Slide 1

Slide 1 text

electron-vueで 僕が考えた最強のメモアプリを 作ってる話 エムスリー 前原 @maeharin - 2018/5/30 エムスリー社内テックトーク -

Slide 2

Slide 2 text

自己紹介 ● 前原 秀徳 ● @maeharin(まえはりん) ● エムスリー株式会社 ● 4年目 ● キャリアチーム エンジニアチームリーダー ● Kotlin、 Vue.js、Ruby ● 好きな漫画は ベルセルク(心の支え) ● 今さらながら NEW GAME!!にハマっています

Slide 3

Slide 3 text

背景 https://speakerdeck.com/juntaki/sugoi-notewotukututa 同じチーム滝安さん作のWebノート

Slide 4

Slide 4 text

https://sugoi-note.net ブラウザベース。シンプル。

Slide 5

Slide 5 text

しかし 僕にとっての 最強メモアプリは これじゃない!

Slide 6

Slide 6 text

ということで、作った作っている 僕が考えた最強のメモアプリ Cappy

Slide 7

Slide 7 text

デモ

Slide 8

Slide 8 text

どうやって作っているか

Slide 9

Slide 9 text

ボイラープレート

Slide 10

Slide 10 text

electron-vue ● vueでelectronアプリを作るボイラープレート ● コマンド一発で、初期設定が完了 ○ よく使うライブラリ ○ Hot Module Replacement ○ ESLint ○ パッケージ機能 ○ テスト ○ .travis.yml ○ など

Slide 11

Slide 11 text

たった3ステップ! ● vue init simulatedgreg/electron-vue my-project ● cd my-project && yarn ● yarn run dev

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

web技術(html, js, css)で デスクトップアプリ書ける WebでVue.js使うのとほぼ同じ感覚 Hot Module Replacement設定済み

Slide 14

Slide 14 text

babelなどの面倒な設定が 一通り完了している

Slide 15

Slide 15 text

(選択した場合) vue-routerのルーティングあり

Slide 16

Slide 16 text

画面ショット

Slide 17

Slide 17 text

electronのdesktopCapturer.getSources() electronのDesktopCapturerSourceオブジェクト navigator.mediaDevices.getUserMedia() WebRTCのMediaStreamオブジェクト videoタグ canvas.getContext('2d').drawImage(videoEL,...) canvasタグ canvas.toDataURL() base64 png画像 node.jsのfs.writeFileSync() 透明なdivでクロップ範囲を決定 キャプチャするスクリーンをユーザーに選 択してもらう クロップ範囲を切り取って、 canvasに表示する 保存ボタンが押されたら、 base64に変換 ローカルPCのファイルシステムに保存 DesktopCapturerSourceのidを渡す videoタグのsrcObjectプロパティに MediaStreamを突っ込む => スクリーンがvideoタグに表示される Web技術

Slide 18

Slide 18 text

electronのdesktopCapturer.getSources() electronのDesktopCapturerSourceオブジェクト キャプチャするスクリーンをユーザーに選 択してもらう

Slide 19

Slide 19 text

electronのdesktopCaptureで DesktopCapturerSourceのリストを取得

Slide 20

Slide 20 text

DesktopCapturerSourceは サムネイル画像を持っている

Slide 21

Slide 21 text

electronのDesktopCapturerSourceオブジェクト navigator.mediaDevices.getUserMedia() WebRTCのMediaStreamオブジェクト videoタグ キャプチャするスクリーンをユーザーに選 択してもらう DesktopCapturerSourceのidを渡す videoタグのsrcObjectプロパティに MediaStreamを突っ込む => スクリーンがvideoタグに表示される

Slide 22

Slide 22 text

DesktopCapturerSourceの idを渡す WebRTCのMediaStream

Slide 23

Slide 23 text

videoタグ canvas.getContext('2d').drawImage(videoEL,...) 透明なdivでクロップ範囲を決定 クロップ範囲を切り取って、 canvasに表示する videoタグのsrcObjectプロパティに MediaStreamを突っ込む => スクリーンがvideoタグに表示される

Slide 24

Slide 24 text

Video div

Slide 25

Slide 25 text

v-bindでstyleをバインド

Slide 26

Slide 26 text

video要素の特定の位置を クロップしてcanvasに 書き込む

Slide 27

Slide 27 text

canvasタグ canvas.toDataURL() base64 png画像 node.jsのfs.writeFileSync() 保存ボタンが押されたら、 base64に変換 ローカルPCのファイルシステムに保存

Slide 28

Slide 28 text

canvasに表示されている画像 をbase64に変換し、 ローカルのPCに保存

Slide 29

Slide 29 text

マークダウン プレビュー マークダウンか らHTMLへ

Slide 30

Slide 30 text

markdown-it ● markdownのパーサ(jsライブラリ) ● vscodeなどでも使われている ● markdown-it-containerプラグインを使って、パーサを独自に拡 張できる ○ 特定の記法を、特定の方法でパースし、特定のhtmlタグに 変換できる 例

Slide 31

Slide 31 text

vueでmarkdown-it使うには? ● textareaタグで入力を受け付ける ● プレビュー側は、Vueのrender関数にする ○ ※htmlを動的に生成するので ● render関数の中でmarkdown-itを使ってhtmlを生成

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

ちなみに、録画も同じような仕組み

Slide 35

Slide 35 text

electronのdesktopCapturer.getSources() electronのDesktopCapturerSourceオブジェクト navigator.mediaDevices.getUserMedia() WebRTCのMediaStreamオブジェクト WebRTCのMediaRecorder Uint8Arrayオブジェクト webm動画 node.jsのfs.writeFileSync() Blobオブジェクト 画像キャプチャと同じ

Slide 36

Slide 36 text

まとめ ● electron-vueでデスクトップアプリ開発が簡単に ● 画面ショットや画面録画もWebのAPIを使って実装できる ● electron-vue触ってみて!