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
830
Other Decks in Technology
See All in Technology
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
310
PHPで作って学ぶリアルタイム音声対話AIとWebSocket入門 by ムナカタ
munakata
0
150
41歳でAWSが好きすぎてITエンジニアになったおっさんの話
yama3133
1
760
AI時代の開発生産性を捉え直す — 経営と現場をつなぐ「開発組織のオブザーバビリティ」— / AI Dev Ex Conference 2026
tkyowa
1
1.5k
[Droidcon Orlando '26] The Android Lens: Applying Mobile Forensics to AI Performance
amanda_hinchman
1
110
論語・武士道・産業革命から見る かわるもの、かわらないもの
ichimichi
5
520
文字起こし基盤の信頼性
abnoumaru
0
130
なぜ、あなたのAPIは使われないのか? AX時代の設計原則、ガードレール、運用体制
yokawasa
1
220
Claude Mythos、Fable...フロンティアAIの最新動向と企業のセキュリティ対策
flatt_security
0
130
”AIを使う” から ”AIに任せる” へ ─ 開発プロセスを再設計してAIを組織標準にするまで
cyberagentdevelopers
PRO
2
140
変更し続けられるシステムをどう保つか — AI時代のSSoTという設計原則
kawauso
1
1.2k
ダッシュボード"開発"について 〜使われるダッシュボードのつくりかた〜
kimichan
0
210
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
660
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
Everyday Curiosity
cassininazir
0
260
Building Adaptive Systems
keathley
44
3.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
The SEO identity crisis: Don't let AI make you average
varn
0
520
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
The Curious Case for Waylosing
cassininazir
1
440
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
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
まとめ
まとめ 動的型付け言語で比較演算子を使うときは === , !=== を 使うこと
まとめ 動的型付け言語で比較演算子を使うときは === , !=== を 使うこと 初めて触る言語については,言語仕様についてよく確認する こと
まとめ 動的型付け言語で比較演算子を使うときは === , !=== を 使うこと 初めて触る言語については,言語仕様についてよく確認する こと 引数の受け渡し方法はディープコピー?シャローコピー?