WEBVTT

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

00:00:05.400 --> 00:00:12.080
This is episode 263, recorded December 15th, 2021, and I'm Brian Okken.

00:00:12.080 --> 00:00:13.480
I'm Michael Kennedy.

00:00:13.480 --> 00:00:14.800
And I'm Laís Carvalho.

00:00:14.800 --> 00:00:19.820
Welcome, Laís. Before we jump in, could you tell us who you are?

00:00:19.820 --> 00:00:24.340
Absolutely. So, first of all, thank you so much for having me. Thank you for the invite.

00:00:24.860 --> 00:00:30.540
And so my name is Laís Carvalho, and I'm a developer advocate for QuantSite.

00:00:30.540 --> 00:00:39.920
And I also do a little bit of voluntary work for Python Ireland and a few other Python things around the sphere.

00:00:39.920 --> 00:00:40.720
Nice.

00:00:40.720 --> 00:00:45.480
That sounds really fun. The company you work for, I'm not familiar with it.

00:00:45.480 --> 00:00:50.640
What do you guys do there? It sounds a little bit like maybe QuantFinance, maybe some ML stuff.

00:00:50.640 --> 00:00:52.800
Yeah, so we do everything.

00:00:53.560 --> 00:00:56.200
So QuantSite is a consultancy company.

00:00:56.200 --> 00:01:04.800
But we do, so basically our CEO is one of the main guys behind NumPy.

00:01:04.800 --> 00:01:10.140
And yeah, basically we do consultancy and everything you need.

00:01:10.140 --> 00:01:12.000
Yeah, sounds fun.

00:01:12.000 --> 00:01:13.320
Brian, you know what else is fun?

00:01:13.320 --> 00:01:14.240
What is fun?

00:01:14.240 --> 00:01:14.860
Websites.

00:01:14.860 --> 00:01:15.620
Yeah.

00:01:15.620 --> 00:01:16.200
Yeah.

00:01:16.800 --> 00:01:22.720
And if you think about websites, what web framework in Python is used more than Django?

00:01:22.720 --> 00:01:23.840
Flask.

00:01:23.840 --> 00:01:25.000
Maybe Flask.

00:01:25.000 --> 00:01:28.720
I think they're right on the boundary, but certainly Django is at the top.

00:01:29.120 --> 00:01:35.880
And I hear so many stories from people who say they got into Python not because they love Python, but because they wanted to do Django.

00:01:35.880 --> 00:01:47.440
And I even had a guest recently describe themselves as a Django developer who learned Python because they just wanted, they came for the Django and they stayed for Python, which is cool.

00:01:47.760 --> 00:01:52.420
So Django has been on a bit of a tear lately in terms of its speed.

00:01:52.420 --> 00:01:54.020
So I actually went back and looked.

00:01:54.020 --> 00:01:59.800
If you look at a release for Django 1, that was in May 2010.

00:01:59.800 --> 00:02:03.900
I think it came out before then, but that's as far as the release history goes back and dates.

00:02:04.120 --> 00:02:05.800
So 1.0 was in 2010.

00:02:05.800 --> 00:02:09.300
Seven years later, 2.0 came out in 2017.

00:02:09.300 --> 00:02:10.760
It seems like that just happened.

00:02:10.760 --> 00:02:11.540
Time's flying.

00:02:11.540 --> 00:02:12.020
Yeah.

00:02:12.020 --> 00:02:17.180
And then in 2020, three years after 2 was 3.

00:02:17.180 --> 00:02:19.640
And then now we have Django 4.0.

00:02:19.640 --> 00:02:23.860
So it's going seven years, three years, one years, you know, who knows?

00:02:23.860 --> 00:02:25.740
So do we get like five in March?

00:02:25.740 --> 00:02:26.840
Yeah, exactly.

00:02:26.840 --> 00:02:28.340
Maybe.

00:02:28.340 --> 00:02:29.840
Maybe, maybe.

00:02:29.840 --> 00:02:31.160
But it's cool.

00:02:31.160 --> 00:02:32.120
Django 4 is out.

00:02:32.120 --> 00:02:43.240
It's not a super huge release in terms of what's covered, but some of the highlights over there include, I think I mentioned this, that it was coming, but now it is here, the new Redis cache back in.

00:02:43.240 --> 00:02:50.400
So there have been previously ways to plug in or use Redis as a cache back in inside of Django.

00:02:50.400 --> 00:02:57.740
But now it's just, you just use Django's caching implementation and you tell it, by the way, here's the connection string to Redis.

00:02:57.740 --> 00:02:58.680
And that happens.

00:02:58.680 --> 00:02:59.560
So that's pretty cool, right?

00:02:59.560 --> 00:03:00.120
Yeah.

00:03:00.120 --> 00:03:07.300
Another thing that Django does for you is it will render forms and stuff based on various things like models and whatnot.

00:03:07.300 --> 00:03:12.840
And so they've changed how that works to ease customizations of forms and form sets and errorless.

00:03:12.840 --> 00:03:15.180
They are now rendered using the template engine.

00:03:15.180 --> 00:03:17.880
So you have more control over how forms and stuff look.

00:03:17.880 --> 00:03:21.840
And some changes to do with the time zone as well.

00:03:21.920 --> 00:03:24.540
So that's now using Python's time zone.

00:03:24.540 --> 00:03:26.240
So I guess it used a different one before.

00:03:26.240 --> 00:03:29.660
I never really paid that much attention to which time zone it used.

00:03:30.000 --> 00:03:37.420
So with the release of 4.3.2 has now reached the end of mainstream support, which is interesting.

00:03:37.420 --> 00:03:40.920
And Liza, what you're going to talk about later, actually, this is relevant as well, right?

00:03:40.920 --> 00:03:45.860
I know the thing you're covering talks about Django and versions and upgrades and so on.

00:03:45.860 --> 00:03:47.520
So that's it.

00:03:47.520 --> 00:03:50.700
Django 3.2 is a long-term support release.

00:03:50.700 --> 00:03:55.940
So it will receive security fixes until April 24, but there's no more features coming to 3.2.

00:03:55.940 --> 00:03:59.760
All the new features and improvements and whatnot are going into 4.0.

00:03:59.760 --> 00:04:01.180
So that's pretty cool.

00:04:01.180 --> 00:04:03.860
And let's see if you go over to the release notes.

00:04:03.860 --> 00:04:09.920
It now supports only Python 3.8 to 3.10, which I think is pretty cool.

00:04:09.920 --> 00:04:10.700
That's interesting.

00:04:10.700 --> 00:04:14.060
Yeah, that's no messing around, right?

00:04:14.060 --> 00:04:17.980
They're like, nope, we spent too long supporting 2.7.

00:04:17.980 --> 00:04:20.580
We're not doing that anymore, right?

00:04:20.900 --> 00:04:24.420
Yeah, I think most frameworks are not supporting 2 anymore.

00:04:24.420 --> 00:04:26.840
There's a lot still supporting 3.7, though.

00:04:26.840 --> 00:04:28.740
So it's interesting that 3.7 is out as well.

00:04:28.740 --> 00:04:34.640
Yeah, well, they've got the 3.2.1 that still supports that if you want to kind of be on the slow burn.

00:04:34.640 --> 00:04:35.620
Let's see what else.

00:04:35.620 --> 00:04:36.580
There's a few things.

00:04:36.580 --> 00:04:38.080
I'm not going to go through it, I guess.

00:04:38.080 --> 00:04:44.020
One more highlight maybe is you can create composite indexes really easily with the unique constraints.

00:04:44.020 --> 00:04:49.200
So you can have a uniqueness constraint that has the first name and the last name.

00:04:49.300 --> 00:04:54.220
So you could have the same first name or the same last name as somebody in the database, but not the same first and last name.

00:04:54.220 --> 00:04:55.320
That's pretty interesting.

00:04:55.760 --> 00:05:02.560
They upgraded the password hasher to script.

00:05:02.560 --> 00:05:09.940
And then you can have the password hasher to have the password hasher to have the password.

00:05:09.940 --> 00:05:17.320
You can have the password hasher to have the password hasher to have the password hasher to have the password.

00:05:17.320 --> 00:05:24.980
So you've got to have the password hasher to have the password.

00:05:24.980 --> 00:05:32.360
And then there's a password hasher to have the password hasher to have the password.

00:05:32.360 --> 00:05:37.580
And then there's some backwards incompatible changes, things that are breaking changes.

00:05:37.580 --> 00:05:42.700
And there's also deprecation of some features that were not previously deprecated.

00:05:42.700 --> 00:05:45.240
So you want to be on top of that as well.

00:05:45.240 --> 00:05:46.780
So Django 4.

00:05:46.780 --> 00:05:50.840
Yeah, we're going to get Django 5 in March or something, I'm guessing, right, Brian?

00:05:50.840 --> 00:05:51.860
Yeah, I think so.

00:05:51.860 --> 00:05:58.080
And can we take a moment to just say thank you for the amazing documentation that Django has all over?

00:05:58.400 --> 00:05:59.680
It's so good.

00:05:59.680 --> 00:06:00.880
Like, I'm a newbie.

00:06:00.880 --> 00:06:04.980
And every time I open, I don't really use Django that much.

00:06:04.980 --> 00:06:13.800
But every time I open their documentation, like sometimes I actually use their documentation to just check stuff about the web development because it's just so, so good.

00:06:13.800 --> 00:06:19.000
So thank you very much, maintainers of Django documentation, because it's really, really good.

00:06:19.000 --> 00:06:20.220
Indeed, indeed.

00:06:20.220 --> 00:06:26.460
Sam Morley on the audience says, I'm always impressed by how much Django managed to cram into each release.

00:06:26.460 --> 00:06:26.900
Indeed.

00:06:26.900 --> 00:06:29.760
And Mark Pender says, howdy all from Ireland.

00:06:29.760 --> 00:06:30.580
Hello.

00:06:30.580 --> 00:06:30.900
Nice.

00:06:30.900 --> 00:06:32.320
Right on.

00:06:32.320 --> 00:06:33.000
Cool, cool.

00:06:33.000 --> 00:06:33.840
All right.

00:06:33.840 --> 00:06:35.160
Brian, what do you got?

00:06:35.160 --> 00:06:37.180
I got Python minifier.

00:06:37.180 --> 00:06:41.260
Actually, so this was a suggestion from Lance Reinsmith.

00:06:41.260 --> 00:06:42.840
So thanks, Lance, for sending it on.

00:06:42.840 --> 00:06:44.280
But he also sent some reasons.

00:06:44.280 --> 00:06:48.140
My first reaction was, we don't need a minifier for Python.

00:06:48.140 --> 00:06:49.040
What's up?

00:06:49.040 --> 00:06:51.380
This isn't Java or something.

00:06:51.380 --> 00:06:55.320
But he gave a couple reasons.

00:06:55.680 --> 00:07:01.920
The docs for minifier have this sort of convoluted reason.

00:07:01.920 --> 00:07:04.780
Apparently, AWS CloudFormation.

00:07:04.780 --> 00:07:06.360
I don't know any of the details of this.

00:07:06.360 --> 00:07:16.040
But AWS CloudFormation templates can have AWS Lambda functions, source code embedded in them, but only if they're 4K or less.

00:07:16.420 --> 00:07:18.200
So a small amount of code.

00:07:18.200 --> 00:07:20.480
So that's one of the reasons why he wrote this package.

00:07:20.480 --> 00:07:29.620
Lance, the person that sent it in, said his reason for using it is Adafruit boards, which is a cool idea.

00:07:29.620 --> 00:07:30.860
I didn't think about that.

00:07:31.100 --> 00:07:46.440
So what does this do?

00:07:46.440 --> 00:07:51.380
There's an example on the page of just normal Python code.

00:07:51.380 --> 00:07:55.740
It's maybe not the best Python code, but normal-ish.

00:07:55.740 --> 00:08:01.860
And then it replaces it with, like, you know, replaces the variable names with A, B, C, things like that.

00:08:01.860 --> 00:08:05.700
Some of your typical renaming things.

00:08:06.120 --> 00:08:10.220
So it has, like, a whole bunch of different techniques that it uses.

00:08:10.220 --> 00:08:12.640
I'm going to go to the docs.

00:08:12.640 --> 00:08:15.080
It combines the imports.

00:08:15.080 --> 00:08:19.060
So instead of on multiple lines, you just combine them all together.

00:08:19.060 --> 00:08:20.180
Saves a little space.

00:08:20.180 --> 00:08:22.620
Removes passes, which is interesting.

00:08:22.620 --> 00:08:28.080
It removes them to just assigns it to zero in a function.

00:08:28.080 --> 00:08:28.700
That's interesting.

00:08:29.080 --> 00:08:30.180
I didn't know you could do that.

00:08:30.180 --> 00:08:32.980
Hoist literals, that's an interesting thing.

00:08:32.980 --> 00:08:40.560
And that's just if you've got a literal that's a bunch of different places, it just defines a variable and defines it at the top.

00:08:40.560 --> 00:08:41.940
Kind of interesting.

00:08:41.940 --> 00:08:43.940
And it uses a lot of semicolons.

00:08:43.940 --> 00:08:44.460
That's wild.

00:08:44.460 --> 00:08:45.500
Yeah.

00:08:45.500 --> 00:08:48.140
Remove annotations.

00:08:48.140 --> 00:08:52.020
So type annotations you probably don't need at runtime for something like this.

00:08:52.020 --> 00:08:52.960
So you can remove them.

00:08:53.840 --> 00:09:00.660
Local renaming, a whole bunch of stuff, and, you know, renaming globals and literals.

00:09:00.660 --> 00:09:08.280
And sometimes, like, if it's an API or if something else is using it, you don't want to rename the globals because those are the APIs.

00:09:08.280 --> 00:09:11.320
So you can turn any or all of this stuff off.

00:09:11.320 --> 00:09:14.620
I guess you wouldn't turn all of it off because why would you use it?

00:09:14.620 --> 00:09:16.800
But you can turn off stuff that doesn't work.

00:09:16.800 --> 00:09:23.020
So I would suggest if you're using Minify, test your code, of course, and remove what you need.

00:09:24.020 --> 00:09:29.320
And I actually, for something like CircuitPython and stuff like this, this might be an interesting idea.

00:09:29.320 --> 00:09:30.520
And I'm curious.

00:09:30.520 --> 00:09:34.340
Let me put out another idea about where it may be useful.

00:09:34.340 --> 00:09:35.720
Can you go back to the example?

00:09:35.720 --> 00:09:38.200
So just that code sample you had?

00:09:38.200 --> 00:09:38.720
Yeah.

00:09:38.960 --> 00:09:46.660
So if you look at it, one of the things you often have to do, and I'm not suggesting this is really a good idea, but it could be applied this way.

00:09:46.660 --> 00:09:53.420
One of the things you have to do if you want to ship your Python code around to be used with places is to share your source code, right?

00:09:53.720 --> 00:09:58.000
And sure, you could send a PYC file, but it's basically the same thing, right?

00:09:58.000 --> 00:09:58.480
Yeah.

00:09:58.480 --> 00:10:05.820
So what about if you go in here and run this against something that you want just a little bit more obfuscation?

00:10:05.820 --> 00:10:07.460
You don't want people poking around it.

00:10:07.460 --> 00:10:09.840
That definitely looks less easy to read to me.

00:10:10.720 --> 00:10:12.560
I mean, it could go farther, right?

00:10:12.560 --> 00:10:18.180
It could rename like create certain and whatnot, but maybe those are like standard library things.

00:10:18.180 --> 00:10:25.320
But certainly if you're trying to obfuscate your code as well, there could be some sort of use case there, although it's not super obfuscated.

00:10:25.320 --> 00:10:26.120
Yeah.

00:10:26.120 --> 00:10:28.360
It seems like that was a Java thing.

00:10:28.360 --> 00:10:30.980
I don't even know if they do that anymore, obfuscators.

00:10:30.980 --> 00:10:32.600
Yeah, I don't know.

00:10:32.600 --> 00:10:34.360
I haven't been in that world for a long time either.

00:10:34.360 --> 00:10:39.340
It might help also if you're playing golf, coding golf.

00:10:40.300 --> 00:10:42.000
You know, just write one of these.

00:10:42.000 --> 00:10:43.180
Yeah, indeed.

00:10:43.180 --> 00:10:44.660
What is coding golf?

00:10:44.660 --> 00:10:48.640
Sounds like a thing that blacks should have, maybe a flag.

00:10:48.640 --> 00:10:50.020
That's a terrible idea.

00:10:50.020 --> 00:10:52.820
Yeah, I don't know what coding golf is either.

00:10:52.820 --> 00:10:53.580
Really?

00:10:53.580 --> 00:10:55.680
Okay, so you have like a coding.

00:10:55.680 --> 00:10:56.780
I just go to the driving range.

00:10:56.780 --> 00:10:59.960
I don't actually do any more things with golf, so I'm not very honest with it.

00:10:59.960 --> 00:11:03.380
Coding golf is like the lowest score is the best, right?

00:11:03.380 --> 00:11:03.840
In golf.

00:11:03.840 --> 00:11:10.040
So it's coding challenges that you solve with the minimal characters.

00:11:10.100 --> 00:11:14.360
So minimal lines of code, minimal characters.

00:11:14.360 --> 00:11:17.600
And it's, yeah, that's what coding golf is.

00:11:17.600 --> 00:11:20.100
So you just throw the Xenob Python out of the window.

00:11:20.100 --> 00:11:21.360
Exactly.

00:11:22.360 --> 00:11:24.960
It's not easy to read code, but.

00:11:24.960 --> 00:11:25.500
Okay.

00:11:25.500 --> 00:11:27.280
Got it.

00:11:27.280 --> 00:11:28.020
All right.

00:11:28.020 --> 00:11:29.200
Sounds fair.

00:11:29.200 --> 00:11:31.680
May the best man win.

00:11:31.680 --> 00:11:32.960
May the best person win.

00:11:32.960 --> 00:11:33.400
Sorry.

00:11:33.400 --> 00:11:34.540
Indeed.

00:11:34.540 --> 00:11:35.100
Yeah.

00:11:35.100 --> 00:11:40.940
Also, one of the things it does is that it doesn't advertise is it throws away all your spaces and replaces them with tabs.

00:11:40.940 --> 00:11:42.260
And.

00:11:42.960 --> 00:11:43.720
Oh, interesting.

00:11:43.720 --> 00:11:44.020
Yeah.

00:11:44.020 --> 00:11:45.980
It does look very tab filled in the.

00:11:45.980 --> 00:11:47.100
Well, it makes sense.

00:11:47.100 --> 00:11:51.480
You know, four, four spaces versus one tab to the forex reduction right there.

00:11:51.480 --> 00:11:51.820
So.

00:11:51.820 --> 00:11:52.320
Yep.

00:11:52.320 --> 00:11:53.120
Yeah.

00:11:53.620 --> 00:11:56.200
Sam says, Elias, you're, you're in for a treat.

00:11:56.200 --> 00:11:58.940
Code golf stack exchange is fascinating.

00:12:00.680 --> 00:12:02.140
I can only imagine.

00:12:02.140 --> 00:12:03.180
Yeah.

00:12:03.180 --> 00:12:05.060
Indeed.

00:12:05.060 --> 00:12:06.240
All right.

00:12:06.240 --> 00:12:08.540
Well, your topic is up next.

00:12:08.540 --> 00:12:13.560
This is the one I was alluding to earlier, talking about Django and support for old things and so on.

00:12:13.560 --> 00:12:14.420
Yes.

00:12:14.420 --> 00:12:15.540
Yes, indeed.

00:12:15.540 --> 00:12:16.860
I think it's a watch for the tip as well.

00:12:16.860 --> 00:12:21.440
So then this is, it's time to stop using Python 3.6.

00:12:21.440 --> 00:12:29.120
So in one week and one day, Python is dropping support for, well, Python 3.6.

00:12:29.340 --> 00:12:32.540
So there's not going to be any more releases after that.

00:12:32.540 --> 00:12:36.960
So basically, well, you should update Python.

00:12:36.960 --> 00:12:52.340
If you are using Ubuntu, then you can say, well, I don't really have to update right now because, well, Ubuntu has long time support.

00:12:52.820 --> 00:13:05.040
But it doesn't necessarily work like that because, well, the Python dev team is not going to support your Python 3.6 anymore, which basically means that.

00:13:05.040 --> 00:13:05.060
Exactly.

00:13:05.060 --> 00:13:05.860
Yeah.

00:13:05.860 --> 00:13:07.980
That's what we were just talking about with Django, right?

00:13:08.080 --> 00:13:12.900
Like, just because you might be on an LTS version of Ubuntu that will still let you use 3.6.

00:13:12.900 --> 00:13:20.080
Well, you're going to have to give up all the new libraries, like, so long to Django 4.0 and probably FastAPI and all the things, right?

00:13:20.720 --> 00:13:21.720
Yes, exactly.

00:13:21.720 --> 00:13:26.240
So you have your dependencies that are going to need to be updated anyhow.

00:13:26.240 --> 00:13:28.000
So you should update.

00:13:28.000 --> 00:13:29.700
But then I have a question.

00:13:29.700 --> 00:13:30.920
So Nubi here.

00:13:32.280 --> 00:13:35.200
I looked around when we were preparing the notes for the show.

00:13:35.200 --> 00:13:38.480
I looked around and I tried to, because I'm using 3.7.

00:13:38.480 --> 00:13:39.980
So I'm still okay.

00:13:39.980 --> 00:13:42.260
But I was looking.

00:13:42.260 --> 00:13:51.640
I wanted to try the 3.10 new stuff because I listened to a few podcasts ago and you're talking about the wonders of Python 3.10.

00:13:51.640 --> 00:13:53.940
And I was like, okay, so let's update.

00:13:53.940 --> 00:14:01.580
But then I couldn't find the best way to update from 3.7 or let's say 3.6 to 3.10.

00:14:01.580 --> 00:14:06.480
I saw some people saying that it would be better to just update gradually.

00:14:06.480 --> 00:14:13.460
So go from 3.6, 3.7, 3.8, 3.9, and then 3.10 because it could fix the dependencies easier like that.

00:14:13.460 --> 00:14:18.740
But then some other people just say, just go straight to the version you want and then just deal with the problems when you get there.

00:14:18.740 --> 00:14:20.240
Just rip the bandaid off.

00:14:20.240 --> 00:14:20.820
Yeah, I don't know.

00:14:20.820 --> 00:14:22.460
Yeah, I'm with Brian too.

00:14:22.460 --> 00:14:26.280
Go as far ahead as you can and then see if it works.

00:14:26.280 --> 00:14:27.080
All right.

00:14:27.080 --> 00:14:29.480
So just go 3.10 straight away.

00:14:29.480 --> 00:14:30.440
Okay, cool.

00:14:30.440 --> 00:14:31.280
That's what I would say.

00:14:31.280 --> 00:14:32.980
But the question is still open.

00:14:32.980 --> 00:14:34.280
How do you do that?

00:14:34.280 --> 00:14:35.420
Right?

00:14:35.420 --> 00:14:38.120
It depends, I think, on what OS you're on.

00:14:38.120 --> 00:14:45.320
For example, on Ubuntu, 3.9 is really about as far as you're going to get without some jumping around.

00:14:45.320 --> 00:14:48.520
Like that's the latest Python 3 that it'll give you.

00:14:48.520 --> 00:14:50.200
On Mac, you only have two.

00:14:50.300 --> 00:14:54.840
So you got to install something, but you could download the installer from python.org.

00:14:54.840 --> 00:14:56.880
You could homebrew it or you could do other things.

00:14:56.880 --> 00:15:01.600
You could do PyE&V like Brandon Brunner out in the audience has suggested.

00:15:01.600 --> 00:15:02.580
I got started with PyE&V.

00:15:02.580 --> 00:15:06.800
It makes this kind of thing trivial, true, except for I can't get it to work on my Mac.

00:15:07.140 --> 00:15:11.920
Maybe it's an M1 thing or an Apple Silicon thing, but it just won't install anything.

00:15:11.920 --> 00:15:14.400
So it's not trivial for me.

00:15:14.400 --> 00:15:18.840
But when it works, you can just say PyE&V, give me 3.6.

00:15:18.840 --> 00:15:20.160
You can be very specific.

00:15:20.160 --> 00:15:23.160
Like give me Python 3.11 RC2.

00:15:23.160 --> 00:15:24.340
I want that one.

00:15:24.340 --> 00:15:26.460
And it'll put them all side by side.

00:15:26.460 --> 00:15:28.500
So, mate, what do you think, Brian?

00:15:28.840 --> 00:15:35.640
I think I'm on PyE&V now, but it's because I test a lot of things.

00:15:36.700 --> 00:15:50.620
For normal people that have an application and they just want to upgrade, I say, unless you're on Ubuntu or Linux, I say just go to python.org and download the latest one and install it.

00:15:50.620 --> 00:15:52.600
It works on Windows and Mac, usually.

00:15:52.600 --> 00:15:55.360
On Windows, there's the Windows installer.

00:15:55.360 --> 00:15:57.060
You can go to the Windows store.

00:15:57.060 --> 00:15:57.680
That works.

00:15:57.680 --> 00:16:01.820
But the python.org one works good, too.

00:16:01.820 --> 00:16:02.980
So, usually.

00:16:02.980 --> 00:16:03.760
Yeah.

00:16:03.760 --> 00:16:04.080
All right.

00:16:04.080 --> 00:16:04.640
Yeah, indeed.

00:16:04.780 --> 00:16:07.640
Of course, I'll try and I'll let you know how it goes on Twitter.

00:16:07.640 --> 00:16:08.860
Right on.

00:16:08.860 --> 00:16:10.040
The best I can do.

00:16:10.040 --> 00:16:11.820
Give us a report of what you've found to work.

00:16:11.820 --> 00:16:14.820
Because I drew the question on Twitter as well.

00:16:14.820 --> 00:16:17.380
And then I got a bunch of people saying, don't go 3.10.

00:16:17.380 --> 00:16:18.920
Yes, it's not great for production.

00:16:18.920 --> 00:16:19.620
Go 3.9.

00:16:19.620 --> 00:16:22.960
And then other people just say, no, just rip the Band-Aid as you did, Mike.

00:16:22.960 --> 00:16:23.100
Yeah.

00:16:23.100 --> 00:16:23.780
So, okay.

00:16:23.780 --> 00:16:26.020
The Aachen Doctrine.

00:16:26.020 --> 00:16:29.560
I mean, I only support little tiny projects, though.

00:16:29.560 --> 00:16:33.740
So, in Python, I support big things in C++.

00:16:34.040 --> 00:16:39.780
But I would run your tests, you know, upgrade, run the tests, make sure everything works.

00:16:39.780 --> 00:16:40.460
Yeah.

00:16:40.460 --> 00:16:40.880
Oh.

00:16:40.880 --> 00:16:44.360
Well, your conversation's got a whole bunch of stuff going off in the audience here.

00:16:44.360 --> 00:16:48.140
Alvaro says, NumPy is dropping support for 3.7 sometime this month.

00:16:48.140 --> 00:16:51.640
So, that should push the data science community to update.

00:16:51.820 --> 00:16:57.420
And then, also, on Ubuntu, you can install the dead snakes PPA.

00:16:58.080 --> 00:17:01.500
And you'll get now versions of the latest version of Python.

00:17:01.500 --> 00:17:01.760
Okay.

00:17:01.760 --> 00:17:02.300
That's interesting.

00:17:02.300 --> 00:17:02.760
Yeah.

00:17:02.760 --> 00:17:04.340
I saw that that snakes PPA.

00:17:04.340 --> 00:17:05.200
Yes, indeed.

00:17:05.780 --> 00:17:08.780
And I saw that in Ubuntu, that's really easy to do it.

00:17:08.780 --> 00:17:12.780
But still, you can find tutorials saying go gradually.

00:17:12.780 --> 00:17:14.440
And then in other tutorials, it's the same.

00:17:14.440 --> 00:17:14.600
Yeah.

00:17:14.600 --> 00:17:15.560
Just go straight in.

00:17:15.560 --> 00:17:16.260
Yeah.

00:17:16.260 --> 00:17:19.260
Sam says, just compile from source every time.

00:17:19.260 --> 00:17:19.820
That's what I do.

00:17:19.820 --> 00:17:20.880
That's what I'm doing in production.

00:17:20.880 --> 00:17:22.520
But I'm doing homebrew on my Mac.

00:17:22.520 --> 00:17:23.260
All right.

00:17:23.300 --> 00:17:24.340
Maybe that's enough.

00:17:24.340 --> 00:17:26.000
How do I get the latest version of Python?

00:17:26.000 --> 00:17:30.340
But you were going to make a comment about Java.

00:17:30.340 --> 00:17:31.260
Is that right?

00:17:31.260 --> 00:17:32.660
Oh, yes.

00:17:32.660 --> 00:17:33.700
Yes, that's true.

00:17:33.700 --> 00:17:38.200
So, because I saw, I was doing a little bit of research for this.

00:17:38.200 --> 00:17:46.140
And then, there was a little bit of a discussion of the third-party libraries and the frameworks

00:17:46.140 --> 00:17:50.420
that will drop support for 2.6 soon enough, as Alvaro just mentioned.

00:17:51.060 --> 00:18:00.580
So, then, I saw on Twitter, someone mentioning, let me put it here, that, like, using the Java,

00:18:00.580 --> 00:18:05.540
the new Log4J problem, let's put it like that.

00:18:05.540 --> 00:18:08.780
Log4J, it's so bad.

00:18:08.780 --> 00:18:09.780
This is so bad.

00:18:09.780 --> 00:18:10.920
Yeah.

00:18:10.920 --> 00:18:18.360
So, using it as an example for how, like, you should upgrade your version, the version of the

00:18:18.360 --> 00:18:19.800
that programming language is using.

00:18:19.800 --> 00:18:27.480
And then, they talk about, yeah, so they say that you should upgrade as soon as you can.

00:18:27.480 --> 00:18:28.540
Yeah.

00:18:28.540 --> 00:18:30.080
What an interesting example they gave.

00:18:30.080 --> 00:18:34.060
Because this Log4Shell thing that I'm going to actually talk about a little bit later.

00:18:34.920 --> 00:18:38.900
But the problem is, you have to upgrade Log4J to a patched version.

00:18:38.900 --> 00:18:41.500
The patched version only works on Java 8.

00:18:41.500 --> 00:18:45.480
So, if you've been dragging your feet, in a sense, and staying on an old version of Java,

00:18:45.480 --> 00:18:48.180
well, now, all of a sudden, it's not just replace a library.

00:18:48.180 --> 00:18:50.720
It's completely upgrade the Java you're running on.

00:18:50.720 --> 00:18:54.420
And if you were dragging your feet that hard, there's probably some kind of reason that it's

00:18:54.420 --> 00:18:56.220
a pain and not well-maintained or something.

00:18:56.660 --> 00:19:01.060
And so, instead of just going, oh, we've got to quick fix this problem because it's a super,

00:19:01.060 --> 00:19:02.260
a super big deal.

00:19:02.260 --> 00:19:05.720
It's now, all of a sudden, you've got to do a major upgrade when you weren't planning on it,

00:19:05.720 --> 00:19:05.880
right?

00:19:05.880 --> 00:19:06.420
That's bad.

00:19:06.420 --> 00:19:06.860
Yeah.

00:19:06.860 --> 00:19:09.580
And then, you have to have this meme.

00:19:09.580 --> 00:19:12.340
Oh, this wonderful meme.

00:19:12.340 --> 00:19:14.400
Your next task.

00:19:14.400 --> 00:19:15.500
This is from the Squid Game.

00:19:15.500 --> 00:19:20.380
Your next task is to figure out which applications in your organization is using Log4J.

00:19:20.380 --> 00:19:23.600
You have 10 minutes.

00:19:25.600 --> 00:19:29.100
Oh, that's good.

00:19:29.100 --> 00:19:30.340
I didn't catch the meme.

00:19:30.340 --> 00:19:31.340
Yes.

00:19:31.340 --> 00:19:34.160
So, then I think, Michael, it's you now?

00:19:34.160 --> 00:19:35.500
It is.

00:19:35.500 --> 00:19:36.080
It is.

00:19:36.080 --> 00:19:36.340
Awesome.

00:19:36.340 --> 00:19:36.780
Well, yeah.

00:19:36.780 --> 00:19:38.460
Thanks for highlighting that article.

00:19:38.460 --> 00:19:40.900
That's a good one by Itamar Trauer-Turning.

00:19:40.900 --> 00:19:41.760
Trauer?

00:19:41.760 --> 00:19:42.540
Trauer-Turning.

00:19:42.540 --> 00:19:42.960
Yes.

00:19:42.960 --> 00:19:44.180
Okay.

00:19:44.180 --> 00:19:47.080
So, what do I got next here for us?

00:19:47.080 --> 00:19:49.580
Not Django, but something fun.

00:19:49.580 --> 00:19:55.420
We just had what was probably the most contentious Formula One season.

00:19:55.480 --> 00:19:57.900
In 10 years, at least.

00:19:57.900 --> 00:20:01.300
And one of the most wild ones, for sure.

00:20:01.300 --> 00:20:06.980
The championship was decided on the final lap of the final race.

00:20:06.980 --> 00:20:10.280
Like, literally, the two people were contending for it.

00:20:10.280 --> 00:20:11.820
Hamilton and Verstappen.

00:20:11.820 --> 00:20:14.960
They were literally tied on points going into the final one.

00:20:15.100 --> 00:20:17.160
And the final move was done on the final lap.

00:20:17.160 --> 00:20:23.320
So, I wanted to highlight this article here called, How to Visualize the Formula One Championship

00:20:23.320 --> 00:20:27.260
in Python Using the AirGast API in Seaborn.

00:20:27.260 --> 00:20:32.780
So, for people who are in data science, I know if you're learning it, one of the challenges

00:20:32.780 --> 00:20:37.920
I have of learning those tools is I don't have a great professional need for them.

00:20:37.920 --> 00:20:41.600
I don't use that kind of stuff to analyze data that I work with that frequently.

00:20:41.760 --> 00:20:44.880
So, my chance to learn Seaborn, for example, it's pretty limited.

00:20:44.880 --> 00:20:51.600
So, finding some example or some fun project you can do, that turns out to be super important.

00:20:51.600 --> 00:20:55.480
So, I thought I'd pull this up as something people could do to learn to play with this kind

00:20:55.480 --> 00:20:55.820
of data.

00:20:56.180 --> 00:21:03.500
Now, if you're not yet into this stuff, check out the Drive to Survive Season 3.

00:21:03.500 --> 00:21:09.040
I think I got the wrong link here, but I put the trailer to it in the show notes.

00:21:09.040 --> 00:21:14.760
So, Netflix did a great series that is really good for people to just sort of get into it.

00:21:14.760 --> 00:21:19.280
And also, there's like an eight-minute highlight of the last race, which was absolutely crazy.

00:21:19.280 --> 00:21:25.260
But, what I want to talk about is some cool stuff that Jasper, just goes by Jasper, no

00:21:25.260 --> 00:21:26.500
last name, over on Medium.

00:21:26.500 --> 00:21:32.960
So, introduces this thing called the AirGast API, which if you go over there, it's looking

00:21:32.960 --> 00:21:37.640
a little old school, but not very, how do you say, not very restful, for example.

00:21:37.640 --> 00:21:45.440
So, for example, you can come over and we could get like details about the third race of the

00:21:45.440 --> 00:21:49.440
2008 season by just going API F1 2008 3.

00:21:49.440 --> 00:21:54.900
And it's going to come back with, well, a series of tables, which is not necessarily that

00:21:54.900 --> 00:21:55.240
useful.

00:21:55.240 --> 00:22:01.020
And I thought the way you get the JSON, you might do like an accept application slash JSON

00:22:01.020 --> 00:22:02.700
type and not HTML or something.

00:22:02.700 --> 00:22:04.860
But no, you say 3.json.

00:22:04.860 --> 00:22:07.420
And that gives you the API there.

00:22:07.420 --> 00:22:08.520
So, that's pretty cool.

00:22:08.520 --> 00:22:09.580
And you come through here.

00:22:09.680 --> 00:22:16.980
And basically, they talk about how to use Pandas, NumPy, Seaborn, and that API to just build

00:22:16.980 --> 00:22:22.240
some cool graphs that actually show you the position of all the drivers across the entire

00:22:22.240 --> 00:22:22.920
season.

00:22:22.920 --> 00:22:23.520
Right?

00:22:23.520 --> 00:22:28.720
So, if you want to build this picture you see right at the top of the article and play

00:22:28.720 --> 00:22:32.680
around with that data from that API, then this is the way to do it.

00:22:33.300 --> 00:22:38.160
One other thing that's pretty interesting from this article that I had no idea about is over

00:22:38.160 --> 00:22:46.520
on PyPI, we have FastF1 as a package, which is a wrapper library for F1 data and telemetry

00:22:46.520 --> 00:22:49.880
APIs with additional data processing capabilities.

00:22:49.880 --> 00:22:50.520
That's pretty cool.

00:22:50.940 --> 00:22:51.080
Yeah.

00:22:51.080 --> 00:22:56.620
So, you go down here and they'll show you how to build this really cool graph of lap by

00:22:56.620 --> 00:22:59.040
lap, the times, the various drivers.

00:22:59.040 --> 00:23:03.880
You can see in the beginning, there's all sorts of chaos because there's people jockeying for

00:23:03.880 --> 00:23:04.460
position.

00:23:04.460 --> 00:23:05.500
The cars are heavy.

00:23:05.500 --> 00:23:06.720
They're full of fuel.

00:23:06.720 --> 00:23:07.580
So, they go slower.

00:23:07.580 --> 00:23:12.240
You can sort of see as things spread out, as the cars lighten up and stuff because they

00:23:12.240 --> 00:23:16.280
burn off 100 kilograms of fuel, then they all kind of get faster and better times.

00:23:16.280 --> 00:23:19.260
So, you can get cool graphs and exploration of all this stuff here.

00:23:19.360 --> 00:23:24.440
And the way you do it is really interesting as you just go over to this FastF1 and you

00:23:24.440 --> 00:23:27.940
enable the cache because it downloads some stuff and you don't want to have to download it twice.

00:23:27.940 --> 00:23:31.840
You can say, give me this season, this Grand Prix, give me the race details, load up the laps,

00:23:31.840 --> 00:23:34.880
and then you can start just working with the data in this really interesting way.

00:23:34.880 --> 00:23:38.900
So, if I was into data science and I wanted to learn some stuff, this might be a really cool

00:23:38.900 --> 00:23:41.140
real world data set that you can play with.

00:23:41.140 --> 00:23:41.900
What do you all think?

00:23:41.900 --> 00:23:42.700
I like it.

00:23:42.700 --> 00:23:48.300
I think I might actually try to know more about Formula One just so that I can talk with Anthony

00:23:48.300 --> 00:23:51.380
Shaw's a big fan.

00:23:51.380 --> 00:23:52.380
Yeah.

00:23:52.380 --> 00:23:53.380
Indeed.

00:23:53.380 --> 00:23:54.580
As am I these days.

00:23:54.580 --> 00:23:55.380
It's a lot of fun.

00:23:55.380 --> 00:23:57.880
It was really a cool season this year.

00:23:57.880 --> 00:24:00.780
And yeah, check out the highlights from the last race.

00:24:00.780 --> 00:24:02.540
It was absolutely off the hook.

00:24:02.540 --> 00:24:06.180
Liza, what do you think in terms of a data science project here?

00:24:06.180 --> 00:24:07.820
A data science project?

00:24:07.820 --> 00:24:08.420
Wonderful.

00:24:08.420 --> 00:24:10.880
Like, especially if you actually like this.

00:24:10.880 --> 00:24:13.960
I have no knowledge on F1.

00:24:13.960 --> 00:24:18.960
I actually worked for a company that was like the, I think the founders of the company were

00:24:18.960 --> 00:24:20.520
in love with F1.

00:24:20.520 --> 00:24:22.740
And that's how they got together to found the company.

00:24:23.260 --> 00:24:29.720
And I got to talk to them and like a certain one specific circumstance.

00:24:29.720 --> 00:24:31.760
It was like, oh, you like F1.

00:24:31.760 --> 00:24:33.100
That's awesome.

00:24:33.100 --> 00:24:35.500
I know nothing about it.

00:24:35.500 --> 00:24:36.540
So please enlighten me.

00:24:38.340 --> 00:24:41.680
If you're interested, check out the Netflix Drive to Survive series.

00:24:41.680 --> 00:24:43.540
That's the easy way in.

00:24:43.540 --> 00:24:47.440
It's lots of drama, not like the boring sort of 30 minutes in between the things that actually

00:24:47.440 --> 00:24:47.760
happen.

00:24:47.760 --> 00:24:48.420
Okay.

00:24:48.420 --> 00:24:48.900
Yeah.

00:24:48.900 --> 00:24:53.480
What some of the people from the US don't understand is that they can turn in two directions.

00:24:53.480 --> 00:24:54.760
That's odd.

00:24:55.760 --> 00:24:56.440
So odd.

00:24:56.440 --> 00:25:01.600
However, Brian, just before we're off this, the US Grand Prix for the first time, I think

00:25:01.600 --> 00:25:09.740
was the most attended race ever, certainly for F1, but maybe 400,000 attendees in Austin,

00:25:09.740 --> 00:25:10.540
Texas this year.

00:25:10.540 --> 00:25:10.920
Wow.

00:25:10.920 --> 00:25:12.580
So apparently it's becoming a thing.

00:25:12.580 --> 00:25:14.860
Like soccer became a thing in the US when it didn't used to be.

00:25:14.860 --> 00:25:15.940
And now it is.

00:25:15.940 --> 00:25:17.180
I think this is as well.

00:25:17.180 --> 00:25:17.660
Yeah.

00:25:17.660 --> 00:25:18.340
All right.

00:25:18.340 --> 00:25:21.660
Alvaro also says, interesting about interesting libraries.

00:25:21.660 --> 00:25:25.060
Last week, I found DuckDB super interesting for data science as well.

00:25:25.060 --> 00:25:25.700
Yeah, definitely.

00:25:25.940 --> 00:25:28.780
We've only touched on that a little bit, but yeah, it's a great one.

00:25:28.780 --> 00:25:33.020
DuckDB is like a new database, like, I don't know, CockroachDB?

00:25:33.020 --> 00:25:41.060
A different, but I believe it has integration with like pandas and stuff, if I recall correctly.

00:25:41.060 --> 00:25:41.980
I think so.

00:25:41.980 --> 00:25:43.280
I'll have to look it up, but yeah.

00:25:43.280 --> 00:25:43.780
Cool.

00:25:43.780 --> 00:25:47.680
I'll do some real-time follow-up, but Brian, tell us about NBdime.

00:25:47.680 --> 00:25:48.840
NBdime.

00:25:48.840 --> 00:25:48.920
NBdime.

00:25:48.920 --> 00:25:54.260
So another listener suggestion, Henrik Finsberg, cool last name.

00:25:55.000 --> 00:26:04.740
He said we recently covered Jupyter Notebook Terminal Viewer.

00:26:04.740 --> 00:26:07.120
We covered that in episode 258.

00:26:07.120 --> 00:26:08.220
He's correct.

00:26:08.220 --> 00:26:13.720
But he said, hey, you should check out NBdime because it's been around for a long time.

00:26:14.320 --> 00:26:15.840
And it does something similar.

00:26:15.840 --> 00:26:17.180
So I definitely did.

00:26:17.180 --> 00:26:20.340
And I think this is a really cool set of tools.

00:26:20.340 --> 00:26:24.420
So we've got, not only does it do an NB show, which does a...

00:26:24.420 --> 00:26:24.560
Right.

00:26:24.560 --> 00:26:27.340
That's the Jute equivalent is the NB show, which is cool.

00:26:27.740 --> 00:26:27.940
Yeah.

00:26:27.940 --> 00:26:34.600
But it's, this is a set of tools that is around the needs for diffing and merging notebooks.

00:26:34.600 --> 00:26:40.100
So like if you're keeping notebooks in a Git repo, you'll have to do things like this.

00:26:41.100 --> 00:26:44.120
And so one of the, it's got a bunch of tools.

00:26:44.120 --> 00:26:44.780
It's got diff.

00:26:44.780 --> 00:26:45.520
It's got merge.

00:26:45.520 --> 00:26:46.700
It's got diff web.

00:26:46.700 --> 00:26:51.460
So you can have a rich rendered diff of the notebook.

00:26:51.460 --> 00:26:53.380
And NB merge web.

00:26:53.380 --> 00:26:56.840
So web, a three-way web-based merge of notebook tools.

00:26:56.840 --> 00:26:58.980
This just looks really cool.

00:26:58.980 --> 00:27:01.440
And I definitely think it's worth checking out.

00:27:01.560 --> 00:27:05.660
If you, if you work with notebooks and work with teams, you need to do things like this.

00:27:05.660 --> 00:27:06.000
So.

00:27:06.000 --> 00:27:06.560
Oh yeah.

00:27:06.560 --> 00:27:07.320
This looks great.

00:27:07.320 --> 00:27:08.420
Yeah.

00:27:08.420 --> 00:27:14.620
Diffing and merging notebooks is tricky for sure, because the actual on-disk representation

00:27:14.620 --> 00:27:17.200
is basically a JSON document.

00:27:17.200 --> 00:27:21.120
And then it embeds the output in there as well.

00:27:21.120 --> 00:27:21.740
Right.

00:27:21.740 --> 00:27:25.280
So if you ran it against live data and you got some output and you run it again, of course,

00:27:25.280 --> 00:27:27.500
that's going to be different, but that's a, you know, straight Git.

00:27:27.500 --> 00:27:28.580
That's a merge conflict, right?

00:27:28.580 --> 00:27:29.180
Yeah.

00:27:29.340 --> 00:27:31.840
I'd be interested to know how they deal with that.

00:27:31.840 --> 00:27:34.560
I haven't looked through this, but you probably.

00:27:34.560 --> 00:27:38.740
It looks like it understands the cells and then just the cells or something along those lines.

00:27:38.740 --> 00:27:39.440
Probably.

00:27:39.440 --> 00:27:40.320
So.

00:27:40.320 --> 00:27:40.660
Yeah.

00:27:40.660 --> 00:27:41.540
That's super cool.

00:27:41.540 --> 00:27:42.020
Yeah.

00:27:42.020 --> 00:27:42.700
This is a great one.

00:27:42.700 --> 00:27:44.800
Thanks for the recommendation as well.

00:27:44.800 --> 00:27:45.460
All right.

00:27:45.460 --> 00:27:46.580
Lise, you're up next.

00:27:46.580 --> 00:27:47.700
Yes.

00:27:47.700 --> 00:27:51.320
So we found out.

00:27:51.320 --> 00:27:54.580
So first of all, this is a recommendation from Fridolin.

00:27:54.580 --> 00:27:56.520
He works.

00:27:56.520 --> 00:27:58.300
He's a software developer at Red Hat.

00:27:58.300 --> 00:27:59.880
So thank you very much for the suggestion.

00:27:59.880 --> 00:28:03.620
And this is Project Dot.

00:28:03.620 --> 00:28:10.280
So basically, this is an open source cloud-based Python dependency resolver.

00:28:10.280 --> 00:28:17.480
So we all know that PyPy just launched a new dependency resolver.

00:28:17.520 --> 00:28:18.520
Yeah.

00:28:18.520 --> 00:28:18.960
Yeah.

00:28:18.960 --> 00:28:20.220
That was a big deal.

00:28:20.220 --> 00:28:22.600
There were some breaking changes to PyPI and stuff like that.

00:28:22.600 --> 00:28:23.300
But yeah.

00:28:23.300 --> 00:28:23.840
Yes.

00:28:23.840 --> 00:28:31.280
And well, show the first stone who never had dependency resolving issues with PyP.

00:28:31.280 --> 00:28:36.020
We've spent so much time like, okay, so it's not this library.

00:28:36.020 --> 00:28:36.900
It's this other one.

00:28:37.160 --> 00:28:38.080
No, it's not this version.

00:28:38.080 --> 00:28:38.820
It's this other one.

00:28:38.820 --> 00:28:48.720
So this Project Dot basically comes to solve this issue and it uses reinforcement learning to solve these dependency issues.

00:28:48.720 --> 00:28:54.580
So basically, from what I understood, it's a smarter pip.

00:28:54.580 --> 00:29:09.740
So basically, it uses a few inputs from the developer, such as like the speed of the execution of the code and if there was any errors and your hard drive version, etc.

00:29:10.460 --> 00:29:22.720
Yeah, it's not just what version do you want, like greater than 2.1, but you could say, I would like one that's relatively stable or I would prefer security over recency or something along those lines.

00:29:22.720 --> 00:29:29.480
So there's a lot of different inputs to this machine learning model that then will give you the result of like pip install a thing.

00:29:29.480 --> 00:29:30.220
Yes.

00:29:30.220 --> 00:29:36.980
And then it pre-computes this whole dependency information and puts it in a database and then it just keeps track of it.

00:29:36.980 --> 00:29:50.120
And then the logs that result from like actually installing the dependencies of that environment, then I use to go into as input into that reinforcement learning algorithm.

00:29:50.120 --> 00:29:54.520
And they use that then to create future resolutions.

00:29:54.520 --> 00:30:00.800
So basically, just make the whole process of dependency resolving much faster and much easier.

00:30:00.800 --> 00:30:01.920
Yeah.

00:30:01.920 --> 00:30:04.720
It sounds like a great thing.

00:30:04.720 --> 00:30:12.600
And I tried testing, but well, I got it to a little bit of an issue with my past-term versions.

00:30:12.600 --> 00:30:14.840
I was like, oh, I'll deal with all of this later.

00:30:14.840 --> 00:30:16.120
Yeah, exactly.

00:30:16.120 --> 00:30:20.320
Can you scroll down to the code sample where it's talking about Thamos or Thamos?

00:30:20.320 --> 00:30:21.940
I don't remember the term exactly.

00:30:21.940 --> 00:30:23.440
It's a little further down.

00:30:23.440 --> 00:30:25.020
It's like a code call out.

00:30:25.020 --> 00:30:26.420
Keep going.

00:30:26.420 --> 00:30:26.800
Keep going.

00:30:26.800 --> 00:30:28.020
I've got a little bit right there.

00:30:28.180 --> 00:30:40.260
So yeah, so the way you can use it is you pip install this Thamos thing and then you configure environment and then you add dependencies with some suggested version like approximately Flask 1.

00:30:40.260 --> 00:30:44.360
And then you ask it to advise you on your current setup.

00:30:44.360 --> 00:30:48.440
And it'll go through and it actually analyzes the code and does a whole bunch of stuff.

00:30:48.600 --> 00:30:52.340
And then it'll give you some information.

00:30:52.340 --> 00:31:00.220
I don't remember exactly all the details of what it would suggest, but it'll give you information about the various dependencies that you have installed and so on.

00:31:00.220 --> 00:31:05.080
And also give you suggestions on hardware and OS versions that you should be using.

00:31:05.080 --> 00:31:05.620
Yeah.

00:31:06.280 --> 00:31:07.580
It's quite smart.

00:31:07.580 --> 00:31:09.100
I thought it was quite interesting.

00:31:09.100 --> 00:31:11.440
And it's in beta phase.

00:31:11.440 --> 00:31:24.040
So if anyone that is listening would like to try it and then maybe just give some feedback back to Red Hat there, they'll be very, very, very happy to hear from the community as well.

00:31:24.040 --> 00:31:25.780
Because it's an open source project.

00:31:25.780 --> 00:31:27.180
So please, collaborate.

00:31:27.180 --> 00:31:28.340
Yeah, check it out.

00:31:28.440 --> 00:31:33.800
And it looks like it might have something to do with OpenStack and their whole cloud story over there as well.

00:31:33.800 --> 00:31:36.720
Although I don't believe it explicitly said it.

00:31:36.720 --> 00:31:39.980
It doesn't seem to be tied to it, but it seems maybe motivated by that as well.

00:31:39.980 --> 00:31:40.980
So yeah, cool.

00:31:40.980 --> 00:31:42.000
That's a good one.

00:31:42.000 --> 00:31:42.580
Interesting.

00:31:42.580 --> 00:31:45.040
Brian, some real-time feedback here.

00:31:45.040 --> 00:31:50.720
So we covered this article, Efficient SQL on Pandas with DuckDB.

00:31:51.440 --> 00:32:00.220
And one of the cool things you could do is create a Pandas data frame and then do select queries on top of the data frame.

00:32:00.220 --> 00:32:01.780
That's pretty cool.

00:32:01.780 --> 00:32:02.320
Yeah.

00:32:02.320 --> 00:32:14.240
So for example, remember you have like a local variable and you say the name of local variable in the query and it like reaches into the call stack and grabs that out of the context and then works with it.

00:32:14.240 --> 00:32:14.860
So yeah.

00:32:14.860 --> 00:32:17.340
Anyway, this is one of the data science-y things.

00:32:17.340 --> 00:32:17.980
Nice.

00:32:17.980 --> 00:32:18.600
Yep.

00:32:18.600 --> 00:32:19.060
Fine.

00:32:19.060 --> 00:32:20.640
Brian, is that it for all of our items?

00:32:21.040 --> 00:32:21.700
I think it is.

00:32:21.700 --> 00:32:22.200
Yeah.

00:32:22.200 --> 00:32:23.320
I think you might be right.

00:32:23.320 --> 00:32:24.620
What about the extras?

00:32:24.620 --> 00:32:25.140
You got any?

00:32:25.140 --> 00:32:25.960
I do.

00:32:25.960 --> 00:32:28.540
Actually, nice timing for today.

00:32:28.540 --> 00:32:33.080
So Pragmatic Bookshelf, they're the publishers of the pytest book.

00:32:33.080 --> 00:32:37.140
They're running a sale, actually 12 days of Christmas sale.

00:32:37.140 --> 00:32:39.140
So every day is something different.

00:32:39.140 --> 00:32:40.440
You don't know what it is.

00:32:40.440 --> 00:32:41.700
I don't know what it is.

00:32:41.700 --> 00:32:44.280
But today, my book is part of it.

00:32:44.280 --> 00:32:51.720
So you enter a promo code and you get 50% off $50 spend.

00:32:51.720 --> 00:32:54.620
So you got to order a couple of books because they're not that expensive.

00:32:54.620 --> 00:32:57.080
But anyway, it's pretty cool.

00:32:57.080 --> 00:32:57.780
Cool.

00:32:57.780 --> 00:32:58.000
Yeah.

00:32:58.120 --> 00:32:59.400
Hopefully that does well.

00:32:59.400 --> 00:33:00.320
Liza, how about you?

00:33:00.320 --> 00:33:02.980
Got anything extra you want to give a quick shout out to while we're here?

00:33:02.980 --> 00:33:04.360
Oh, yes, of course.

00:33:04.360 --> 00:33:08.480
So I am a volunteer for Python Island.

00:33:08.480 --> 00:33:15.840
And Python Island has a speakers coaching session happening on the 22nd of January.

00:33:16.240 --> 00:33:21.940
So it's basically we're offering for people that would like to be a pro on giving talks.

00:33:21.940 --> 00:33:24.220
We're offering a workshop.

00:33:24.220 --> 00:33:25.680
It's the entire day.

00:33:25.680 --> 00:33:34.920
And you need to say that you need to just like give us your words that you're going to give us a talk as like a practice thing.

00:33:35.920 --> 00:33:40.240
But it's quite it's a very interesting workshop thing.

00:33:40.240 --> 00:33:46.540
And if you would like to be part of it, just go into the meetup.com slash Python Island.

00:33:46.540 --> 00:33:51.220
And it's the 22nd of January.

00:33:51.220 --> 00:33:53.660
Yeah, that's a cool service.

00:33:53.660 --> 00:34:00.600
I guess you would call it a cool option for speakers because speaking is one of those things that really can open doors and help get you connected.

00:34:00.600 --> 00:34:02.740
But it's also super stressful.

00:34:02.900 --> 00:34:06.240
The very first time you do it is in front of the audience and it's being broadcast.

00:34:06.240 --> 00:34:11.560
And also like the tips on how to put a talk together, because there is that anxiety as well.

00:34:11.560 --> 00:34:20.240
Like, I have a talk, but I don't know if my thing that I want to talk about is a good thing or I don't know if my slides are good.

00:34:20.240 --> 00:34:23.980
I don't know if I know how to actually convey the message.

00:34:23.980 --> 00:34:26.380
So we would love to help you with that.

00:34:26.380 --> 00:34:28.800
And I won't be the one giving the workshop.

00:34:28.960 --> 00:34:33.620
There is a proper person there that has experience in doing that.

00:34:34.620 --> 00:34:38.760
So, yeah, I've done the workshop, though, and it's a great workshop.

00:34:38.760 --> 00:34:39.940
Yeah, nice.

00:34:40.600 --> 00:34:42.920
And then I have a few other extras, though.

00:34:42.920 --> 00:34:44.000
Can I just go on?

00:34:44.000 --> 00:34:44.760
Yeah, yeah.

00:34:44.760 --> 00:34:46.100
Cover as many as you want.

00:34:46.100 --> 00:34:47.000
As many as you got.

00:34:47.000 --> 00:34:47.620
Cool.

00:34:48.040 --> 00:34:53.280
So then I also found, I don't know how many newbies we have listening to us today.

00:34:54.120 --> 00:35:03.940
But for people that, since we're talking a lot about data science as well, there's a bunch of data scientists and other people around that don't really know how to deal with Git.

00:35:03.940 --> 00:35:10.720
And even for me as a person, my personal experience with Git initially was so hard.

00:35:10.720 --> 00:35:11.180
Yeah.

00:35:11.180 --> 00:35:13.220
Why do I have to commit it twice?

00:35:13.220 --> 00:35:13.880
Why do I have to do that?

00:35:13.880 --> 00:35:15.140
I just want to commit it.

00:35:15.140 --> 00:35:17.600
What's this push about?

00:35:17.600 --> 00:35:20.100
And then what do you mean, where am I?

00:35:21.200 --> 00:35:23.280
I am here in front of my computer.

00:35:23.280 --> 00:35:25.580
Yeah.

00:35:25.580 --> 00:35:39.980
So if you want to learn Git, there is this website called learningbranching.js.org that gives you a step-by-step with a visual manual of how to actually get Git done.

00:35:39.980 --> 00:35:41.820
So you have lessons.

00:35:41.820 --> 00:35:49.100
So you can click on the lessons and then it gives you an explanation with some best practices.

00:35:49.360 --> 00:35:51.560
And then it gives you snippets of code as well.

00:35:51.560 --> 00:35:54.400
So you have like a thing that kind of moves.

00:35:54.400 --> 00:36:00.320
It's, yeah, it's quite like straightforward and it's quite interesting.

00:36:00.320 --> 00:36:01.420
I don't know what happened here.

00:36:01.420 --> 00:36:04.260
My computer, I think, stopped working.

00:36:04.260 --> 00:36:05.800
Yeah.

00:36:05.800 --> 00:36:06.440
Anyhow.

00:36:06.440 --> 00:36:07.980
So it's very interesting.

00:36:07.980 --> 00:36:13.260
It's a very visual way of learning Git.

00:36:13.260 --> 00:36:20.100
So if you're struggling with Git and you don't have time to read the book, actually, first thing, read the book.

00:36:20.100 --> 00:36:23.780
Chapter, I think chapter 10 of the Git book is the most important one.

00:36:23.780 --> 00:36:25.860
It teaches you the main things that you need to know.

00:36:26.680 --> 00:36:36.120
But if you don't have time to do that, then if you want to train a little bit with a GUI, just this is the most straightforward thing that I found around.

00:36:36.120 --> 00:36:37.500
Yeah, that's cool.

00:36:37.500 --> 00:36:39.660
I like how it's like a little fake shell.

00:36:40.820 --> 00:36:41.120
Yes.

00:36:41.120 --> 00:36:45.260
And if everything was working, I could show you that like you have.

00:36:45.260 --> 00:36:49.120
So you do, you click here and it's like it's very GUI based.

00:36:49.120 --> 00:36:54.000
But then as soon as you get out of this thing, you need to train to pass the face because it's kind of like a game.

00:36:54.000 --> 00:36:54.300
Okay.

00:36:54.300 --> 00:36:55.520
Then you need to type it.

00:36:55.520 --> 00:36:56.880
So you're like.

00:36:56.880 --> 00:36:57.340
Oh, I see.

00:36:57.340 --> 00:37:03.700
So it has you do some kind of branch thing or check out and then it watches to make sure that, say, the branch was created or something.

00:37:03.700 --> 00:37:03.920
Huh?

00:37:04.400 --> 00:37:04.800
Yes.

00:37:04.800 --> 00:37:05.320
Yes.

00:37:05.320 --> 00:37:06.200
Like you have a check.

00:37:06.200 --> 00:37:11.640
It's quite interesting and it's quite good for money.

00:37:11.640 --> 00:37:12.140
Yes.

00:37:12.140 --> 00:37:12.560
Yeah.

00:37:12.560 --> 00:37:14.000
Oh, yeah.

00:37:14.000 --> 00:37:14.340
Nice.

00:37:14.340 --> 00:37:16.740
If you could pick.

00:37:16.740 --> 00:37:17.400
No, you can't.

00:37:17.400 --> 00:37:18.940
I don't know what's going on.

00:37:18.940 --> 00:37:19.480
I'm sorry.

00:37:19.480 --> 00:37:21.300
No worries.

00:37:21.300 --> 00:37:21.780
It looks cool.

00:37:21.780 --> 00:37:22.540
It's a good suggestion.

00:37:22.540 --> 00:37:24.320
People can check that out in the show notes.

00:37:24.320 --> 00:37:25.500
Yeah.

00:37:25.500 --> 00:37:25.940
So.

00:37:25.940 --> 00:37:26.520
Yeah.

00:37:26.520 --> 00:37:27.720
I like the visuals.

00:37:27.720 --> 00:37:28.860
This is the one.

00:37:28.860 --> 00:37:31.140
So you can type, let's say, Git commit.

00:37:31.140 --> 00:37:33.300
And it's here.

00:37:33.340 --> 00:37:35.560
You can see what happens and it tells you.

00:37:35.560 --> 00:37:36.440
So, okay.

00:37:36.440 --> 00:37:39.000
So you did a commit and this is what happens.

00:37:39.000 --> 00:37:43.520
And then you can go back to the instructions if you don't get it.

00:37:43.520 --> 00:37:44.600
It's quite interesting.

00:37:44.600 --> 00:37:47.320
And then just to close the extras.

00:37:47.320 --> 00:37:54.320
So I started coding with Python for a very short period of time.

00:37:54.320 --> 00:37:56.180
And then I switched when I started IT.

00:37:56.180 --> 00:37:59.100
I switched to Java and then I did a few years of Java.

00:37:59.100 --> 00:38:01.860
And then I went back into Python.

00:38:02.080 --> 00:38:06.560
But then when I went back into Python, I was like, well, I know Java now.

00:38:06.560 --> 00:38:07.880
And what's going on?

00:38:07.880 --> 00:38:10.780
What is this language that is not verbose at all?

00:38:10.780 --> 00:38:12.580
And you can do whatever you want with it.

00:38:12.580 --> 00:38:14.340
How do you do objectively?

00:38:14.340 --> 00:38:14.560
There's no rules.

00:38:14.560 --> 00:38:15.080
What's happening?

00:38:15.080 --> 00:38:15.940
Exactly.

00:38:15.940 --> 00:38:17.560
What's the story?

00:38:18.420 --> 00:38:23.560
And I struggled a lot to find a straightforward tutorial and a straightforward manual.

00:38:23.560 --> 00:38:24.300
They'll tell me.

00:38:24.300 --> 00:38:25.680
So this is the comparison.

00:38:25.680 --> 00:38:26.880
This is what Python does.

00:38:26.880 --> 00:38:27.820
The Java doesn't do.

00:38:27.820 --> 00:38:30.620
Or this is how to do things in Python.

00:38:30.620 --> 00:38:32.260
And this is how to do things in Java.

00:38:32.260 --> 00:38:34.000
This is the comparison and blah, blah, blah.

00:38:34.380 --> 00:38:42.600
So then I found this real Python article that was just being published, I think, maybe a few weeks ago.

00:38:42.600 --> 00:38:45.300
I wish it was around when I started, but it wasn't.

00:38:45.300 --> 00:38:46.040
Yeah.

00:38:46.040 --> 00:38:49.140
It's only like five days old or seven days old or something.

00:38:49.140 --> 00:38:50.080
Yes.

00:38:50.080 --> 00:38:50.960
Yes.

00:38:50.960 --> 00:38:57.380
So it tells you like very straightforward way the differences and the similarities between the two languages.

00:38:58.380 --> 00:39:11.200
And talks about the Python data types and talks a little bit about as well the center of Python and how we do things in Python and how we do things in Java and then standard library.

00:39:11.200 --> 00:39:16.640
And then comments as well as about perhaps and tutorials and documentation.

00:39:16.640 --> 00:39:24.080
So it's very, very, very interesting if you're starting with Python coming from a Java background.

00:39:24.080 --> 00:39:24.860
Nice.

00:39:24.860 --> 00:39:25.220
Yeah.

00:39:25.220 --> 00:39:25.800
That's cool.

00:39:25.920 --> 00:39:31.660
I think using your existing skills to level up is a much better way.

00:39:31.660 --> 00:39:33.460
Like I want to know how to talk to a database.

00:39:33.460 --> 00:39:34.380
I can do that in Java.

00:39:34.380 --> 00:39:35.740
How do I do that in Python?

00:39:35.740 --> 00:39:36.460
Oh, I see.

00:39:36.460 --> 00:39:36.900
Okay.

00:39:36.900 --> 00:39:37.900
Now I got it, right?

00:39:37.900 --> 00:39:38.540
Yes.

00:39:38.540 --> 00:39:39.440
Cool, cool.

00:39:39.440 --> 00:39:40.320
All right.

00:39:40.320 --> 00:39:43.000
I got a few extras as everyone may imagine.

00:39:43.000 --> 00:39:49.320
First, a quick follow-up for people who are getting started with Git and you want some more help, consider using OhMyZShell.

00:39:49.320 --> 00:39:50.400
Why?

00:39:50.620 --> 00:39:57.040
Because if you go into a Git repository here and you type Git, you can hit tab.

00:39:57.040 --> 00:39:59.600
It'll give you all the top level features of Git.

00:39:59.600 --> 00:40:03.620
So like branch, clone, checkout, commit, whatever.

00:40:04.080 --> 00:40:14.340
So if you type Git branch and hit tab, though, it'll actually list, give you tab autocomplete and arrow autocomplete for all the existing branches, for example, and stuff.

00:40:14.540 --> 00:40:27.000
So if you're having a hard time on the terminal and you want some help, you can just do ZShell and it'll actually give you like super deep autocomplete on the terminal, even into, say, your project structure, your repo structure.

00:40:27.000 --> 00:40:27.680
So that's cool.

00:40:27.680 --> 00:40:28.880
Don't go there without that.

00:40:29.660 --> 00:40:35.280
But for my actual things, I gave a talk at FlaskCon.

00:40:35.280 --> 00:40:37.900
So that talk is up, which is really cool.

00:40:37.900 --> 00:40:42.160
It was on HTMX and Flask and Jinja partials and things like that.

00:40:42.160 --> 00:40:43.720
So people can check that out.

00:40:43.720 --> 00:40:44.660
That's good.

00:40:44.660 --> 00:40:51.320
Brian, I've talked about why Firefox is awesome and people should be using it more and not letting it fade into oblivion.

00:40:51.800 --> 00:40:56.000
As everyone thinks, Chromium is the core that we should all be building on.

00:40:56.000 --> 00:41:03.440
And they just came out with a really cool idea called RL blocks that would be applicable to other browsers as well.

00:41:03.440 --> 00:41:12.960
So one of the problems with web browsers is they accept all sorts of input from random strangers on the Internet, which is generally not a good idea for security, right?

00:41:12.960 --> 00:41:15.340
And it's not just the browser, it's the plugins.

00:41:15.340 --> 00:41:27.760
And so you've got things like the Ogg format or Wolf is a font parsing library and all these different things that you might need to run inside the browser.

00:41:27.760 --> 00:41:30.260
But you really get them from somewhere else, right?

00:41:30.260 --> 00:41:37.080
So, for example, if there's a problem with, say, the Ogg parser and you load an Ogg file, then, you know, the browser gets hacked into.

00:41:37.080 --> 00:41:41.840
And there's things they've been doing to try to restrict that with, like, sandboxes and stuff.

00:41:41.840 --> 00:41:45.420
So this thing, I'll just give a quick shout out to R blocks.

00:41:45.420 --> 00:41:47.380
What they're doing is insane.

00:41:47.380 --> 00:41:50.020
As somebody who does a little C++, tell me what you think about this.

00:41:50.020 --> 00:41:55.800
So what they do is they use the LLVM, or no, clang here.

00:41:55.800 --> 00:41:59.180
They use clang and they take these libraries like Ogg.

00:41:59.180 --> 00:42:01.280
They compile them to WebAssembly.

00:42:01.280 --> 00:42:05.720
And then there's another thing called WebAssembly to C and they compile it back to C.

00:42:05.720 --> 00:42:11.160
And then they compile it into the system as if they hadn't done anything to it, which sounds weird, right?

00:42:11.160 --> 00:42:13.180
Why would you do that?

00:42:13.180 --> 00:42:24.200
But what it does is it strips out a bunch of intermediate steps where viruses could live and uses WebAssembly to, like, put those checks as part of the system and then puts it back into C.

00:42:24.200 --> 00:42:24.860
Okay.

00:42:24.860 --> 00:42:25.460
Yeah.

00:42:25.460 --> 00:42:29.300
So anyway, this is a pretty wild thing that they came up with.

00:42:29.300 --> 00:42:31.720
So just worth a quick checking out.

00:42:31.720 --> 00:42:35.060
And then, Liza, you mentioned this Log4J thing.

00:42:35.060 --> 00:42:35.880
Yes.

00:42:36.120 --> 00:42:39.480
We're all going to be suffering from this for so long.

00:42:39.480 --> 00:42:40.500
This is so bad.

00:42:40.500 --> 00:42:48.320
So it turned out that Log4J, the problem with Log4J is, let me describe this in Python terms and just see what you all think.

00:42:48.400 --> 00:42:55.320
So Log4J has this ability to parse the strings you put into the logs.

00:42:55.320 --> 00:42:56.860
So I want to log out a message.

00:42:56.860 --> 00:43:04.840
But instead of actually getting a user, like, say, instead of going to the code and getting, say, the machine name or the IP address that I'm on,

00:43:04.900 --> 00:43:15.840
I can put, like, a little symbol in the log file and Log4J will go, oh, what you need is you want me to, say, pull in the IP address locally and then write that in the log.

00:43:15.840 --> 00:43:17.140
That's maybe okay.

00:43:17.140 --> 00:43:21.380
They also have this ability to run code that they don't know.

00:43:21.380 --> 00:43:22.580
I mean, you did some Java.

00:43:22.720 --> 00:43:32.680
They have this ability to run code not in the local class library but on a remote machine somewhere else out on the Internet called, was it J-N-D-I?

00:43:32.680 --> 00:43:33.680
J-D-N-I?

00:43:33.680 --> 00:43:35.040
I don't always swipe the order.

00:43:35.040 --> 00:43:41.260
Well, it turns out you can put the J-D-N-I run code symbol into your log file.

00:43:41.440 --> 00:43:48.860
And then the log message will result in running code from anywhere on the Internet in the process of your thing that's trying to log.

00:43:48.860 --> 00:43:50.300
And it can come from anywhere.

00:43:50.300 --> 00:43:51.880
It is so bad.

00:43:51.880 --> 00:44:01.800
If it's in a header file, if it's in the URL, if it's in the email address where you expected email address, you put in, like, dollar bracket J-N-D-I colon some path to the virus.

00:44:01.800 --> 00:44:07.480
Literally the attempt to say this user with this email address failed to log in results in running the virus.

00:44:08.180 --> 00:44:15.300
Anything that you may ever log, user agents, like, you name it, run virus remotely in this process.

00:44:15.300 --> 00:44:20.800
And anything you might want to log in, you're typically logging bad inputs, so you can log attempts to hack your system.

00:44:20.800 --> 00:44:27.960
There were, like, 850,000 hack attempts within the first couple, like, day or two of this.

00:44:27.960 --> 00:44:37.480
It's going to be not good, which made me think of just a quick little fun comment here of an XKCD that someone put on Twitter after this.

00:44:37.560 --> 00:44:39.940
Because it's all about this log for J that's not really funded.

00:44:39.940 --> 00:44:44.740
So all modern digital infrastructure is like this Jenga tower.

00:44:44.740 --> 00:44:50.940
And then at the very bottom, it's a project some random person in Nebraska has been thinklessly maintaining since 2003.

00:44:50.940 --> 00:44:51.660
Pull that out.

00:44:51.660 --> 00:44:52.500
It all comes down.

00:44:52.500 --> 00:44:54.280
So that's the world we live in.

00:44:54.280 --> 00:44:54.780
Yeah.

00:44:55.460 --> 00:44:55.880
Yeah.

00:44:55.880 --> 00:44:55.880
Yeah.

00:44:55.880 --> 00:45:04.240
Especially because there was this thing, this movement on Twitter of people just blaming the log for J developers about it.

00:45:04.240 --> 00:45:10.540
And some other people just show up and, well, they haven't been getting paid for all the work that they're doing.

00:45:10.540 --> 00:45:13.940
And everybody's using the application throughout.

00:45:13.940 --> 00:45:25.580
There's certainly a conversation to be had about how much energy and time should these large companies be putting into supporting open source stuff.

00:45:25.820 --> 00:45:26.000
Right.

00:45:26.000 --> 00:45:32.040
And it's, I think there's so many little things like log for J that nobody feels like they're using.

00:45:32.040 --> 00:45:32.400
Sure.

00:45:32.400 --> 00:45:35.720
Their web framework might use it, but they don't actually want to use it.

00:45:35.720 --> 00:45:37.460
It just happens to be what their web framework shows.

00:45:37.460 --> 00:45:39.720
But they are built on top of it as they're learning.

00:45:39.720 --> 00:45:42.100
I'm sure there are many sleepless nights on this.

00:45:42.100 --> 00:45:42.840
I don't know.

00:45:42.840 --> 00:45:43.480
Not good.

00:45:43.860 --> 00:45:45.860
As a Java person, what do you think about this?

00:45:45.860 --> 00:45:47.500
Actually.

00:45:47.500 --> 00:45:50.520
As a representative of all Java.

00:45:50.520 --> 00:45:51.240
Yes.

00:45:51.240 --> 00:45:54.080
No pressure at all, right?

00:45:54.080 --> 00:45:54.940
No pressure whatsoever.

00:45:54.940 --> 00:46:06.440
I can say as someone that has worked for open source for a while now that there is a big discussion to be had on that.

00:46:07.080 --> 00:46:14.920
But there is also a big discussion to be had on how do we want open source to be sustained from now on?

00:46:14.920 --> 00:46:18.820
Because the way that it's going is not sustainable when we all know it.

00:46:18.820 --> 00:46:23.260
And we have big companies and we don't even need to name the big companies.

00:46:23.260 --> 00:46:24.660
But we have really big companies.

00:46:24.660 --> 00:46:32.160
They have been using and are starting now to do open source projects simply because it's good for business.

00:46:33.440 --> 00:46:39.560
Because it gets people hooked into what they're doing and then, well, you're going to have to use our open source packet now.

00:46:39.560 --> 00:46:42.100
And that's us taking the market.

00:46:42.100 --> 00:46:51.840
But we need open source to be at least a tiny bit more sustainable because the way it's going, it's not good for anyone.

00:46:51.840 --> 00:46:52.420
Yeah.

00:46:52.420 --> 00:46:54.580
I guess one final thought on this.

00:46:54.580 --> 00:46:56.460
This was not a bug that was found.

00:46:56.460 --> 00:47:00.000
This was a feature that was used in a way that people didn't expect.

00:47:00.000 --> 00:47:01.560
I can expand variables.

00:47:01.560 --> 00:47:02.640
I can run remote code.

00:47:02.640 --> 00:47:04.340
I can run expanded remote code.

00:47:04.340 --> 00:47:04.560
Oops.

00:47:04.560 --> 00:47:05.740
All right.

00:47:05.740 --> 00:47:08.720
But let's bring it back to Python with a joke.

00:47:08.720 --> 00:47:09.400
What do you guys think?

00:47:09.400 --> 00:47:09.920
Yeah.

00:47:09.920 --> 00:47:10.640
All right.

00:47:10.640 --> 00:47:12.980
Liza, you got the first joke.

00:47:12.980 --> 00:47:13.960
Hit us on this one.

00:47:13.960 --> 00:47:27.380
So we were talking about virtual environments and how much fun it is to set up Python and use all your virtual environments because you have, well, fans and ppams and condes and everything else.

00:47:27.380 --> 00:47:33.000
And how much everyone always complains about having to set up their environment before installing Python.

00:47:33.000 --> 00:47:33.500
So I found this.

00:47:33.500 --> 00:47:41.700
So apparently this would be society if you didn't have to use virtual environments to install Python packages.

00:47:41.700 --> 00:47:47.160
Let me try to describe this for the world who is just listening.

00:47:47.700 --> 00:47:52.920
It's like the most idealistic, futuristic view of the world.

00:47:52.920 --> 00:47:59.420
We've got like monorails and there's just shining silver spaceships zooming through the sky.

00:47:59.420 --> 00:48:03.700
And it just looks like, oh, yeah, here's the perfect future.

00:48:03.800 --> 00:48:05.620
We all dreamed we were supposed to have.

00:48:05.620 --> 00:48:06.260
Yes.

00:48:06.260 --> 00:48:08.360
That everyone, everyone types Python.

00:48:08.360 --> 00:48:09.640
Everyone knows Python.

00:48:09.640 --> 00:48:13.520
But you don't have to use virtual environments to install their packages.

00:48:13.520 --> 00:48:14.060
Imagine.

00:48:14.060 --> 00:48:17.680
Are you telling me that virtual environments denied this from us?

00:48:17.680 --> 00:48:17.960
No.

00:48:17.960 --> 00:48:22.220
This is the reason why we can't have these things is because people don't learn virtual environments.

00:48:22.220 --> 00:48:24.440
That spaceship has its own environment.

00:48:24.440 --> 00:48:27.300
The little house over there that's running a different version.

00:48:27.300 --> 00:48:28.120
Yeah.

00:48:28.120 --> 00:48:29.320
Because of its environment.

00:48:29.320 --> 00:48:31.620
That's a good way to look at it, Brian.

00:48:31.620 --> 00:48:32.320
I like it.

00:48:33.320 --> 00:48:34.060
Yeah, me too.

00:48:34.060 --> 00:48:36.400
Brian always brings the other side of the things.

00:48:36.400 --> 00:48:38.120
Where it's like, oh, the data perspective.

00:48:38.120 --> 00:48:39.660
It's wonderful.

00:48:39.660 --> 00:48:40.520
Thank you, Brian.

00:48:40.520 --> 00:48:41.980
Yeah, thanks, Brian.

00:48:41.980 --> 00:48:42.320
All right.

00:48:42.320 --> 00:48:45.380
The joke I was going to cover is actually that Jenga tower I already showed.

00:48:45.380 --> 00:48:47.640
So I'll just leave it at that.

00:48:47.640 --> 00:48:50.340
One real quick bit of follow up here.

00:48:50.340 --> 00:48:52.020
Because I think this will be helpful to people.

00:48:52.020 --> 00:49:00.820
Jeremy Page says, if you are on bash instead of z shell, the package bash dash completion will also allow git command tags, branches, etc.

00:49:00.820 --> 00:49:01.660
to autocomplete.

00:49:01.960 --> 00:49:03.360
And I never read a book.

00:49:03.360 --> 00:49:07.500
I just like, I think I read an article that's like the 10 git commands you need.

00:49:07.500 --> 00:49:09.480
And I've been good since.

00:49:09.480 --> 00:49:11.540
Yeah.

00:49:11.540 --> 00:49:12.800
Oh, yeah.

00:49:12.800 --> 00:49:13.540
Okay.

00:49:13.540 --> 00:49:15.220
Mr. Waze Kidd.

00:49:15.220 --> 00:49:16.940
I can't.

00:49:16.940 --> 00:49:17.920
Exactly.

00:49:17.920 --> 00:49:22.380
And Brandon says, you don't need virtual environments if you just set up a new virtual machine for every project.

00:49:22.380 --> 00:49:23.060
That's true.

00:49:23.060 --> 00:49:23.480
Yeah.

00:49:23.480 --> 00:49:24.880
Docker will save the world.

00:49:25.580 --> 00:49:26.220
That's right.

00:49:26.220 --> 00:49:27.220
I agree.

00:49:27.220 --> 00:49:31.200
We could have the same picture with Docker, but they'd all just be cubes just flowing around.

00:49:31.200 --> 00:49:31.600
Cubes.

00:49:31.600 --> 00:49:31.860
Yeah.

00:49:31.860 --> 00:49:33.960
Like, yeah.

00:49:33.960 --> 00:49:35.200
Pack it.

00:49:35.400 --> 00:49:36.560
There's shipping containers everywhere.

00:49:36.560 --> 00:49:37.740
Shipping containers everywhere.

00:49:37.740 --> 00:49:38.420
With wings.

00:49:38.420 --> 00:49:39.200
There's also the pragmatic.

00:49:39.200 --> 00:49:40.740
Exactly.

00:49:40.740 --> 00:49:44.180
The pragmatic Mario says, I click buttons on VS Code.

00:49:44.180 --> 00:49:46.580
Go GUI.

00:49:48.580 --> 00:49:50.120
All right, Brian, you want to take us out of here?

00:49:50.120 --> 00:49:52.060
Yeah, sure.

00:49:52.060 --> 00:49:55.320
Let's, thanks everybody for showing up for the show.

00:49:55.320 --> 00:49:57.240
And it was really a lot of fun.

00:49:57.240 --> 00:50:01.240
Thanks, Leiaz for, sorry, Leiaz for showing up.

00:50:01.240 --> 00:50:01.900
It's been great.

00:50:01.900 --> 00:50:02.540
Bye, everyone.

00:50:02.540 --> 00:50:03.700
Thank you.

00:50:03.700 --> 00:50:04.580
Thank you for listening.

00:50:04.580 --> 00:50:06.100
And thank you for the invite again.

00:50:06.100 --> 00:50:06.940
It was a pleasure.

