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
13
インドのパンについての話 / a story about Indian bread
Arata
July 26, 2020
Tweet
Share
More Decks by Arata
See All by Arata
コードエディターのシンタックスハイライトの話
arata_nvm
0
87
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
35
TableGenの言語サーバーをつくる
arata_nvm
0
480
pwn入門 / introduction to pwn
arata_nvm
1
2k
TableGenと和解せよ / make peace with TableGen
arata_nvm
0
85
sudo-rsのテストの話 / story of sudo-rs testing
arata_nvm
1
130
ソースコードリーディングはいいぞ / source code reading is good
arata_nvm
0
53
ネットワーク委員会活動報告 / network committee activity report
arata_nvm
0
16
Twitter専用のPCを作る / create a dedicated Twitter PC
arata_nvm
0
39
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
How GitHub (no longer) Works
holman
311
140k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Designing Experiences People Love
moore
138
23k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
Faster Mobile Websites
deanohume
305
30k
Thoughts on Productivity
jonyablonski
67
4.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
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 -
インドのパンがナンであることは関係ない
ナンはおいしい🙄