Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
No content
Slide 2
Slide 2 text
@listochkin
Slide 3
Slide 3 text
Ember
Slide 4
Slide 4 text
2018 Looks like Vue Tons of components WASM SSR Preact speeds
Slide 5
Slide 5 text
Awesome?
Slide 6
Slide 6 text
You tell me! No UI in 3? years
Slide 7
Slide 7 text
jQuery React
Slide 8
Slide 8 text
You don’t need a UI
Slide 9
Slide 9 text
Email Calendar CRM Sms Phone API
Slide 10
Slide 10 text
No content
Slide 11
Slide 11 text
Math Physics
Slide 12
Slide 12 text
Programming Languages
Slide 13
Slide 13 text
=> async
Slide 14
Slide 14 text
conditions loops functions data-types
Slide 15
Slide 15 text
Binary Hardware
Slide 16
Slide 16 text
Reality <-> Digital
Slide 17
Slide 17 text
UI
Slide 18
Slide 18 text
Messy Inconsistent Illogical
Slide 19
Slide 19 text
Humans
Slide 20
Slide 20 text
Logical Wise Sentient Decision-makers
Slide 21
Slide 21 text
Emotional Greasy Impulsive Reactionary
Slide 22
Slide 22 text
Math Poetry Music Art
Slide 23
Slide 23 text
Logical and Illogical Consistent and Inconsistent
Slide 24
Slide 24 text
Programmers’ Minefield
Slide 25
Slide 25 text
Human data
Slide 26
Slide 26 text
Text Numbers Time Color & Sound Smell & Taste
Slide 27
Slide 27 text
Logical yet inconsistent
Slide 28
Slide 28 text
2018
Slide 29
Slide 29 text
3 golden rules
Slide 30
Slide 30 text
Store time in UTC
Slide 31
Slide 31 text
Unicode and UTF-8
Slide 32
Slide 32 text
Fixed-point decimals or integers for Money
Slide 33
Slide 33 text
Store time in UTC Unicode and UTF-8 Fixed-point decimals or integers for Money
Slide 34
Slide 34 text
Bad News
Slide 35
Slide 35 text
Bad News #1 Not everybody does it
Slide 36
Slide 36 text
Bad News #2 These rules aren’t enough
Slide 37
Slide 37 text
There was a bank
Slide 38
Slide 38 text
Loans Principal + Interest Monthly Installments
Slide 39
Slide 39 text
SMS Reminder
Slide 40
Slide 40 text
Every month 3 days before payment due at 10:00 am
Slide 41
Slide 41 text
1. Find the right date
Slide 42
Slide 42 text
29th -> 26th
Slide 43
Slide 43 text
Move to 25th for February
Slide 44
Slide 44 text
Except Leap Year
Slide 45
Slide 45 text
Except when that date ends up being a weekend or a bank holiday
Slide 46
Slide 46 text
2. Find the right time
Slide 47
Slide 47 text
10:00 am
Slide 48
Slide 48 text
Time Zones
Slide 49
Slide 49 text
Time Offset vs Time Zone
Slide 50
Slide 50 text
No content
Slide 51
Slide 51 text
No content
Slide 52
Slide 52 text
UTC+2 Finland Ukraine South Africa
Slide 53
Slide 53 text
UTC+3 Finland Ukraine UTC+2 South Africa
Slide 54
Slide 54 text
Time Zones
Slide 55
Slide 55 text
tzdata
Slide 56
Slide 56 text
“Timestamp with timezone” is a lie
Slide 57
Slide 57 text
Timestamp with timezone offset
Slide 58
Slide 58 text
User time = Local DateTime + TimeZone Name
Slide 59
Slide 59 text
Almost nobody does it today
Slide 60
Slide 60 text
Location -> TimeZone
Slide 61
Slide 61 text
APIs Local datasets
Slide 62
Slide 62 text
Moving target
Slide 63
Slide 63 text
tzdata 2018c 10+ releases a year Often bundled with other software
Slide 64
Slide 64 text
App-tzdata Database-tzdata System-tzdata
Slide 65
Slide 65 text
Time Math can be surprising!
Slide 66
Slide 66 text
1. Do it in a single place 2. Update tzdata regularly
Slide 67
Slide 67 text
Numbers
Slide 68
Slide 68 text
Number Base
Slide 69
Slide 69 text
Base 10 0.5 0.111 ⅓
Slide 70
Slide 70 text
Base 10 Financial Data
Slide 71
Slide 71 text
0.1 + 0.2 = 0.30000000000000004
Slide 72
Slide 72 text
True for almost all languages
Slide 73
Slide 73 text
Intel 1977
Slide 74
Slide 74 text
Sign Fraction Exponent
Slide 75
Slide 75 text
(1 + F) * 2^E
Slide 76
Slide 76 text
IEEE 754 - 1985, 2008
Slide 77
Slide 77 text
Money
Slide 78
Slide 78 text
“Use fixed point numbers”
Slide 79
Slide 79 text
+ - *
Slide 80
Slide 80 text
/
Slide 81
Slide 81 text
%
Slide 82
Slide 82 text
Installments
Slide 83
Slide 83 text
(Interest + Premium) / Duration
Slide 84
Slide 84 text
Typical durations: 3, 6, 12, 24, 120, etc
Slide 85
Slide 85 text
Nonoptimal for Base-2
Slide 86
Slide 86 text
Rounding
Slide 87
Slide 87 text
10.265
Slide 88
Slide 88 text
Round-half-up for all installments but the last one
Slide 89
Slide 89 text
10.265 => 10.27
Slide 90
Slide 90 text
Skews the effective rate up Need to compensate
Slide 91
Slide 91 text
Last installment
Slide 92
Slide 92 text
Round-half-to-even Banking rounding
Slide 93
Slide 93 text
10.265 => 10.26 6 is even 7 is add
Slide 94
Slide 94 text
Math.round() Always half-up
Slide 95
Slide 95 text
CSS
Slide 96
Slide 96 text
Text
Slide 97
Slide 97 text
Writing systems Right-to-left Top-to-bottom Graphemes vs Characters
Slide 98
Slide 98 text
6-bit => 7-bit (ASCII) 8-bit CP-1251, koi8-u 16-bit - GB, Big5, Shift-JIS
Slide 99
Slide 99 text
Unicode
Slide 100
Slide 100 text
Let’s encode every writing
Slide 101
Slide 101 text
2 bytes should be enough
Slide 102
Slide 102 text
Windows macOS iOS JavaScript
Slide 103
Slide 103 text
0 - 10FFFFFF
Slide 104
Slide 104 text
UCS-2 => UTF-16 Surrogate pairs
Slide 105
Slide 105 text
1101 10xx xxxx xxxx 1101 11xx xxxx xxxx
Slide 106
Slide 106 text
UTF-8
Slide 107
Slide 107 text
Linux Android Networking Databases
Slide 108
Slide 108 text
iOS device Network Server
Slide 109
Slide 109 text
UTF-8 <=> UTF-16
Slide 110
Slide 110 text
UTF-16 => UTF-8
Slide 111
Slide 111 text
Correct: 2 surrogate pairs Codepoint Re-encode as 3-4 byte UTF-8
Slide 112
Slide 112 text
Practical: Take each surrogate separately 2 codepoints Re-encode as 2 * (3 - 4) byte UTF-8
Slide 113
Slide 113 text
Non-valid UTF-8 bytes CESU-8
Slide 114
Slide 114 text
NULL-byte
Slide 115
Slide 115 text
“Modified UTF-8” Often CESU-8-encoded
Slide 116
Slide 116 text
CESU-8 Oracle MySQL Java Desktop software
Slide 117
Slide 117 text
Forbidden on Web
Slide 118
Slide 118 text
Codepoint vs Character vs Glyph
Slide 119
Slide 119 text
No content
Slide 120
Slide 120 text
U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466
Slide 121
Slide 121 text
1 glyph 7 codepoints
Slide 122
Slide 122 text
Cyrillic small letter ha combining breve
Slide 123
Slide 123 text
No content
Slide 124
Slide 124 text
देवनागर Devanagari
Slide 125
Slide 125 text
split substr
Slide 126
Slide 126 text
Unicode-aware regular expressions
Slide 127
Slide 127 text
/\p{Alpha}/u
Slide 128
Slide 128 text
Unicode is not always the answer
Slide 129
Slide 129 text
Han Unification
Slide 130
Slide 130 text
No content
Slide 131
Slide 131 text
Serbian б
Ukrainian б
Slide 132
Slide 132 text
No content
Slide 133
Slide 133 text
Now imagine this for almost every letter
Slide 134
Slide 134 text
Traditional Chinese Simplified Chinese Japanese (Kanji) Korean (Hanja) Vietnamese (Chữ Nôm)
Slide 135
Slide 135 text
No content
Slide 136
Slide 136 text
Plain-text document in 2 CJK languages? Show historic and modern kanji variants? Impossible in Unicode
Slide 137
Slide 137 text
Errors Inaccuracies Ambiguities
Slide 138
Slide 138 text
HTML
Slide 139
Slide 139 text
No Browser API to detect User Input Language
Slide 140
Slide 140 text
window.navigator.languages Statistical methods
Slide 141
Slide 141 text
Sorting
Slide 142
Slide 142 text
Collation
Slide 143
Slide 143 text
Harald Henrik Haakon
Slide 144
Slide 144 text
aa <=> å … x y z æ ø å
Slide 145
Slide 145 text
Sorting is not always character-based
Slide 146
Slide 146 text
kanji 漢字 hiragana (ひらがな / 平仮名) katakana (カタカナ / 片仮名) rōmaji
Slide 147
Slide 147 text
ラドクリフ、マラソン 五輪代表に 1万m出場にも含み
Slide 148
Slide 148 text
Can’t sort text in Kanji
Slide 149
Slide 149 text
No content
Slide 150
Slide 150 text
Search
Slide 151
Slide 151 text
ñ U+006E U+0303 U+00F1
Slide 152
Slide 152 text
Composed Decomposed Canonical Compatibility
Slide 153
Slide 153 text
O ffi ce O f f i ce
Slide 154
Slide 154 text
NKFD Compatible Decomposed
Slide 155
Slide 155 text
Key is to have all strings normalized the same way!
Slide 156
Slide 156 text
ICU
Slide 157
Slide 157 text
International Components for Unicode
Slide 158
Slide 158 text
Iteration Collation Formatting for text and datetimes Normalization
Slide 159
Slide 159 text
~30 MiB
Slide 160
Slide 160 text
JavaScript ECMA-402 Intl
Slide 161
Slide 161 text
Not included in Node by default
Slide 162
Slide 162 text
Be extra careful!
Slide 163
Slide 163 text
No content
Slide 164
Slide 164 text
Every developer made mistakes handling these kinds of data
Slide 165
Slide 165 text
Non-obvious Dormant Painful to find, test, and fix
Slide 166
Slide 166 text
Very expensive bugs
Slide 167
Slide 167 text
Demand knowledge
Slide 168
Slide 168 text
while if Unicode
Slide 169
Slide 169 text
Check your software Teach your team-mates Screen at the interview
Slide 170
Slide 170 text
No content
Slide 171
Slide 171 text
Time Numbers Text @listochkin