WEBVTT

1
00:00:00.120 --> 00:00:03.560
<v Speaker 1>Welcome to the deep dive. You send us practical Julia

2
00:00:03.600 --> 00:00:07.559
<v Speaker 1>dot pdf, and we're going to explore why this language,

3
00:00:07.639 --> 00:00:10.839
<v Speaker 1>Julia is making ways, especially in science and tech.

4
00:00:11.039 --> 00:00:13.919
<v Speaker 2>Exactly. Our mission really is to pull out the key

5
00:00:13.960 --> 00:00:16.760
<v Speaker 2>ideas about what makes Julia special and why it could

6
00:00:16.800 --> 00:00:19.120
<v Speaker 2>be a well, a really useful tool for you.

7
00:00:19.559 --> 00:00:22.640
<v Speaker 1>Think of this as the quick guide to Julia's main straints.

8
00:00:23.160 --> 00:00:25.559
<v Speaker 1>We want to hit the highlights what really sets it

9
00:00:25.600 --> 00:00:28.679
<v Speaker 1>apart without getting totally bogged down in every little command.

10
00:00:28.800 --> 00:00:30.039
<v Speaker 2>Yeah, keep it focused.

11
00:00:30.160 --> 00:00:32.479
<v Speaker 1>It's got quite an origin story actually came out of

12
00:00:32.600 --> 00:00:37.280
<v Speaker 1>MIT back in twenty twelve. The creators were they jokingly

13
00:00:37.320 --> 00:00:39.880
<v Speaker 1>call themselves greedy, greedy in what way they wandered it

14
00:00:39.920 --> 00:00:41.799
<v Speaker 1>all in one language. They're the ease of use you

15
00:00:41.799 --> 00:00:43.240
<v Speaker 1>get from something like Python.

16
00:00:43.000 --> 00:00:45.520
<v Speaker 2>Uh huh, the interactive feel, right yeah.

17
00:00:45.280 --> 00:00:47.960
<v Speaker 1>But also the raw speed, the high performance you usually

18
00:00:48.000 --> 00:00:50.240
<v Speaker 1>need languages like C or Fortran four.

19
00:00:50.719 --> 00:00:53.240
<v Speaker 2>Okay, so the best of both worlds. And yeah, if

20
00:00:53.280 --> 00:00:58.280
<v Speaker 2>you've used interactive environments Pythons, repl matt Lab, Octave, some

21
00:00:58.320 --> 00:01:00.560
<v Speaker 2>parts of Julia will feel pretty familiar, like.

22
00:01:00.520 --> 00:01:02.479
<v Speaker 1>Typing a command and getting an answer straight.

23
00:01:02.280 --> 00:01:06.159
<v Speaker 2>Away exactly that and defining variables on the fly, not

24
00:01:06.200 --> 00:01:10.159
<v Speaker 2>always needing to specify their type beforehand. That feels comfortable,

25
00:01:10.280 --> 00:01:10.959
<v Speaker 2>right it does.

26
00:01:11.359 --> 00:01:13.879
<v Speaker 1>But okay, let's pivot slightly because this is where Julia

27
00:01:13.959 --> 00:01:16.079
<v Speaker 1>gets well, really unique, isn't it?

28
00:01:16.359 --> 00:01:20.840
<v Speaker 2>Definitely? What makes it stand out, especially for scientists and engineers,

29
00:01:21.079 --> 00:01:23.239
<v Speaker 2>is this thing called multiple dispatch.

30
00:01:23.480 --> 00:01:26.799
<v Speaker 1>Multiple dispatch sounds technical, it is a bit, but the

31
00:01:26.920 --> 00:01:27.959
<v Speaker 1>concept is key.

32
00:01:28.400 --> 00:01:32.159
<v Speaker 2>It's powered by Julia's type system, which is very sophisticated,

33
00:01:32.599 --> 00:01:35.840
<v Speaker 2>and it's this feature, combined with the interactivity and the

34
00:01:35.879 --> 00:01:37.840
<v Speaker 2>speed that's driving its adoption.

35
00:01:38.280 --> 00:01:40.560
<v Speaker 1>So what does multiple dispatch do differently?

36
00:01:41.000 --> 00:01:43.640
<v Speaker 2>Okay, so imagine you want to add two things in

37
00:01:43.680 --> 00:01:46.040
<v Speaker 2>many languages, the decision of how to add them depends

38
00:01:46.120 --> 00:01:48.239
<v Speaker 2>only on the type of the first thing. Right, With

39
00:01:48.359 --> 00:01:51.000
<v Speaker 2>multiple dispatches, Julia looks at the types of all the

40
00:01:51.040 --> 00:01:54.159
<v Speaker 2>things involved. So adding an integer and a floating point

41
00:01:54.239 --> 00:01:56.920
<v Speaker 2>number might use a different internal method than adding two

42
00:01:57.000 --> 00:01:59.400
<v Speaker 2>integers or adding an integer in a fraction.

43
00:01:59.640 --> 00:02:02.680
<v Speaker 1>Ah. So it picks the most specific recipe based on

44
00:02:02.760 --> 00:02:04.519
<v Speaker 1>everything you give it precisely.

45
00:02:04.920 --> 00:02:08.719
<v Speaker 2>That makes it incredibly flexible and crucially very fast when

46
00:02:08.759 --> 00:02:10.560
<v Speaker 2>you're dealing with all the different kinds of data you

47
00:02:10.599 --> 00:02:11.919
<v Speaker 2>find in scientific computing.

48
00:02:12.159 --> 00:02:15.879
<v Speaker 1>Interesting. Okay, so the material you sent practical Julia. How

49
00:02:15.879 --> 00:02:17.759
<v Speaker 1>does it structure this give us the roadmap?

50
00:02:17.879 --> 00:02:22.639
<v Speaker 2>Sure, it starts naturally with the basics, setting things up,

51
00:02:22.680 --> 00:02:24.919
<v Speaker 2>the syntax, the fundamental building.

52
00:02:24.599 --> 00:02:26.400
<v Speaker 1>Blocks, the usual starting point. Yep.

53
00:02:26.680 --> 00:02:31.280
<v Speaker 2>Then it moves into organizing code, modules, packages, then visualization

54
00:02:31.439 --> 00:02:32.240
<v Speaker 2>which is huge.

55
00:02:32.360 --> 00:02:34.199
<v Speaker 1>Plotting yeah, always important, Then.

56
00:02:34.120 --> 00:02:38.560
<v Speaker 2>Different ways to store data collections. It even gets into metaprogramming.

57
00:02:38.000 --> 00:02:40.039
<v Speaker 1>Whoa code that writes code.

58
00:02:39.879 --> 00:02:44.639
<v Speaker 2>Essentially, Yeah, pretty advanced stuff. Then things like diagrams, animations,

59
00:02:44.879 --> 00:02:49.120
<v Speaker 2>the type sister itself in detail, handling physical units. Wow, okay,

60
00:02:49.360 --> 00:02:54.800
<v Speaker 2>And finally it shows Julia in action across different fields physics, biology, stats, math,

61
00:02:55.039 --> 00:02:58.280
<v Speaker 2>signal processing, image analysis, even parallel computing.

62
00:02:58.400 --> 00:02:59.599
<v Speaker 1>So it covers a lot of ground.

63
00:02:59.680 --> 00:03:03.879
<v Speaker 2>It really does, speaks volumes about Julia's versatility. Actually, following

64
00:03:03.879 --> 00:03:06.599
<v Speaker 2>this structure should give you a really solid grasp from

65
00:03:06.680 --> 00:03:08.759
<v Speaker 2>the core ideas out to the more specialized stuff.

66
00:03:08.840 --> 00:03:11.120
<v Speaker 1>All right, let's dive into that core. Then, getting started,

67
00:03:11.280 --> 00:03:14.319
<v Speaker 1>the book talks about the r EPL that interactive command line.

68
00:03:14.479 --> 00:03:16.400
<v Speaker 2>Uh huh, the read evil print loop.

69
00:03:16.599 --> 00:03:19.159
<v Speaker 1>Right, and it has different modes, like a normal mode

70
00:03:19.199 --> 00:03:19.879
<v Speaker 1>than a shell mode.

71
00:03:20.000 --> 00:03:23.159
<v Speaker 2>Yeah, you hit a semicolon, and you're basically at your

72
00:03:23.199 --> 00:03:26.319
<v Speaker 2>system's command line right inside Julia. Super handy, and.

73
00:03:26.280 --> 00:03:28.240
<v Speaker 1>A package mode too with a bracket.

74
00:03:28.280 --> 00:03:31.319
<v Speaker 2>That's right, And that integrated package system is honestly a

75
00:03:31.319 --> 00:03:34.280
<v Speaker 2>bit of a game changer. Oh so well, finding, installing

76
00:03:34.360 --> 00:03:38.280
<v Speaker 2>and managing external libraries, you know, extra tools people have

77
00:03:38.319 --> 00:03:41.159
<v Speaker 2>written can be a real nightmare in some ecosystem.

78
00:03:41.240 --> 00:03:43.560
<v Speaker 1>Oh yeah, dependency hell exactly.

79
00:03:43.639 --> 00:03:47.360
<v Speaker 2>That Julia's built in package manager, accessed with that Hall

80
00:03:47.479 --> 00:03:50.520
<v Speaker 2>is designed to make that whole process much much smoother.

81
00:03:50.719 --> 00:03:53.360
<v Speaker 2>It's like having the app store right there in the language.

82
00:03:53.400 --> 00:03:56.400
<v Speaker 1>Okay, that sounds genuinely useful. So after the environment, it's

83
00:03:56.439 --> 00:03:59.919
<v Speaker 1>the basic data types, right, the absolute fundamentals yep.

84
00:04:00.080 --> 00:04:07.240
<v Speaker 2>Numbers, integers, floating point, decimals, even fractions, rationals, and things

85
00:04:07.280 --> 00:04:10.840
<v Speaker 2>like infinity and logic, true and false, true and false.

86
00:04:11.360 --> 00:04:13.879
<v Speaker 2>And the book points out something called short circuiting for

87
00:04:14.080 --> 00:04:15.159
<v Speaker 2>nd A and D.

88
00:04:15.360 --> 00:04:18.199
<v Speaker 1>And ore, meaning it stops evaluating early.

89
00:04:18.079 --> 00:04:20.639
<v Speaker 2>Exactly if you have condition one and condition two and

90
00:04:20.680 --> 00:04:23.560
<v Speaker 2>condition one is false, Julia doesn't even bother checking condition

91
00:04:23.600 --> 00:04:26.000
<v Speaker 2>two because the whole thing has to be false. Saves time,

92
00:04:26.480 --> 00:04:27.920
<v Speaker 2>prevents potential errors.

93
00:04:28.079 --> 00:04:31.639
<v Speaker 1>Smart, okay, and it differentiates between zero mb it does

94
00:04:31.839 --> 00:04:34.439
<v Speaker 1>checks if the values are equal, So five equals five

95
00:04:34.480 --> 00:04:37.439
<v Speaker 1>point zero would be true because five equals five point

96
00:04:37.560 --> 00:04:39.800
<v Speaker 1>zero numerically right, But.

97
00:04:40.199 --> 00:04:42.519
<v Speaker 2>Checks for identity. Are they the exact same thing and

98
00:04:42.560 --> 00:04:45.040
<v Speaker 2>memory the same type? So five equals five point zero

99
00:04:45.040 --> 00:04:47.680
<v Speaker 2>is false. One's an integer, one's afloat.

100
00:04:47.480 --> 00:04:50.720
<v Speaker 1>Got it value versus identity, Like checking if two coins

101
00:04:50.759 --> 00:04:53.000
<v Speaker 1>have the same value versus checking if they're the exact

102
00:04:53.040 --> 00:04:53.439
<v Speaker 1>same coin.

103
00:04:53.519 --> 00:04:54.399
<v Speaker 2>That's a perfect analogy.

104
00:04:54.480 --> 00:04:59.160
<v Speaker 1>Yeah, okay, Next up collections putting data together a raise.

105
00:04:59.319 --> 00:05:03.439
<v Speaker 2>First, arrays are fundamental. They can be simplests vectors or

106
00:05:03.480 --> 00:05:06.360
<v Speaker 2>tables like matrices or even higher dimensional things.

107
00:05:06.439 --> 00:05:08.319
<v Speaker 1>And you access elements with square.

108
00:05:08.040 --> 00:05:11.560
<v Speaker 2>Bracket yep, square brackets. And it's important to note you

109
00:05:11.560 --> 00:05:14.399
<v Speaker 2>can get a single element with one index, or a

110
00:05:14.439 --> 00:05:17.560
<v Speaker 2>whole slice like a row or column using a colon red.

111
00:05:17.879 --> 00:05:21.000
<v Speaker 1>And you need the right number of indices for your array, right,

112
00:05:21.040 --> 00:05:23.480
<v Speaker 1>like two indices for a matrix spot on.

113
00:05:24.079 --> 00:05:27.360
<v Speaker 2>Using the wrong number will give you an error. Understanding

114
00:05:27.399 --> 00:05:30.399
<v Speaker 2>how to index and slice arrays efficiently is crucial for

115
00:05:30.519 --> 00:05:31.279
<v Speaker 2>numerical work.

116
00:05:31.600 --> 00:05:35.720
<v Speaker 1>Then strings text data defined with double quotes double quotes.

117
00:05:35.800 --> 00:05:38.639
<v Speaker 2>Yeah, the booknotes they're kind of like lists of characters,

118
00:05:38.639 --> 00:05:41.040
<v Speaker 2>but with a key difference. They're immutable.

119
00:05:41.199 --> 00:05:43.800
<v Speaker 1>Immutable meaning you can't change them once they're created.

120
00:05:43.920 --> 00:05:46.079
<v Speaker 2>Exactly. You can't just swap out one character in the

121
00:05:46.120 --> 00:05:48.399
<v Speaker 2>middle of an existing string, You'd have to create a new.

122
00:05:48.240 --> 00:05:51.680
<v Speaker 1>One, okay. And joining strings uses the asterisker.

123
00:05:51.439 --> 00:05:54.519
<v Speaker 2>Yep concatenates to them. And you can check for characters

124
00:05:54.600 --> 00:05:58.000
<v Speaker 2>using in or for substrings using the a cursin function.

125
00:05:58.240 --> 00:05:59.439
<v Speaker 1>And there's a warning about.

126
00:05:59.240 --> 00:06:02.920
<v Speaker 2>Unicode, because Julia handles Unicode characters, which can take up

127
00:06:02.920 --> 00:06:06.319
<v Speaker 2>different numbers of bytes. Trying to access a specific bite

128
00:06:06.399 --> 00:06:08.360
<v Speaker 2>might land you in the middle of a character, causing

129
00:06:08.439 --> 00:06:10.800
<v Speaker 2>a string index error. Just something to be aware of.

130
00:06:11.079 --> 00:06:15.560
<v Speaker 1>And for multiline text, triple quotes like this very handy. Okay,

131
00:06:16.040 --> 00:06:18.639
<v Speaker 1>what about ranges you mentioned eight point two point one.

132
00:06:18.600 --> 00:06:21.920
<v Speaker 2>Right, ranges define sequences? Eight point two point one means

133
00:06:21.920 --> 00:06:24.199
<v Speaker 2>start at eight step by Naze's two, so go down,

134
00:06:24.480 --> 00:06:26.600
<v Speaker 2>stop when you get to one, or pass it. So

135
00:06:26.720 --> 00:06:30.399
<v Speaker 2>eight six four to two super useful in loops.

136
00:06:30.560 --> 00:06:32.879
<v Speaker 1>Speaking of loops, the four loop you can use in

137
00:06:33.319 --> 00:06:36.040
<v Speaker 1>or or even that fancy symbol uh huh, I'll work.

138
00:06:35.879 --> 00:06:38.600
<v Speaker 2>For iterating, and you can nest them easily even with

139
00:06:38.639 --> 00:06:43.000
<v Speaker 2>a compact comma syntax. For simple cases, loops, work of arranges, arrays,

140
00:06:43.319 --> 00:06:43.959
<v Speaker 2>all sorts.

141
00:06:43.720 --> 00:06:45.959
<v Speaker 1>Of a collections, gotcha tooples are mentioned too.

142
00:06:46.040 --> 00:06:50.600
<v Speaker 2>Parentheses immutable exactly like lists, you can't change defined with

143
00:06:50.920 --> 00:06:53.759
<v Speaker 2>and the in operator works for checking membership and collections

144
00:06:54.040 --> 00:06:56.959
<v Speaker 2>and checks for non membership. Ranges are memory efficient too.

145
00:06:56.959 --> 00:06:59.120
<v Speaker 2>They don't store every number, just the start, step and

146
00:06:59.279 --> 00:06:59.639
<v Speaker 2>end right.

147
00:06:59.639 --> 00:07:03.319
<v Speaker 1>That makes sense, okay. Let's talk functions, reusable blocks of code.

148
00:07:03.120 --> 00:07:06.600
<v Speaker 2>Defined with the function keyword pretty standard. The key concept

149
00:07:06.639 --> 00:07:08.199
<v Speaker 2>the book emphasizes here is.

150
00:07:08.279 --> 00:07:10.920
<v Speaker 1>Scope scope, meaning where variables live.

151
00:07:11.199 --> 00:07:15.040
<v Speaker 2>Pretty much, variables inside a function are typically local to

152
00:07:15.079 --> 00:07:17.800
<v Speaker 2>that function. They don't usually mess with variables of the

153
00:07:17.839 --> 00:07:20.759
<v Speaker 2>same name outside the funder totally well. The book mentions

154
00:07:20.759 --> 00:07:24.279
<v Speaker 2>a nuance with loops, specifically, if you're running code from

155
00:07:24.319 --> 00:07:27.079
<v Speaker 2>a file and you use a variable inside a loop

156
00:07:27.079 --> 00:07:30.000
<v Speaker 2>that has the same name as a global variable outside,

157
00:07:30.240 --> 00:07:34.240
<v Speaker 2>Julia might warn you about potential shadowing or unintended modification.

158
00:07:34.759 --> 00:07:36.800
<v Speaker 2>It's a helpful safety check, okay.

159
00:07:37.000 --> 00:07:39.759
<v Speaker 1>And functions can change their inputs, there's a naming convention.

160
00:07:39.920 --> 00:07:40.160
<v Speaker 3>Yes.

161
00:07:40.560 --> 00:07:43.720
<v Speaker 2>Functions that modify their arguments often end with an exclamation

162
00:07:43.759 --> 00:07:46.600
<v Speaker 2>mark like push to add to an array or pop

163
00:07:46.720 --> 00:07:47.279
<v Speaker 2>to remove.

164
00:07:47.439 --> 00:07:50.199
<v Speaker 1>So the inna day is a warning sign. This might

165
00:07:50.319 --> 00:07:51.800
<v Speaker 1>change your data exactly.

166
00:07:52.079 --> 00:07:55.519
<v Speaker 2>It's a really useful convention. Contrast that with mutable types

167
00:07:55.560 --> 00:07:58.480
<v Speaker 2>like strings, where operations always create new strings makes sense.

168
00:07:58.519 --> 00:08:00.959
<v Speaker 1>Anonymous functions are covered too little one liners yep.

169
00:08:01.120 --> 00:08:05.600
<v Speaker 2>Using the syntax stores great for quick operations and function composition.

170
00:08:05.680 --> 00:08:08.120
<v Speaker 2>Combining functions plus do blocks?

171
00:08:08.240 --> 00:08:09.279
<v Speaker 1>What do blocks for?

172
00:08:09.560 --> 00:08:12.639
<v Speaker 2>They're clean? Way to pass a multiline anonymous function to

173
00:08:12.720 --> 00:08:15.759
<v Speaker 2>another function makes the code much more readable when a

174
00:08:15.759 --> 00:08:18.920
<v Speaker 2>function takes another function as an argument, which happens a

175
00:08:18.920 --> 00:08:19.759
<v Speaker 2>lot in Julia.

176
00:08:19.800 --> 00:08:25.519
<v Speaker 1>Interesting. Okay. Scaling up modules and packages for bigger.

177
00:08:25.240 --> 00:08:29.279
<v Speaker 2>Projects, right, You use using or import to bring code

178
00:08:29.279 --> 00:08:31.959
<v Speaker 2>from other modules into your current scope. The book gives

179
00:08:31.959 --> 00:08:35.639
<v Speaker 2>examples like linear algebra or random from the standard library.

180
00:08:35.960 --> 00:08:38.600
<v Speaker 1>Is there a difference between using and import?

181
00:08:39.120 --> 00:08:43.120
<v Speaker 2>There is a subtle one. Using module brings all exported

182
00:08:43.200 --> 00:08:46.320
<v Speaker 2>names into your name space, while import module only brings

183
00:08:46.440 --> 00:08:49.000
<v Speaker 2>the module name itself, so you have to write module dot,

184
00:08:49.039 --> 00:08:51.679
<v Speaker 2>function name dot, import module dot function one, function two

185
00:08:51.720 --> 00:08:54.639
<v Speaker 2>is also possible. Using is more common for interactive use.

186
00:08:54.840 --> 00:08:56.960
<v Speaker 2>Import can be clearer in large projects.

187
00:08:57.159 --> 00:08:59.440
<v Speaker 1>Got it and this ties back to the package manager

188
00:08:59.440 --> 00:08:59.960
<v Speaker 1>in the RPA.

189
00:09:00.240 --> 00:09:02.799
<v Speaker 2>Absolutely, that's where you add these external packages, and the

190
00:09:02.799 --> 00:09:05.600
<v Speaker 2>book highlights the project dot tom l and manifest dot

191
00:09:05.639 --> 00:09:06.240
<v Speaker 2>tom l file.

192
00:09:06.399 --> 00:09:09.200
<v Speaker 1>Those are the files that tract dependencies exactly.

193
00:09:09.320 --> 00:09:12.840
<v Speaker 2>Project dot com lists your direct dependencies, and manifest dot

194
00:09:12.840 --> 00:09:17.240
<v Speaker 2>com records the exact versions of all dependencies, including dependencies

195
00:09:17.279 --> 00:09:21.320
<v Speaker 2>of dependencies used in your project. This is crucial for reproducibility.

196
00:09:21.879 --> 00:09:25.399
<v Speaker 2>Anyone else or you later on can recreate the exact

197
00:09:25.480 --> 00:09:27.480
<v Speaker 2>environment no more dependency.

198
00:09:27.519 --> 00:09:32.240
<v Speaker 1>Hell, that sounds incredibly valuable for collaboration and just sanity.

199
00:09:32.679 --> 00:09:34.000
<v Speaker 1>How do you find these packages?

200
00:09:34.320 --> 00:09:37.279
<v Speaker 2>GitHub is the main place. The book suggests searching GitHub

201
00:09:37.279 --> 00:09:40.000
<v Speaker 2>and adding language Julia to your search query to narrow

202
00:09:40.039 --> 00:09:40.360
<v Speaker 2>it down.

203
00:09:40.399 --> 00:09:41.960
<v Speaker 1>Good tip and documentation.

204
00:09:42.159 --> 00:09:45.360
<v Speaker 2>There's a central place pkg d D three dot julia

205
00:09:45.440 --> 00:09:49.200
<v Speaker 2>lang dot org, which often hosts documentation for many registered packages.

206
00:09:49.279 --> 00:09:53.399
<v Speaker 1>Excellent okay, visualization, you said it was huge. The plos package.

207
00:09:53.080 --> 00:09:55.679
<v Speaker 2>Plots dot jl is the go to metapackage doesn't do

208
00:09:55.720 --> 00:09:58.240
<v Speaker 2>the drawing itself. It uses different back ends. Gr is

209
00:09:58.279 --> 00:10:01.200
<v Speaker 2>the default. It's fast and usually just work, but you

210
00:10:01.240 --> 00:10:03.440
<v Speaker 2>can install and use others if needed.

211
00:10:03.200 --> 00:10:05.240
<v Speaker 1>And you just use plot often. Yeah.

212
00:10:05.480 --> 00:10:07.679
<v Speaker 2>Plot xy is the basic idea, and if you want

213
00:10:07.679 --> 00:10:09.720
<v Speaker 2>to add to an existing plot, you use plot with

214
00:10:09.759 --> 00:10:10.639
<v Speaker 2>the exclamation mark.

215
00:10:10.679 --> 00:10:14.320
<v Speaker 1>Again ah, Modifying the plot object makes sense, and customization

216
00:10:14.679 --> 00:10:16.399
<v Speaker 1>labels legends all there.

217
00:10:16.480 --> 00:10:19.559
<v Speaker 2>You can set labels, control the legend position legends on

218
00:10:19.679 --> 00:10:23.320
<v Speaker 2>top left, give it a title, legend title, change line styles, LS,

219
00:10:23.720 --> 00:10:27.159
<v Speaker 2>line widths, LW, markers, colors, lots of options.

220
00:10:27.200 --> 00:10:29.080
<v Speaker 1>What about math formulas in plots?

221
00:10:29.159 --> 00:10:31.480
<v Speaker 2>That's where latex strings comes in. You just put an

222
00:10:31.559 --> 00:10:34.759
<v Speaker 2>L before a string like L alpha plus beta and

223
00:10:34.919 --> 00:10:37.799
<v Speaker 2>plots with the right back end will render it as

224
00:10:37.919 --> 00:10:41.320
<v Speaker 2>proper math using latex really nice for technical plots.

225
00:10:41.440 --> 00:10:44.799
<v Speaker 1>Very cool and more complex plots. Contours heat maps YEP.

226
00:10:44.639 --> 00:10:48.320
<v Speaker 2>Contour heat map surface plots are mentioned and arranging multiple

227
00:10:48.320 --> 00:10:49.000
<v Speaker 2>plots together.

228
00:10:49.120 --> 00:10:49.840
<v Speaker 1>How does that work?

229
00:10:50.039 --> 00:10:52.279
<v Speaker 2>You can use the at layout macro to define a

230
00:10:52.320 --> 00:10:55.120
<v Speaker 2>grid structure and then pass multiple plot objects to the

231
00:10:55.159 --> 00:10:59.039
<v Speaker 2>plot function. Makes creating figures with subplots pretty straightforward.

232
00:10:59.080 --> 00:11:04.279
<v Speaker 1>Okay, Moving beyond rays and strings. Other collection types dictionaries.

233
00:11:03.679 --> 00:11:06.919
<v Speaker 2>YEP, dicked for key value pairs like a Python dictionary

234
00:11:07.000 --> 00:11:09.519
<v Speaker 2>or a hash map. You look up values using keys

235
00:11:09.720 --> 00:11:12.559
<v Speaker 2>and the sets set for unordered collections of unique elements

236
00:11:12.879 --> 00:11:16.360
<v Speaker 2>useful for membership, testing and operations like intersect to find

237
00:11:16.440 --> 00:11:19.120
<v Speaker 2>common elements or union to combine elements.

238
00:11:19.120 --> 00:11:20.120
<v Speaker 1>Okay, and structs.

239
00:11:20.399 --> 00:11:23.480
<v Speaker 2>Structs let you define your own custom composite data types.

240
00:11:23.919 --> 00:11:27.039
<v Speaker 2>You bundle related data fields together. Think of defining a

241
00:11:27.080 --> 00:11:29.679
<v Speaker 2>point type with x and y fields.

242
00:11:29.320 --> 00:11:31.799
<v Speaker 1>And named tuples like tuples, but.

243
00:11:31.840 --> 00:11:34.639
<v Speaker 2>Each element has a name, so instead of accessing my

244
00:11:34.759 --> 00:11:38.600
<v Speaker 2>tupule one, you might access my nametuple dot x makes

245
00:11:38.639 --> 00:11:39.600
<v Speaker 2>code more readable.

246
00:11:39.799 --> 00:11:43.360
<v Speaker 1>So lots of tools for organizing data. Let's circle back

247
00:11:43.360 --> 00:11:45.480
<v Speaker 1>to a raise for a bit more advanced concepts.

248
00:11:45.480 --> 00:11:49.559
<v Speaker 2>Definitely, you can create arrays using functions like comprehensions, which

249
00:11:49.559 --> 00:11:52.039
<v Speaker 2>are a very concise way to build arrays based on

250
00:11:52.080 --> 00:11:55.159
<v Speaker 2>loops and conditions. Think I two for i in one

251
00:11:55.200 --> 00:11:55.960
<v Speaker 2>point five.

252
00:11:55.799 --> 00:11:57.720
<v Speaker 1>Ah list comprehensions from Python.

253
00:11:57.840 --> 00:12:01.919
<v Speaker 2>But for arrays exactly, there's also repeat and fill fill

254
00:12:02.000 --> 00:12:04.799
<v Speaker 2>value DIMS creates an array where every element is the

255
00:12:04.840 --> 00:12:07.840
<v Speaker 2>exact same object in memory. If that object is mutable,

256
00:12:07.960 --> 00:12:09.320
<v Speaker 2>changing one changes them all.

257
00:12:09.440 --> 00:12:11.759
<v Speaker 1>Ooh tricky. What about repeat.

258
00:12:11.440 --> 00:12:14.279
<v Speaker 2>BP actually copies the elements, so it behaves more like

259
00:12:14.320 --> 00:12:16.679
<v Speaker 2>you might initially expect good distinction to know.

260
00:12:16.759 --> 00:12:19.279
<v Speaker 1>And helper functions like zeros and ones yep.

261
00:12:19.200 --> 00:12:21.600
<v Speaker 2>Quickly create a rays filled with zeros or ones super

262
00:12:21.600 --> 00:12:24.480
<v Speaker 2>common and reshape lets you change the dimensions of an

263
00:12:24.559 --> 00:12:26.399
<v Speaker 2>array without changing the data itself.

264
00:12:26.559 --> 00:12:30.320
<v Speaker 1>Useful. What about numerical operations combining arrays?

265
00:12:30.600 --> 00:12:36.200
<v Speaker 2>You can concatenate arrays vertically using semicolones AB or horizontally

266
00:12:36.279 --> 00:12:37.639
<v Speaker 2>using spaces AB.

267
00:12:38.000 --> 00:12:40.080
<v Speaker 1>Logical indexing using true false.

268
00:12:40.240 --> 00:12:42.960
<v Speaker 2>Yeah, this is powerful. If you have an array A

269
00:12:43.200 --> 00:12:45.759
<v Speaker 2>and a boolian array B of the same size, AB

270
00:12:45.919 --> 00:12:48.399
<v Speaker 2>gives you only the elements of A where the corresponding

271
00:12:48.440 --> 00:12:49.480
<v Speaker 2>element in B is true.

272
00:12:49.799 --> 00:12:54.960
<v Speaker 1>Great for filtering and matrix stuff transpose multiplications.

273
00:12:54.360 --> 00:12:57.840
<v Speaker 2>The single quote gives you the joint complex conjugate transpose,

274
00:12:57.879 --> 00:13:01.799
<v Speaker 2>which is just the transpose for real matrices. Standard matrix multiplication.

275
00:13:01.360 --> 00:13:05.440
<v Speaker 1>Is just a okay. And iterating enumerate and zip.

276
00:13:05.480 --> 00:13:10.039
<v Speaker 2>Enumerate collection gives you pairs of index value as you loop.

277
00:13:10.720 --> 00:13:13.679
<v Speaker 2>ZIP call one, call two gives you pairs of value

278
00:13:13.679 --> 00:13:15.320
<v Speaker 2>one value two from each collection.

279
00:13:15.759 --> 00:13:18.039
<v Speaker 1>Very useful, and pairs for dictionary.

280
00:13:17.759 --> 00:13:21.399
<v Speaker 2>Peirs iterates through key value pairs. The book also warns

281
00:13:21.399 --> 00:13:25.000
<v Speaker 2>about mixing up the iteration number from enumerate with say

282
00:13:25.320 --> 00:13:28.559
<v Speaker 2>the character index in a string, especially with unicode. They

283
00:13:28.600 --> 00:13:29.519
<v Speaker 2>aren't always the same.

284
00:13:29.639 --> 00:13:31.960
<v Speaker 1>Good point. Okay, this feels like we're getting into some

285
00:13:32.000 --> 00:13:35.519
<v Speaker 1>really powerful features now, functions, metaprogramming errors.

286
00:13:35.679 --> 00:13:39.399
<v Speaker 2>Yeah, this is where Julia really starts to flex its muscles. Vargs.

287
00:13:39.440 --> 00:13:43.759
<v Speaker 2>For instance, using its in a function definition lets it

288
00:13:43.799 --> 00:13:48.039
<v Speaker 2>accept any number of arguments like printal, NBC exactly. Keyword

289
00:13:48.080 --> 00:13:51.200
<v Speaker 2>arguments are also common, letting you pass optional arguments by

290
00:13:51.320 --> 00:13:55.600
<v Speaker 2>name like plot x, y, line style dot. There's even

291
00:13:55.600 --> 00:13:58.639
<v Speaker 2>a concise syntax if the keyword is just a variable name.

292
00:13:58.519 --> 00:14:01.240
<v Speaker 1>And splatting illy guy in a call. Right.

293
00:14:01.519 --> 00:14:04.039
<v Speaker 2>If you have arguments in a tuple or dictionary, you

294
00:14:04.080 --> 00:14:08.399
<v Speaker 2>can splat them into a function call. My funk ARGs

295
00:14:08.440 --> 00:14:11.879
<v Speaker 2>passes elements of the tupple ARBs as individual arguments. For

296
00:14:12.000 --> 00:14:15.200
<v Speaker 2>dictionaries with symbol keys, you use myfunk quarks.

297
00:14:15.399 --> 00:14:18.240
<v Speaker 1>Handy string interpolation with docker yep.

298
00:14:18.600 --> 00:14:22.000
<v Speaker 2>Variable name is expression embeds values directly in strings, and

299
00:14:22.159 --> 00:14:25.039
<v Speaker 2>raw strings are useful if you have lots of backslashes

300
00:14:25.120 --> 00:14:26.200
<v Speaker 2>or dollar signs you don't want.

301
00:14:26.240 --> 00:14:28.759
<v Speaker 1>Interpreted operators are functions. You can define your.

302
00:14:28.639 --> 00:14:32.360
<v Speaker 2>Own yes plus thalk. They're all just functions, and you

303
00:14:32.360 --> 00:14:35.519
<v Speaker 2>can define your own custom infix operators, though you need

304
00:14:35.519 --> 00:14:38.320
<v Speaker 2>to follow rules about allowed characters and precedents, which are

305
00:14:38.360 --> 00:14:39.320
<v Speaker 2>in the Julida docs.

306
00:14:39.440 --> 00:14:42.159
<v Speaker 1>Higher order functions, map, filter.

307
00:14:42.000 --> 00:14:46.279
<v Speaker 2>Reduce standard functional programming tools. Map applies a function to

308
00:14:46.279 --> 00:14:49.799
<v Speaker 2>each element, Filter keeps elements based on a condition. Reduce

309
00:14:49.840 --> 00:14:52.919
<v Speaker 2>combines elements using a function. The book notes to be

310
00:14:52.960 --> 00:14:56.039
<v Speaker 2>careful with reduce and non associated operators like division.

311
00:14:56.320 --> 00:14:59.440
<v Speaker 1>The order matters and do blocks pop up again here?

312
00:14:59.639 --> 00:15:03.440
<v Speaker 2>Yep? Because map, filter, etc. Often take functions as arguments.

313
00:15:03.720 --> 00:15:07.159
<v Speaker 2>Do blocks make the syntax cleaner for multiline function arguments?

314
00:15:07.279 --> 00:15:08.039
<v Speaker 1>Okay?

315
00:15:07.919 --> 00:15:12.519
<v Speaker 3>Symbol type symbols some name are like efficient unique strings,

316
00:15:12.559 --> 00:15:15.320
<v Speaker 3>often used internally or for things like dictionary keys or

317
00:15:15.399 --> 00:15:18.720
<v Speaker 3>keyword arguments like we saw in plotting attributes line style.

318
00:15:18.559 --> 00:15:24.120
<v Speaker 1>Dot dash right and then metaprogramming code about code.

319
00:15:24.279 --> 00:15:27.679
<v Speaker 2>This is advanced but powerful. You can capture Julia code

320
00:15:27.720 --> 00:15:31.480
<v Speaker 2>as data using quote, dot end or race. This creates

321
00:15:31.519 --> 00:15:34.759
<v Speaker 2>an EXPRUNO object representing the code structure.

322
00:15:34.360 --> 00:15:35.879
<v Speaker 1>And you can manipulate that structure.

323
00:15:35.919 --> 00:15:38.200
<v Speaker 2>You can, and then you can evaluate it using Evil,

324
00:15:38.240 --> 00:15:41.120
<v Speaker 2>though the book rightly warns to use Evil carefully. You

325
00:15:41.120 --> 00:15:44.320
<v Speaker 2>can even write functions that programmatically create variables.

326
00:15:44.519 --> 00:15:46.960
<v Speaker 1>And macros build on this at macro.

327
00:15:46.759 --> 00:15:49.840
<v Speaker 2>Name macros are functions that run at parse time. They

328
00:15:49.879 --> 00:15:53.559
<v Speaker 2>take code expressions as input and return new code expressions,

329
00:15:53.600 --> 00:15:57.200
<v Speaker 2>which then replace the macro call. It's like programmable copy paste,

330
00:15:57.279 --> 00:15:58.240
<v Speaker 2>but much smarter.

331
00:15:58.519 --> 00:16:00.480
<v Speaker 1>What are they used for? Things?

332
00:16:00.879 --> 00:16:05.840
<v Speaker 2>Simplifying syntax, generating repetitive code, optimizing performance. The book mentions

333
00:16:05.879 --> 00:16:08.440
<v Speaker 2>at time and at a lapse for basic timing at

334
00:16:08.480 --> 00:16:12.399
<v Speaker 2>b time from benchmark tools for proper benchmarking at code

335
00:16:12.399 --> 00:16:16.320
<v Speaker 2>worn type to check type stability crucial for performance, and

336
00:16:16.360 --> 00:16:21.440
<v Speaker 2>at FastMATH to allow aggressive, potentially non standard floating point optimizations.

337
00:16:21.679 --> 00:16:24.240
<v Speaker 1>That at code one type sounds really useful for squeezing

338
00:16:24.240 --> 00:16:24.919
<v Speaker 1>out speed.

339
00:16:24.720 --> 00:16:28.799
<v Speaker 2>It absolutely is. And macros need sometimes to control variable scoping,

340
00:16:28.919 --> 00:16:32.039
<v Speaker 2>ensuring variables from the macro's definition don't clash with variables

341
00:16:32.039 --> 00:16:34.360
<v Speaker 2>where the macro is used. It's called hygiene.

342
00:16:34.559 --> 00:16:37.360
<v Speaker 1>Okay, deep stuff. Finally, error handling essential.

343
00:16:37.759 --> 00:16:40.639
<v Speaker 2>You get stack traces when errors occur, showing the sequence

344
00:16:40.639 --> 00:16:44.080
<v Speaker 2>of function calls. You can handle expected errors gracefully using

345
00:16:44.120 --> 00:16:44.759
<v Speaker 2>triy dot.

346
00:16:44.639 --> 00:16:47.000
<v Speaker 1>Catch blocks, and create your own errors.

347
00:16:46.919 --> 00:16:50.279
<v Speaker 2>YEP using throw, often with specific error types. It domain

348
00:16:50.360 --> 00:16:52.879
<v Speaker 2>er if an import value is invalid. Plus warn and

349
00:16:53.159 --> 00:16:57.320
<v Speaker 2>error for logging messages without necessarily stopping execution for warnings.

350
00:16:57.360 --> 00:17:04.240
<v Speaker 1>Right comprehensive error handling. What about graphic beyond plotting diagrams animations.

351
00:17:03.679 --> 00:17:07.799
<v Speaker 2>The book introduces Luxor dot JL for creating static vector graphics.

352
00:17:07.880 --> 00:17:11.519
<v Speaker 2>It's imperative you issue commands like set color, draw circle, draw.

353
00:17:11.400 --> 00:17:14.359
<v Speaker 1>Text, like programming a drawing step by step exactly.

354
00:17:14.480 --> 00:17:17.680
<v Speaker 2>The example is a solar system diagram pulling data from NASA,

355
00:17:17.960 --> 00:17:20.640
<v Speaker 2>drawing planets, setting colors, dash styles, et cetera.

356
00:17:20.799 --> 00:17:22.079
<v Speaker 1>Cool and animations.

357
00:17:22.160 --> 00:17:24.839
<v Speaker 2>That's where Javis dot jl comes in built on Luxor.

358
00:17:25.119 --> 00:17:30.119
<v Speaker 2>You define objects and then act on them over time, rotate, translate, scale,

359
00:17:30.359 --> 00:17:33.519
<v Speaker 2>dot opacity, then you render the result as a video

360
00:17:33.720 --> 00:17:34.119
<v Speaker 2>or gift.

361
00:17:34.359 --> 00:17:35.359
<v Speaker 1>Examples given and.

362
00:17:35.319 --> 00:17:38.480
<v Speaker 2>Epicycles animation is mentioned, and a simulation of a vibrating

363
00:17:38.480 --> 00:17:41.559
<v Speaker 2>circle visualized with a heat map and polar coordinates. Very

364
00:17:41.559 --> 00:17:45.640
<v Speaker 2>neat ways to visualize dynamic processes and interactive plots. Briefly

365
00:17:45.680 --> 00:17:49.119
<v Speaker 2>touches on using Pluto notebooks. With the at bind macro,

366
00:17:49.480 --> 00:17:52.960
<v Speaker 2>you can link HTML sliders or buttons to Julia variables,

367
00:17:53.119 --> 00:17:55.759
<v Speaker 2>making visualizations interactive within the notebook.

368
00:17:55.880 --> 00:17:58.119
<v Speaker 1>Okay, now the type system we mentioned.

369
00:17:57.839 --> 00:18:01.160
<v Speaker 2>It's key, absolutely fundamental. Every value in Julia has a

370
00:18:01.200 --> 00:18:04.440
<v Speaker 2>type tells you what it is. We have basic numeric types,

371
00:18:04.440 --> 00:18:08.160
<v Speaker 2>but also parametric types like rational and sixty four a

372
00:18:08.279 --> 00:18:10.559
<v Speaker 2>rational number made from sixty four bit integers.

373
00:18:10.880 --> 00:18:13.039
<v Speaker 1>And you can check types with isa.

374
00:18:12.920 --> 00:18:16.240
<v Speaker 2>Ice value type checks if the value is of that

375
00:18:16.359 --> 00:18:19.839
<v Speaker 2>type or a subtype. This leads to the type hierarchy,

376
00:18:19.920 --> 00:18:22.440
<v Speaker 2>a tree of types sort of Every type has a

377
00:18:22.480 --> 00:18:24.440
<v Speaker 2>supertype going all the way up to the root type,

378
00:18:24.440 --> 00:18:27.200
<v Speaker 2>and meet types lower down or subtypes. The book even

379
00:18:27.240 --> 00:18:31.160
<v Speaker 2>shows visualizing this hierarchy using graph packages. Concrete types are

380
00:18:31.200 --> 00:18:32.680
<v Speaker 2>the ones that can actually have instances.

381
00:18:32.920 --> 00:18:34.400
<v Speaker 1>Can you declare variable types?

382
00:18:34.480 --> 00:18:38.200
<v Speaker 2>You can globally globalgf dot float sixty four egles one

383
00:18:38.279 --> 00:18:42.400
<v Speaker 2>point zero, or locally x dot nt equals five. This

384
00:18:42.640 --> 00:18:44.960
<v Speaker 2>x is an assution. Assigning the wrong type will cause

385
00:18:45.000 --> 00:18:48.480
<v Speaker 2>an error. Helps catch bugs and sometimes aids performance.

386
00:18:48.000 --> 00:18:50.960
<v Speaker 1>And defining your own types abstract versus concrete.

387
00:18:51.160 --> 00:18:54.160
<v Speaker 2>You use abstract type my abstract type end to define

388
00:18:54.160 --> 00:18:57.640
<v Speaker 2>concepts and struct my concrete type end for actual data

389
00:18:57.640 --> 00:19:01.640
<v Speaker 2>structures with fields, you can specify subtyping relationships using a.

390
00:19:02.079 --> 00:19:03.720
<v Speaker 1>So struct my concrete type my.

391
00:19:03.720 --> 00:19:07.519
<v Speaker 2>Abstract precisely, and structs can be parametric too, like structs

392
00:19:07.559 --> 00:19:10.480
<v Speaker 2>selips t ND where t could be the number type

393
00:19:10.559 --> 00:19:13.440
<v Speaker 2>used for coordinates. You can add constraints using war like

394
00:19:13.480 --> 00:19:15.079
<v Speaker 2>selips T, whar T real.

395
00:19:15.039 --> 00:19:17.440
<v Speaker 1>Very flexible m plot recipes.

396
00:19:17.240 --> 00:19:20.000
<v Speaker 2>Ah at recipe and at user plot. These let you

397
00:19:20.039 --> 00:19:22.319
<v Speaker 2>teach the plots package how to plot your custom types

398
00:19:22.359 --> 00:19:25.279
<v Speaker 2>automatically super powerful for integration.

399
00:19:25.039 --> 00:19:27.960
<v Speaker 1>Makes your own types first class citizens for plotting nice.

400
00:19:28.000 --> 00:19:29.200
<v Speaker 1>What about physical units?

401
00:19:29.279 --> 00:19:31.759
<v Speaker 2>The unit ful dot jl package is fantastic for this.

402
00:19:31.880 --> 00:19:34.799
<v Speaker 2>You can create quantities with units using string macros like

403
00:19:34.920 --> 00:19:36.319
<v Speaker 2>q U one m.

404
00:19:36.319 --> 00:19:39.160
<v Speaker 1>And then just do math q two U ones exactly.

405
00:19:39.720 --> 00:19:43.119
<v Speaker 2>It handles the unit conversions and checks consistency. One meter

406
00:19:43.200 --> 00:19:44.640
<v Speaker 2>plus two's would give an air.

407
00:19:44.960 --> 00:19:47.559
<v Speaker 1>How do you get the number unit back out bestrip.

408
00:19:47.200 --> 00:19:49.920
<v Speaker 2>Q gives you the numerical value one. In this case,

409
00:19:50.079 --> 00:19:52.720
<v Speaker 2>unit q gives you the unit m and convert you

410
00:19:52.799 --> 00:19:54.480
<v Speaker 2>cmq converts.

411
00:19:54.079 --> 00:19:55.079
<v Speaker 1>It deplaying them nicely.

412
00:19:55.480 --> 00:19:59.519
<v Speaker 2>Latex unit ful of texify dot jl integrates with latexifi

413
00:20:00.079 --> 00:20:03.920
<v Speaker 2>reduce properly formatted latex strings for units, with options for

414
00:20:03.960 --> 00:20:05.279
<v Speaker 2>how fractions are displayed.

415
00:20:05.640 --> 00:20:07.480
<v Speaker 1>Plotting handle units automatically.

416
00:20:07.759 --> 00:20:12.039
<v Speaker 2>Yes, Plots often automatically labels axs with the correct units

417
00:20:12.039 --> 00:20:15.200
<v Speaker 2>when you plot unit forul quantities, or you can build

418
00:20:15.240 --> 00:20:18.480
<v Speaker 2>labels manually using US strip, unit and latex strings.

419
00:20:18.519 --> 00:20:22.160
<v Speaker 1>That's incredibly useful for scientific work. Okay, let's talk applications.

420
00:20:22.559 --> 00:20:24.960
<v Speaker 1>The book showcases Julia across different fields.

421
00:20:25.000 --> 00:20:29.319
<v Speaker 2>Oh yeah, a wide range physics, oceananigans for fluid dynamics,

422
00:20:29.680 --> 00:20:33.920
<v Speaker 2>differential equations, dot JAIL for solving all kinds of differential equations,

423
00:20:33.960 --> 00:20:38.359
<v Speaker 2>pendulum examples, even chaotic systems, platistics, random for random numbers,

424
00:20:38.640 --> 00:20:43.200
<v Speaker 2>distributions for statistical distributions to uniform, et cetera. Data frames

425
00:20:43.240 --> 00:20:47.920
<v Speaker 2>dot JL for tabular data manipulation, reading, CSVS, filtering, grouping, joining,

426
00:20:47.960 --> 00:20:49.480
<v Speaker 2>pivoting like you would in R or.

427
00:20:49.440 --> 00:20:51.519
<v Speaker 1>Pandas data frame sounds essential.

428
00:20:51.359 --> 00:20:54.119
<v Speaker 2>It really is for data analysis. Also stats plots for

429
00:20:54.160 --> 00:20:57.720
<v Speaker 2>statistical plotting on top of data frames at DF, macro histograms,

430
00:20:57.759 --> 00:21:01.640
<v Speaker 2>correlation plots handling missing data covered too. While agents dot

431
00:21:01.680 --> 00:21:05.480
<v Speaker 2>JL for agent based modeling. The example is simulating evolution

432
00:21:05.720 --> 00:21:09.160
<v Speaker 2>predator prey dynamics where agents move, reproduce, mutate.

433
00:21:08.920 --> 00:21:11.799
<v Speaker 1>Interact mathematics, symbolic stuff.

434
00:21:11.559 --> 00:21:15.799
<v Speaker 2>Symbolics DoD JL for computer algebra, define symbolic variables, at variables,

435
00:21:15.839 --> 00:21:22.000
<v Speaker 2>create symbolic expressions, differentiate, differential solve equations, solve, substitute value,

436
00:21:22.000 --> 00:21:24.519
<v Speaker 2>substitute plot symbolic functions.

437
00:21:24.119 --> 00:21:26.920
<v Speaker 1>Like MATHEMATICA or maple, but within Julia.

438
00:21:26.759 --> 00:21:29.640
<v Speaker 2>Kind of yeah. He can even trace regular Julia functions

439
00:21:29.640 --> 00:21:31.079
<v Speaker 2>to generate symbolic expressions.

440
00:21:31.119 --> 00:21:33.079
<v Speaker 1>WOW signal and image.

441
00:21:32.720 --> 00:21:37.000
<v Speaker 2>Processing signal analysis example, Fouria analysis of audio images, dot

442
00:21:37.079 --> 00:21:42.000
<v Speaker 2>JL loading saving, manipulating images, color channels, grayscale image filtering,

443
00:21:42.240 --> 00:21:46.920
<v Speaker 2>image minorization, morphological operations like dilation, erosion, feature recognition. It

444
00:21:47.000 --> 00:21:50.279
<v Speaker 2>also mentions array views at view for efficient access to

445
00:21:50.319 --> 00:21:54.640
<v Speaker 2>submarize offset arrays, and Cartesian indices for easier multidimensional iteration, and.

446
00:21:54.599 --> 00:21:58.480
<v Speaker 1>Finally, concurrency using multiple cores, threads for multi threading on

447
00:21:58.519 --> 00:22:03.160
<v Speaker 1>a single machine, reads macro for loops, threads at spawn

448
00:22:03.200 --> 00:22:07.160
<v Speaker 1>for tasks at sync to weight, and distributed for using

449
00:22:07.279 --> 00:22:11.359
<v Speaker 1>multiple processes, possibly a cross machines depth p flag to

450
00:22:11.440 --> 00:22:14.680
<v Speaker 1>start Julia, PMAT for parallel map at spawn at to

451
00:22:14.759 --> 00:22:20.160
<v Speaker 1>run code on specific workers. Performance depends on minimizing communication overhead, So.

452
00:22:20.200 --> 00:22:23.920
<v Speaker 2>A huge range of applications covered by dedicated packages.

453
00:22:23.440 --> 00:22:26.880
<v Speaker 1>Absolutely, and this leads to maybe the most important point

454
00:22:26.920 --> 00:22:30.200
<v Speaker 1>the book makes near the end, composability. How well all

455
00:22:30.200 --> 00:22:32.359
<v Speaker 1>these different packages work together? Ah?

456
00:22:32.480 --> 00:22:35.279
<v Speaker 2>Right? Because of multiple dispatch and the type system.

457
00:22:35.119 --> 00:22:38.279
<v Speaker 1>Exactly different packages can interact in ways the original authors

458
00:22:38.400 --> 00:22:41.519
<v Speaker 1>might not have even planned. The example given is combining

459
00:22:41.640 --> 00:22:45.920
<v Speaker 1>differential equations with Turing dot JL for babilistic programming to

460
00:22:46.000 --> 00:22:49.279
<v Speaker 1>do Bayesian inference on parameters of differential equations.

461
00:22:49.319 --> 00:22:50.559
<v Speaker 2>That sounds incredibly powerful.

462
00:22:50.559 --> 00:22:54.039
<v Speaker 1>You're not stuck in silos precisely. It revisits that easiest

463
00:22:54.039 --> 00:22:57.599
<v Speaker 1>Python fast as four tran idea, but adds composability as

464
00:22:57.640 --> 00:23:01.200
<v Speaker 1>maybe the second huge reason Julia is gaining traction. You

465
00:23:01.240 --> 00:23:05.119
<v Speaker 1>can build complex solutions by combining specialized tools flexibly. Okay,

466
00:23:05.359 --> 00:23:08.519
<v Speaker 1>that's a really compelling picture of Julia. So wrapping up

467
00:23:08.559 --> 00:23:12.160
<v Speaker 1>this deep dive based on practical Julia, what are the

468
00:23:12.240 --> 00:23:14.319
<v Speaker 1>key takeaways for someone listening?

469
00:23:14.880 --> 00:23:17.559
<v Speaker 2>I think fundamentally it's this unique blend. You get a

470
00:23:17.640 --> 00:23:20.400
<v Speaker 2>language that feels high level and easy to work with,

471
00:23:20.559 --> 00:23:23.920
<v Speaker 2>like Python, but it's designed for high performance from the

472
00:23:23.920 --> 00:23:26.279
<v Speaker 2>ground up thanks to things like its type system and

473
00:23:26.400 --> 00:23:30.240
<v Speaker 2>multiple dispatches, and then you have these really powerful extras

474
00:23:30.279 --> 00:23:31.279
<v Speaker 2>like metaprogramming.

475
00:23:31.519 --> 00:23:35.079
<v Speaker 1>Yeah, that combination seems central, and it's clearly not just theoretical.

476
00:23:35.160 --> 00:23:37.960
<v Speaker 1>The application show it's being used for serious work across

477
00:23:37.960 --> 00:23:39.039
<v Speaker 1>many technical fields.

478
00:23:39.079 --> 00:23:42.119
<v Speaker 2>Definitely, it's past the early adopter phase in many areas.

479
00:23:42.480 --> 00:23:45.920
<v Speaker 2>The ecosystem is growing fast, it's active, and there are

480
00:23:46.039 --> 00:23:49.079
<v Speaker 2>solid packages for doing real science and engineering.

481
00:23:49.240 --> 00:23:51.680
<v Speaker 1>So if any of those areas we touched on the plotting,

482
00:23:51.839 --> 00:23:55.880
<v Speaker 1>the data frames, units with unitful simulations with agents or

483
00:23:55.920 --> 00:23:59.599
<v Speaker 1>differential equations, symbolic math, if any of that sounded relevant.

484
00:23:59.319 --> 00:24:02.079
<v Speaker 2>Then you should definitely dig deeper into those specific packages.

485
00:24:02.519 --> 00:24:05.880
<v Speaker 2>The Julia community is generally very welcoming and the documentation

486
00:24:05.960 --> 00:24:07.240
<v Speaker 2>is often quite good.

487
00:24:07.480 --> 00:24:09.559
<v Speaker 1>All right, So here's a final thought to leave you with.

488
00:24:10.240 --> 00:24:13.279
<v Speaker 1>We talked a lot about composability. How Julia lets you

489
00:24:13.319 --> 00:24:15.880
<v Speaker 1>combine different tools seamlessly.

490
00:24:15.599 --> 00:24:17.559
<v Speaker 2>Right, the playing well together aspect.

491
00:24:17.680 --> 00:24:20.759
<v Speaker 1>So think about your own work, your own field. How

492
00:24:20.839 --> 00:24:24.119
<v Speaker 1>might you combine existing tools or techniques in Julia in

493
00:24:24.160 --> 00:24:27.480
<v Speaker 1>a novel way? Could linking a simulation package with a

494
00:24:27.480 --> 00:24:30.960
<v Speaker 1>machine learning library, or a data analysis tool with a

495
00:24:31.039 --> 00:24:34.960
<v Speaker 1>visualization framework open up new avenues for discovery or problem solving.

496
00:24:35.240 --> 00:24:38.759
<v Speaker 2>Hmm. Yeah, that's the exciting potential, isn't it? Using these

497
00:24:38.839 --> 00:24:41.240
<v Speaker 2>building blocks and creative combination exactly.

498
00:24:41.480 --> 00:24:44.640
<v Speaker 1>So keep exploring Julia, check out the community. You might

499
00:24:44.640 --> 00:24:46.920
<v Speaker 1>find that its unique approach lets You tackle problems in

500
00:24:46.960 --> 00:24:48.559
<v Speaker 1>ways you hadn't considered before
