Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
セーフティ・JavaScript・プログラミング
Search
e_ntyo
May 26, 2018
Programming
0
240
セーフティ・JavaScript・プログラミング
https://hojiro-lt.connpass.com/event/88352/
e_ntyo
May 26, 2018
Tweet
Share
More Decks by e_ntyo
See All by e_ntyo
論文紹介 "My Mouse, My Rules - Privacy Issues of Behavioral User Profiling via Mouse Tracking"
e_ntyo
1
160
論文紹介 - Towards Memorable Information Retrieval (ICTIR ‘20)
e_ntyo
0
73
Introducing Type Providers
e_ntyo
0
17k
slamdata/purescript-halogen の紹介
e_ntyo
0
130
Other Decks in Programming
See All in Programming
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
390
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
8.2k
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
570
安いハードウェアでVulkan
fadis
0
440
Angular-Apps smarter machen mit Gen AI: Lokal und offlinefähig - Hands-on Workshop!
christianliebel
PRO
0
120
それはエンジニアリングの糧である:AI開発のためにAIのOSSを開発する現場より / It serves as fuel for engineering: insights from the field of developing open-source AI for AI development.
nrslib
0
110
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
130
Understanding Apache Lucene - More than just full-text search
spinscale
0
130
AI 開発合宿を通して得た学び
niftycorp
PRO
0
140
Codex の「自走力」を高める
yorifuji
0
1.2k
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
6
2k
API Platformを活用したPHPによる本格的なWeb API開発 / api-platform-book-intro
ttskch
1
140
Featured
See All Featured
Paper Plane (Part 1)
katiecoart
PRO
0
5.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
350
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
860
How to make the Groovebox
asonas
2
2k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
200
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
250
GraphQLの誤解/rethinking-graphql
sonatard
75
11k
4 Signs Your Business is Dying
shpigford
187
22k
Deep Space Network (abreviated)
tonyrice
0
92
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Transcript
None
はなすこと 1. @e_ntyoとは 2. なぜJavaScriptなのか 3. 何をもって”安全”とするのか 4. 安全にJavaScriptを書くために ◦
関数型プログラミング ◦ 静的型 ◦ fp-tsの紹介 5. まとめ
1. @e_ntyoとは • オタク(アイドル, アニメ, バンド) • 走る異常性癖 •
普段はTypeScriptを書いている ◦ 最近はHaskell, GraphQLに興味
2. なぜJavaScriptなのか • 活躍する機会が豊富 ◦ web browser, v8 engine, mobile,
etc… ▪ メディアプログラミングの環境としても優秀 ◦ Webアプリケーション開発における莫大な資産(ドキュメント, ライブラリ, FW, 知見) • 特になし
2. なぜJavaScriptなのか • そもそも出来ることならJavaScriptなんて書きたくない ◦ AltJSを使おう(後述) ◦ もうすぐwasmの時代がやってくるらしい
• それでも今は、書かなくてはならない ◦ 今、本格的なWebアプリケーションを開発・運用するなら、JSからは逃げられない ▪ 既存の手法を利用し、早く作って早く公開する必要に駆られることは多い ◦ あなたの大好きなプログラミング言語のコードを読める人は会社に何人いるか
3. 何をもって”安全”とするのか • プログラミング言語の文脈での”安全” ◦ メモリ安全性, 型安全性, null安全, etc… ◦
使うプログラミング言語に依存するところが大きい • “安全な言語とはプログラミングの最中にうっかり自分の足を撃つことが不可能 な言語” - Benjamin C. Pierce 著/住井英二郎 監訳/遠藤侑介・酒井政裕・今井敬吾・黒木裕介・今井宜洋・才川隆文・今井健男 訳 『型システム入門 プログラミング言語と型の理論』 (オーム社、978-4-274-06911-6、2013年) ◦ うっかり”危険”な操作をしないよう、適切な抽象を提供する ▪ スコープ違反 ▪ nullを含む型エラー ▪ セグメント違反, 配列の無効なアクセス
3. 何をもって”安全”とするのか • 型安全 != 実行前に危険な/誤った箇所がわかる ◦ 実行時にエラーで教えてくれるタイプ == 動的型付け言語
◦ 環境(使用する言語やツール)に依存 ◦ 静的型の表現力にも限界はある ▪ どこまで実行前にチェックするか ▪ 依存型やモナドで表現力を高めていく • 今回扱う”安全”は、”TypeScriptで担保される安全”`
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc… TypeScriptでこれらの”危険”は回避できるのか?
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc…
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc…
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc…
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc…
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc… transpile
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc…
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc…
4. 安全にJavaScript を書くために • JavaScriptでの”危険”とは何か ◦ Null, undefinedの扱い ◦
等価性判定 ◦ var, letで宣言した変数への 再代入 ◦ 存在しないプロパティへの アクセス・代入 ◦ etc… • with, eval ◦ やめようね! ◦ neverを使うとマシに • dead code ◦ 論理的に到達不可能なコードは 検出される • if, switchの条件分岐の漏れ ◦ if, caseブロック内で 値を返す関数の場合、 それは網羅的でないといけない ▪ もちろん検出される
4. 安全にJavaScriptを書くために • でもお高いんでしょう? ◦ “Your TypeScript is JavaScript”
▪ 既存のJSのコードをそのままtscを噛ませると、エラーが出ても必ず出力される ▪ TSの導入にコストはかからない • 安全性以外の特典 ◦ 型がコードのドキュメントのようにはたらく ◦ 最新のECMAScriptの機能が使える ▪ babelいらず ◦ 既存のたくさんのJSライブラリの型ヒント ▪ 補完だけ欲しい人にも
4. 安全にJavaScriptを書くために • さらに”安全”にやっていくために ◦ 副作用のないコード ▪ いちいち関数の返した値を変数に束縛したくない
◦ テスタブルで再利用性の高いコード ▪ well-testedな関数の組み合わせで書けばバグりにくいはず ◦ 文脈を型で表現したい ▪ Option<T>くんはどこ…?
4. 安全にJavaScriptを書くために • さらに”安全”にやっていくために ◦ 副作用のないコード ▪ いちいち関数の返した値を変数に束縛したくない
◦ テスタブルで再利用性の高いコード ▪ well-testedな関数の組み合わせで書けばバグりにくいはず ◦ 文脈を型で表現したい ▪ Option<T>くんはどこ…?
4. 安全にJavaScriptを書くために • いつものパターン ◦ fp ▪ むやみにグローバルな状態を作らない ▪
副作用を出さない • ケースによってはReactive Extensionsもアリかと ▪ 複雑な機能はwell-testedな小さな関数の組み合わせで実現 ▪ カリー化 ▪ 高階関数 ▪ 関数合成 ▪ オライリーから本が出ているが古い • Webのドキュメントを漁ったほうが良い
4. 安全にJavaScriptを書くために • モテない男が気休めに使うみじめな道具 ◦ モナドライブラリ(TypeScript) ▪ Option<T>, Either<T>,
Writer<T>, etc… ▪ monapt, TSMonad, fp-ts
4. 安全にJavaScriptを書くために • gcanti/fp-ts ◦ 最近出てきたさいつよモナドライブラリ ▪ さいつよ: Star,
機能数, 更新頻度 ◦ PureScript, fantasy-land, static-land, Scalaにインスパイアされた ◦ 最新のTypeScriptの機能を取り入れている ◦ interfaceで高階型を表現し、Applicative, Monadを提供 ◦ Option<T>, Either<T>, Reader<T>, Writer<T>, State<T>, Task<T>, Debug.Trace(), etc… ◦ この前記事を書いたので読んでください
4. 安全にJavaScript を書くために • gcanti/fp-ts ◦ Either<L, R> ▪ 失敗系と成功系を
型で表現 ▪ Promiseとの親和性
4. 安全にJavaScript を書くために • gcanti/fp-ts ◦ Option<T> ▪ Nullableな型 •
T | null ▪ 他のモナドと 組み合わせられる
5. まとめ • プログラミング言語の安全性の定義は難しい ◦ 言語により様々な”危険”があるため • もしJSを書くときは、TSやfpを使い、JSの”危険”なコードを握り潰そう ◦
fp-tsを使うと便利である