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
インドのパンについての話 / a story about Indian bread
Search
Arata
July 26, 2020
0
22
インドのパンについての話 / a story about Indian bread
Arata
July 26, 2020
Tweet
Share
More Decks by Arata
See All by Arata
コードエディターのシンタックスハイライトの話
arata_nvm
0
130
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
52
TableGenの言語サーバーをつくる
arata_nvm
0
550
pwn入門 / introduction to pwn
arata_nvm
1
2.2k
TableGenと和解せよ / make peace with TableGen
arata_nvm
0
120
sudo-rsのテストの話 / story of sudo-rs testing
arata_nvm
1
210
ソースコードリーディングはいいぞ / source code reading is good
arata_nvm
0
62
ネットワーク委員会活動報告 / network committee activity report
arata_nvm
0
22
Twitter専用のPCを作る / create a dedicated Twitter PC
arata_nvm
0
54
Featured
See All Featured
KATA
mclloyd
29
14k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
YesSQL, Process and Tooling at Scale
rocio
173
14k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Designing for Performance
lara
609
69k
Writing Fast Ruby
sferik
628
61k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Typedesign – Prime Four
hannesfritz
42
2.7k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Transcript
インドのパンについての話 2020/07/26 SecHack365 輪講 @Arata
インドのパンと言えば?
インドのパンと言えば? = ナン
NaNの読みは? ※ NaN: Not a Number
NaNの読みは? = ナン ※ NaN: Not a Number
つまり...
つまり...
つまり... ∴インドのパンはナン(=NaN)である。
ありがとうございました
なんで?
なんで? - JavaScript の仕様で決められているから
他の言語では
他の言語では - Go言語 packge main import “math” func main() {
math.IsNaN(+”インドのパン”) }
他の言語では - Go言語 packge main import “math” func main() {
math.IsNaN(+”インドのパン”) } ./hoge.go:4:14: invalid operation: + untyped string
1. 式を調べる 2. ドキュメントを調べる 3. ソースコードを調べる もっと詳しく
式を調べる
式を調べる - 式の評価される順番を調べる
式を調べる Number.isNaN( + ’インドのパン’ ) - 式の評価される順番を調べる
式を調べる Number.isNaN( + ’インドのパン’ ) - 式の評価される順番を調べる
式を調べる Number.isNaN( + ’インドのパン’ ) - 式の評価される順番を調べる 1. [文字列] 2.
+[文字列] 3. Number.isNan
式を調べる Number.isNaN( + ’インドのパン’ ) - 式の評価される順番を調べる 1. [文字列] 2.
+[文字列] <- ??? 3. Number.isNan
ドキュメントを調べる
ドキュメントを調べる - ‘+’には2つの意味がある
ドキュメントを調べる - ‘+’には2つの意味がある - 単項演算子: 1つの式に対しての演算 - e.g. +10
ドキュメントを調べる - ‘+’には2つの意味がある - 単項演算子: 1つの式に対しての演算 - e.g. +10 -
二項演算子: 2つの式に対しての演算 - e.g. 10 + 5
ドキュメントを調べる - ‘+’には2つの意味がある - 単項演算子: 1つの式に対しての演算 - e.g. +10 -
二項演算子: 2つの式に対しての演算 - e.g. 10 + 5 - +[文字列]は単項演算子
ドキュメントを調べる - Unary plus (+) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unary_plus
ドキュメントを調べる - Unary plus (+) - If it cannot parse
a particular value, it will evaluate to NaN. - 意訳: 文字列が数字として解釈できなかったらNaNを返す https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unary_plus
ソースコードを調べる
ソースコードを調べる - 環境: Node.js v14.3.0
ソースコードを調べる - 環境: Node.js v14.3.0 - 内部でV8を使っている
ソースコードを調べる - 環境: Node.js v14.3.0 - 内部でV8を使っている - Google製のJavaScriptエンジン -
ECMA-262という仕様に従って実装されている - Chromeの内部で使われている
ソースコードを調べる - 環境: Node.js v14.3.0 - 内部でV8を使っている - Google製のJavaScriptエンジン -
ECMA-262という仕様に従って実装されている - Chromeの内部で使われている - GitHub: https://github.com/v8/v8
ソースコードを調べる - 調べ方
ソースコードを調べる - 調べ方 - GitHubの検索機能を使う - リポジトリをクローンして検索ツールを使う
ソースコードを調べる - 調べ方 - GitHubの検索機能を使う - リポジトリをクローンして検索ツールを使う
ソースコードを調べる - “unary plus”でコミットを検索する
ソースコードを調べる - “unary plus”でコミットを検索する - “Improve handling of unary plus.”
- +[hoge] を [hoge]*1 に置換する
ソースコードを調べる - “unary plus”でコミットを検索する - “Improve handling of unary plus.”
- +[hoge] を [hoge]*1 に置換する - [hoge]が文字列の場合、String::ToNumber([hoge])*1に 置換する
ソースコードを調べる - “String::ToNumber”でファイルを検索する
ソースコードを調べる - “String::ToNumber”でファイルを検索する - “src/objects/string.cc” 370~427行目
ソースコードを調べる - “String::ToNumber”でファイルを検索する - “src/objects/string.cc” 370~427行目 - 符号、指数表記、進数を判断して数値に変換する - 変換できなければNaNを返す
まとめ - Number.isNaN(+’インドのパン’)は次のように評価される 1. Number.isNaN(‘インドのパン’*1)
まとめ - Number.isNaN(+’インドのパン’)は次のように評価される 1. Number.isNaN(‘インドのパン’*1) 2. Number.isNaN(NaN)
まとめ - Number.isNaN(+’インドのパン’)は次のように評価される 1. Number.isNaN(‘インドのパン’*1) 2. Number.isNaN(NaN) 3. true
まとめ - Number.isNaN(+’インドのパン’)は次のように評価される 1. Number.isNaN(‘インドのパン’*1) 2. Number.isNaN(NaN) 3. true -
インドのパンがナンであることは関係ない
ナンはおいしい🙄