Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
meetup app tokyo@1
Web MVC+SPAフレームワーク
Mithril
2016/06/24
GDI 渋川よしき
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
お前だれよ?
 前職
⁃ 自動車会社の社内SE
 現職
⁃ 社内ゲームエンジン用のフレームワーク
(クライアント用もサーバ用も)作ったり、
開発支援ツール作ったりいわゆる社内SE
⁃ 最近はQt(C++)を毎日書いてます
渋川 よしき
 プログラミング
 C++とかPythonとかGolangとかJavaScriptとか
 本
 つまみぐい勉強法、アート・オブ・コミュニティ(翻訳)、
Mobageを支える技術、オブジェクト指向JavaScript(翻訳)、
ポモドーロ・テクニック入門(翻訳)、etc
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
昨年出しました!
 JavaScriptの、最速クライアント用MVCフレームワークの本です!
⁃ 速いのが好きな人や、変化が多いブラウザ周辺技術に疲れた人に
オススメ
⁃ 古くなってません!
 電子書籍のみです
 表紙は黒ムツの仲間
⁃ 南オセアニアの深海魚
⁃ 最大75cm
⁃ 確認された最高齢は
100歳を超えるとか
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
かんたん/Easy/Simpleについて
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
かんたん/Easy/Simpleについて
 かんたん/Easy/Simpleといった言葉がよく使われる
 ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決
をしやすくするために作られる
→対象を限定すればどのソフトウェアも「かんたん」で説明できる
→つまり何も説明していないのと同じ
 例えば
⁃ Qt/Xamarin
• 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる
⁃ Angular
• 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる
⁃ Electron
• ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる
⁃ C++
• ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
かんたん/Easy/Simpleについて
 かんたん/Easy/Simpleといった言葉がよく使われる
 ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決
をしやすくするために作られる
→対象を限定すればどのソフトウェアも「かんたん」で説明できる
→つまり何も説明していないのと同じ
 例えば
⁃ Qt/Xamarin
• 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる
⁃ Angular
• 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる
⁃ Electron
• ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる
⁃ C++
• ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる
かんたん/Easy/Simpleは今日のNGワード
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilとは
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilとは
 ドキュメントの日本語翻訳あります!
 http://mithril-ja.js.org
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilの守備範囲
V-DOM
Router (SPA)
Component XHR
サーバへの通信コード含めて
Mithrilで完結
ビジュアル層は好きなCSS
フレームワーク等が利用可能
(ただしPolymerはChrome限定)
その他、既存のUIライブラリも
使える(jQuery UI系など)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilのコア
 機能が絞りこまれたアトミックなWebのMVC+SPAフレームワーク
⁃ 他のライブラリに依存せずにアプリが作れる
• サーバ通信、非同期処理(promise)、モデル作成、SPAサポート(ラウター)
仮想DOM、コンポーネント
⁃ gzipされた状態で7.8KBほどの大きさ
• リファレンスに乗っている関数は16個ほど
• そのうちよく使うのは半分ぐらい?
• 本を書き始めてから1年以上、バグ修正等で更新は頻繁にあるが、
ほとんどAPIに変更がない
 内部では仮想DOMという仕組みを使っていて比較的高速
⁃ 詳細は「最速MVCフレームワークMithril.jsの速度の秘密」(Qiita)
⁃ 速度チューニングも可能だが、そこまで頑張る必要性が低い
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilアプリケーションの構造
実際に作ったアプリケーションを参考に紹介します。
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
 戦魂 –SENTAMA-
戦国時代がモチーフの戦略シミュレーションRPG
開発の目線での紹介はこちら
(http://www.slideshare.net/dena_study/unityrpg)にまとまって
います
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
戦魂チーム向けの運用改善
 マスターデータ運用は、昨年のFINAL FANTASY Record Keeperのマ
スターデータ運用改善で発表したのと同じ仕組みは導入済みだった
 スプレッドシートでは表現が難しく入力⇔確認に手間がかかるデータが
2つほどあったのでElectronを使って入力補助ツールを作成した
⁃ 戦場マップ
⁃ 列伝(キャンペーンモード)のオープニングシーケンス
 これらを題材に、Mithrilアプリケーションの構造を紹介します
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
できあがったもの
 今までのワークフローに手を入れることはなく入力高速化にフォーカス
⁃ Mithril同様、アトミックな部分に割りきって、費用対効果最大化
⁃ コピペ・ツールチェーン(後工程のスプレッドシートにコピペで
データを移せるように、整形した表を表示)
⁃ 試行錯誤の時間が増えて、よりユーザに楽しんでもらえる演出、
マップづくりに時間が使えるようになった
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilアプリケーションの基本設計 (1)
 HTMLの一部をMithrilの仮想DOM管理下にする
⁃ m.mount(): 1つのコンポーネントに描画を任せる
⁃ m.route(): 現在のURLに応じてコンポーネントを切り替える
 全部を仮想DOMにまかせてしまうのも可だが、ヘッダー、フッターな
ど変化しない部分は静的HTMLのままの方が楽
 複数パートに分割適用もできる(した)
m.route()
m.mount()
m.mount()
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
できあがった構造
main.js
application
context.js
script/index.j
s
script/
xxx page.js
script/
xxx page.js
script/
xxx page.js
script/viewm
odel.js
script/model
.jswindow
open
undo/redo
script/
canvasmap.js
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilアプリケーションの基本設計(2)
 コンポーネント、ビューモデル、モデルでアプリを組み立てる
⁃ コンポーネントはコントローラとビューで構成
• どちらも状態は持たない
• コンポーネントは入れ子にできる
⁃ ビューモデルは編集中のデータなど永続化しないデータ持つ
⁃ モデルは永続化するべき大事なデータを持つ
• VMとMの機能分けは規約でそうなっているだけでAPI上は1つにまとめるこ
とも不可能ではない
• それどころか、コントローラ==モデルにすることもAPI上は不可能ではな
いが、上記の規約に従う方がよい
• クラス継承等でコード的にルール強制されるわけではないので、自分で
Mithril Wayに従ってコードを整理しなければいけない点は要注意
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
戦場マップエディタのコンポーネント・ビュー(1)
 各ページのトップはコンポーネント
 よく使うマップ部分もコンポーネント化した
⁃ <canvas>タグをm()で作り、ビューのconfigから、
requestAnimationFrame()の再帰的呼び出しでcanvas更新
⁃ 引数でモード切り替え
• モードによって要素のフィルタリング・サイズ変更など
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
戦場マップエディタのコンポーネント・ビュー(2)
 ビューの一部に、仮想DOM以外のライブラリを併用することが可能
⁃ 既存のUI部品資産があれば、それを利用できる
 表はMITライセンス版のhandsontableを使用
⁃ ビューのconfigの機能を使って適用
⁃ 行・列のどちらの方向もExcelっぽく選択でき、コピペでExcelにそ
のまま貼れる
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
シングルページアプリケーションのサポート
 画面の完全リロードやリセットが起きなくなり、レスポンスがよくなる
 Mithrilの場合は、フルリロードの従来型ウェブアプリケーションも、
SPAにする場合も、コードは特に変わらないので対応しない理由はない
 URLのスタイルがいくつか選べる
 今回はデフォルトのまま利用
スタイル 例 デメリット
“search” (デフォルト) http://server/?/path/to/page history.pushStateがないIE8ではリフレッシュ
してしまう
“hash” http://server/#/path/to/page どのブラウザでもOKだが、名前付きアン
カーが使えなくなる
“pathname” http://server/path/to/page URLは一番きれいだが、サーバ側の設定が必
要
history.pushStateがないIE8ではリフレッシュ
してしまう
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
おまけ: Electron側の描画側ではない方のプロセス
 ブラウザ/レンダラプロセス間のインタラクションを疎にしつつ、普通
のデスクトップアプリの使い勝手を再現した
⁃ Electronのブラウザプロセス側のコードはモデルの履歴管理と、
ファイル入出力に特化する。
⁃ ブラウザがXHRでサーバ通信する代わりに、編集(モデル変更)時に
レンダラープロセスがJSONをブラウザプロセスに送る
⁃ ファイル読み込み、アンドゥ・リドゥ実行時にブラウザプロセスか
ら、今表示すべきモデルを
レンダラープロセスに送り、
Mithrilのモデルをリセット
⁃ 詳しくはQiitaの「Electron+
Mithrilで、ふつうのデスク
トップアプリを作る」参照
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ちなみに
 餃子声優 橘田いずみさん(@izugyoza)の餃子本
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mithrilのアプリの構造と完全に一致
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
橘田いずみさんの餃子のコア
 アトミックな餃子フレームワーク
⁃ 限界まで絞りこまれたシンプルな材料
• 豚肉・青ネギ・生姜のみ
• ニンニクもニラも使わず、豚肉を混ぜるときは箸で行う
⁃ 夕食以外も安心して食べられる
⁃ 爪の手入れをしている女性にも優しそう
⁃ これに、各種野菜などをアドオンして餡を仕上げる
• 単に混ぜるだけなので、肉餡をたくさん作ってから小分けにして、一度に
数種類の餃子を仕上げることも可能
 高いポータビリティ
⁃ 肉餡の状態の状態でも保存ができるし、餃子にしても保存が可能
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
まとめ
 MithrilはアトミックなMVC+SPAフレームワーク
⁃ 関数の数が少なく、余計な機能がないため、APIの変更もほぼない
⁃ デスクトップGUI開発者も勉強になりますよ!
 CSSフレームワークは自由に切り替えられる
⁃ 僕のお気に入りはMaterial Design Lite (mithril-mdl)
⁃ ShadowDOMが来たらPolymerが・・・
 コンポーネントの分割、ビューモデル、モデルの責務分割が勝利の鍵
⁃ データの流れを整流
 既存のUIライブラリと一緒に使ったり、canvas
を組み込んだりもできます
 Electronと一緒に使うのも簡単
⁃ 社内ツールを作ってみた
 餃子と同じぐらいMithrilもいいよ

More Related Content

PPTX
Golang tokyo #7 qtpm
PPTX
FINAL FANTASY Record Keeperを支えたGolang
PPTX
Chunked encoding を使った高速化の考察
PPTX
Mithril - 軽量/高速なMVCフレームワーク
PPTX
アンラーニング
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
The History of Reactive Extensions
Golang tokyo #7 qtpm
FINAL FANTASY Record Keeperを支えたGolang
Chunked encoding を使った高速化の考察
Mithril - 軽量/高速なMVCフレームワーク
アンラーニング
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
【Unite Tokyo 2019】Understanding C# Struct All Things
The History of Reactive Extensions

What's hot (20)

PPTX
Unityで使える C# 6.0~と .NET 4.6
PDF
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
PDF
UniRx - Reactive Extensions for Unity
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
PPTX
C#で速度を極めるいろは
PDF
Bluetoothでgo!
PDF
DeNAのゲーム開発を支える技術 (クライアントサイド編)
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
PDF
A Framework for LightUp Applications of Grani
PDF
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
PDF
Fortranが拓く世界、VSCodeが架ける橋
PPTX
Introduction to JIT Compiler in JVM
PDF
Effective web performance tuning for smartphone
PPTX
FINAL FANTASY Record Keeperのマスターデータを支える技術
PDF
FFRK cocos2d xレイヤーの最適化
PPTX
DeNAの最新のマスタデータ管理システム Oyakata の全容
PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
PDF
FINAL FANTASY
 Record Keeper 演出データについて
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
PDF
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityで使える C# 6.0~と .NET 4.6
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
UniRx - Reactive Extensions for Unity
NextGen Server/Client Architecture - gRPC + Unity + C#
C#で速度を極めるいろは
Bluetoothでgo!
DeNAのゲーム開発を支える技術 (クライアントサイド編)
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
A Framework for LightUp Applications of Grani
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
Fortranが拓く世界、VSCodeが架ける橋
Introduction to JIT Compiler in JVM
Effective web performance tuning for smartphone
FINAL FANTASY Record Keeperのマスターデータを支える技術
FFRK cocos2d xレイヤーの最適化
DeNAの最新のマスタデータ管理システム Oyakata の全容
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
FINAL FANTASY
 Record Keeper 演出データについて
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Ad

Viewers also liked (20)

PPTX
Go & multi platform GUI Trials and Errors
PPTX
Excelの話
PDF
Oktavia全文検索エンジン - SphinxCon JP 2014
PPTX
社内の画像変換サーバーをGoで置き換えた話
PDF
大規模JavaScript開発
ODP
[C++ GUI Programming with Qt4] chap6
DOCX
Advanced file permissions in linux
PDF
Who is the person whom the IT engineers should learn next to Alexander?
PPTX
TOSHIBAxGUGEN FlashAirハッカソン-FlashAirでなに作る?
PDF
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
PDF
[Golang] Go言語でサービス作ってる話
PDF
Go言語によるwebアプリの作り方
PDF
Python Programming - XIII. GUI Programming
PPTX
File permission in linux
PPTX
【初心者向け】Go言語勉強会資料
PPTX
C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについて
PDF
Develop Android app using Golang
PDF
FFRKを支えるWebアプリケーションフレームワークの技術
PDF
GoによるWebアプリ開発のキホン
PPTX
何故DeNAがverticaを選んだか?
Go & multi platform GUI Trials and Errors
Excelの話
Oktavia全文検索エンジン - SphinxCon JP 2014
社内の画像変換サーバーをGoで置き換えた話
大規模JavaScript開発
[C++ GUI Programming with Qt4] chap6
Advanced file permissions in linux
Who is the person whom the IT engineers should learn next to Alexander?
TOSHIBAxGUGEN FlashAirハッカソン-FlashAirでなに作る?
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
[Golang] Go言語でサービス作ってる話
Go言語によるwebアプリの作り方
Python Programming - XIII. GUI Programming
File permission in linux
【初心者向け】Go言語勉強会資料
C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについて
Develop Android app using Golang
FFRKを支えるWebアプリケーションフレームワークの技術
GoによるWebアプリ開発のキホン
何故DeNAがverticaを選んだか?
Ad

Similar to Mithril (20)

PDF
3DCAD仮想デスクトップソリューションのご紹介
PPTX
オールアバウトにおける技術への取り組み
PDF
App Modernization for .NET
PPTX
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
PPTX
技術選択とアーキテクトの役割
PDF
PDF
Airflowを広告データのワークフローエンジンとして運用してみた話
PDF
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
PDF
モバイルHTML5サイトでの写真アップロードの最適化と業務アプリへの適用
PDF
XenDesktop / XenAppグラフィック ディープダイブ
PDF
Jslug2 nagoya-shibata
PDF
とあるメーカーのRedmine活用事例
PPTX
C++ AMPを使ってみよう
PDF
CODT2020 ビジネスプラットフォームを支えるCI/CDパイプライン ~エンタープライズのDevOpsを加速させる運用改善Tips~
PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PDF
サーバーレスやマイクロサービスへの"チャレンジ"を後押ししてくれるセッションを紹介
PDF
デスクトップエンジニアという働き方
PPTX
Windows 8時代のアプリ開発
PDF
Essentials of container
PPTX
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
3DCAD仮想デスクトップソリューションのご紹介
オールアバウトにおける技術への取り組み
App Modernization for .NET
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
技術選択とアーキテクトの役割
Airflowを広告データのワークフローエンジンとして運用してみた話
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
モバイルHTML5サイトでの写真アップロードの最適化と業務アプリへの適用
XenDesktop / XenAppグラフィック ディープダイブ
Jslug2 nagoya-shibata
とあるメーカーのRedmine活用事例
C++ AMPを使ってみよう
CODT2020 ビジネスプラットフォームを支えるCI/CDパイプライン ~エンタープライズのDevOpsを加速させる運用改善Tips~
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
サーバーレスやマイクロサービスへの"チャレンジ"を後押ししてくれるセッションを紹介
デスクトップエンジニアという働き方
Windows 8時代のアプリ開発
Essentials of container
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた

More from Yoshiki Shibukawa (20)

PDF
多すぎるユニットテストは却ってよくない?私が実践しているテストコードのリファクタリング
PDF
ITコンサルが改善するのはビジネスだけじゃない! サークル的活動で業界貢献 技育祭2024秋
PPTX
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
PPTX
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
PDF
東京Node学園 今できる通信高速化にトライしてみた
PDF
Oktavia Search Engine - pyconjp2014
PDF
Xpjug基調lt2011
PDF
Expert JavaScript Programming
PDF
JavaScriptゲーム制作勉強会
PDF
Pomodoro technique
PDF
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
PDF
Bitbucket&mercurial
PDF
つまみぐい勉強法。その後。
PPTX
Erlang and I and Sphinx.
PPTX
Sphinx Tutorial at BPStudy#30
PDF
1日~1週間でOSSに貢献する方法
PDF
儲かるドキュメント
PDF
コンカツ女子のためのIT技術者の落とし方
PDF
Chashitsu And Pattern
PDF
EUnit in Practice(Japanese)
多すぎるユニットテストは却ってよくない?私が実践しているテストコードのリファクタリング
ITコンサルが改善するのはビジネスだけじゃない! サークル的活動で業界貢献 技育祭2024秋
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
東京Node学園 今できる通信高速化にトライしてみた
Oktavia Search Engine - pyconjp2014
Xpjug基調lt2011
Expert JavaScript Programming
JavaScriptゲーム制作勉強会
Pomodoro technique
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
Bitbucket&mercurial
つまみぐい勉強法。その後。
Erlang and I and Sphinx.
Sphinx Tutorial at BPStudy#30
1日~1週間でOSSに貢献する方法
儲かるドキュメント
コンカツ女子のためのIT技術者の落とし方
Chashitsu And Pattern
EUnit in Practice(Japanese)

Mithril

  • 1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. meetup app tokyo@1 Web MVC+SPAフレームワーク Mithril 2016/06/24 GDI 渋川よしき
  • 2. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. お前だれよ?  前職 ⁃ 自動車会社の社内SE  現職 ⁃ 社内ゲームエンジン用のフレームワーク (クライアント用もサーバ用も)作ったり、 開発支援ツール作ったりいわゆる社内SE ⁃ 最近はQt(C++)を毎日書いてます 渋川 よしき  プログラミング  C++とかPythonとかGolangとかJavaScriptとか  本  つまみぐい勉強法、アート・オブ・コミュニティ(翻訳)、 Mobageを支える技術、オブジェクト指向JavaScript(翻訳)、 ポモドーロ・テクニック入門(翻訳)、etc
  • 3. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 昨年出しました!  JavaScriptの、最速クライアント用MVCフレームワークの本です! ⁃ 速いのが好きな人や、変化が多いブラウザ周辺技術に疲れた人に オススメ ⁃ 古くなってません!  電子書籍のみです  表紙は黒ムツの仲間 ⁃ 南オセアニアの深海魚 ⁃ 最大75cm ⁃ 確認された最高齢は 100歳を超えるとか
  • 4. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. かんたん/Easy/Simpleについて
  • 5. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. かんたん/Easy/Simpleについて  かんたん/Easy/Simpleといった言葉がよく使われる  ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決 をしやすくするために作られる →対象を限定すればどのソフトウェアも「かんたん」で説明できる →つまり何も説明していないのと同じ  例えば ⁃ Qt/Xamarin • 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる ⁃ Angular • 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる ⁃ Electron • ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる ⁃ C++ • ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる
  • 6. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. かんたん/Easy/Simpleについて  かんたん/Easy/Simpleといった言葉がよく使われる  ソフトウェアのライブラリ・フレームワーク・言語は特定の問題の解決 をしやすくするために作られる →対象を限定すればどのソフトウェアも「かんたん」で説明できる →つまり何も説明していないのと同じ  例えば ⁃ Qt/Xamarin • 1度GUI作成を学べば、同じ知識で他のOSのアプリも「かんたんに」作れる ⁃ Angular • 束縛が強いため、レールに乗って「かんたんに」MVCアプリが作れる ⁃ Electron • ブラウザの知識があれば「かんたんに」デスクトップアプリが作れる ⁃ C++ • ゼロオーバーヘッドでC言語よりも遅くないコードが「かんたんに」作れる かんたん/Easy/Simpleは今日のNGワード
  • 7. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilとは
  • 8. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilとは  ドキュメントの日本語翻訳あります!  http://mithril-ja.js.org
  • 9. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilの守備範囲 V-DOM Router (SPA) Component XHR サーバへの通信コード含めて Mithrilで完結 ビジュアル層は好きなCSS フレームワーク等が利用可能 (ただしPolymerはChrome限定) その他、既存のUIライブラリも 使える(jQuery UI系など)
  • 10. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilのコア  機能が絞りこまれたアトミックなWebのMVC+SPAフレームワーク ⁃ 他のライブラリに依存せずにアプリが作れる • サーバ通信、非同期処理(promise)、モデル作成、SPAサポート(ラウター) 仮想DOM、コンポーネント ⁃ gzipされた状態で7.8KBほどの大きさ • リファレンスに乗っている関数は16個ほど • そのうちよく使うのは半分ぐらい? • 本を書き始めてから1年以上、バグ修正等で更新は頻繁にあるが、 ほとんどAPIに変更がない  内部では仮想DOMという仕組みを使っていて比較的高速 ⁃ 詳細は「最速MVCフレームワークMithril.jsの速度の秘密」(Qiita) ⁃ 速度チューニングも可能だが、そこまで頑張る必要性が低い
  • 11. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilアプリケーションの構造 実際に作ったアプリケーションを参考に紹介します。
  • 13. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.  戦魂 –SENTAMA- 戦国時代がモチーフの戦略シミュレーションRPG 開発の目線での紹介はこちら (http://www.slideshare.net/dena_study/unityrpg)にまとまって います
  • 15. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 戦魂チーム向けの運用改善  マスターデータ運用は、昨年のFINAL FANTASY Record Keeperのマ スターデータ運用改善で発表したのと同じ仕組みは導入済みだった  スプレッドシートでは表現が難しく入力⇔確認に手間がかかるデータが 2つほどあったのでElectronを使って入力補助ツールを作成した ⁃ 戦場マップ ⁃ 列伝(キャンペーンモード)のオープニングシーケンス  これらを題材に、Mithrilアプリケーションの構造を紹介します
  • 16. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. できあがったもの  今までのワークフローに手を入れることはなく入力高速化にフォーカス ⁃ Mithril同様、アトミックな部分に割りきって、費用対効果最大化 ⁃ コピペ・ツールチェーン(後工程のスプレッドシートにコピペで データを移せるように、整形した表を表示) ⁃ 試行錯誤の時間が増えて、よりユーザに楽しんでもらえる演出、 マップづくりに時間が使えるようになった
  • 17. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilアプリケーションの基本設計 (1)  HTMLの一部をMithrilの仮想DOM管理下にする ⁃ m.mount(): 1つのコンポーネントに描画を任せる ⁃ m.route(): 現在のURLに応じてコンポーネントを切り替える  全部を仮想DOMにまかせてしまうのも可だが、ヘッダー、フッターな ど変化しない部分は静的HTMLのままの方が楽  複数パートに分割適用もできる(した) m.route() m.mount() m.mount()
  • 18. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. できあがった構造 main.js application context.js script/index.j s script/ xxx page.js script/ xxx page.js script/ xxx page.js script/viewm odel.js script/model .jswindow open undo/redo script/ canvasmap.js
  • 19. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilアプリケーションの基本設計(2)  コンポーネント、ビューモデル、モデルでアプリを組み立てる ⁃ コンポーネントはコントローラとビューで構成 • どちらも状態は持たない • コンポーネントは入れ子にできる ⁃ ビューモデルは編集中のデータなど永続化しないデータ持つ ⁃ モデルは永続化するべき大事なデータを持つ • VMとMの機能分けは規約でそうなっているだけでAPI上は1つにまとめるこ とも不可能ではない • それどころか、コントローラ==モデルにすることもAPI上は不可能ではな いが、上記の規約に従う方がよい • クラス継承等でコード的にルール強制されるわけではないので、自分で Mithril Wayに従ってコードを整理しなければいけない点は要注意
  • 20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 戦場マップエディタのコンポーネント・ビュー(1)  各ページのトップはコンポーネント  よく使うマップ部分もコンポーネント化した ⁃ <canvas>タグをm()で作り、ビューのconfigから、 requestAnimationFrame()の再帰的呼び出しでcanvas更新 ⁃ 引数でモード切り替え • モードによって要素のフィルタリング・サイズ変更など
  • 21. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 戦場マップエディタのコンポーネント・ビュー(2)  ビューの一部に、仮想DOM以外のライブラリを併用することが可能 ⁃ 既存のUI部品資産があれば、それを利用できる  表はMITライセンス版のhandsontableを使用 ⁃ ビューのconfigの機能を使って適用 ⁃ 行・列のどちらの方向もExcelっぽく選択でき、コピペでExcelにそ のまま貼れる
  • 22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. シングルページアプリケーションのサポート  画面の完全リロードやリセットが起きなくなり、レスポンスがよくなる  Mithrilの場合は、フルリロードの従来型ウェブアプリケーションも、 SPAにする場合も、コードは特に変わらないので対応しない理由はない  URLのスタイルがいくつか選べる  今回はデフォルトのまま利用 スタイル 例 デメリット “search” (デフォルト) http://server/?/path/to/page history.pushStateがないIE8ではリフレッシュ してしまう “hash” http://server/#/path/to/page どのブラウザでもOKだが、名前付きアン カーが使えなくなる “pathname” http://server/path/to/page URLは一番きれいだが、サーバ側の設定が必 要 history.pushStateがないIE8ではリフレッシュ してしまう
  • 23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. おまけ: Electron側の描画側ではない方のプロセス  ブラウザ/レンダラプロセス間のインタラクションを疎にしつつ、普通 のデスクトップアプリの使い勝手を再現した ⁃ Electronのブラウザプロセス側のコードはモデルの履歴管理と、 ファイル入出力に特化する。 ⁃ ブラウザがXHRでサーバ通信する代わりに、編集(モデル変更)時に レンダラープロセスがJSONをブラウザプロセスに送る ⁃ ファイル読み込み、アンドゥ・リドゥ実行時にブラウザプロセスか ら、今表示すべきモデルを レンダラープロセスに送り、 Mithrilのモデルをリセット ⁃ 詳しくはQiitaの「Electron+ Mithrilで、ふつうのデスク トップアプリを作る」参照
  • 24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ちなみに  餃子声優 橘田いずみさん(@izugyoza)の餃子本
  • 25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
  • 27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Mithrilのアプリの構造と完全に一致
  • 28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 橘田いずみさんの餃子のコア  アトミックな餃子フレームワーク ⁃ 限界まで絞りこまれたシンプルな材料 • 豚肉・青ネギ・生姜のみ • ニンニクもニラも使わず、豚肉を混ぜるときは箸で行う ⁃ 夕食以外も安心して食べられる ⁃ 爪の手入れをしている女性にも優しそう ⁃ これに、各種野菜などをアドオンして餡を仕上げる • 単に混ぜるだけなので、肉餡をたくさん作ってから小分けにして、一度に 数種類の餃子を仕上げることも可能  高いポータビリティ ⁃ 肉餡の状態の状態でも保存ができるし、餃子にしても保存が可能
  • 29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. まとめ  MithrilはアトミックなMVC+SPAフレームワーク ⁃ 関数の数が少なく、余計な機能がないため、APIの変更もほぼない ⁃ デスクトップGUI開発者も勉強になりますよ!  CSSフレームワークは自由に切り替えられる ⁃ 僕のお気に入りはMaterial Design Lite (mithril-mdl) ⁃ ShadowDOMが来たらPolymerが・・・  コンポーネントの分割、ビューモデル、モデルの責務分割が勝利の鍵 ⁃ データの流れを整流  既存のUIライブラリと一緒に使ったり、canvas を組み込んだりもできます  Electronと一緒に使うのも簡単 ⁃ 社内ツールを作ってみた  餃子と同じぐらいMithrilもいいよ