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
14
インドのパンについての話 / a story about Indian bread
Arata
July 26, 2020
Tweet
Share
More Decks by Arata
See All by Arata
コードエディターのシンタックスハイライトの話
arata_nvm
0
94
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
39
TableGenの言語サーバーをつくる
arata_nvm
0
490
pwn入門 / introduction to pwn
arata_nvm
1
2k
TableGenと和解せよ / make peace with TableGen
arata_nvm
0
88
sudo-rsのテストの話 / story of sudo-rs testing
arata_nvm
1
140
ソースコードリーディングはいいぞ / source code reading is good
arata_nvm
0
54
ネットワーク委員会活動報告 / network committee activity report
arata_nvm
0
16
Twitter専用のPCを作る / create a dedicated Twitter PC
arata_nvm
0
43
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
We Have a Design System, Now What?
morganepeng
51
7.3k
Optimizing for Happiness
mojombo
376
70k
The Invisible Side of Design
smashingmag
299
50k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
113
50k
Building Applications with DynamoDB
mza
93
6.2k
Code Review Best Practice
trishagee
65
17k
Unsuck your backbone
ammeep
669
57k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.5k
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 -
インドのパンがナンであることは関係ない
ナンはおいしい🙄