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
プログラミング初心者のぼくが陥った落とし穴 / Traps for programming b...
Search
uoo38
February 21, 2019
Technology
250
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プログラミング初心者のぼくが陥った落とし穴 / Traps for programming beginner
uoo38
February 21, 2019
More Decks by uoo38
See All by uoo38
Algorithm and Data Structre -Graph Algorithm-
uoo38
1
180
コンパイラ開発から学ぶ大規模開発 / Large-Scale Development Learned from Compiler Development
uoo38
0
1.3k
Cコンパイラ自作 / Progress of Developing C Compiler
uoo38
0
840
Other Decks in Technology
See All in Technology
自宅NWにISR4331を導入してみた話
okaits
0
120
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
640
コネクションをピン留めさせずに SELECTクエリのタイムアウトを設定した話
codmoninc
0
200
【Aiming】共通基盤なのに「共通化しない」課金・認証基盤「LINK」が選び取ったシングルテナント戦略と運用の秘訣
saikeda
0
140
SmartHR Engineering Team Deck
smarthr
1
3.4k
8bit CPU 2026
koba789
6
2.6k
トークンマネジメントでAIにとって働きやすい環境を実現する
hikaruegashira
0
140
[potatotips #96] Give Your AI Agent the Flutter Playbook
korodroid
0
140
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
120
Adding Right-to-Left support to your web application with CSS logical properties — Lessons from Redmine
vividtone
0
170
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
2
470
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.6k
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
220
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
470
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
710
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Exploring anti-patterns in Rails
aemeredith
3
470
Paper Plane
katiecoart
PRO
2
53k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Being A Developer After 40
akosma
91
590k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
プログラミング初心者の ぼくが陥った落とし穴 at 静大情報LT大会 -2019年2月-
自己紹介
自己紹介 ソーシャルアカウント
自己紹介 ソーシャルアカウント Twitter: @uoo38 GitHub: uoo38
自己紹介 ソーシャルアカウント Twitter: @uoo38 GitHub: uoo38 高1でプログラミングを初めた
自己紹介 ソーシャルアカウント Twitter: @uoo38 GitHub: uoo38 高1でプログラミングを初めた プログラミング歴約7年の初心者>< 初めてKeynote使ってみた
自己紹介 ソーシャルアカウント Twitter: @uoo38 GitHub: uoo38 高1でプログラミングを初めた プログラミング歴約7年の初心者>< 初めてKeynote使ってみた 使ってみたら結構よかった
比較演算子(復習)
比較演算子(復習) 静的型付け言語(C,Javaなど)における比較演算子
比較演算子(復習) 静的型付け言語(C,Javaなど)における比較演算子 X == Y でXとYが等価のときtrue そうでないときfalse
比較演算子(復習) 静的型付け言語(C,Javaなど)における比較演算子 X == Y でXとYが等価のときtrue そうでないときfalse 関数f()の戻り値のNULLチェック
比較演算子(復習) 静的型付け言語(C,Javaなど)における比較演算子 X == Y でXとYが等価のときtrue そうでないときfalse 関数f()の戻り値のNULLチェック f() ==
NULL って書いた
クイズ
クイズ 1年目くらいで陥った落とし穴
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか)
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ?
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null 2. 37
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null 2. 37 3. 0
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null 2. 37 3. 0 4. false
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null 2. 37 3. 0 4. false 5. “sana”
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null 2. 37 3. 0 4. false 5. “sana” 6. “” (空文字列)
クイズ 1年目くらいで陥った落とし穴 ここは動的型付け言語の世界(JavaScript, PHPとか) 関数f()はエラーのときnullを返す f() == null としたとき true
になるf()の戻り値はどれ? 1. null 2. 37 3. 0 4. false 5. “sana” 6. “” (空文字列) PHPではtrue,JavaScriptではfalse むずすぎ>< PHPではtrue,JavaScriptではfalse PHPではtrue,JavaScriptではfalse
なぜPHPでnull以外が true?
なぜPHPでnull以外が true? たとえば null == 0
なぜPHPでnull以外が true? たとえば null == 0 nullを数値にキャストすると0になる
なぜPHPでnull以外が true? たとえば null == 0 nullを数値にキャストすると0になる (int)null で0を返す
なぜPHPでnull以外が true? たとえば null == 0 nullを数値にキャストすると0になる (int)null で0を返す 比較演算子で暗黙の型変換が行われたので両辺が等価
なぜPHPでnull以外が true? たとえば null == 0 nullを数値にキャストすると0になる (int)null で0を返す 比較演算子で暗黙の型変換が行われたので両辺が等価
暗黙の型変換を防ぐなら f() === null を使おう
クイズ
クイズ • つい最近陥った落とし穴
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 <?php $N = 100; $dummy
= array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?>
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 <?php $N = 100; $dummy
= array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?> N 10^2 10^4 10^6 time(sec) PHP 7.1.23, MacBook Pro 13-inch, 2018, 2.3 GHz Intel Core i5 1.00 × 10−5 2.31 × 10−4 1.86 × 10−2
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 • my_push_back関数はO(1)のアルゴリ ズムだがO(N)で動作しているっぽい <?php $N
= 100; $dummy = array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?> N 10^2 10^4 10^6 time(sec) PHP 7.1.23, MacBook Pro 13-inch, 2018, 2.3 GHz Intel Core i5 1.00 × 10−5 2.31 × 10−4 1.86 × 10−2
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 • my_push_back関数はO(1)のアルゴリ ズムだがO(N)で動作しているっぽい • どこに原因があるか?
<?php $N = 100; $dummy = array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?> N 10^2 10^4 10^6 time(sec) PHP 7.1.23, MacBook Pro 13-inch, 2018, 2.3 GHz Intel Core i5 1.00 × 10−5 2.31 × 10−4 1.86 × 10−2
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 • my_push_back関数はO(1)のアルゴリ ズムだがO(N)で動作しているっぽい • どこに原因があるか?
1. $size = count($arr); <?php $N = 100; $dummy = array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?> N 10^2 10^4 10^6 time(sec) PHP 7.1.23, MacBook Pro 13-inch, 2018, 2.3 GHz Intel Core i5 1.00 × 10−5 2.31 × 10−4 1.86 × 10−2
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 • my_push_back関数はO(1)のアルゴリ ズムだがO(N)で動作しているっぽい • どこに原因があるか?
1. $size = count($arr); 2. $arr[$size] = $n; <?php $N = 100; $dummy = array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?> N 10^2 10^4 10^6 time(sec) PHP 7.1.23, MacBook Pro 13-inch, 2018, 2.3 GHz Intel Core i5 1.00 × 10−5 2.31 × 10−4 1.86 × 10−2
クイズ • つい最近陥った落とし穴 • ここはPHPの世界 • my_push_back関数はO(1)のアルゴリ ズムだがO(N)で動作しているっぽい • どこに原因があるか?
1. $size = count($arr); 2. $arr[$size] = $n; 3. その他 <?php $N = 100; $dummy = array_fill(0, $N, 1); $dummy = my_push_back($dummy, 2); function my_push_back($arr, $n) { $size = count($arr); $arr[$size] = $n; return $arr; } ?> N 10^2 10^4 10^6 time(sec) PHP 7.1.23, MacBook Pro 13-inch, 2018, 2.3 GHz Intel Core i5 1.00 × 10−5 2.31 × 10−4 1.86 × 10−2
どこに原因があったのか
どこに原因があったのか N = 10^6 のとき
どこに原因があったのか N = 10^6 のとき $size = count($arr); 3.10 ×
10−6 sec
どこに原因があったのか N = 10^6 のとき $size = count($arr); $arr[$size] =
$n; 9.05 × 10−6 sec 3.10 × 10−6 sec
どこに原因があったのか N = 10^6 のとき $size = count($arr); $arr[$size] =
$n; 関数呼び出し 約 9.05 × 10−6 sec 3.10 × 10−6 sec 0.01 sec
どこに原因があったのか N = 10^6 のとき $size = count($arr); $arr[$size] =
$n; 関数呼び出し 約 PHPでは引数の受け渡しはディープコピー 9.05 × 10−6 sec 3.10 × 10−6 sec 0.01 sec
どこに原因があったのか N = 10^6 のとき $size = count($arr); $arr[$size] =
$n; 関数呼び出し 約 PHPでは引数の受け渡しはディープコピー 引数の受け渡しにO(N)掛かっていたんだなぁ 9.05 × 10−6 sec 3.10 × 10−6 sec 0.01 sec
どこに原因があったのか N = 10^6 のとき $size = count($arr); $arr[$size] =
$n; 関数呼び出し 約 PHPでは引数の受け渡しはディープコピー 引数の受け渡しにO(N)掛かっていたんだなぁ 引数の前に & を付けると参照渡しになる 9.05 × 10−6 sec 3.10 × 10−6 sec 0.01 sec
どこに原因があったのか N = 10^6 のとき $size = count($arr); $arr[$size] =
$n; 関数呼び出し 約 PHPでは引数の受け渡しはディープコピー 引数の受け渡しにO(N)掛かっていたんだなぁ 引数の前に & を付けると参照渡しになる そしたら10^-6秒くらいで処理されるようになったよ 9.05 × 10−6 sec 3.10 × 10−6 sec 0.01 sec
まとめ
まとめ 動的型付け言語で比較演算子を使うときは === , !=== を 使うこと
まとめ 動的型付け言語で比較演算子を使うときは === , !=== を 使うこと 初めて触る言語については,言語仕様についてよく確認する こと
まとめ 動的型付け言語で比較演算子を使うときは === , !=== を 使うこと 初めて触る言語については,言語仕様についてよく確認する こと 引数の受け渡し方法はディープコピー?シャローコピー?