-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.html
270 lines (206 loc) · 42 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>reveal-md</title>
<link rel="stylesheet" href="./css/reveal.css">
<link rel="stylesheet" href="./css/theme/black.css" id="theme">
<link rel="stylesheet" href="./css/highlight/zenburn.css">
<link rel="stylesheet" href="./css/print/paper.css" type="text/css" media="print">
<link rel="stylesheet" href="./_assets/style.css">
</head>
<body>
<div class="reveal">
<div class="slides"><section data-markdown><script type="text/template">![](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiB2aWV3Qm94PSIwLCAwLCAxMDAsIDEwMCI+CiAgPGcgaWQ9IkxheWVyXzEiPgogICAgPGc+CiAgICAgIDxwYXRoIGQ9Ik0zMC43NSw4NC4yMDkgQzIxLjkxNCw4NC4yMDkgMTQuNzUsNzcuMDQ2IDE0Ljc1LDY4LjIwOSBDMTQuNzUsNTkuMzczIDIxLjkxNCw1Mi4yMDkgMzAuNzUsNTIuMjA5IEMzOS41ODcsNTIuMjA5IDQ2Ljc1LDU5LjM3MyA0Ni43NSw2OC4yMDkgQzQ2Ljc1LDc3LjA0NiAzOS41ODcsODQuMjA5IDMwLjc1LDg0LjIwOSB6IiBmaWxsPSIjRDU2MzVDIi8+CiAgICAgIDxwYXRoIGQ9Ik0zMC43NSw1MC43MDkgQzQwLjQxNSw1MC43MDkgNDguMjUsNTguNTQ0IDQ4LjI1LDY4LjIwOSBDNDguMjUsNzcuODc0IDQwLjQxNSw4NS43MDkgMzAuNzUsODUuNzA5IEMyMS4wODUsODUuNzA5IDEzLjI1LDc3Ljg3NCAxMy4yNSw2OC4yMDkgQzEzLjI1LDU4LjU0NCAyMS4wODUsNTAuNzA5IDMwLjc1LDUwLjcwOSB6IE0zMC43NSw1My43MDkgQzIyLjc0Miw1My43MDkgMTYuMjUsNjAuMjAxIDE2LjI1LDY4LjIwOSBDMTYuMjUsNzYuMjE4IDIyLjc0Miw4Mi43MDkgMzAuNzUsODIuNzA5IEMzOC43NTgsODIuNzA5IDQ1LjI1LDc2LjIxOCA0NS4yNSw2OC4yMDkgQzQ1LjI1LDYwLjIwMSAzOC43NTgsNTMuNzA5IDMwLjc1LDUzLjcwOSB6IiBmaWxsPSIjQ0IzQzMzIi8+CiAgICA8L2c+CiAgICA8Zz4KICAgICAgPHBhdGggZD0iTTcyLjc5OSw4NC4yMDkgQzYzLjk2Miw4NC4yMDkgNTYuNzk5LDc3LjA0NiA1Ni43OTksNjguMjA5IEM1Ni43OTksNTkuMzczIDYzLjk2Miw1Mi4yMDkgNzIuNzk5LDUyLjIwOSBDODEuNjM1LDUyLjIwOSA4OC43OTksNTkuMzczIDg4Ljc5OSw2OC4yMDkgQzg4Ljc5OSw3Ny4wNDYgODEuNjM1LDg0LjIwOSA3Mi43OTksODQuMjA5IHoiIGZpbGw9IiNBQTc5QzEiLz4KICAgICAgPHBhdGggZD0iTTcyLjc5OSw1MC43MDkgQzgyLjQ2NCw1MC43MDkgOTAuMjk5LDU4LjU0NCA5MC4yOTksNjguMjA5IEM5MC4yOTksNzcuODc0IDgyLjQ2NCw4NS43MDkgNzIuNzk5LDg1LjcwOSBDNjMuMTM0LDg1LjcwOSA1NS4yOTksNzcuODc0IDU1LjI5OSw2OC4yMDkgQzU1LjI5OSw1OC41NDQgNjMuMTM0LDUwLjcwOSA3Mi43OTksNTAuNzA5IHogTTcyLjc5OSw1My43MDkgQzY0Ljc5MSw1My43MDkgNTguMjk5LDYwLjIwMSA1OC4yOTksNjguMjA5IEM1OC4yOTksNzYuMjE4IDY0Ljc5MSw4Mi43MDkgNzIuNzk5LDgyLjcwOSBDODAuODA3LDgyLjcwOSA4Ny4yOTksNzYuMjE4IDg3LjI5OSw2OC4yMDkgQzg3LjI5OSw2MC4yMDEgODAuODA3LDUzLjcwOSA3Mi43OTksNTMuNzA5IHoiIGZpbGw9IiM5NTU4QjIiLz4KICAgIDwvZz4KICAgIDxnPgogICAgICA8cGF0aCBkPSJNNTEuNzc3LDQ3Ljc5MSBDNDIuOTQsNDcuNzkxIDM1Ljc3Nyw0MC42MjcgMzUuNzc3LDMxLjc5MSBDMzUuNzc3LDIyLjk1NCA0Mi45NCwxNS43OTEgNTEuNzc3LDE1Ljc5MSBDNjAuNjEzLDE1Ljc5MSA2Ny43NzcsMjIuOTU0IDY3Ljc3NywzMS43OTEgQzY3Ljc3Nyw0MC42MjcgNjAuNjEzLDQ3Ljc5MSA1MS43NzcsNDcuNzkxIHoiIGZpbGw9IiM2MEFENTEiLz4KICAgICAgPHBhdGggZD0iTTUxLjc3NiwxNC4yOTEgQzYxLjQ0MiwxNC4yOTEgNjkuMjc3LDIyLjEyNiA2OS4yNzcsMzEuNzkxIEM2OS4yNzcsNDEuNDU2IDYxLjQ0Miw0OS4yOTEgNTEuNzc3LDQ5LjI5MSBDNDIuMTEyLDQ5LjI5MSAzNC4yNzcsNDEuNDU2IDM0LjI3NywzMS43OTEgQzM0LjI3NywyMi4xMjYgNDIuMTEyLDE0LjI5MSA1MS43NzcsMTQuMjkxIHogTTUxLjc3NiwxNy4yOTEgQzQzLjc2OSwxNy4yOTEgMzcuMjc3LDIzLjc4MyAzNy4yNzcsMzEuNzkxIEMzNy4yNzcsMzkuNzk5IDQzLjc2OSw0Ni4yOTEgNTEuNzc3LDQ2LjI5MSBDNTkuNzg1LDQ2LjI5MSA2Ni4yNzcsMzkuNzk5IDY2LjI3NywzMS43OTEgQzY2LjI3NywyMy43ODMgNTkuNzg1LDE3LjI5MSA1MS43NzcsMTcuMjkxIHoiIGZpbGw9IiMzODk4MjYiLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=) <!-- .element height="10%" width="10%" -->
# Julia
A new programming language *specifically* made for scientists and engineers
<aside class="notes"><p>~5 years ago at MIT</p>
</aside></script></section><section ><section data-markdown><script type="text/template">
# Two-language problem
<aside class="notes"><p>to build complex compiled programs OR to have fast dynamic programs, you have 2 languages involved</p>
</aside></script></section><section data-markdown><script type="text/template">
## Building compiled programs
1. Brain-storm in a dynamic language for algorithm exploration and testing.
2. Deliver a performant final-version in a compiled language.
<aside class="notes"><p>Most compiled programs had a testing stage in a dynamic language</p>
</aside></script></section><section data-markdown><script type="text/template">
## Using dynamic languages
```none
Does a package/library do exactly
what you need?
├── Yes: Great!
├── Dunno: You need to read C/++ code.
└── No: You need to code in C/++.
```
<aside class="notes"><p>R, Python, and MATLAB are coded mostly in C/++. Anything that is fast in those languages is coded in C/++.</p>
</aside></script></section><section data-markdown><script type="text/template">
## What if the dynamic language was fast enough?
* [Benchmarks](https://julialang.org/benchmarks/)
* Solves the two-language problem
* `Julia` is mostly coded in `Julia`!
<aside class="notes"><p>Julia is mostly coded in Julia!</p>
</aside></script></section><section data-markdown><script type="text/template">
## LOC versus speed
![](data:image/png;base64,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)
<aside class="notes"><ol>
<li>I wrote a flexible and fast ray tracer in Julia. It's 100 LOC. </li>
<li>The study "Mash: fast genome and metagenome distance estimation using MinHash" used MinHashing -- a fast algorithm for comparing two sets of things -- for DNA sequence comparison. They implemented it in C for speed. Someone else made python bindings to the compiled C version. But someone implemented it directly in Julia and made it super fast in under 100 lines of very readable code.</li>
</ol>
</aside></script></section></section><section data-markdown><script type="text/template">
# Dynamic & fast, how?
1. Just-in-time compilation (JIT): User-level code is compiled to machine code on-the-fly.
2. Meticulous type system: Designed to maximize impact of JIT.
3. Multiple dispatch: Function dispatch determined at compile time when possible, run time when not.
<aside class="notes"><p>JIT compilation times are slow for first run</p>
</aside></script></section><section ><section data-markdown><script type="text/template">
# Easy code
Looks like `Python`/`MATLAB`/`R` but with prettier syntax.
</script></section><section data-markdown><script type="text/template">
## Syntax
<section style="text-align: left;">
Math:
```julia
2π√3/5α₀
```
`Python`:
```python
2*np.pi*np.sqrt(3)/(5*alpha0)
```
`Julia`:
```julia
2π*√3/5α₀
```
<aside class="notes"><p>Unicode characters, degree symbol, Greek letters, square root, units. Easy to read and understand, scientists are not programmers.</p>
</aside></script></section><section data-markdown><script type="text/template">
## Custom infix operators
```julia
# rotate coordinate `c` by `θ` radians
julia> ↺(c, θ) = [cos(θ) -sin(θ); sin(θ) cos(θ)]*c
↺ (generic function with 1 method)
julia> [1,0] ↺ π/2
2-element Array{Float64,1}:
0.0
1.0
```
<aside class="notes"><p>This opens the door to tons of cool syntax.</p>
</aside></script></section><section data-markdown><script type="text/template">
## Embedded units
It took a beetle 36 seconds to walk 25 cm. How many days will it take it to walk 3 km?
```julia
using Unitful:uconvert, cm, km, s, d
v = 25cm/36s
t = 3km/v
uconvert(d, t)
```
5 days
<aside class="notes"><p>if you use m, cm, feet, degrees, radians, etc</p>
</aside></script></section></section><section data-markdown><script type="text/template">
# Missing
The concept of `missing` and `NaN` is treated correctly:
```julia
julia> NaN + 1 = NaN
julia> missing + 1 = missing
julia> true | NaN ERROR!
julia> true | missing = true
julia> false | missing = missing
julia> true & missing = missing
julia> false & missing = false
```
<aside class="notes"><p>Consider that no other language has managed to get this concept of missing data correctly into their code.</p>
</aside></script></section><section data-markdown><script type="text/template">
# Zero overhead
Full access to all the libraries and functionalities you already know.
`MATLAB.jl`, `RCall.jl`, `PyCall.jl`, `JavaCall.jl`, `Mathematica.jl`, and `ccall` keyword to call `C` (and other languages, like `Fortran` and `Rust`)
<aside class="notes"><p>you can call Julia home without losing all of your furniture in the move.</p>
</aside></script></section><section data-markdown><script type="text/template">
# Some of my favourite things
* [AxisArrays](https://github.com/JuliaArrays/AxisArrays.jl): Arrays where each dimension can have a named axis with ranged values.
* [Images](https://github.com/JuliaImages/Images.jl) & [Colors](https://github.com/JuliaGraphics/Colors.jl): Treat colors as a unit.
* `github` integration: your code and its documentation accessible to everyone, automatically tested on multiple architectures, with coverage reports.
<aside class="notes"><p>Many many more, but it's outside the scope of this presentation, CI</p>
</aside></script></section><section data-markdown><script type="text/template">
# Free & open source
* Easy to share and collaborate with *anyone*
* Drives the language forward
* Highly specialized and niche solutions and tools
* Free from hardware requirements
* No "black boxes", everything is within reach
<aside class="notes"><p>This is true for Python and R, but not MATLAB. Julia got git integration really well.</p>
</aside></script></section><section ><section data-markdown><script type="text/template">
# Disadvantages
Mostly it's just too new…
<aside class="notes"><p>nothing is perfect.</p>
</aside></script></section><section data-markdown><script type="text/template">
## Too new!
* Ecosystems (e.g. packages, IDEs, debugger) not as mature as in other environments.
* Some of the more specialized libraries are missing.
* Harder to Google for answers.
<aside class="notes"><p>IDE (Integrated Development Environment). Maybe in 6 months or so the environment will solidify completely.</p>
</aside></script></section><section data-markdown><script type="text/template">
## Still working out all the kinks
* Loading some packages is still a bit slow.
* Plotting works but hasn't settled yet.
* Transitioning into `v1.0.0`: Major changes.
</script></section><section data-markdown><script type="text/template">
## General purpose
* Need statistics? `R`
* Need vectorized operations on matrices? `MATLAB`
* `Julia` (like `Python`) is more general-purpose → can be harder to find what you're looking for.
<aside class="notes"><p>apropos statistics, Douglas Bates, the developer of the <code>lme4</code> R package for GLMMs switched to Julia.</p>
</aside></script></section></section><section data-markdown><script type="text/template">
# Conclusions
* `Julia` is considered by many one of the best dynamic languages out there.
* A number of libraries already far out-perform their equivalents in other languages.
* People come to `Julia` because of its speed, but stay for the type-dispatch system ♥
* Suffers from being "too new": might not be suitable for early adopters.
<aside class="notes"><p>I've started using Julia about 4 years ago and never looked back.</p>
</aside></script></section><section data-markdown><script type="text/template">
<!-- .slide: data-background-color="#ffffff" -->
![](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMjUiIGhlaWdodD0iMjI1IiB2aWV3Qm94PSIwLCAwLCAzMjUsIDIyNSI+CiAgPGcgaWQ9IkxheWVyXzEiPgogICAgPHBhdGggZD0iTTcyLjg3MiwxNzcuMzExIEM3Mi44NzIsMTg0Ljg0NyA3Mi4wMjQsMTkwLjkzMiA3MC4zMjksMTk1LjU2NyBDNjguNjMzLDIwMC4yMDIgNjYuMjIyLDIwMy44IDYzLjA5NCwyMDYuMzYyIEM1OS45NjcsMjA4LjkyNSA1Ni4yMTcsMjEwLjYzOSA1MS44NDYsMjExLjUwNiBDNDcuNDc2LDIxMi4zNzMgNDIuNjE1LDIxMi44MDYgMzcuMjY0LDIxMi44MDYgQzMwLjAyOSwyMTIuODA2IDI0LjQ5LDIxMS42NzUgMjAuNjQ3LDIwOS40MTQgQzE2LjgwMywyMDcuMTU0IDE0Ljg4MSwyMDQuNDQxIDE0Ljg4MSwyMDEuMjc1IEMxNC44ODEsMTk4LjYzOCAxNS45NTUsMTk2LjQxNSAxOC4xMDMsMTk0LjYwNiBDMjAuMjUxLDE5Mi43OTcgMjMuMTM0LDE5MS44OTMgMjYuNzUxLDE5MS44OTMgQzI5LjQ2NCwxOTEuODkzIDMxLjYzMSwxOTIuNjI4IDMzLjI1MSwxOTQuMDk3IEMzNC44NzIsMTk1LjU2NyAzNi4yMDksMTk3LjAxOCAzNy4yNjQsMTk4LjQ0OSBDMzguNDcsMjAwLjAzMiAzOS40ODcsMjAxLjA4NyA0MC4zMTYsMjAxLjYxNSBDNDEuMTQ1LDIwMi4xNDIgNDEuODk5LDIwMi40MDYgNDIuNTc3LDIwMi40MDYgQzQ0LjAwOSwyMDIuNDA2IDQ1LjEwMiwyMDEuNTU4IDQ1Ljg1NSwxOTkuODYyIEM0Ni42MDksMTk4LjE2NyA0Ni45ODUsMTk0Ljg3IDQ2Ljk4NSwxODkuOTcxIEw0Ni45ODUsOTcuMDUxIEw3Mi44NzIsODkuOTI5IEw3Mi44NzIsMTc3LjMxMSIgZmlsbD0iIzFBMUExQSIvPgogICAgPHBhdGggZD0iTTEwOS43MzksOTIuNDE2IEwxMDkuNzM5LDE1Mi4yMTUgQzEwOS43MzksMTUzLjg3NCAxMTAuMDYsMTU1LjQzNyAxMTAuNywxNTYuOTA3IEMxMTEuMzQxLDE1OC4zNzYgMTEyLjIyNiwxNTkuNjM5IDExMy4zNTcsMTYwLjY5NCBDMTE0LjQ4NywxNjEuNzQ5IDExNS44MDYsMTYyLjU5NiAxMTcuMzEzLDE2My4yMzcgQzExOC44MjEsMTYzLjg3OCAxMjAuNDQxLDE2NC4xOTggMTIyLjE3NCwxNjQuMTk4IEMxMjQuMTM0LDE2NC4xOTggMTI2LjM2LDE2My4xMDEgMTI5LjA2OSwxNjEuMjAyIEMxMzMuMzYzLDE1OC4xOTQgMTM1Ljk2NSwxNTYuMTI3IDEzNS45NjUsMTUzLjY4NSBDMTM1Ljk2NSwxNTMuMDk5IDEzNS45NjUsOTIuNDE2IDEzNS45NjUsOTIuNDE2IEwxNjEuNzM4LDkyLjQxNiBMMTYxLjczOCwxNzcuMzExIEwxMzUuOTY1LDE3Ny4zMTEgTDEzNS45NjUsMTY5LjM5OCBDMTMyLjU3NCwxNzIuMjYyIDEyOC45NTYsMTc0LjU2IDEyNS4xMTMsMTc2LjI5MyBDMTIxLjI3LDE3OC4wMjcgMTE3LjUzOSwxNzguODkzIDExMy45MjIsMTc4Ljg5MyBDMTA5LjcwMiwxNzguODkzIDEwNS43ODMsMTc4LjE5NiAxMDIuMTY1LDE3Ni44MDIgQzk4LjU0OCwxNzUuNDA4IDk1LjM4MywxNzMuNTA1IDkyLjY3LDE3MS4wOTMgQzg5Ljk1NywxNjguNjgyIDg3LjgyOCwxNjUuODU2IDg2LjI4MywxNjIuNjE1IEM4NC43MzksMTU5LjM3NSA4My45NjYsMTU1LjkwOCA4My45NjYsMTUyLjIxNSBMODMuOTY2LDkyLjQxNiBMMTA5LjczOSw5Mi40MTYiIGZpbGw9IiMxQTFBMUEiLz4KICAgIDxwYXRoIGQ9Ik0xOTcuODgxLDE3Ny4zMTEgTDE3Mi4yMjEsMTc3LjMxMSBMMTcyLjIyMSw1OC4yNzggTDE5Ny44ODEsNTEuMTU2IEwxOTcuODgxLDE3Ny4zMTEiIGZpbGw9IiMxQTFBMUEiLz4KICAgIDxwYXRoIGQ9Ik0yMDguNjAzLDk3LjA1MSBMMjM0LjM3Niw4OS45MjkgTDIzNC4zNzYsMTc3LjMxMSBMMjA4LjYwMywxNzcuMzExIEwyMDguNjAzLDk3LjA1MSIgZmlsbD0iIzFBMUExQSIvPgogICAgPHBhdGggZD0iTTI4OC4yMjUsMTMzLjQ1MSBDMjg1LjczOCwxMzQuNTA2IDI4My4yMzIsMTM1LjczMSAyODAuNzA3LDEzNy4xMjQgQzI3OC4xODMsMTM4LjUxOSAyNzUuODg0LDE0MC4wNDUgMjczLjgxMiwxNDEuNzAzIEMyNzEuNzQsMTQzLjM2MSAyNzAuMDYyLDE0NS4xMzIgMjY4Ljc4MiwxNDcuMDE1IEMyNjcuNTAxLDE0OC45IDI2Ni44NiwxNTAuODU5IDI2Ni44NiwxNTIuODk0IEMyNjYuODYsMTU0LjQ3NiAyNjcuMDY3LDE1Ni4wMDIgMjY3LjQ4MSwxNTcuNDcyIEMyNjcuODk2LDE1OC45NDEgMjY4LjQ4LDE2MC4yMDQgMjY5LjIzNCwxNjEuMjU5IEMyNjkuOTg4LDE2Mi4zMTQgMjcwLjgxNiwxNjMuMTYyIDI3MS43MjEsMTYzLjgwMiBDMjcyLjYyNSwxNjQuNDQzIDI3My42MDUsMTY0Ljc2MyAyNzQuNjYsMTY0Ljc2MyBDMjc2Ljc3LDE2NC43NjMgMjc4Ljg5OSwxNjQuMTIzIDI4MS4wNDcsMTYyLjg0MSBDMjgzLjE5NCwxNjEuNTYgMjg1LjU4NywxNTkuOTQgMjg4LjIyNSwxNTcuOTgxIEwyODguMjI1LDEzMy40NTEgeiBNMzE0LjExMSwxNzcuMzExIEwyODguMjI1LDE3Ny4zMTEgTDI4OC4yMjUsMTcwLjUyOCBDMjg2Ljc5MiwxNzEuNzM0IDI4NS4zOTksMTcyLjg0NiAyODQuMDQyLDE3My44NjMgQzI4Mi42ODYsMTc0Ljg4IDI4MS4xNiwxNzUuNzY2IDI3OS40NjQsMTc2LjUxOSBDMjc3Ljc2OCwxNzcuMjczIDI3NS44NjYsMTc3Ljg1NyAyNzMuNzU1LDE3OC4yNzIgQzI3MS42NDUsMTc4LjY4NiAyNjkuMTU4LDE3OC44OTMgMjY2LjI5NSwxNzguODkzIEMyNjIuMzc1LDE3OC44OTMgMjU4Ljg1MywxNzguMzI4IDI1NS43MjUsMTc3LjE5OCBDMjUyLjU5NywxNzYuMDY3IDI0OS45NDEsMTc0LjUyMiAyNDcuNzU2LDE3Mi41NjMgQzI0NS41NzEsMTcwLjYwNCAyNDMuODkzLDE2OC4yODcgMjQyLjcyNSwxNjUuNjExIEMyNDEuNTU4LDE2Mi45MzYgMjQwLjk3MywxNjAuMDE1IDI0MC45NzMsMTU2Ljg1IEMyNDAuOTczLDE1My42MSAyNDEuNTk1LDE1MC42NzEgMjQyLjgzOCwxNDguMDMzIEMyNDQuMDgyLDE0NS4zOTYgMjQ1Ljc3OCwxNDMuMDIyIDI0Ny45MjUsMTQwLjkxMSBDMjUwLjA3MywxMzguODAxIDI1Mi41NzksMTM2LjkxNyAyNTUuNDQzLDEzNS4yNTkgQzI1OC4zMDYsMTMzLjYwMSAyNjEuMzc3LDEzMi4wNzUgMjY0LjY1NSwxMzAuNjgxIEMyNjcuOTM0LDEyOS4yODcgMjcxLjM0NCwxMjguMDA2IDI3NC44ODYsMTI2LjgzOCBDMjc4LjQyNywxMjUuNjcgMjgxLjkzMiwxMjQuNTU4IDI4NS4zOTksMTIzLjUwMyBMMjg4LjIyNSwxMjIuODI1IEwyODguMjI1LDExNC40NTkgQzI4OC4yMjUsMTA5LjAzNCAyODcuMTg4LDEwNS4xOSAyODUuMTE2LDEwMi45MjkgQzI4My4wNDQsMTAwLjY2OCAyODAuMjc0LDk5LjUzOCAyNzYuODA3LDk5LjUzOCBDMjcyLjczOCw5OS41MzggMjY5LjkxMiwxMDAuNTE4IDI2OC4zMjksMTAyLjQ3NyBDMjY2Ljc0NywxMDQuNDM2IDI2NS45NTUsMTA2LjgxIDI2NS45NTUsMTA5LjU5OSBDMjY1Ljk1NSwxMTEuMTgxIDI2NS43ODYsMTEyLjcyNiAyNjUuNDQ3LDExNC4yMzMgQzI2NS4xMDgsMTE1Ljc0MSAyNjQuNTIzLDExNy4wNTkgMjYzLjY5NSwxMTguMTkgQzI2Mi44NjYsMTE5LjMyIDI2MS42NzksMTIwLjIyNSAyNjAuMTM0LDEyMC45MDMgQzI1OC41ODksMTIxLjU4MSAyNTYuNjQ5LDEyMS45MiAyNTQuMzEyLDEyMS45MiBDMjUwLjY5NSwxMjEuOTIgMjQ3Ljc1NiwxMjAuODg0IDI0NS40OTUsMTE4LjgxMiBDMjQzLjIzNCwxMTYuNzM5IDI0Mi4xMDQsMTE0LjEyIDI0Mi4xMDQsMTEwLjk1NSBDMjQyLjEwNCwxMDguMDE2IDI0My4xMDIsMTA1LjI4NCAyNDUuMDk5LDEwMi43NiBDMjQ3LjA5NywxMDAuMjM1IDI0OS43OSw5OC4wNjggMjUzLjE4Miw5Ni4yNiBDMjU2LjU3Myw5NC40NTEgMjYwLjQ5Miw5My4wMTkgMjY0LjkzOCw5MS45NjQgQzI2OS4zODQsOTAuOTA5IDI3NC4wOTQsOTAuMzgyIDI3OS4wNjgsOTAuMzgyIEMyODUuMTczLDkwLjM4MiAyOTAuNDI5LDkwLjkyOCAyOTQuODM4LDkyLjAyMSBDMjk5LjI0Niw5My4xMTQgMzAyLjg4Myw5NC42NzcgMzA1Ljc0Niw5Ni43MTIgQzMwOC42MDksOTguNzQ3IDMxMC43MiwxMDEuMTk2IDMxMi4wNzYsMTA0LjA2IEMzMTMuNDMzLDEwNi45MjMgMzE0LjExMSwxMTAuMTI3IDMxNC4xMTEsMTEzLjY2OCBMMzE0LjExMSwxNzcuMzExIiBmaWxsPSIjMUExQTFBIi8+CiAgPC9nPgogIDxnIGlkPSJMYXllcl8yIj4KICAgIDxnPgogICAgICA8cGF0aCBkPSJNMjIyLjc3Miw4NC4wOTEgQzIxMy45MzYsODQuMDkxIDIwNi43NzIsNzYuOTI4IDIwNi43NzIsNjguMDkxIEMyMDYuNzcyLDU5LjI1NSAyMTMuOTM2LDUyLjA5MSAyMjIuNzcyLDUyLjA5MSBDMjMxLjYwOSw1Mi4wOTEgMjM4Ljc3Miw1OS4yNTUgMjM4Ljc3Miw2OC4wOTEgQzIzOC43NzIsNzYuOTI4IDIzMS42MDksODQuMDkxIDIyMi43NzIsODQuMDkxIHoiIGZpbGw9IiNENTYzNUMiLz4KICAgICAgPHBhdGggZD0iTTIyMi43NzIsNTAuNTkxIEMyMzIuNDM3LDUwLjU5MSAyNDAuMjcyLDU4LjQyNiAyNDAuMjcyLDY4LjA5MSBDMjQwLjI3Miw3Ny43NTYgMjMyLjQzNyw4NS41OTEgMjIyLjc3Miw4NS41OTEgQzIxMy4xMDcsODUuNTkxIDIwNS4yNzIsNzcuNzU2IDIwNS4yNzIsNjguMDkxIEMyMDUuMjcyLDU4LjQyNiAyMTMuMTA3LDUwLjU5MSAyMjIuNzcyLDUwLjU5MSB6IE0yMjIuNzcyLDUzLjU5MSBDMjE0Ljc2NCw1My41OTEgMjA4LjI3Miw2MC4wODMgMjA4LjI3Miw2OC4wOTEgQzIwOC4yNzIsNzYuMDk5IDIxNC43NjQsODIuNTkxIDIyMi43NzIsODIuNTkxIEMyMzAuNzgxLDgyLjU5MSAyMzcuMjcyLDc2LjA5OSAyMzcuMjcyLDY4LjA5MSBDMjM3LjI3Miw2MC4wODMgMjMwLjc4MSw1My41OTEgMjIyLjc3Miw1My41OTEgeiIgZmlsbD0iI0NCM0MzMyIvPgogICAgPC9nPgogICAgPGc+CiAgICAgIDxwYXRoIGQ9Ik02MC40NTQsODQuMDkxIEM1MS42MTgsODQuMDkxIDQ0LjQ1NCw3Ni45MjggNDQuNDU0LDY4LjA5MSBDNDQuNDU0LDU5LjI1NSA1MS42MTgsNTIuMDkxIDYwLjQ1NCw1Mi4wOTEgQzY5LjI5MSw1Mi4wOTEgNzYuNDU0LDU5LjI1NSA3Ni40NTQsNjguMDkxIEM3Ni40NTQsNzYuOTI4IDY5LjI5MSw4NC4wOTEgNjAuNDU0LDg0LjA5MSB6IiBmaWxsPSIjNjY4MkUwIi8+CiAgICAgIDxwYXRoIGQ9Ik02MC40NTQsNTAuNTkxIEM3MC4xMTksNTAuNTkxIDc3Ljk1NCw1OC40MjYgNzcuOTU0LDY4LjA5MSBDNzcuOTU0LDc3Ljc1NiA3MC4xMTksODUuNTkxIDYwLjQ1NCw4NS41OTEgQzUwLjc4OSw4NS41OTEgNDIuOTU0LDc3Ljc1NiA0Mi45NTQsNjguMDkxIEM0Mi45NTQsNTguNDI2IDUwLjc4OSw1MC41OTEgNjAuNDU0LDUwLjU5MSB6IE02MC40NTQsNTMuNTkxIEM1Mi40NDYsNTMuNTkxIDQ1Ljk1NCw2MC4wODMgNDUuOTU0LDY4LjA5MSBDNDUuOTU0LDc2LjA5OSA1Mi40NDYsODIuNTkxIDYwLjQ1NCw4Mi41OTEgQzY4LjQ2Miw4Mi41OTEgNzQuOTU0LDc2LjA5OSA3NC45NTQsNjguMDkxIEM3NC45NTQsNjAuMDgzIDY4LjQ2Miw1My41OTEgNjAuNDU0LDUzLjU5MSB6IiBmaWxsPSIjNDA2M0Q4Ii8+CiAgICA8L2c+CiAgICA8Zz4KICAgICAgPHBhdGggZD0iTTI2NC44MjEsODQuMDkxIEMyNTUuOTg0LDg0LjA5MSAyNDguODIxLDc2LjkyOCAyNDguODIxLDY4LjA5MSBDMjQ4LjgyMSw1OS4yNTUgMjU1Ljk4NCw1Mi4wOTEgMjY0LjgyMSw1Mi4wOTEgQzI3My42NTgsNTIuMDkxIDI4MC44MjEsNTkuMjU1IDI4MC44MjEsNjguMDkxIEMyODAuODIxLDc2LjkyOCAyNzMuNjU4LDg0LjA5MSAyNjQuODIxLDg0LjA5MSB6IiBmaWxsPSIjQUE3OUMxIi8+CiAgICAgIDxwYXRoIGQ9Ik0yNjQuODIxLDUwLjU5MSBDMjc0LjQ4Niw1MC41OTEgMjgyLjMyMSw1OC40MjYgMjgyLjMyMSw2OC4wOTEgQzI4Mi4zMjEsNzcuNzU2IDI3NC40ODYsODUuNTkxIDI2NC44MjEsODUuNTkxIEMyNTUuMTU2LDg1LjU5MSAyNDcuMzIxLDc3Ljc1NiAyNDcuMzIxLDY4LjA5MSBDMjQ3LjMyMSw1OC40MjYgMjU1LjE1Niw1MC41OTEgMjY0LjgyMSw1MC41OTEgeiBNMjY0LjgyMSw1My41OTEgQzI1Ni44MTMsNTMuNTkxIDI1MC4zMjEsNjAuMDgzIDI1MC4zMjEsNjguMDkxIEMyNTAuMzIxLDc2LjA5OSAyNTYuODEzLDgyLjU5MSAyNjQuODIxLDgyLjU5MSBDMjcyLjgyOSw4Mi41OTEgMjc5LjMyMSw3Ni4wOTkgMjc5LjMyMSw2OC4wOTEgQzI3OS4zMjEsNjAuMDgzIDI3Mi44MjksNTMuNTkxIDI2NC44MjEsNTMuNTkxIHoiIGZpbGw9IiM5NTU4QjIiLz4KICAgIDwvZz4KICAgIDxnPgogICAgICA8cGF0aCBkPSJNMjQzLjc5OSw0Ny42NzIgQzIzNC45NjIsNDcuNjcyIDIyNy43OTksNDAuNTA5IDIyNy43OTksMzEuNjcyIEMyMjcuNzk5LDIyLjgzNiAyMzQuOTYyLDE1LjY3MiAyNDMuNzk5LDE1LjY3MiBDMjUyLjYzNiwxNS42NzIgMjU5Ljc5OSwyMi44MzYgMjU5Ljc5OSwzMS42NzIgQzI1OS43OTksNDAuNTA5IDI1Mi42MzYsNDcuNjcyIDI0My43OTksNDcuNjcyIHoiIGZpbGw9IiM2MEFENTEiLz4KICAgICAgPHBhdGggZD0iTTI0My43OTksMTQuMTcyIEMyNTMuNDY0LDE0LjE3MiAyNjEuMjk5LDIyLjAwNyAyNjEuMjk5LDMxLjY3MiBDMjYxLjI5OSw0MS4zMzcgMjUzLjQ2NCw0OS4xNzIgMjQzLjc5OSw0OS4xNzIgQzIzNC4xMzQsNDkuMTcyIDIyNi4yOTksNDEuMzM3IDIyNi4yOTksMzEuNjcyIEMyMjYuMjk5LDIyLjAwNyAyMzQuMTM0LDE0LjE3MiAyNDMuNzk5LDE0LjE3MiB6IE0yNDMuNzk5LDE3LjE3MiBDMjM1Ljc5MSwxNy4xNzIgMjI5LjI5OSwyMy42NjQgMjI5LjI5OSwzMS42NzIgQzIyOS4yOTksMzkuNjgxIDIzNS43OTEsNDYuMTcyIDI0My43OTksNDYuMTcyIEMyNTEuODA3LDQ2LjE3MiAyNTguMjk5LDM5LjY4MSAyNTguMjk5LDMxLjY3MiBDMjU4LjI5OSwyMy42NjQgMjUxLjgwNywxNy4xNzIgMjQzLjc5OSwxNy4xNzIgeiIgZmlsbD0iIzM4OTgyNiIvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==) <!-- .element height="100%" width="100%" -->
</script></section></div>
</div>
<script src="./lib/js/head.min.js"></script>
<script src="./js/reveal.js"></script>
<script>
function extend() {
var target = {};
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key];
}
}
}
return target;
}
// Optional libraries used to extend on reveal.js
var deps = [
{ src: './lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: './plugin/markdown/marked.js', condition: function() { return !!document.querySelector('[data-markdown]'); } },
{ src: './plugin/markdown/markdown.js', condition: function() { return !!document.querySelector('[data-markdown]'); } },
{ src: './plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: './plugin/zoom-js/zoom.js', async: true },
{ src: './plugin/notes/notes.js', async: true },
{ src: './plugin/math/math.js', async: true }
];
// default options to init reveal.js
var defaultOptions = {
controls: true,
progress: true,
history: true,
center: true,
transition: 'default', // none/fade/slide/convex/concave/zoom
dependencies: deps
};
// options from URL query string
var queryOptions = Reveal.getQueryHash() || {};
var options = {};
options = extend(defaultOptions, options, queryOptions);
</script>
<script>
Reveal.initialize(options);
</script>
</body>
</html>