WEBVTT

00:00:00.001 --> 00:00:04.880
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:04.880 --> 00:00:10.060
This is episode 311, recorded November 22nd, 2022.

00:00:10.060 --> 00:00:11.440
And I am Brian Okken.

00:00:11.440 --> 00:00:12.480
I'm Michael Kennedy.

00:00:12.480 --> 00:00:13.640
And I'm Murilo Cunha.

00:00:13.640 --> 00:00:15.040
So welcome, Murilo.

00:00:15.040 --> 00:00:18.440
So tell us a little bit about yourself before we jump into the topics.

00:00:18.440 --> 00:00:24.100
TLDR is, I'm a machine learning engineer at a data and AI consultancy company called Data Roots.

00:00:24.100 --> 00:00:26.800
I'm from Brazil, but I actually live in Belgium.

00:00:26.800 --> 00:00:28.740
And I guess that's it.

00:00:29.440 --> 00:00:30.420
Thanks for having me.

00:00:30.420 --> 00:00:31.880
Thanks for showing up.

00:00:31.880 --> 00:00:32.720
It's great to have you here.

00:00:32.720 --> 00:00:35.260
Well, Michael, why don't you kick us off with the first topic?

00:00:35.260 --> 00:00:36.760
All right, let's kick it off.

00:00:36.760 --> 00:00:38.720
I've got some fun stuff.

00:00:38.720 --> 00:00:40.460
Let's see what Murilo thinks about this.

00:00:40.460 --> 00:00:44.140
This is, it's a little bit mathy, what I got going on here.

00:00:44.140 --> 00:00:45.980
That is not the right screen.

00:00:45.980 --> 00:00:46.820
How about that screen?

00:00:46.820 --> 00:00:51.520
So this comes in from one of the big friends of the show, Brian Skin.

00:00:51.520 --> 00:00:54.260
And he sent me a tweet and it just says, what?

00:00:54.260 --> 00:00:55.360
At Python Bytes.

00:00:55.360 --> 00:01:04.020
And it's a quote tweet from somebody here saying, holy, latexify is the sexiest thing I've ever seen.

00:01:04.020 --> 00:01:06.040
And look at this.

00:01:06.040 --> 00:01:16.160
So when I studied a ton of math and the symbols of mathematics are really important and they communicate stuff like really, really quickly.

00:01:16.160 --> 00:01:23.840
You can scan over and you see the symbol for the real numbers or you can see the symbol for subset or, you know, infinite sum.

00:01:23.840 --> 00:01:25.100
And you're like, I know what that means.

00:01:25.100 --> 00:01:31.860
When you translate that into Python or into computer code, it usually becomes something kind of gnarly looking.

00:01:31.860 --> 00:01:32.100
Right.

00:01:32.160 --> 00:01:38.120
So the example here on this tweet has a function called solve and it's solving the quadratic equation.

00:01:38.120 --> 00:01:42.380
I guess just for one variation of the root, not the plus minus, but that's fine.

00:01:42.380 --> 00:01:48.060
It just says like negative B plus math dot square root B star star two.

00:01:48.060 --> 00:01:49.380
It's like symbol soup, right?

00:01:49.380 --> 00:01:49.800
Yeah.

00:01:50.020 --> 00:02:01.560
So this latexify thing, latexify, latex is the language of expressing those symbols the way mathematicians would have written them in, you know, the 16th century or whatever.

00:02:01.560 --> 00:02:07.420
Like the fancy flowing sort of, you know, sum symbols and integral symbols and whatnot.

00:02:07.420 --> 00:02:11.880
And so what this does is you just put a decorator onto that Python function.

00:02:11.880 --> 00:02:14.920
You say latexify dot with latex, latex.

00:02:14.920 --> 00:02:22.360
When you show that function in a notebook, it shows the math, formal mathematics of it.

00:02:22.360 --> 00:02:22.860
Wow.

00:02:22.860 --> 00:02:26.500
Like, like there's one that was doing, I said, the quadratic equation.

00:02:26.500 --> 00:02:32.640
Another one that says if x is zero, return one else, return math sine of x divided by x.

00:02:32.640 --> 00:02:38.960
And then the symbols is like this sort of like branching equation, you know, like what you would write that in latex conceptually.

00:02:38.960 --> 00:02:39.680
What do you think?

00:02:39.680 --> 00:02:40.020
Oh, wow.

00:02:40.020 --> 00:02:41.100
Is that insane?

00:02:41.100 --> 00:02:42.180
This is great.

00:02:42.180 --> 00:02:45.160
But it just changes the ripple of the function, I guess, right?

00:02:45.160 --> 00:02:47.060
Like if you call the function, it's all fine.

00:02:47.060 --> 00:02:47.800
Yeah, exactly.

00:02:47.800 --> 00:02:49.140
It doesn't change the function at all.

00:02:49.140 --> 00:02:51.560
It changes the wrapper or the stir.

00:02:51.560 --> 00:02:59.100
So if you do this outside of a notebook, what it prints out, let me see if I can somehow communicate this back.

00:02:59.100 --> 00:03:03.400
So if you print it out, what it returns, do I have it here?

00:03:03.400 --> 00:03:03.980
No.

00:03:03.980 --> 00:03:04.620
Yes.

00:03:04.620 --> 00:03:05.560
There.

00:03:05.560 --> 00:03:06.440
No, that's not it.

00:03:06.440 --> 00:03:07.260
Sorry, I don't have it.

00:03:07.260 --> 00:03:09.840
What it prints out is the latex escape codes.

00:03:09.840 --> 00:03:16.920
So it'll say like backslash frack of, you know, like it's a weird, I don't know how to write latex.

00:03:16.920 --> 00:03:20.840
I did a little bit when I was studying math and then I said, that's something I never need to remember.

00:03:20.840 --> 00:03:24.000
And, you know, shot it out of my brain.

00:03:24.000 --> 00:03:25.060
Never again.

00:03:25.060 --> 00:03:25.680
Yeah.

00:03:25.680 --> 00:03:26.880
Like, why do I need to know this?

00:03:26.880 --> 00:03:27.740
I don't need to know this.

00:03:28.240 --> 00:03:28.640
Yeah.

00:03:28.640 --> 00:03:36.520
So the wrapper is just the latex escape codes and then the notebooks see that and then they render it as latex.

00:03:36.520 --> 00:03:37.220
That's pretty cool.

00:03:37.220 --> 00:03:46.620
And then, but one of the nice things about this then is you can, you might have like the math that you're trying to convert to code and then you can like check your answer.

00:03:46.620 --> 00:03:50.320
You can just see, did I get it right in code?

00:03:50.320 --> 00:03:51.280
So, yeah.

00:03:51.280 --> 00:03:51.980
It's pretty cool.

00:03:51.980 --> 00:03:53.020
That's really interesting.

00:03:53.020 --> 00:03:53.240
Yeah.

00:03:53.240 --> 00:03:54.380
Could you round trip it, right?

00:03:54.380 --> 00:03:54.780
Yeah.

00:03:54.780 --> 00:03:57.300
I'm assuming people are doing this on their own code.

00:03:57.300 --> 00:03:59.340
So they're, you know, I guess you could grab somebody else's.

00:03:59.340 --> 00:04:00.660
It's the question about the inverse.

00:04:00.660 --> 00:04:01.180
Yeah.

00:04:01.180 --> 00:04:01.640
Right.

00:04:01.640 --> 00:04:06.200
It's like, hey, if I have the math symbols, could I turn this into a Python function?

00:04:06.200 --> 00:04:08.340
I mean, I don't see why I can't go both ways.

00:04:08.340 --> 00:04:08.900
Sure.

00:04:08.900 --> 00:04:09.320
Yeah.

00:04:09.320 --> 00:04:09.480
True.

00:04:09.620 --> 00:04:14.500
But I still think it would be easier to write the Python function than the latex code for rendering it.

00:04:14.500 --> 00:04:14.860
Yeah.

00:04:14.860 --> 00:04:15.880
That's true.

00:04:15.880 --> 00:04:17.440
I think it's a pretty niche use case.

00:04:17.440 --> 00:04:18.380
Well, you know, I'm sure.

00:04:18.380 --> 00:04:22.240
Well, I'm sure someone's going to find a cool use case for it too, right?

00:04:22.240 --> 00:04:22.720
Yeah.

00:04:22.720 --> 00:04:24.800
This is pretty interesting.

00:04:24.800 --> 00:04:27.720
We've got a couple of live comments.

00:04:27.720 --> 00:04:28.220
Madison.

00:04:28.220 --> 00:04:28.700
Hey, Madison.

00:04:28.700 --> 00:04:29.360
Out in the audience.

00:04:29.360 --> 00:04:31.340
Madison's been on the show before.

00:04:31.340 --> 00:04:35.280
I'm blown away by how libraries like this are able to make math approachable.

00:04:35.280 --> 00:04:37.860
I wonder how this could be used with auto-generated documentation.

00:04:37.860 --> 00:04:38.360
Very cool.

00:04:38.640 --> 00:04:39.040
I agree.

00:04:39.040 --> 00:04:45.700
And Henry also says, I'm guessing it's working on the bytecode like Numba, but compiling it into a human language.

00:04:45.700 --> 00:04:45.900
Yeah.

00:04:45.900 --> 00:04:48.620
Compiling it into the latex escape codes.

00:04:48.620 --> 00:04:49.600
Which is not human.

00:04:49.600 --> 00:04:50.480
Yeah.

00:04:50.480 --> 00:04:53.660
Which is the opposite of unilateral, but it is text, right?

00:04:53.660 --> 00:04:55.820
And, you know, related to this, just.

00:04:55.820 --> 00:04:57.840
Oh, yeah.

00:04:57.840 --> 00:04:58.420
Henry.

00:04:58.420 --> 00:04:58.980
Sempai.

00:04:58.980 --> 00:04:59.980
Okay.

00:04:59.980 --> 00:05:02.960
It's using inspect, get source and parsing the AST.

00:05:02.960 --> 00:05:03.260
Yeah.

00:05:03.260 --> 00:05:03.540
Perfect.

00:05:03.540 --> 00:05:07.660
Another thing that's amazing, if people check out like the Sempai stuff,

00:05:07.660 --> 00:05:11.280
it does some really, really interesting things.

00:05:11.280 --> 00:05:14.620
Like if you go, say, to like calculus, you take a limit here.

00:05:15.180 --> 00:05:18.040
It'll do similar outputs as well, right?

00:05:18.040 --> 00:05:24.480
So you could put in this, and it'll actually express it as symbolic math, and it won't lose

00:05:24.480 --> 00:05:26.800
precision because it solves it symbolically.

00:05:26.800 --> 00:05:28.980
And you can say like, you know, back to this equation.

00:05:28.980 --> 00:05:30.080
So that's kind of related.

00:05:30.240 --> 00:05:36.260
But this just says, given any arbitrary Python function, not written in the symbolic form,

00:05:36.260 --> 00:05:38.700
just turn it into a latex, which is pretty amazing.

00:05:38.700 --> 00:05:41.220
So anyway, thank you, Brian Skin, for pointing that out.

00:05:41.220 --> 00:05:42.500
That is pretty neat.

00:05:42.500 --> 00:05:43.500
One final comment.

00:05:43.500 --> 00:05:47.440
I could not get it to install on my Apple Silicon Mac.

00:05:47.440 --> 00:05:48.860
Maybe that detail matters.

00:05:48.860 --> 00:05:50.560
But I couldn't get it to pip install.

00:05:50.560 --> 00:05:57.120
Out of PyPI, I had to pip install the Git plus the GitHub URL, and then it would install.

00:05:57.120 --> 00:06:00.020
I don't know why, but if people want to play with it, that might be necessary.

00:06:00.020 --> 00:06:00.520
Okay.

00:06:00.520 --> 00:06:00.960
Yeah.

00:06:00.960 --> 00:06:02.080
Over to you, Brian.

00:06:02.540 --> 00:06:03.140
All right.

00:06:03.140 --> 00:06:08.600
Well, while we're talking about math, I'm often working in the measurement world,

00:06:08.600 --> 00:06:11.540
and where we care about prefixes a lot.

00:06:11.540 --> 00:06:14.340
And a lot of people do, with big numbers or small numbers.

00:06:14.340 --> 00:06:19.220
And this was actually suggested to us by Avram.

00:06:19.220 --> 00:06:23.380
And I think he either works on this, or it's his project.

00:06:23.380 --> 00:06:25.040
It's a project called Prefixed.

00:06:25.040 --> 00:06:32.920
And what this does is it's just, it's a class, it provides a class called Float, capital F,

00:06:32.920 --> 00:06:37.220
that is a, derives from the built-in float.

00:06:37.220 --> 00:06:45.200
And it supports scientific decimal, or scientific and, yeah, IEC, which I'm not familiar with,

00:06:45.200 --> 00:06:46.220
prefixes.

00:06:46.220 --> 00:06:52.300
So things like scientific, like K and S and things like that.

00:06:52.300 --> 00:06:57.460
If you go look at all the metric prefixes, you've got, like, there's some new ones, but

00:06:57.460 --> 00:07:00.500
N, K, Mega, Giga, things like that.

00:07:00.500 --> 00:07:05.100
And it just, so it adds these onto when you print them.

00:07:05.100 --> 00:07:06.940
So it acts just like a normal float.

00:07:06.940 --> 00:07:11.440
Most of the time, you can, you know, use it in math equations and everything.

00:07:11.440 --> 00:07:17.440
The interesting thing is, if it is used in math, a math equation, the result will be

00:07:17.440 --> 00:07:21.260
one of these prefix float types.

00:07:21.260 --> 00:07:26.740
But then the nice thing about it is when you convert it to a string, it includes the little

00:07:26.740 --> 00:07:33.340
prefix thing or the suffix or whatever, the little micro or K or M or something like that.

00:07:33.340 --> 00:07:36.960
So I think this is actually super helpful.

00:07:36.960 --> 00:07:41.980
I'm going to use this right away because I, you know, I use a lot of, like, big and small

00:07:41.980 --> 00:07:48.500
numbers and reporting out just the huge thing or just the float is sometimes horrible to compare

00:07:48.500 --> 00:07:48.740
with.

00:07:48.800 --> 00:07:50.180
So this is, this is pretty cool.

00:07:50.180 --> 00:07:51.740
It's very clever.

00:07:51.740 --> 00:07:54.020
I love how, how simple the idea is.

00:07:54.020 --> 00:07:59.960
So you can just F string one of these floats and say colon 0.2 H and that'll convert it to

00:07:59.960 --> 00:08:05.920
its, and the H tells it to be either, you know, Killa or Micro or Mega or, you know, whatever

00:08:05.920 --> 00:08:07.100
suffix is needed.

00:08:07.100 --> 00:08:07.660
That's cool.

00:08:08.020 --> 00:08:12.240
And then there's a, the byte example where they said, well, I'm going to, I'm going to

00:08:12.240 --> 00:08:17.060
use the capital B for bytes, but that's after the formatting of the number.

00:08:17.060 --> 00:08:20.720
And then the K comes in from the float thing.

00:08:20.860 --> 00:08:22.200
So that's, that's pretty cool.

00:08:22.200 --> 00:08:26.860
one of the other things that he passed along is there's some new prefixes.

00:08:26.860 --> 00:08:33.580
So this is, this is apparently new, new scientific prefixes over the last, for

00:08:33.580 --> 00:08:37.060
the new first ones, new, new ones for the last 30 years, apparently.

00:08:37.060 --> 00:08:44.020
So we have, 10 to the 21st, which is Zeta and 10 to the 24th, which is Yada.

00:08:44.020 --> 00:08:47.560
And, then negative is Zepto and Yocto.

00:08:47.560 --> 00:08:48.920
So these are fun.

00:08:48.920 --> 00:08:51.220
Maybe why, why now?

00:08:51.220 --> 00:08:56.660
Why they, they decided to like need to, they have more money now and they need to come up

00:08:56.660 --> 00:08:59.300
with new, prefixes or exactly.

00:08:59.300 --> 00:09:04.980
I'm not sure why we need new prefixes, but our microscopes can now see smaller things.

00:09:04.980 --> 00:09:08.220
We don't have words for this, that things are this small, like, yeah.

00:09:08.220 --> 00:09:11.800
But, national debt, maybe.

00:09:11.800 --> 00:09:15.420
yeah, very possible.

00:09:15.420 --> 00:09:20.600
But, but also Avram notes that prefixed does handle these new ones.

00:09:20.600 --> 00:09:21.380
So cool.

00:09:21.380 --> 00:09:21.860
Good job.

00:09:21.860 --> 00:09:22.120
Cool.

00:09:22.120 --> 00:09:24.820
One thing, Python too, you can put the underscore, right?

00:09:24.820 --> 00:09:29.320
To like, if you put underscore on the thousands, that also, that's something that makes it easier,

00:09:29.320 --> 00:09:31.280
I think, to, to, to read the numbers too.

00:09:31.280 --> 00:09:32.060
That's what I was using.

00:09:32.060 --> 00:09:32.080
Yeah.

00:09:32.080 --> 00:09:33.000
Like the digit grouping.

00:09:33.000 --> 00:09:33.600
Yeah.

00:09:33.600 --> 00:09:34.020
Yeah.

00:09:34.020 --> 00:09:34.740
Do you do that a lot?

00:09:34.740 --> 00:09:35.760
Not a lot.

00:09:35.760 --> 00:09:41.120
I, but like some, whenever I can, I do, I think it makes it easier to, to distinguish

00:09:41.120 --> 00:09:42.440
how big the number is, I guess.

00:09:42.440 --> 00:09:46.400
I always forget to, I just, I know it's there, but I never use it.

00:09:46.400 --> 00:09:50.060
but I think usually it's like when I'm counting the zeros with my finger on the screen,

00:09:50.060 --> 00:09:52.620
I'm like, no, no, maybe I'll just put a underscore there.

00:09:52.620 --> 00:09:54.280
It makes it makes everyone's life easier.

00:09:54.280 --> 00:09:54.800
Yeah.

00:09:54.800 --> 00:09:55.140
Yeah.

00:09:55.140 --> 00:09:59.120
I've really started doing that a lot the last couple of years, but before then I didn't.

00:09:59.120 --> 00:09:59.320
Cool.

00:09:59.560 --> 00:10:00.840
Well, what is next?

00:10:00.840 --> 00:10:02.600
Merlot, what you got for us?

00:10:02.600 --> 00:10:03.980
I think that's me.

00:10:03.980 --> 00:10:04.260
I think that's me.

00:10:04.260 --> 00:10:04.900
Yeah.

00:10:04.900 --> 00:10:05.240
Yeah.

00:10:05.940 --> 00:10:07.220
DBT.

00:10:07.220 --> 00:10:07.620
Have you ever heard?

00:10:07.620 --> 00:10:09.440
Of course you got to accept, you got to accept some cookies.

00:10:09.440 --> 00:10:09.880
Hold on.

00:10:09.880 --> 00:10:11.360
Oh, my bad.

00:10:11.360 --> 00:10:11.640
My bad.

00:10:11.640 --> 00:10:12.160
Just kidding.

00:10:12.160 --> 00:10:13.200
No, I'm just teasing.

00:10:14.200 --> 00:10:16.040
These cookie things drive me crazy, man.

00:10:16.040 --> 00:10:16.700
I don't know.

00:10:16.700 --> 00:10:17.080
Yeah.

00:10:17.080 --> 00:10:17.340
Yeah.

00:10:17.340 --> 00:10:17.460
Yeah.

00:10:17.460 --> 00:10:17.620
Yeah.

00:10:17.620 --> 00:10:17.720
Yeah.

00:10:17.720 --> 00:10:21.160
I think it's like, it's crazy how like now that it's popping up everywhere and then you

00:10:21.160 --> 00:10:24.680
see like the data, the gathering all the time and this and this and it's like, okay.

00:10:24.680 --> 00:10:24.940
Yeah.

00:10:24.940 --> 00:10:25.240
Yeah.

00:10:25.240 --> 00:10:27.900
but maybe DBT, have you ever heard of DBT?

00:10:27.900 --> 00:10:28.860
Is this something?

00:10:28.860 --> 00:10:32.340
Cause in the data world in my, my field, it's super popular, but, I don't know if it's

00:10:32.340 --> 00:10:33.300
a bubble as well.

00:10:33.300 --> 00:10:34.300
I've never heard of it.

00:10:34.300 --> 00:10:35.060
Michael never heard.

00:10:35.060 --> 00:10:35.180
Yeah.

00:10:35.180 --> 00:10:38.500
I think I've, I think I've heard of it, but I couldn't tell you what it does.

00:10:38.500 --> 00:10:40.580
So I was basically in the same spot.

00:10:40.580 --> 00:10:40.840
Yeah.

00:10:40.840 --> 00:10:41.580
Tell us about it.

00:10:42.020 --> 00:10:43.480
No, it's a, it's a really cool tool.

00:10:43.480 --> 00:10:44.540
It's open source as well.

00:10:44.540 --> 00:10:46.600
They have their cloud, option, I guess.

00:10:46.600 --> 00:10:46.840
Right.

00:10:46.840 --> 00:10:47.960
So you can pay and they host it.

00:10:47.960 --> 00:10:52.560
maybe a disclaimer as well that I never, I always see it and I always want to use it,

00:10:52.560 --> 00:10:54.300
but I haven't found the use case.

00:10:54.300 --> 00:10:56.100
So I don't have first-hand experience here.

00:10:56.100 --> 00:11:01.540
but basically the way I would describe is that they add best practices around SQL projects.

00:11:01.540 --> 00:11:04.260
So why am I, why am I mentioning this on Python bites?

00:11:04.260 --> 00:11:06.200
it's built with Python.

00:11:06.200 --> 00:11:06.700
Yay.

00:11:06.700 --> 00:11:12.000
and the other thing too is that, yeah, they actually mix Jinja with SQL.

00:11:12.000 --> 00:11:12.500
Right.

00:11:12.500 --> 00:11:14.260
So you can actually do four loops.

00:11:14.260 --> 00:11:15.320
You can do stuff like that.

00:11:15.320 --> 00:11:17.460
So you don't have to repeat every time and just change the variable.

00:11:17.460 --> 00:11:20.700
you, they also have these like reference macros and stuff.

00:11:20.700 --> 00:11:24.060
So you can actually say, okay, this comes from that table that is on that file.

00:11:24.060 --> 00:11:24.840
And this comes from this.

00:11:24.840 --> 00:11:27.560
So you can actually chain a lot of these dependencies, right?

00:11:27.560 --> 00:11:30.680
Like there's a lot of projects that you have this ETL stuff, right?

00:11:30.680 --> 00:11:32.700
So you just have to basically transform it each step.

00:11:32.700 --> 00:11:40.360
And, with dbt, they actually keep track of what depends on what, and you can say, oh, I want the freshest data here and you execute everything that it needs to be executed there.

00:11:40.360 --> 00:11:41.460
wow.

00:11:41.780 --> 00:11:42.120
Yeah.

00:11:42.120 --> 00:11:43.000
So it's super cool.

00:11:43.000 --> 00:11:45.000
They actually support a lot of like data platforms here.

00:11:45.000 --> 00:11:45.320
Right.

00:11:45.320 --> 00:11:49.860
So you see like big query data breaks, snowflake, all these things as well.

00:11:49.860 --> 00:11:52.980
another thing that they also more things they do.

00:11:53.060 --> 00:12:00.380
They even have some data validation stuff, which in my field, it's a big thing too, you know, like maybe have an ID column that needs to be unique, cannot be null.

00:12:00.380 --> 00:12:02.000
And you want to make sure that that always happens.

00:12:02.000 --> 00:12:04.040
And if it doesn't happen, you want to be flagged.

00:12:04.040 --> 00:12:04.260
Right.

00:12:04.260 --> 00:12:05.060
So that's super cool.

00:12:05.060 --> 00:12:07.180
what else?

00:12:07.180 --> 00:12:09.380
Ah, you also have some built-in documentation.

00:12:09.380 --> 00:12:15.960
So if you, once you have the dependencies, you can say, oh, show me the DAG, you know, show me where the data comes from and what depends on what.

00:12:15.960 --> 00:12:17.080
So that's also super cool.

00:12:17.300 --> 00:12:23.300
And recently actually, they actually started supporting, so like an SQL file kind of corresponds to a model, right?

00:12:23.300 --> 00:12:24.040
Cookies again.

00:12:24.040 --> 00:12:27.960
and, so they have SQL models.

00:12:27.960 --> 00:12:30.540
So that's the one, but they also started supporting Python models.

00:12:30.540 --> 00:12:30.960
Right.

00:12:30.960 --> 00:12:32.840
So this is very tight to data.

00:12:32.840 --> 00:12:34.580
So now you can actually mix and match, right?

00:12:34.580 --> 00:12:38.460
You can say this step, this transformation is in SQL, but this one is actually in Python.

00:12:38.460 --> 00:12:38.960
Right.

00:12:38.960 --> 00:12:42.620
So the way they don't run anything on the machine, they actually send it to the cloud.

00:12:42.620 --> 00:12:46.460
So snowflake has snow park, which is Python on its own snowflake.

00:12:46.700 --> 00:12:49.760
big query has spark and Databricks as well.

00:12:49.760 --> 00:12:50.200
Right.

00:12:50.200 --> 00:12:52.440
So basically you can mix and match this transformation.

00:12:52.440 --> 00:12:56.080
See, this transformation is there, but everything is like in a nice put in one place.

00:12:56.080 --> 00:12:58.400
And because it's on Git as well, you can have CI/CD.

00:12:58.400 --> 00:13:05.820
I think also you mentioned, I think it was you, Brian, that mentioned SQL fluff and SQL fluff actually came from a DBT project as well.

00:13:05.820 --> 00:13:07.120
So, and it's all in Python.

00:13:07.120 --> 00:13:07.960
So super cool.

00:13:07.960 --> 00:13:08.500
Wow.

00:13:08.500 --> 00:13:09.080
That's really neat.

00:13:09.080 --> 00:13:11.460
So what do the Python models look like?

00:13:11.460 --> 00:13:14.760
Are they straight Python classes or are they Pydantic or?

00:13:15.080 --> 00:13:20.460
I have, I watched, maybe I'm a bit lazy because I just watched the video and they were, they were showing here.

00:13:20.460 --> 00:13:21.740
how, how it works.

00:13:21.740 --> 00:13:23.280
Cause it's also doing a comparison, right?

00:13:23.280 --> 00:13:25.340
maybe this is, can this, no, this doesn't work.

00:13:25.340 --> 00:13:25.640
Does it?

00:13:25.640 --> 00:13:25.960
Yeah.

00:13:25.960 --> 00:13:26.300
It works.

00:13:26.300 --> 00:13:27.300
no, this works.

00:13:27.300 --> 00:13:27.640
Yeah.

00:13:27.640 --> 00:13:28.040
It was wrong.

00:13:28.040 --> 00:13:28.580
Okay.

00:13:28.580 --> 00:13:30.320
this is, but the quality is horrible.

00:13:30.320 --> 00:13:33.240
But in a nutshell, you have this basically, yeah.

00:13:33.240 --> 00:13:34.800
You define a function.

00:13:34.800 --> 00:13:35.360
Yeah.

00:13:35.360 --> 00:13:38.200
You define a function that has a DBT and a session and then you create a reference.

00:13:38.200 --> 00:13:39.980
So reference basically a table, right?

00:13:39.980 --> 00:13:45.200
And you can say, and then from that point on, you can say two Pandas and then you can just basically use the Pandas API to transform that.

00:13:45.200 --> 00:13:45.680
Right.

00:13:45.680 --> 00:13:47.280
So there's still some caveats, right?

00:13:47.280 --> 00:13:50.600
Cause Panda is not super performant depending on how much data you have and whatnot.

00:13:50.780 --> 00:13:56.720
So sometimes you probably still want to stick to, the SQL stuff, but then it opens a lot of possibilities there too.

00:13:56.720 --> 00:13:57.220
Right.

00:13:57.220 --> 00:14:01.120
So even stuff like deploying machine learning models on the SQL infrastructure and everything.

00:14:01.120 --> 00:14:01.740
So, yeah.

00:14:01.740 --> 00:14:05.540
So it's, kind of the same old, same old story.

00:14:05.540 --> 00:14:11.160
You know, even if you're working with an ORM, sometimes you don't want to bring all that data back to make some minor change.

00:14:11.160 --> 00:14:17.580
And then you would just do a sort of an update statement instead of pull back 10,000 models, change something and call save 10,000 times.

00:14:17.580 --> 00:14:17.740
Right.

00:14:17.740 --> 00:14:20.300
Like it's probably that kind of trade off, but it's really cool.

00:14:20.300 --> 00:14:22.580
That you can bring it back into Python this way.

00:14:22.580 --> 00:14:25.000
what are you using it for in your work?

00:14:25.000 --> 00:14:26.780
Or like, what are you interested in using it for?

00:14:26.780 --> 00:14:30.140
Well, I think we have a lot of these like ETL pipeline stuff, right?

00:14:30.140 --> 00:14:38.140
A lot of these, we have some data here and then we want to like basically clean it up and make sure it's all uniform and put in a dashboard, calculate some KPIs and whatnot.

00:14:38.140 --> 00:14:38.620
Right.

00:14:38.620 --> 00:14:40.940
And so business people can see, are we doing better?

00:14:40.940 --> 00:14:42.080
Are we making more money or not?

00:14:42.080 --> 00:14:42.400
Kind of.

00:14:42.400 --> 00:14:45.740
and like a lot of the times it's just SQL, right?

00:14:45.740 --> 00:14:47.520
It's also more accessible for a lot of people.

00:14:47.520 --> 00:14:48.440
So we stick to SQL.

00:14:48.880 --> 00:14:50.860
but there are also limitations, right?

00:14:50.860 --> 00:14:55.780
But before what I've seen is, people just kind of go in the UI and just execute stuff ad hoc.

00:14:55.780 --> 00:14:56.220
Right.

00:14:56.220 --> 00:14:57.340
So no versioning, nothing.

00:14:57.340 --> 00:14:59.200
And I think this kind of puts everything in one place.

00:14:59.200 --> 00:15:04.940
You can even add CI/CD because the CLI tool and everything, and just kind of make sure that everything goes to that versioned method.

00:15:04.940 --> 00:15:08.800
Let's say, I mean, and again, yeah, if you need something more, more fancy, right.

00:15:08.800 --> 00:15:12.520
Then you can throw some Python stuff in there, but usually we try to avoid it, to be honest.

00:15:12.520 --> 00:15:13.460
I can imagine.

00:15:13.460 --> 00:15:14.820
Oh, let's see here.

00:15:14.820 --> 00:15:15.900
hold on.

00:15:15.900 --> 00:15:16.240
Yeah.

00:15:16.240 --> 00:15:22.840
The models, the way you express the code, it's like, it's really nice looking for SQL, which is surprising.

00:15:22.840 --> 00:15:23.360
Right.

00:15:23.440 --> 00:15:28.700
This, this code you write, like with customers as select these fields from this, this table.

00:15:28.700 --> 00:15:29.400
And yeah.

00:15:29.400 --> 00:15:33.460
And they have a, they also have like the different macros and like people can write different macros.

00:15:33.460 --> 00:15:37.580
So like the describe function in Pandas, someone can just have written that and you can import that.

00:15:37.580 --> 00:15:40.240
And like, it's, it's really nice to share like all these things as well.

00:15:40.240 --> 00:15:41.260
So super cool.

00:15:41.260 --> 00:15:43.360
Really, really eager to, to give it a try.

00:15:43.360 --> 00:15:45.680
To be honest, I've been just like trying to scratch that.

00:15:45.680 --> 00:15:46.560
Like scratch that.

00:15:46.560 --> 00:15:49.460
Where's the next, where's the next project that we get to use this on?

00:15:49.460 --> 00:15:50.300
Indeed, indeed, indeed.

00:15:50.300 --> 00:15:51.460
Yeah.

00:15:51.460 --> 00:15:51.960
All right.

00:15:51.960 --> 00:15:56.400
Brian, anything you want to add before we jump over to, talking about our sponsor real quick?

00:15:56.400 --> 00:15:58.640
Yeah, let's, no, let's talk about our sponsor.

00:15:58.640 --> 00:15:59.360
All right.

00:15:59.360 --> 00:16:05.300
So, today's episode of Python Bytes is brought to you by Microsoft for Startups Founders Hub.

00:16:05.400 --> 00:16:13.220
So Microsoft for Startups set out to understand what startups need to be successful and created a digital platform to help you overcome those challenges.

00:16:13.220 --> 00:16:15.920
And they came up with Microsoft for Startups Founders Hub.

00:16:15.920 --> 00:16:21.400
The Founders Hub provides all founders at any stage with free resources to help solve startup challenges.

00:16:21.400 --> 00:16:29.040
The platform provides access to expert guidance, skilled resources, mentorship, and networking connections, technology benefits, and so much more.

00:16:29.040 --> 00:16:31.300
Founders Hub is truly open to all.

00:16:31.300 --> 00:16:33.480
You don't need to be investor backed, but you can be.

00:16:33.760 --> 00:16:37.760
Speed up development with free access to GitHub and the Microsoft Cloud.

00:16:37.760 --> 00:16:39.520
You can unlock credits over time.

00:16:39.520 --> 00:16:45.480
And there's also discounts and benefits from innovative companies partnering with Founders Hub, such as OpenAI.

00:16:45.480 --> 00:16:52.100
You'll have access to mentorship, their mentorship network, which includes hundreds of mentors across a range of disciplines.

00:16:52.100 --> 00:16:55.140
Need advice on marketing, fundraising, idea validation?

00:16:55.520 --> 00:16:57.900
There's tons of topics, including management and coaching.

00:16:57.900 --> 00:17:04.320
You'll be able to book one-on-one meetings with the mentors, many of whom are former founders themselves.

00:17:04.320 --> 00:17:06.660
It's no longer about who you know.

00:17:06.660 --> 00:17:13.060
Get critical support you need from Microsoft for Startup Founders Hub and make your ideas a reality today.

00:17:13.060 --> 00:17:17.920
Join the program by visiting pythonbytes.fm/foundershub 2022.

00:17:18.460 --> 00:17:20.200
That link is also in your show notes.

00:17:20.200 --> 00:17:20.700
Yep.

00:17:20.700 --> 00:17:22.580
Thanks, Microsoft, for keeping us going strong.

00:17:22.580 --> 00:17:23.720
All right.

00:17:23.720 --> 00:17:25.220
What have I got next?

00:17:25.220 --> 00:17:27.920
This one is a chain of really cool things.

00:17:27.920 --> 00:17:37.280
So, Roman Wright of Beanie Fame and other things tweeted about this project that Pablo Galindo Salgado has been working on.

00:17:37.280 --> 00:17:40.700
So, Pablo was the release manager for Python 3.11.

00:17:40.700 --> 00:17:42.780
It was part of the live stream of releasing.

00:17:42.780 --> 00:17:43.380
That was all fun.

00:17:43.380 --> 00:17:47.060
But he also, I believe, works at Bloomberg, where they work on memory.

00:17:47.060 --> 00:17:50.720
And I think we spoke about memory quite a while back, Brian.

00:17:50.720 --> 00:17:53.200
It's a memory profiling tool.

00:17:53.200 --> 00:17:53.760
Maybe.

00:17:54.540 --> 00:17:58.080
Merlo, do you use profilers and that kind of stuff in your world?

00:17:58.080 --> 00:18:00.120
No, I haven't used much.

00:18:00.120 --> 00:18:01.960
I haven't had a need, to be honest.

00:18:01.960 --> 00:18:02.400
Not yet.

00:18:02.400 --> 00:18:05.040
I feel like so far, there's no...

00:18:05.040 --> 00:18:05.940
Try to keep it simple.

00:18:05.940 --> 00:18:10.020
So, a lot of times profilers are about performance.

00:18:10.020 --> 00:18:11.460
Like, how fast did this code run?

00:18:11.460 --> 00:18:14.180
And if it's slower, should I look at this loop or that loop?

00:18:14.180 --> 00:18:15.840
Or, you know, where do you spend your time making it faster?

00:18:15.840 --> 00:18:18.400
Because it's really surprising when you look at code.

00:18:18.400 --> 00:18:19.600
You're like, this part looks complicated.

00:18:19.600 --> 00:18:20.680
So, that must be the slow part.

00:18:20.680 --> 00:18:22.100
Like, no, that doesn't matter.

00:18:22.100 --> 00:18:23.560
Nothing you do to that will make any difference.

00:18:23.640 --> 00:18:24.580
You got to look over here, right?

00:18:24.580 --> 00:18:25.460
That kind of stuff.

00:18:25.460 --> 00:18:31.300
But memory, as the name would suggest, is more about memory profiling and, like, talking about,

00:18:31.300 --> 00:18:35.160
you know, how many of these different things have you allocated and those kinds of things.

00:18:35.160 --> 00:18:36.780
What is coming?

00:18:36.780 --> 00:18:38.880
Well, first, let me pull up.

00:18:38.880 --> 00:18:42.160
We have a pytest plugin, which is super cool.

00:18:42.260 --> 00:18:46.720
So, with the pytest plugin, you can do two things now.

00:18:46.720 --> 00:18:50.120
You can say pytest --memory tests.

00:18:50.120 --> 00:18:57.580
And it'll tell you things like, you can actually set limits on how much memory can be allocated for a certain operation.

00:18:57.580 --> 00:19:00.900
And if it exceeds that, it'll say, oh, my gosh, there's something wrong.

00:19:00.900 --> 00:19:03.780
This thing is, like, way over using the memory we expected.

00:19:03.920 --> 00:19:04.520
So, that's an error.

00:19:04.520 --> 00:19:10.480
But it also gives you, like, a cool emoji-filled summary, I guess.

00:19:10.480 --> 00:19:15.760
Like, total memory allocated, the number of allocations, a histogram of allocation sizes.

00:19:16.080 --> 00:19:19.060
So, like, Python memory has, like, size classes.

00:19:19.060 --> 00:19:23.600
We've talked about its block arena, one other term.

00:19:23.600 --> 00:19:24.420
I'm forgetting.

00:19:24.420 --> 00:19:26.600
Like, that it uses to organize data structures.

00:19:26.600 --> 00:19:30.940
And then you can actually get it overall, then, for individual tests.

00:19:30.940 --> 00:19:34.660
And so, it'll tell you, like, the different things that were, you know, allocated.

00:19:34.660 --> 00:19:37.400
And anyway, it's pretty insane.

00:19:37.400 --> 00:19:37.880
Okay.

00:19:37.880 --> 00:19:39.440
So, you can get that report.

00:19:39.440 --> 00:19:41.600
And then you can also, where's the other one?

00:19:41.600 --> 00:19:43.280
I think it's, where was it?

00:19:43.360 --> 00:19:51.000
There's a place where you put a decorator, and you just say, on this test, if it exceeds this amount of allocation, that should fail the unit test.

00:19:51.000 --> 00:19:54.680
It's just a pytest.mark.memorylimit or something.

00:19:54.680 --> 00:19:56.220
I don't think it's a limit or memory limit.

00:19:56.220 --> 00:19:58.380
I can't remember exactly what it's called.

00:19:58.380 --> 00:20:05.700
You can say, if this test exceeds one megabyte of memory allocation, then that's a failed test, which is pretty cool, right, Brian?

00:20:05.700 --> 00:20:07.100
That's really great.

00:20:07.100 --> 00:20:12.220
So, yeah, they have a limit memory decorator and a check leaks decorator.

00:20:12.220 --> 00:20:13.080
That's the one.

00:20:13.300 --> 00:20:15.440
So, the check leaks is the new thing.

00:20:15.440 --> 00:20:21.840
And so, what you can do now is you can say pytest.mark.checkleaks as a decorator on your test.

00:20:21.840 --> 00:20:25.940
And if there's a memory leak in the code that runs during that, it will let you know.

00:20:25.940 --> 00:20:26.380
Wow.

00:20:26.380 --> 00:20:28.820
I don't know if anyone else has tried to track down memory leaks.

00:20:28.820 --> 00:20:33.180
I would rather track down, like, a multi-threaded race condition than a memory leak.

00:20:33.180 --> 00:20:35.180
I don't want anything to do with memory leaks.

00:20:35.180 --> 00:20:36.400
This is no fun.

00:20:36.400 --> 00:20:38.680
And so, if I can do it with a decorator, let's do it.

00:20:38.680 --> 00:20:44.000
Well, and also decorating your test so you're not having to modify your code at all to do this.

00:20:44.000 --> 00:20:47.860
I mean, the code under test, you're modifying your test code, if at all.

00:20:47.860 --> 00:20:51.260
Or it looks like it gives you some benefits even with no modification.

00:20:51.260 --> 00:20:52.100
It's pretty cool.

00:20:52.380 --> 00:20:57.080
Maybe, pardon my ignorance here, but when would I worry about memory leaks in Python?

00:20:57.080 --> 00:21:02.900
I think, so imagine you're writing pandas, right?

00:21:02.900 --> 00:21:06.440
And you've written a bunch of C code that's getting imported.

00:21:06.440 --> 00:21:09.600
And you know there's a memory leak in there somewhere.

00:21:09.600 --> 00:21:14.120
And it's just like, okay, well, I don't really know how to do it.

00:21:14.220 --> 00:21:18.540
But then it's more like the C part is the bandage.

00:21:18.540 --> 00:21:23.960
You can also have memory leaks in the sense that you expected there to be no more things

00:21:23.960 --> 00:21:25.720
allocated after the function was called.

00:21:25.720 --> 00:21:30.980
But you could have signed it to a global variable or you could have, you know, stored it, held

00:21:30.980 --> 00:21:33.160
on to a reference in some way that you weren't expecting.

00:21:33.160 --> 00:21:38.260
So, it's not a leak in the super traditional sense, but it could build up if you're doing

00:21:38.260 --> 00:21:39.080
something wrong in Python.

00:21:39.080 --> 00:21:40.940
But certainly outside of that.

00:21:40.940 --> 00:21:42.700
So, I think this is pretty cool.

00:21:42.700 --> 00:21:47.460
Really, any long-running service is going to have, you're going to be concerned about

00:21:47.460 --> 00:21:47.640
it.

00:21:47.640 --> 00:21:52.060
There's a lot of Python applications that are short-running and it just cleans up after

00:21:52.060 --> 00:21:52.980
itself when it's done.

00:21:52.980 --> 00:21:58.640
So, there's cases, long-running services, also things like maybe you care about, things

00:21:58.640 --> 00:22:04.760
that are using large amounts of data and need all of the data that they can get a hold of

00:22:04.760 --> 00:22:05.820
without wasting any.

00:22:05.820 --> 00:22:08.940
That's important as well.

00:22:08.940 --> 00:22:09.600
Makes sense.

00:22:09.600 --> 00:22:10.680
I'm also wondering.

00:22:10.680 --> 00:22:11.520
If you're right at the limit.

00:22:11.520 --> 00:22:11.880
Yeah.

00:22:12.180 --> 00:22:12.520
No, sorry.

00:22:12.520 --> 00:22:12.780
Go ahead.

00:22:12.780 --> 00:22:12.980
Go ahead.

00:22:12.980 --> 00:22:13.320
Yeah.

00:22:13.320 --> 00:22:18.540
If you're right at the limit of like, I'm using 15 and a half gigs and I don't have more

00:22:18.540 --> 00:22:18.900
than that.

00:22:18.900 --> 00:22:19.540
So, I need that.

00:22:19.540 --> 00:22:23.900
Or like, I just checked the Talk Python training site has been running for seven days and one

00:22:23.900 --> 00:22:24.260
hour.

00:22:24.260 --> 00:22:24.740
Yeah.

00:22:24.740 --> 00:22:28.200
Like, if it had a memory leak, you know, it's even if it's, you know, 100 kilobyte here

00:22:28.200 --> 00:22:30.780
and there, like it could turn out to be like a big hassle.

00:22:30.780 --> 00:22:31.400
Okay.

00:22:31.400 --> 00:22:31.860
Cool.

00:22:31.960 --> 00:22:35.100
I'm wondering if you could use this for edge device stuff.

00:22:35.100 --> 00:22:39.000
If we're going to limit the memory because we know the edge device won't have that much.

00:22:39.620 --> 00:22:42.220
That's actually a really good point.

00:22:42.220 --> 00:22:42.280
Oh, yeah.

00:22:42.280 --> 00:22:48.400
Because if you're on one of these like CircuitPython little boards, they've got like 256k of RAM.

00:22:48.400 --> 00:22:51.940
And that's very different than 16 gigs, isn't it?

00:22:51.940 --> 00:22:52.460
Yeah.

00:22:52.460 --> 00:22:52.700
Yeah.

00:22:52.700 --> 00:22:53.040
Right.

00:22:53.140 --> 00:22:58.020
So, you could test your application on a larger computer and limit how much memory

00:22:58.020 --> 00:22:58.900
you give it.

00:22:58.900 --> 00:22:59.880
Right.

00:22:59.880 --> 00:23:00.180
Yeah.

00:23:00.180 --> 00:23:03.860
I think you would want to do that with the limit rather than the check leaks, but still.

00:23:03.860 --> 00:23:04.300
Yeah.

00:23:04.300 --> 00:23:04.860
So, it's the same.

00:23:04.860 --> 00:23:05.360
Yeah.

00:23:05.360 --> 00:23:06.120
Cool.

00:23:06.120 --> 00:23:06.660
Yeah.

00:23:06.660 --> 00:23:06.960
Awesome.

00:23:06.960 --> 00:23:07.520
All right.

00:23:07.520 --> 00:23:07.900
Let's see.

00:23:07.900 --> 00:23:09.320
A couple of comments from the audience.

00:23:09.320 --> 00:23:10.260
Gareth out there.

00:23:10.260 --> 00:23:10.580
Hey, Gareth.

00:23:10.580 --> 00:23:14.560
Says, I ended up writing Docker containers that swapped out every couple hours to solve it.

00:23:14.560 --> 00:23:16.140
I mean, that's actually what a lot of people do.

00:23:16.140 --> 00:23:16.720
They're like, you know what?

00:23:16.720 --> 00:23:18.620
If it runs more than 12 hours, it's a problem.

00:23:18.620 --> 00:23:20.820
So, we just tell it to recycle itself.

00:23:21.420 --> 00:23:23.120
And then Madison says, this is so cool.

00:23:23.120 --> 00:23:26.200
I need memory profiling all the time with some of the data I do work with regularly.

00:23:26.200 --> 00:23:27.820
So, people are digging it.

00:23:27.820 --> 00:23:28.000
Cool.

00:23:28.000 --> 00:23:28.400
Yeah.

00:23:28.400 --> 00:23:28.880
Very cool.

00:23:28.880 --> 00:23:30.440
So, thank you, Roman.

00:23:30.440 --> 00:23:33.800
I know you didn't send that to us on purpose, but you shared it with us anyway.

00:23:33.800 --> 00:23:34.160
Thanks.

00:23:34.160 --> 00:23:34.720
Nice.

00:23:34.720 --> 00:23:35.820
Over to you, Brian.

00:23:35.820 --> 00:23:36.400
Okay.

00:23:36.400 --> 00:23:41.220
Before I get on to the next topic, I want to point out that Henry Schreiner, I'm going

00:23:41.220 --> 00:23:44.260
to paraphrase him by saying, Brian, you dork.

00:23:44.260 --> 00:23:45.580
You didn't even read the article.

00:23:45.580 --> 00:23:46.920
Yes, you're right, Henry.

00:23:46.920 --> 00:23:47.220
Sorry.

00:23:48.220 --> 00:23:56.540
So, the new prefixes, I was showing the previous new ones in 91 when they added yocto and zepto.

00:23:56.540 --> 00:23:57.560
These are not the new ones.

00:23:57.560 --> 00:24:04.160
The new ones are down here with ronacueta, ronto, and quecto.

00:24:04.160 --> 00:24:05.180
Yes.

00:24:05.180 --> 00:24:09.460
The reason why those sounded familiar is because they've been around.

00:24:09.460 --> 00:24:11.220
These new ones, they're the new ones.

00:24:11.220 --> 00:24:11.500
Okay.

00:24:11.500 --> 00:24:13.920
So, thanks, Henry, for clarifying that.

00:24:13.920 --> 00:24:20.640
But on to the next topic is Will McGugan says, please steal my source code.

00:24:20.640 --> 00:24:23.100
So, he wrote an article.

00:24:23.100 --> 00:24:26.820
Will McGugan wrote an article, stealing open source code from Textual.

00:24:27.200 --> 00:24:33.160
And he says, I would like to talk about a serious issue with free and open source software.

00:24:33.160 --> 00:24:35.120
Stealing code.

00:24:35.120 --> 00:24:37.080
You wouldn't steal a car, would you?

00:24:37.080 --> 00:24:43.500
And then, actually, he has this funny video that he embeds about how digital piracy really

00:24:43.500 --> 00:24:44.300
is like stealing.

00:24:44.300 --> 00:24:46.500
And it's sort of a funny video.

00:24:47.060 --> 00:24:53.620
But the comment is real that, like, you need to, you can steal code from open source projects

00:24:53.620 --> 00:24:55.060
as long as you can.

00:24:55.060 --> 00:25:01.280
So, please read the MIT license or read the license to make sure that you can.

00:25:01.280 --> 00:25:03.200
And in a lot of cases, you can.

00:25:03.200 --> 00:25:09.900
So, like, I'm going to give an example that I use a lot is I'll think of something that I

00:25:09.900 --> 00:25:10.320
want to do.

00:25:10.320 --> 00:25:14.760
Like, I'm interacting with a library and maybe I don't quite get how to do that with the

00:25:14.760 --> 00:25:15.200
documentation.

00:25:15.200 --> 00:25:19.800
I could search GitHub for projects that use that library also as an example.

00:25:19.800 --> 00:25:25.680
And so, that's a way to look at other source code of how to interact with a project that

00:25:25.680 --> 00:25:27.440
maybe doesn't have the greatest documentation.

00:25:27.440 --> 00:25:28.620
You can see how it's done.

00:25:28.620 --> 00:25:31.200
I've honestly never thought to do that.

00:25:31.200 --> 00:25:32.180
That's a great idea.

00:25:32.180 --> 00:25:34.920
I'll go look at the tests and stuff.

00:25:34.920 --> 00:25:35.760
I'm like, these tests suck.

00:25:35.760 --> 00:25:39.500
There's not a single one that shows me, like, this use case that I'm looking for.

00:25:39.500 --> 00:25:40.780
This is brilliant.

00:25:41.740 --> 00:25:47.000
Some of the, yeah, I do that a lot with pytest plugins because I look at how other plugins

00:25:47.000 --> 00:25:48.040
are testing their stuff.

00:25:48.040 --> 00:25:50.080
And I'm like, oh, how do they do it?

00:25:50.080 --> 00:25:55.500
So, the warning there is he's not advocating for piracy.

00:25:55.500 --> 00:25:59.180
Open source code gives you explicit permission to use it.

00:25:59.400 --> 00:26:04.200
And if you're actually just copying the whole thing, you probably should reference it and

00:26:04.200 --> 00:26:05.160
use the same license.

00:26:05.160 --> 00:26:07.580
Or if you're copying large chunks.

00:26:07.580 --> 00:26:11.780
But the MIT license, for example, says it's substantial copying.

00:26:11.780 --> 00:26:13.680
So, a little bit of copying is fine.

00:26:13.680 --> 00:26:18.500
And Will says, Textual has some cool stuff in it that you might want to look at.

00:26:18.500 --> 00:26:19.380
So, he's got a loop.

00:26:19.380 --> 00:26:21.400
He points out some things you might want to steal.

00:26:22.040 --> 00:26:23.480
The loop first and last.

00:26:23.480 --> 00:26:29.160
So, he's got a loop iterator that he's got a couple versions of it that will not only

00:26:29.160 --> 00:26:35.320
iterate through things, but it'll give you, it'll note which one's the first and the last.

00:26:35.320 --> 00:26:40.420
So, if you need to do something cool on something different on the first and the last one, do that.

00:26:40.980 --> 00:26:46.040
He tweeted recently or tooted or whatever about the LRU cache as well.

00:26:46.040 --> 00:26:49.820
So, the Python's got a built-in LRU cache, but everything's global.

00:26:49.820 --> 00:26:51.360
So, you can only kind of clear.

00:26:51.360 --> 00:26:53.540
There's limits on how you can interact with it.

00:26:53.540 --> 00:26:55.880
So, he has a more flexible LRU cache.

00:26:55.880 --> 00:27:01.940
He's got a color class that looks pretty cool that you can convert to different color representations.

00:27:01.940 --> 00:27:02.760
That's pretty neat.

00:27:02.760 --> 00:27:06.740
And then, you know, he's been working on a ton of geometry stuff, 2D geometry.

00:27:06.740 --> 00:27:10.780
So, he's like, you might want to use this for whatever 2D geometry you're using.

00:27:10.780 --> 00:27:11.580
And so, here's there.

00:27:11.580 --> 00:27:18.420
So, kind of cool, a reminder that open source, one of the benefits of open source is you get to see the source and learn from people.

00:27:18.420 --> 00:27:19.820
I like it.

00:27:19.820 --> 00:27:20.760
I love your idea.

00:27:20.760 --> 00:27:22.740
You've never done that.

00:27:22.740 --> 00:27:24.560
I'm like, it might dance.

00:27:24.560 --> 00:27:25.880
I just can't figure this out.

00:27:25.880 --> 00:27:27.380
Oh, how are other people using it?

00:27:27.380 --> 00:27:28.960
So, I do that a lot.

00:27:28.960 --> 00:27:30.780
I just get frustrated and go into a new library.

00:27:30.780 --> 00:27:31.380
This one sucks.

00:27:31.380 --> 00:27:31.920
I can't do this.

00:27:31.920 --> 00:27:32.880
I'm going to find another one.

00:27:32.880 --> 00:27:33.760
It's not good enough.

00:27:33.760 --> 00:27:35.560
Merlo, are you an open source thief?

00:27:35.560 --> 00:27:36.680
Do you do this kind of stuff?

00:27:36.680 --> 00:27:38.280
I have to admit, yes.

00:27:38.280 --> 00:27:38.960
Yes, I am.

00:27:38.960 --> 00:27:40.460
Stack Overflow thief.

00:27:40.900 --> 00:27:44.460
Open source thief is just, especially in the early, early days, right?

00:27:44.460 --> 00:27:49.340
But I think with rich stuff too, it's very inviting for you to steal code.

00:27:49.340 --> 00:27:51.580
Because even on the rich package, right?

00:27:51.580 --> 00:27:57.940
Like if you do Python-M rich table or whatever, you always show some really nice stuff on the terminal, right?

00:27:58.380 --> 00:28:00.220
And I was like, how does he do that?

00:28:00.220 --> 00:28:04.340
Or like, I think for every component, he had a little demo that you can just run.

00:28:04.340 --> 00:28:05.880
And it's very tempting.

00:28:05.880 --> 00:28:11.340
Even if he didn't want people to steal stuff from him, I feel like you have a hard time just keeping the thieves away, you know?

00:28:11.340 --> 00:28:11.980
Yeah.

00:28:11.980 --> 00:28:12.340
Yeah.

00:28:12.340 --> 00:28:13.420
Yeah, very cool.

00:28:13.420 --> 00:28:14.520
And funny too.

00:28:14.520 --> 00:28:15.260
I like it.

00:28:15.260 --> 00:28:15.700
Good job.

00:28:15.700 --> 00:28:16.380
Good job, Will.

00:28:16.380 --> 00:28:17.780
Where are we at now?

00:28:17.780 --> 00:28:18.180
All right.

00:28:18.180 --> 00:28:21.420
Off to Merlo's final item.

00:28:21.760 --> 00:28:22.040
Yes.

00:28:22.040 --> 00:28:23.220
This one I had not heard of either.

00:28:23.220 --> 00:28:24.520
And it looks pretty interesting.

00:28:24.520 --> 00:28:25.060
Yeah.

00:28:25.060 --> 00:28:28.480
I mean, it's a, I think it kind of, it's one of the things that I saw.

00:28:28.480 --> 00:28:29.640
I was like, yeah, this makes so much sense.

00:28:29.640 --> 00:28:30.360
Why?

00:28:30.360 --> 00:28:31.980
How come I never, I didn't think of this before.

00:28:31.980 --> 00:28:33.540
But this is Shed.

00:28:33.540 --> 00:28:34.040
I'm a man.

00:28:34.040 --> 00:28:34.980
This is a podcast, right?

00:28:34.980 --> 00:28:42.740
So maybe Shed is, it basically, I think it's related to like bike shedding, shed your legacy code, right?

00:28:42.740 --> 00:28:45.280
So it's like a superset of black, right?

00:28:45.280 --> 00:28:47.060
They call it black plus plus here.

00:28:47.060 --> 00:28:51.340
So they say here, a maximally opinionated auto formatting tool, right?

00:28:51.340 --> 00:28:57.460
So it's all about configuration over, convention over configuration, which is also something that I can subscribe to.

00:28:57.460 --> 00:29:03.700
They have no configuration options, but basically it's a bundling of a lot of tools, right?

00:29:03.700 --> 00:29:09.140
So they have black here, but they also have eyesort and with the profile black, so it doesn't clash.

00:29:09.140 --> 00:29:12.740
They also have pi upgrade, which I think you guys mentioned a couple of times, right?

00:29:12.740 --> 00:29:13.160
Yeah, we did.

00:29:13.160 --> 00:29:14.440
And autoflake as well.

00:29:14.740 --> 00:29:16.440
Autoflake, I didn't know actually before.

00:29:16.440 --> 00:29:23.500
But basically it removes unused imports and unused variables from your Python code.

00:29:23.500 --> 00:29:25.180
So it's kind of like, yeah, that's all I wanted.

00:29:25.180 --> 00:29:27.200
I wish I had this last week.

00:29:27.200 --> 00:29:29.520
There you go.

00:29:29.520 --> 00:29:29.920
Yeah.

00:29:29.920 --> 00:29:32.060
But yeah, it's a one-stop shop.

00:29:32.060 --> 00:29:34.200
And even do like a blackened docs, right?

00:29:34.200 --> 00:29:37.240
So if you have doc strings or markdown or everything, you will take that.

00:29:37.240 --> 00:29:38.760
It will black format that for you.

00:29:38.760 --> 00:29:40.780
So I was like, yeah, this is what I wanted.

00:29:40.780 --> 00:29:41.180
Okay.

00:29:41.180 --> 00:29:41.920
Hold on.

00:29:41.920 --> 00:29:42.740
Blackened docs.

00:29:42.740 --> 00:29:44.140
This is new to me too.

00:29:44.140 --> 00:29:44.640
All right.

00:29:44.640 --> 00:29:45.220
Yeah.

00:29:45.220 --> 00:29:45.900
Let's see.

00:29:45.900 --> 00:29:49.940
So this is black on Python blocks, sample code blocks.

00:29:49.940 --> 00:29:50.500
Yes.

00:29:50.500 --> 00:29:56.020
So if you have rich structured text, markdown, even doc strings, it will format that for you.

00:29:56.020 --> 00:29:58.820
Oh, like you like blackening your readme, for instance.

00:29:58.820 --> 00:30:00.060
Yes.

00:30:00.060 --> 00:30:00.600
Yes.

00:30:00.600 --> 00:30:01.040
Yes.

00:30:01.560 --> 00:30:02.800
Oh, okay.

00:30:02.800 --> 00:30:03.780
This is good.

00:30:03.780 --> 00:30:04.200
Indeed.

00:30:04.200 --> 00:30:09.300
So I have some stuff to talk about at the very end, just a little bit about blogging and writing

00:30:09.300 --> 00:30:11.200
and some platforms and stuff.

00:30:11.200 --> 00:30:12.460
And that's all in Markdown.

00:30:12.460 --> 00:30:19.000
Like I could run this against all of my code samples on my blog to basically auto format all

00:30:19.000 --> 00:30:19.780
code in the blog.

00:30:19.780 --> 00:30:20.720
That would be cool.

00:30:20.720 --> 00:30:21.100
Yeah.

00:30:21.640 --> 00:30:22.000
Yes.

00:30:22.000 --> 00:30:22.800
Exciting.

00:30:22.800 --> 00:30:25.060
The next time I write a book, I'm totally going to use that.

00:30:25.060 --> 00:30:25.440
Yeah.

00:30:25.440 --> 00:30:26.300
Or if you're doing a book.

00:30:26.300 --> 00:30:26.500
Yeah.

00:30:26.500 --> 00:30:27.400
I mean, absolutely.

00:30:28.260 --> 00:30:34.360
So I literally just like yesterday, the day before I was cleaning up some code.

00:30:34.360 --> 00:30:37.860
I finally got, you know, I kind of, I don't do it clean the whole time.

00:30:37.860 --> 00:30:38.820
I get it to work.

00:30:38.820 --> 00:30:41.460
And then I like, you know, then I look at what I did stupid.

00:30:41.460 --> 00:30:46.280
And there's, there might be some imports laying around that I thought I needed because you add

00:30:46.280 --> 00:30:50.160
an import and then you take that code out, but you sometimes forget to take the import

00:30:50.160 --> 00:30:50.320
out.

00:30:50.320 --> 00:30:52.360
So I ran black on everything, of course.

00:30:52.360 --> 00:30:55.580
And then, and then I ran flake eight and I'm getting errors.

00:30:55.680 --> 00:30:58.400
And I'm like, shoot, why didn't black just take those out?

00:30:58.400 --> 00:31:00.540
So now I've got shed and I take those out.

00:31:00.540 --> 00:31:01.560
It does it all.

00:31:01.560 --> 00:31:01.840
Right.

00:31:01.840 --> 00:31:02.700
Like it's, it's great.

00:31:02.700 --> 00:31:02.860
Yeah.

00:31:02.860 --> 00:31:03.720
Because maybe it's the same, right?

00:31:03.720 --> 00:31:05.100
Like your flake eight is like, ah, yeah.

00:31:05.100 --> 00:31:05.840
The unused variable.

00:31:05.840 --> 00:31:06.280
Ah, okay.

00:31:06.280 --> 00:31:09.540
They have to go there one by one, you know, it's like, it feels like there should be a

00:31:09.540 --> 00:31:10.100
nicer way.

00:31:10.100 --> 00:31:10.480
Right.

00:31:10.480 --> 00:31:11.000
Yeah.

00:31:11.000 --> 00:31:12.040
I mean, it's good.

00:31:12.040 --> 00:31:16.700
You have to pay attention to that because your unused variable might be a typo or something.

00:31:16.700 --> 00:31:18.700
You might think you're using it.

00:31:18.700 --> 00:31:20.360
That's true.

00:31:20.360 --> 00:31:20.760
Yeah.

00:31:20.760 --> 00:31:24.680
Or it's like a global variable module supposed to share with something else.

00:31:24.820 --> 00:31:28.020
And it's a library, but in general, I mean, you could probably put like a hash, you know,

00:31:28.020 --> 00:31:29.160
QA or something on it.

00:31:29.160 --> 00:31:29.980
Well, I mean, yeah.

00:31:29.980 --> 00:31:32.000
And also you're, you're, you're testing.

00:31:32.000 --> 00:31:34.140
So your test will catch it if you delete too much.

00:31:34.140 --> 00:31:34.600
So.

00:31:34.600 --> 00:31:36.440
Yeah.

00:31:36.440 --> 00:31:37.800
All right.

00:31:37.800 --> 00:31:38.820
Well, really, really good one.

00:31:38.820 --> 00:31:41.540
Take your code out to the shed and whip it into shape behind the shed.

00:31:41.540 --> 00:31:43.300
That's it.

00:31:43.300 --> 00:31:44.640
All right.

00:31:44.640 --> 00:31:44.960
All right.

00:31:44.960 --> 00:31:46.060
Well, Brian, what else we got?

00:31:46.060 --> 00:31:46.520
Extras?

00:31:46.520 --> 00:31:47.960
I got some extras.

00:31:47.960 --> 00:31:48.920
You got some extras.

00:31:48.920 --> 00:31:49.760
Who should go first?

00:31:50.400 --> 00:31:51.120
You go first.

00:31:51.120 --> 00:31:51.660
Okay.

00:31:51.660 --> 00:31:56.360
Well, the thing that I've been working on is, is by test check.

00:31:56.360 --> 00:32:00.860
And I finally got, and I've been talking about this for like a month because I've been slowly

00:32:00.860 --> 00:32:02.800
pulling this into shape.

00:32:02.800 --> 00:32:07.680
It's almost a complete, not really a rewrite, but I moved everything around and the code's

00:32:07.680 --> 00:32:08.580
a lot easier to read.

00:32:08.640 --> 00:32:09.780
And so it makes me happy.

00:32:09.780 --> 00:32:11.600
And I also changed the API.

00:32:11.600 --> 00:32:18.200
So I wanted to mention to everybody that you can either use, so you can either use from

00:32:18.200 --> 00:32:24.120
pytest check, import check to get this check object, or you can stick the check object as

00:32:24.120 --> 00:32:24.660
a fixture.

00:32:24.660 --> 00:32:27.440
And either way, you get access to everything in the library.

00:32:27.440 --> 00:32:28.440
That's the only thing you have to do.

00:32:28.440 --> 00:32:33.740
And for people unfamiliar, pytest check is a, is a library that allows you to have multiple

00:32:33.740 --> 00:32:34.840
failures per test.

00:32:34.840 --> 00:32:40.100
You know, normally the recommendation is try to fail on one thing, but sometimes you

00:32:40.100 --> 00:32:40.900
need lots of data.

00:32:40.900 --> 00:32:43.580
And I just threw in a little example that uses both.

00:32:43.580 --> 00:32:47.980
So if like it's using HTTPX to grab, grab the status code.

00:32:47.980 --> 00:32:52.060
And as long as the status code is 200, then I can check a whole bunch of stuff.

00:32:52.060 --> 00:32:55.100
I can check to make sure the redirect and encoding is right.

00:32:55.100 --> 00:33:00.580
And check for some, some stuff inside the, I mean, you, you, these could be multiple tests,

00:33:00.580 --> 00:33:03.840
but if it really is, you're checking multiple parts of things.

00:33:03.840 --> 00:33:08.780
And for scientific work that I'm in measurement work that I do, I'm often checking like a tons

00:33:08.780 --> 00:33:09.900
of aspects of a waveform.

00:33:09.900 --> 00:33:12.500
And it's really just making sure the waveforms right.

00:33:12.500 --> 00:33:15.180
And that rightness is multiple checks.

00:33:15.180 --> 00:33:16.340
So use that.

00:33:16.340 --> 00:33:21.240
Anyway, I didn't intend to break anybody, but I did break Brian's skin.

00:33:21.700 --> 00:33:27.020
So Brian came up at the beginning of the article, but he tagged me in a GitHub issue on his project.

00:33:27.020 --> 00:33:30.500
And I looked at it and I'm like, oh, I didn't intend to break that.

00:33:30.500 --> 00:33:31.600
So I fixed it this morning.

00:33:31.600 --> 00:33:37.700
So hopefully if, if anybody gets broken by this, I was not intending to break anybody.

00:33:37.700 --> 00:33:39.360
Just let me know and I'll try to fix it.

00:33:39.360 --> 00:33:40.040
That looks great.

00:33:40.040 --> 00:33:41.020
How about you?

00:33:41.020 --> 00:33:42.920
Merlo, I know you have some as well.

00:33:42.920 --> 00:33:43.660
I'll let you go as well.

00:33:43.660 --> 00:33:44.040
Sorry.

00:33:44.500 --> 00:33:44.940
Maybe.

00:33:44.940 --> 00:33:49.800
Yeah, I feel like I should have opened that.

00:33:49.800 --> 00:33:50.900
I didn't have the link up here.

00:33:50.900 --> 00:33:56.760
But talking about breaking stuff, Flake 8 is not on GitLab anymore.

00:33:56.760 --> 00:34:00.760
And I actually didn't have issues with that because with pre-commit, right?

00:34:00.760 --> 00:34:01.800
You have to specify the repo.

00:34:01.800 --> 00:34:06.060
I already was on GitHub, but I actually heard from people, some people that they heard a lot

00:34:06.060 --> 00:34:08.560
of noise that Flake 8 is not on GitLab anymore.

00:34:08.560 --> 00:34:11.440
And then there was also this video from Anthony that is maintaining, right?

00:34:11.440 --> 00:34:12.820
Pre-commit and Flake 8.

00:34:12.820 --> 00:34:16.840
He was explaining a bit because why, what was the motivation from going from GitLab to

00:34:16.840 --> 00:34:17.100
GitHub?

00:34:17.100 --> 00:34:22.880
And yeah, like what's relatable is that like sometimes you break people's code, but it's

00:34:22.880 --> 00:34:24.100
like, it's not any intention, right?

00:34:24.100 --> 00:34:26.600
But sometimes people can get very heated over these things.

00:34:26.600 --> 00:34:31.980
So yeah, just maybe public service announcement, you know, change your Git repo to GitHub now

00:34:31.980 --> 00:34:33.700
for if you're using Flake 8 as a pre-commit.

00:34:33.700 --> 00:34:36.480
You also had Mastodon.py, right?

00:34:36.480 --> 00:34:37.820
Yes, yes, yes.

00:34:37.820 --> 00:34:38.480
That I did.

00:34:38.480 --> 00:34:42.200
I just, sorry, I flipped the order because I thought it was, it was, it was a segue there.

00:34:42.200 --> 00:34:43.680
Yeah, yeah, yeah.

00:34:43.680 --> 00:34:47.540
I wish I knew about this like a week ago or so.

00:34:47.540 --> 00:34:48.320
That would have been awesome.

00:34:48.320 --> 00:34:50.640
You covered Toot, I think, right?

00:34:50.640 --> 00:34:51.880
Yes, we covered Toot.

00:34:51.880 --> 00:34:52.260
That's right.

00:34:52.260 --> 00:34:52.840
Yeah, yeah.

00:34:52.840 --> 00:34:58.060
So this is, to be very honest, I wasn't the one that found this, was my boss.

00:34:58.060 --> 00:34:59.940
So shout out to Bart if you're listening right now.

00:35:00.480 --> 00:35:04.100
But this is basically just a wrapper around the Mastodon API, right?

00:35:04.100 --> 00:35:05.000
So you don't have to do requests.

00:35:05.000 --> 00:35:07.740
You can usually have like a nice client library there to do all these things.

00:35:07.740 --> 00:35:12.580
So if you want to play around, create some bots, you know, whatever, then yeah, there's

00:35:12.580 --> 00:35:15.020
a nice convenient package now for you to do it.

00:35:15.020 --> 00:35:15.380
Wow.

00:35:15.380 --> 00:35:16.020
This is really cool.

00:35:16.020 --> 00:35:16.980
And it has, you know what?

00:35:16.980 --> 00:35:19.060
Documentations that say what functions it has.

00:35:19.120 --> 00:35:19.620
I love it.

00:35:19.620 --> 00:35:21.660
Documentation.

00:35:21.660 --> 00:35:23.300
Just read the code.

00:35:23.300 --> 00:35:24.280
It doesn't have to be much.

00:35:24.280 --> 00:35:28.000
Like the seven or eight lines of code that are in the readme, like gives you a really good

00:35:28.000 --> 00:35:28.200
boost.

00:35:28.200 --> 00:35:32.160
But it lets you register your app, which is one of the things if you go to the website,

00:35:32.160 --> 00:35:36.740
it'll show you which apps are registered for your access keys on Mastodon, but it won't

00:35:36.740 --> 00:35:38.880
let you create one on the website.

00:35:38.880 --> 00:35:42.860
So here's like a simple create app and just give it a kind of your instance name and what

00:35:42.860 --> 00:35:46.420
file to save the access tokens over to and boom, you're good to go.

00:35:46.720 --> 00:35:49.160
Have you guys already done stuff with the Mastodon or?

00:35:49.160 --> 00:35:49.800
Yeah.

00:35:49.800 --> 00:35:53.900
I, you know, on the stream deck, the thing that controls the stream, I already wrote that

00:35:53.900 --> 00:35:58.400
thing where I, when I pushed the one button, it, it sends out the message automatically that

00:35:58.400 --> 00:35:59.600
this live stream is starting.

00:35:59.600 --> 00:36:04.620
And yeah, it uses, that uses a little bit of toot and mostly just the straight API with

00:36:04.620 --> 00:36:05.340
HTTPX.

00:36:05.340 --> 00:36:07.380
But if I'd known about this, you know, I already used it.

00:36:07.380 --> 00:36:08.820
Now we know.

00:36:08.820 --> 00:36:09.480
Yeah, I know.

00:36:09.480 --> 00:36:10.140
Thanks for sharing that.

00:36:10.140 --> 00:36:12.120
Anything else you want to share before we move on?

00:36:12.120 --> 00:36:12.640
Yes.

00:36:12.640 --> 00:36:16.700
So there are a couple more things, but this one, this is the, the, the, the, the,

00:36:16.700 --> 00:36:19.580
Brazilian enemy that couldn't resist the world cup started.

00:36:19.580 --> 00:36:22.020
I don't know if, are you guys soccer fans or not at all?

00:36:22.020 --> 00:36:24.580
So we've a fun soccer team.

00:36:24.580 --> 00:36:25.040
Here we go.

00:36:25.040 --> 00:36:27.380
See, I go see with the kids and stuff in town.

00:36:27.380 --> 00:36:27.860
Yeah.

00:36:27.860 --> 00:36:30.800
So the, so I'm also in machine learning.

00:36:30.800 --> 00:36:34.200
So a lot of data and like this time of the year, you know, there's a lot of like, oh yeah,

00:36:34.200 --> 00:36:35.500
the AI models are predicting this.

00:36:35.500 --> 00:36:37.240
This one is one from Oxford.

00:36:37.240 --> 00:36:38.920
So I just wanted to give a quick shout out here.

00:36:39.380 --> 00:36:42.080
So they, they have a video on YouTube as well, which is cool.

00:36:42.080 --> 00:36:43.120
They explain the math.

00:36:43.120 --> 00:36:46.700
And I will go on a limb here and say they use Python because they even mentioned Metplotlib

00:36:46.700 --> 00:36:47.040
and whatnot.

00:36:47.040 --> 00:36:50.880
But this is basically just a big excuse to say that they predict Brazil to win.

00:36:50.880 --> 00:36:53.540
So, you know, if this doesn't happen, it's all rigged.

00:36:53.540 --> 00:36:56.020
This, the math suggests, the math supports this.

00:36:56.260 --> 00:37:00.180
So Brazil must win this World Cup and anything that is not there, I'm going to be extremely

00:37:00.180 --> 00:37:00.660
disappointed.

00:37:00.660 --> 00:37:03.960
This is really cool.

00:37:03.960 --> 00:37:09.260
People are always looking for like realistic examples to learn and explore libraries and

00:37:09.260 --> 00:37:09.580
tools.

00:37:09.580 --> 00:37:12.660
And this, you know, if you're into soccer and you care about the World Cup, this is great.

00:37:12.660 --> 00:37:13.100
Yeah.

00:37:13.100 --> 00:37:16.480
I think if you, yeah, there's, there's people, people are very creative.

00:37:16.480 --> 00:37:18.360
I feel like there's a lot of uses for it.

00:37:18.360 --> 00:37:21.640
Well, I'm sure this will happen because there's absolutely no corruption in soccer.

00:37:21.640 --> 00:37:22.300
Yeah.

00:37:22.300 --> 00:37:22.520
Yeah.

00:37:22.520 --> 00:37:22.920
For sure.

00:37:22.920 --> 00:37:25.140
Yeah.

00:37:25.140 --> 00:37:25.620
Not at all.

00:37:25.620 --> 00:37:26.140
Not at all.

00:37:26.140 --> 00:37:27.860
Cool.

00:37:27.860 --> 00:37:30.840
Should I just keep going or you want to take over?

00:37:30.840 --> 00:37:32.160
If you got more items?

00:37:32.160 --> 00:37:32.600
Yeah.

00:37:32.600 --> 00:37:32.900
Keep going.

00:37:32.900 --> 00:37:34.260
Take us down the list.

00:37:34.260 --> 00:37:35.560
I have two more.

00:37:35.560 --> 00:37:36.160
Sorry.

00:37:36.160 --> 00:37:37.800
I know you said I could have more than two.

00:37:37.800 --> 00:37:39.160
So you can just wait.

00:37:39.160 --> 00:37:40.940
That's what this whole section is about.

00:37:40.940 --> 00:37:42.300
One.

00:37:42.300 --> 00:37:46.200
So for me as a data scientist or machine learning engineer, we use a lot of notebooks.

00:37:46.200 --> 00:37:46.440
Right.

00:37:46.440 --> 00:37:50.100
And I think they have their place in data science, but there are some tools that don't, don't

00:37:50.100 --> 00:37:51.320
play very nicely with it.

00:37:51.320 --> 00:37:51.520
Right.

00:37:51.520 --> 00:37:55.580
And I think in Git diffs or PRs, they don't, they don't play so nicely.

00:37:55.580 --> 00:37:55.920
Right.

00:37:55.920 --> 00:37:57.960
So this is a, I think it's public preview.

00:37:57.960 --> 00:38:02.480
I want to say, but I haven't actually seen this, but now GitHub is going to start supporting

00:38:02.480 --> 00:38:03.620
notebook diffs.

00:38:03.620 --> 00:38:07.540
So if you have a pull request, they're going to have a nicer rendering of the notebook here

00:38:07.540 --> 00:38:09.060
and you can actually see what the differences are.

00:38:09.260 --> 00:38:13.620
And I think before there was a tool called review and be that you could add to GitHub.

00:38:13.620 --> 00:38:17.240
But yeah, now they're just going to start supporting it.

00:38:17.240 --> 00:38:20.020
So I haven't seen how it looks, but I'm pretty excited about this too.

00:38:20.020 --> 00:38:21.140
One less headache for me.

00:38:21.140 --> 00:38:21.540
Yeah.

00:38:21.540 --> 00:38:22.000
That's excellent.

00:38:22.000 --> 00:38:24.940
Because before the diff would just be like, here's the diff of the JSON file.

00:38:24.940 --> 00:38:26.560
You're like, no, that's not what I want to say.

00:38:27.220 --> 00:38:29.440
And also JSON is just JSON, like just key value.

00:38:29.440 --> 00:38:33.420
So if you just change the order of some keys, it's just like, yeah, you have a lot of changes,

00:38:33.420 --> 00:38:34.340
but it's not, you don't care.

00:38:34.340 --> 00:38:34.840
Yeah.

00:38:34.840 --> 00:38:36.200
Oh, this looks really useful.

00:38:36.200 --> 00:38:36.720
Yeah.

00:38:36.820 --> 00:38:39.600
And maybe one last, if that's okay.

00:38:39.600 --> 00:38:40.060
Yeah.

00:38:40.060 --> 00:38:41.080
Just pull this here.

00:38:41.080 --> 00:38:42.040
This is Lancer.

00:38:42.040 --> 00:38:43.380
So it's another CLI tool.

00:38:43.380 --> 00:38:45.260
I talked about linting before, right?

00:38:45.260 --> 00:38:47.360
So this is another kind of linting.

00:38:47.360 --> 00:38:55.440
And I say kind of, because so, you know, some definition of linting or cleanup.

00:38:55.440 --> 00:38:55.760
Yeah.

00:38:55.760 --> 00:38:59.020
So this is like black, almost like black, but it's the opposite.

00:38:59.020 --> 00:39:04.060
So instead of making your code look nice, it would just make it like a hideous, but working mess.

00:39:04.060 --> 00:39:04.420
Right?

00:39:04.420 --> 00:39:05.860
So these are some of the features.

00:39:06.240 --> 00:39:10.740
It turns all your comments to pit bull lyrics or something safe for work, depending if you want.

00:39:10.740 --> 00:39:16.740
It takes all your variable names and mix into like animal sounds and horribly look similar

00:39:16.740 --> 00:39:17.480
looking characters.

00:39:17.480 --> 00:39:21.620
So like bark underscore bark underscore zero, oh, oh, zero, oh.

00:39:21.620 --> 00:39:23.580
It adds white spaces.

00:39:23.580 --> 00:39:26.440
It adds completely irrelevant comments.

00:39:26.440 --> 00:39:29.460
And the code still runs after these improvements.

00:39:29.460 --> 00:39:30.800
So here's an example.

00:39:30.800 --> 00:39:34.640
You have to hear some comments and everything.

00:39:34.940 --> 00:39:36.720
So before, like nicely formatted.

00:39:36.720 --> 00:39:40.100
And then afterwards, you see some comments like, bada bim, bada boom.

00:39:40.100 --> 00:39:44.780
You know, there's nothing like Miami heat, some alpha characters in your variable name.

00:39:45.440 --> 00:39:45.940
Pretty good stuff.

00:39:45.940 --> 00:39:46.600
Pretty good stuff.

00:39:46.600 --> 00:39:51.760
Again, I must say I haven't used this, but this is a tool that I'm not as excited to use.

00:39:52.880 --> 00:40:00.760
I mean, there's all, there's always times that you need to send out your code to different places and you would rather share it less than more.

00:40:00.980 --> 00:40:08.780
You know, like if you're thinking of like, if you make a desktop app and you got to send out the code for that or whatever, and you would want to obfuscate it.

00:40:08.780 --> 00:40:11.900
You want to make it harder for people to just pick it up and like do something.

00:40:11.900 --> 00:40:13.000
You could hit it with this.

00:40:13.000 --> 00:40:15.780
They'd be like, yeah, no, no, we're just, no, we're just not doing that.

00:40:15.900 --> 00:40:28.300
So my favorite one, my favorite ones on the screen is the, adding obvious comments, like, setting the value of some, like, that wasn't in the original.

00:40:28.300 --> 00:40:31.600
And it's just funny that, I mean, that that's actually not gibberish.

00:40:31.600 --> 00:40:32.740
It's just useless.

00:40:32.740 --> 00:40:37.980
it's, it's really good.

00:40:37.980 --> 00:40:42.200
The, the, comments out in the live stream are really great, as well.

00:40:42.200 --> 00:40:43.180
People are enjoying it.

00:40:43.180 --> 00:40:45.120
One of them is it's great for Twitter employees.

00:40:45.120 --> 00:40:48.660
You can maximize your lines of code for review as it's coming up.

00:40:48.660 --> 00:40:51.320
Then you just print it out and you take a sidebar.

00:40:51.320 --> 00:40:58.360
Like if somebody says print out my code so we can review it, they're not, they're not, equipped to review the code that you may have written.

00:40:58.360 --> 00:41:01.260
Like if the word print involves in is valuing code, like, no.

00:41:01.260 --> 00:41:01.780
All right.

00:41:01.780 --> 00:41:02.720
Just, I don't think so.

00:41:02.720 --> 00:41:09.100
So, leave that where that is, but you could, you could put this on top of like, yeah, I'm kind of funky when I write codes.

00:41:09.100 --> 00:41:09.960
It's a little different.

00:41:09.960 --> 00:41:11.900
Let's get used to let's yeah.

00:41:11.900 --> 00:41:13.480
I just, it's a farm.

00:41:13.480 --> 00:41:14.340
It's a code farm.

00:41:14.340 --> 00:41:14.820
Yeah.

00:41:14.820 --> 00:41:15.640
Oink, oink, oink.

00:41:15.640 --> 00:41:16.260
Yeah.

00:41:16.260 --> 00:41:18.660
You can have two sets of books.

00:41:18.660 --> 00:41:25.700
kind of, you got your real repo and then you port use this to, to put it into the actual one that you submit.

00:41:25.700 --> 00:41:27.640
and you're like, I understand it.

00:41:27.640 --> 00:41:28.720
I don't know what your problem is.

00:41:28.720 --> 00:41:29.800
It works.

00:41:29.800 --> 00:41:30.660
It works on my machine.

00:41:30.660 --> 00:41:31.700
I don't know.

00:41:32.980 --> 00:41:35.400
I kind of want to run this on a large code base.

00:41:35.400 --> 00:41:38.480
I like something really complicated.

00:41:38.480 --> 00:41:40.000
Squash all the commits.

00:41:40.000 --> 00:41:41.540
Put force push.

00:41:41.540 --> 00:41:43.360
Like, like textual.

00:41:43.360 --> 00:41:45.060
Release it as textual.

00:41:45.060 --> 00:41:45.600
Oink, oink.

00:41:45.600 --> 00:41:46.280
Or something.

00:41:48.440 --> 00:41:48.840
Yes.

00:41:48.840 --> 00:41:48.920
Yes.

00:41:48.920 --> 00:41:49.460
I love it.

00:41:49.460 --> 00:41:50.160
Cool.

00:41:50.160 --> 00:41:50.540
All right.

00:41:50.540 --> 00:41:52.420
Well, this was, this was a good, a good find.

00:41:52.420 --> 00:41:52.720
Awesome.

00:41:52.720 --> 00:41:53.000
Thanks.

00:41:53.000 --> 00:41:53.240
All right.

00:41:53.240 --> 00:41:54.720
I'll, I'll, I'll make mine quick here.

00:41:54.720 --> 00:41:56.100
So a new YouTube video.

00:41:56.100 --> 00:42:02.520
I talked about how you can install the Mastodon web app on your iPad as a native app, as well

00:42:02.520 --> 00:42:03.260
as on your desktop.

00:42:03.260 --> 00:42:06.800
So, if you're doing that kind of stuff, not there.

00:42:06.800 --> 00:42:12.680
Basically they just released Mastodon four a couple of days ago and all the apps don't have

00:42:12.680 --> 00:42:17.820
features like edit and some of the other features that are there because they're like months behind.

00:42:17.820 --> 00:42:20.820
And so if you install the web app as an app, then guess what?

00:42:20.820 --> 00:42:21.540
It looks like an app.

00:42:21.540 --> 00:42:24.480
It acts like an app, but it has like zero latency.

00:42:24.480 --> 00:42:27.780
So as soon as something is released on the website, you get it, which is pretty cool.

00:42:27.780 --> 00:42:28.760
So people can check that out.

00:42:28.760 --> 00:42:36.960
I saw Madison in the audience, sent over a call for proposals or calling all Pythonistas,

00:42:36.960 --> 00:42:38.500
if you will, for Pi Cascades.

00:42:38.500 --> 00:42:41.760
So Pi Cascades is back in person this year in Vancouver, BC.

00:42:41.760 --> 00:42:46.060
It goes from Vancouver to Seattle to Portland and cycles through that, there.

00:42:46.060 --> 00:42:49.800
But so this year it's going to be in, Vancouver.

00:42:49.800 --> 00:42:53.740
So if you want to go up there and, talk, be part of the conference, good conference.

00:42:53.740 --> 00:42:55.640
So call for proposals are open there.

00:42:55.640 --> 00:42:56.340
Yeah.

00:42:56.340 --> 00:42:57.820
But they're not open for very much longer.

00:42:57.820 --> 00:42:59.320
So, jump on that.

00:42:59.320 --> 00:42:59.640
Yeah.

00:42:59.640 --> 00:43:04.100
I don't remember what the date is, but it is, it closes a Wednesday 30th.

00:43:04.100 --> 00:43:04.820
So what is that?

00:43:04.820 --> 00:43:05.320
Yeah.

00:43:05.320 --> 00:43:05.980
Well, Wednesday.

00:43:05.980 --> 00:43:06.160
Yeah.

00:43:06.160 --> 00:43:06.640
Next Wednesday.

00:43:06.640 --> 00:43:07.080
Yeah.

00:43:07.080 --> 00:43:07.600
Eight days.

00:43:07.600 --> 00:43:10.040
And Madison and I feel an audience.

00:43:10.160 --> 00:43:10.520
Thank you.

00:43:10.520 --> 00:43:11.920
It's put in person this time.

00:43:11.920 --> 00:43:15.420
We, and we really value the first time speakers and atypical talks.

00:43:15.420 --> 00:43:18.920
So get out there and put yourself out there and, and get into public speaking.

00:43:18.920 --> 00:43:21.480
It's not a huge conference, but it's, you know, it's, it's big enough.

00:43:21.480 --> 00:43:24.100
A couple hundred people, three, 400 people, fun time.

00:43:24.100 --> 00:43:26.760
this is just really quick and fun.

00:43:26.920 --> 00:43:32.040
You know, if you're on a Mac, you're not as likely to get viruses sent your way that would

00:43:32.040 --> 00:43:35.400
actually be able to do something like 90% of viruses are written for windows.

00:43:35.500 --> 00:43:37.080
But what's a really interesting fact.

00:43:37.080 --> 00:43:42.940
I just, if you do have a Mac, it turns out 50% of all macOS malware comes from one single

00:43:42.940 --> 00:43:43.340
app.

00:43:43.340 --> 00:43:44.260
Can you believe that?

00:43:44.260 --> 00:43:44.880
What is it?

00:43:44.880 --> 00:43:45.320
Safari?

00:43:45.320 --> 00:43:48.820
No, it's, Mac keeper.

00:43:48.820 --> 00:43:55.300
So if, if you have Mac keeper, it like organizes your files and it'll like clean up your, your

00:43:55.300 --> 00:44:00.480
junky cache and stuff, but apparently it has to take over so much permissions and it is like,

00:44:00.480 --> 00:44:02.480
it can get, I guess, plug in there.

00:44:02.480 --> 00:44:05.280
I don't know what it does, but people can like plug into this.

00:44:05.420 --> 00:44:07.140
And make it to all sorts of horrible stuff.

00:44:07.140 --> 00:44:10.200
So 50% of all malware is written for Mac keeper.

00:44:10.200 --> 00:44:13.060
So if you have Mac keeper, maybe unhabit.

00:44:13.060 --> 00:44:23.600
I recently, as a Sunday, launched a new website that I hope will bring me back to writing some

00:44:23.600 --> 00:44:23.760
more.

00:44:23.760 --> 00:44:25.040
We'll see about how that goes.

00:44:25.040 --> 00:44:29.260
But here I'm, I'm trying a new philosophy on, on blogging, Brian.

00:44:29.260 --> 00:44:32.340
I don't know how you feel about it, but I have a blog been doing it for a long time,

00:44:32.340 --> 00:44:35.100
but like I looked the last article I wrote was like 2020.

00:44:35.340 --> 00:44:36.320
I'm like, Oh, that's not so good.

00:44:36.320 --> 00:44:42.280
And the reason is I would always try to write like 2000 word posts that are really, and I'm

00:44:42.280 --> 00:44:45.340
like, but I could post to Twitter and mass it on all day.

00:44:45.340 --> 00:44:46.500
And it's like, I can just do that.

00:44:46.500 --> 00:44:47.160
That's no problem.

00:44:47.160 --> 00:44:48.940
I don't like fall behind on Twitter.

00:44:49.120 --> 00:44:52.640
That's because these really should be super short posts.

00:44:52.640 --> 00:44:57.720
So I have, I've got this new website that I wrote that are just super short, you know,

00:44:57.720 --> 00:45:01.020
fits on a page type of articles that people can go and check out.

00:45:01.020 --> 00:45:02.020
So, yeah.

00:45:02.100 --> 00:45:07.280
Some of the people, some people are promoting like today I learned things, but short, and

00:45:07.280 --> 00:45:07.680
why not?

00:45:07.680 --> 00:45:12.120
I mean, if you think it, if you think it's going to be a thread, write a blog post.

00:45:12.120 --> 00:45:13.320
Exactly.

00:45:13.320 --> 00:45:13.880
Yeah.

00:45:13.880 --> 00:45:14.300
Yeah.

00:45:14.300 --> 00:45:14.780
So cool.

00:45:15.000 --> 00:45:19.740
So all of these are written, and this is all based on Hugo, which is a, just learned

00:45:19.740 --> 00:45:22.260
about it, but a ridiculously cool static site generator.

00:45:22.260 --> 00:45:23.320
Either of you played with Hugo?

00:45:23.320 --> 00:45:24.240
I use it.

00:45:24.240 --> 00:45:24.740
I love it.

00:45:24.740 --> 00:45:25.180
Python.

00:45:25.180 --> 00:45:27.920
So python test.com is written on Hugo.

00:45:27.920 --> 00:45:29.380
It's ridiculous, right?

00:45:29.380 --> 00:45:30.820
No, you haven't?

00:45:31.160 --> 00:45:31.520
Sorry.

00:45:31.520 --> 00:45:33.180
No, I haven't used it, but I heard of it.

00:45:33.180 --> 00:45:33.340
Yeah.

00:45:33.340 --> 00:45:33.480
Yeah.

00:45:33.480 --> 00:45:34.020
I heard nice things.

00:45:34.020 --> 00:45:34.680
Yeah.

00:45:34.680 --> 00:45:38.060
So you basically just go to your directory of Markdown files and images.

00:45:38.060 --> 00:45:40.560
You just run Hugo dash D server, whatever.

00:45:40.560 --> 00:45:45.220
And then as you write, you have your, your web page open in your browser and automatically

00:45:45.220 --> 00:45:50.060
sees the Markdown file changes or the CSS changes, regenerates it and refreshes your

00:45:50.060 --> 00:45:50.380
browser.

00:45:50.380 --> 00:45:52.700
Just so your browser could be just over there.

00:45:52.700 --> 00:45:56.480
And it's just periodically as you make changes, it instantly refreshes.

00:45:56.480 --> 00:45:58.900
So you don't even go and refresh the page to see how that you just write.

00:45:59.320 --> 00:46:02.240
And the browser just watches and, and reloads.

00:46:02.240 --> 00:46:02.560
It's cool.

00:46:02.560 --> 00:46:02.960
Yeah.

00:46:02.960 --> 00:46:07.340
And I, so you got it so that you just, you just push it, push your changes to GitHub or

00:46:07.340 --> 00:46:10.820
your, or your repo for, and it just appears on your website.

00:46:10.820 --> 00:46:11.480
Exactly.

00:46:11.480 --> 00:46:12.920
Yeah, exactly.

00:46:12.920 --> 00:46:18.240
So that was my, my next thing is then I set up a Netlify free account with CD and SSL custom

00:46:18.240 --> 00:46:19.500
domain name push.

00:46:19.500 --> 00:46:21.800
It just has a prod branch that I connected it to.

00:46:21.800 --> 00:46:24.300
And when I pushed a prod, boom, it just goes there instantly.

00:46:24.300 --> 00:46:25.680
So anyway, people are looking at that.

00:46:25.680 --> 00:46:26.500
That is super cool.

00:46:26.500 --> 00:46:27.400
Push the prod.

00:46:27.400 --> 00:46:28.720
Oh, that's kind of cool.

00:46:29.020 --> 00:46:30.400
I just, I just edit on prod.

00:46:30.400 --> 00:46:32.740
So I just log in.

00:46:32.740 --> 00:46:34.180
I didn't edit over SSH.

00:46:34.180 --> 00:46:34.660
Yeah.

00:46:34.660 --> 00:46:36.120
Just edit on the server.

00:46:36.120 --> 00:46:37.040
The server is the backup.

00:46:37.040 --> 00:46:39.620
Anyway, I have stuff on the screen, but there are no more backups.

00:46:39.620 --> 00:46:41.040
That's just stuff I pulled up while we're talking.

00:46:41.040 --> 00:46:42.440
So no more extras.

00:46:42.440 --> 00:46:44.060
I mean, so yeah, fun stuff.

00:46:44.060 --> 00:46:51.080
People check out the blog website and the video and apply for speaking at PyCascades.

00:46:51.080 --> 00:46:51.640
Nice.

00:46:51.900 --> 00:46:56.340
Well, I feel like Lancer also was like already really funny, but do you have anything else

00:46:56.340 --> 00:46:57.260
funny for us or?

00:46:57.620 --> 00:46:58.180
I do.

00:46:58.180 --> 00:46:58.180
I do.

00:46:58.180 --> 00:47:00.360
Although I somehow forgot to pull them up on the screen.

00:47:00.360 --> 00:47:01.800
So give me just a second here.

00:47:01.800 --> 00:47:02.280
There's two.

00:47:02.280 --> 00:47:03.240
These are really good.

00:47:03.240 --> 00:47:03.680
Okay.

00:47:03.680 --> 00:47:05.840
These are, these are pretty, pretty epic.

00:47:05.840 --> 00:47:11.540
So this one is called, I think Merlo, you'll, you'll really like this one.

00:47:11.540 --> 00:47:15.720
Cause it has to do with like algorithms and data science and it's called messing with the

00:47:15.720 --> 00:47:16.100
algorithm.

00:47:16.100 --> 00:47:19.700
And it shows this, this dude here, don't mind the thing at the bottom.

00:47:19.700 --> 00:47:23.840
I have no idea what that's about, but see, there's this guy whose face is blurred out in

00:47:23.840 --> 00:47:24.540
UK.

00:47:24.540 --> 00:47:26.260
I think I can't remember where this was.

00:47:26.260 --> 00:47:26.880
I know Berlin.

00:47:26.880 --> 00:47:33.360
And he's got a wagon, like a little red wagon that you pull behind you full of 99 phones.

00:47:33.360 --> 00:47:39.320
Now what he did is he got them all running Google maps and left them open and started walking

00:47:39.320 --> 00:47:44.580
down the street real slow and notice his neighborhood is now red on the map and he got it.

00:47:44.580 --> 00:47:47.740
So it thinks there's a traffic jam and it'll send cars around his neighborhood.

00:47:47.740 --> 00:47:48.440
Nice.

00:47:48.440 --> 00:47:50.900
I want to get one of these so bad.

00:47:50.900 --> 00:47:54.900
And whenever I take my dog for a walk, just walk with the wagon behind me too.

00:47:54.900 --> 00:47:55.960
This is no cars.

00:47:55.960 --> 00:47:56.920
Yeah.

00:47:56.920 --> 00:47:58.300
So good.

00:47:58.300 --> 00:47:58.980
Isn't it?

00:47:58.980 --> 00:47:59.640
Yeah.

00:47:59.640 --> 00:48:01.760
This guy's so ahead of our time.

00:48:01.760 --> 00:48:03.500
He's just like, oh, he's so brilliant.

00:48:03.500 --> 00:48:03.800
Yeah.

00:48:03.800 --> 00:48:05.220
And for his neighbors.

00:48:05.220 --> 00:48:05.720
Yeah.

00:48:05.720 --> 00:48:09.300
The next one, the next one here is going to take a little bit of a, I just got a, I

00:48:09.300 --> 00:48:10.020
got to set the stage.

00:48:10.020 --> 00:48:11.840
Give me a second to set, set the history.

00:48:11.840 --> 00:48:13.940
Have you heard of, you've heard about these motivational posters.

00:48:13.940 --> 00:48:17.900
You go to like a dentist's office and it'll be like an eagle soaring over like a sunset.

00:48:17.900 --> 00:48:21.220
Like if you don't spread your wings, you'll never soar as high as you could or something

00:48:21.220 --> 00:48:22.080
cheesy like that.

00:48:22.080 --> 00:48:22.440
Yeah.

00:48:22.440 --> 00:48:24.920
Well, there's this company called, yes, exactly.

00:48:24.920 --> 00:48:29.540
There's a company called despair and despair creates these, but like in reverse.

00:48:29.540 --> 00:48:31.380
They're called the demotivators.

00:48:31.380 --> 00:48:31.880
Yeah.

00:48:31.880 --> 00:48:32.180
Nice.

00:48:32.180 --> 00:48:33.720
So have you, have you seen these?

00:48:33.720 --> 00:48:34.140
No.

00:48:34.140 --> 00:48:34.660
Okay.

00:48:34.660 --> 00:48:35.900
So here's one like solutions.

00:48:35.900 --> 00:48:36.640
And what does it say?

00:48:36.740 --> 00:48:40.640
It has like a Rube Goldbergian type looking thing here.

00:48:40.640 --> 00:48:42.040
And it says solutions.

00:48:42.040 --> 00:48:45.420
This is what happens when the problem solver gets paid by the hour.

00:48:45.420 --> 00:48:48.140
It's just, it's just out of control.

00:48:48.140 --> 00:48:49.240
Here's one.

00:48:49.240 --> 00:48:49.720
What is this?

00:48:49.720 --> 00:48:52.360
It's a frog wearing with a snail on its head.

00:48:52.360 --> 00:48:52.960
It says collaborate.

00:48:52.960 --> 00:48:56.200
So the best of us have to carry the rest of us.

00:48:56.200 --> 00:48:58.840
It's just like, they're really.

00:49:00.400 --> 00:49:00.940
All right.

00:49:00.940 --> 00:49:04.100
So that brings us to, I feel like this is a Brian's skin show a little bit.

00:49:04.100 --> 00:49:13.300
This, a tweet that he shared here and it, it has the latexify, latexify thing, but recursion.

00:49:13.300 --> 00:49:15.820
And for the recursion, it has that demotivator.

00:49:15.820 --> 00:49:17.080
It's a picture that said recursion.

00:49:17.080 --> 00:49:17.800
Here we go again.

00:49:17.800 --> 00:49:19.540
And then embedded in that is recursion.

00:49:19.540 --> 00:49:20.160
Here we go again.

00:49:20.160 --> 00:49:20.740
It's like that.

00:49:20.740 --> 00:49:21.020
Yeah.

00:49:21.020 --> 00:49:23.580
Like your screen share, you see your own screen.

00:49:23.580 --> 00:49:24.080
Yeah.

00:49:24.080 --> 00:49:26.280
So it's kind of like that poster, but for recursion.

00:49:26.280 --> 00:49:27.260
Yeah.

00:49:27.260 --> 00:49:31.940
I kind of feel bad that people, people that don't get the recursion joke, because they can't

00:49:31.940 --> 00:49:34.500
even look it up because it just, it's redirected.

00:49:34.500 --> 00:49:36.060
It just keeps going.

00:49:36.060 --> 00:49:38.000
Like the definition is the definition.

00:49:38.000 --> 00:49:38.480
That's right.

00:49:38.480 --> 00:49:39.420
Nice.

00:49:39.420 --> 00:49:39.720
All right.

00:49:39.720 --> 00:49:40.740
Well, that's what I got for y'all.

00:49:40.740 --> 00:49:42.100
Well, thanks everybody.

00:49:42.100 --> 00:49:43.360
And thanks Michael, of course.

00:49:43.360 --> 00:49:45.840
And thanks Merlo for coming on the show.

00:49:45.840 --> 00:49:46.940
Thanks for having me.

00:49:46.940 --> 00:49:47.560
It was great.

00:49:47.560 --> 00:49:48.360
Yeah.

00:49:48.360 --> 00:49:48.740
You bet.

00:49:48.740 --> 00:49:49.460
Bye everyone.