WEBVTT

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

00:00:05.020 --> 00:00:09.980
This is episode 139, recorded July 11th, 2019.

00:00:09.980 --> 00:00:11.040
I'm Michael Kennedy.

00:00:11.040 --> 00:00:11.880
And I'm Brian Okken.

00:00:11.880 --> 00:00:14.960
And I want to welcome Ines Montani to the show.

00:00:14.960 --> 00:00:16.340
Ines, it's great to have you here.

00:00:16.340 --> 00:00:18.860
Special guest, going to help us cover the news of the week.

00:00:18.860 --> 00:00:19.440
Thanks for being here.

00:00:19.440 --> 00:00:20.400
Yeah, thanks for having me.

00:00:20.400 --> 00:00:20.980
I'm really excited.

00:00:20.980 --> 00:00:23.020
It's going to be really fun to have you participate in this.

00:00:23.020 --> 00:00:25.740
Also, thank you to DigitalOcean for sponsoring this episode.

00:00:25.740 --> 00:00:28.240
Check them out at pythonbytes.fm/digitalocean.

00:00:28.240 --> 00:00:29.200
More on that later.

00:00:30.000 --> 00:00:32.520
Brian, we've talked a lot about like, how do you install Python?

00:00:32.520 --> 00:00:34.120
How do you manage Python?

00:00:34.120 --> 00:00:35.640
How do you upgrade your stuff?

00:00:35.640 --> 00:00:37.300
There's just so many ways.

00:00:37.300 --> 00:00:40.360
And then we've got things like pipenv, flit, poetry.

00:00:40.360 --> 00:00:41.780
It goes on and on.

00:00:41.780 --> 00:00:43.340
And it still goes on, right?

00:00:43.340 --> 00:00:46.860
This was a contribution from Niels DeBruin sent us this.

00:00:46.860 --> 00:00:50.640
There was an article called Simplify Your Python Developer Environment.

00:00:50.640 --> 00:00:56.460
And it talked about using pyenv, pipex, and pipenv together.

00:00:56.880 --> 00:01:00.240
And my first reaction was like, we've already covered all of these.

00:01:00.240 --> 00:01:02.720
However, I have tried pipex.

00:01:02.720 --> 00:01:05.040
Actually, I did the joke, the pi jokes.

00:01:05.040 --> 00:01:06.260
I did that with pipex.

00:01:06.260 --> 00:01:09.440
And I've tried pipenv once before.

00:01:09.440 --> 00:01:12.520
It doesn't really do anything for me that I really need.

00:01:13.000 --> 00:01:16.800
And the pyenv, I've tried it and it didn't work for me.

00:01:16.800 --> 00:01:21.160
So actually, all these things, I kind of wanted to give them another shot anyway.

00:01:21.160 --> 00:01:23.420
So I went ahead and read this article.

00:01:23.420 --> 00:01:26.240
And it actually is pretty nice.

00:01:26.240 --> 00:01:30.220
It's a nice pros and cons of all the tools and how to set them up.

00:01:30.420 --> 00:01:37.020
And I think for somebody that wants to try these out again, this is a good article to read to try to get back into it.

00:01:37.140 --> 00:01:45.720
So if people don't remember, pyenv is used to install and manage multiple Python versions and flavors on a computer.

00:01:45.720 --> 00:01:57.760
And then pipex is something that allows you to create, take a Python application and have it bundled with its own virtual environment and use it globally on your system without having to activate the environment.

00:01:57.980 --> 00:02:07.720
And then pipenv is for when you're working on project and application, it's a way to manage virtual environments and dependencies on a per project basis.

00:02:07.720 --> 00:02:14.160
These are really interesting because I feel like often they kind of blend like in a blur together, right?

00:02:14.160 --> 00:02:17.940
You're like, well, I know there's all these E and V things I could use and whatnot.

00:02:17.940 --> 00:02:21.840
And it's like, well, when should I use what and what one is relevant for the situation?

00:02:21.840 --> 00:02:22.560
And what do you think, Anis?

00:02:22.560 --> 00:02:26.180
It actually took me a second to remember the one that I've used.

00:02:26.180 --> 00:02:27.940
So I'm totally in the market for stuff like that.

00:02:27.940 --> 00:02:30.220
But actually, I hadn't heard of pipex at all.

00:02:30.220 --> 00:02:32.960
But I think, yeah, pyenv I definitely use.

00:02:32.960 --> 00:02:38.860
And I think it's quite important, at least for the work I'm doing, because I need to run stuff in all kinds of Pythons.

00:02:38.860 --> 00:02:42.960
And I mean, as a library developer, we need to build stuff for like Python 2.

00:02:42.960 --> 00:02:45.780
We're supporting Python 2.7 and 3.5.

00:02:45.780 --> 00:02:54.720
Just so folks know, like you're deeply involved with spaCy and some tools built on top of that, the natural language processing, which will come evident as we go through some of your topics and more.

00:02:54.720 --> 00:02:56.780
But, you know, maybe not everyone knows your background.

00:02:56.880 --> 00:03:02.820
But I feel like pyenv is most relevant for people building libraries.

00:03:02.820 --> 00:03:07.560
And pipenv is really relevant for people building applications.

00:03:07.560 --> 00:03:08.160
I don't know.

00:03:08.160 --> 00:03:08.800
What do you think, Brian?

00:03:08.800 --> 00:03:11.780
Both of them are important for people like us that have to do both.

00:03:11.980 --> 00:03:14.220
I have a question for Ines.

00:03:14.220 --> 00:03:16.100
The pyenv.

00:03:16.100 --> 00:03:28.160
So one of my concerns was, can I use it to install, to have multiple Pythons and still be able to run them all from one project, like with the tox build to be able to access all of them?

00:03:28.320 --> 00:03:31.420
So I haven't tried it all like within the exact same projects.

00:03:31.420 --> 00:03:34.500
I think you might need different virtual environments for that.

00:03:34.500 --> 00:03:35.620
At least that's how I use it.

00:03:35.620 --> 00:03:38.920
So I use venv to create my virtual environments.

00:03:38.920 --> 00:03:44.440
And then they are created with whichever Python version I've configured locally.

00:03:44.440 --> 00:03:46.680
So I do like pyenv local 2.7.

00:03:46.680 --> 00:03:49.260
And then the virtual environment will have 2.7 in it.

00:03:49.260 --> 00:03:49.500
Okay.

00:03:49.500 --> 00:03:50.780
Well, I'll give it a shot.

00:03:50.780 --> 00:03:51.260
Yeah, yeah.

00:03:51.260 --> 00:03:51.720
Really nice.

00:03:52.100 --> 00:03:53.380
I'm a big fan of PipX.

00:03:53.380 --> 00:03:55.140
I think PipX is super cool.

00:03:55.140 --> 00:04:00.740
So PipX is great if you have a thing that you just want as a utility on the command line in your terminal.

00:04:00.740 --> 00:04:02.840
That happens to be Python-based.

00:04:02.840 --> 00:04:07.880
So instead of brew install something or npm install something, PipX does that.

00:04:07.880 --> 00:04:09.740
So, for example, I have like cookie cutter.

00:04:09.740 --> 00:04:12.160
I have the HTTP library.

00:04:12.160 --> 00:04:12.800
I have glances.

00:04:12.800 --> 00:04:15.640
I have PyJokes, of course, because we run this podcast.

00:04:15.640 --> 00:04:19.380
And some other stuff that I'll even talk about later, like PTPython.

00:04:19.380 --> 00:04:21.900
Is that a bit like PEX files or is that something else?

00:04:21.980 --> 00:04:23.600
It's a little bit.

00:04:23.600 --> 00:04:31.080
What it does is you say I want to have, let's say I want the utility PTPython, which is like an Emacs enabled rebel, basically.

00:04:31.080 --> 00:04:31.360
Okay.

00:04:31.360 --> 00:04:32.340
So I want to have that.

00:04:32.340 --> 00:04:33.560
And I want to be able to just type it.

00:04:33.560 --> 00:04:34.920
It's not tied to any project.

00:04:34.920 --> 00:04:37.940
I just want to have it as a command on my computer that I can use.

00:04:37.940 --> 00:04:41.360
So what you can do is you can PipX install PTPython.

00:04:41.360 --> 00:04:48.360
And then it just automatically puts it in a location, modifies your path so that it has its own virtual environment.

00:04:48.360 --> 00:04:51.100
It upgrades itself and its dependencies separately.

00:04:51.280 --> 00:04:55.760
But anytime I want, I can just type PTPython and go crazy or glances or PyJoke or whatever.

00:04:55.760 --> 00:04:56.200
Okay.

00:04:56.200 --> 00:04:57.260
I think I get it.

00:04:57.260 --> 00:04:57.440
Okay.

00:04:57.440 --> 00:04:58.540
That actually sounds quite cool.

00:04:58.540 --> 00:04:58.740
Yeah.

00:04:58.740 --> 00:04:59.320
It's really nice.

00:04:59.320 --> 00:05:04.020
You can just say, what are the updates from my Python libraries that I use as applications or little utilities?

00:05:04.020 --> 00:05:04.700
It's pretty cool.

00:05:04.700 --> 00:05:05.520
I like that one as well.

00:05:05.520 --> 00:05:05.960
Yeah.

00:05:05.960 --> 00:05:10.220
I wonder if we can ship our annotation tool Prodigy like that because it's very, very command line heavy.

00:05:10.220 --> 00:05:13.040
And, you know, it's usually kind of a separate thing.

00:05:13.040 --> 00:05:15.120
All it does is build upon pip.

00:05:15.120 --> 00:05:21.360
So if you could pip install the thing and it has an entry point, then you can pipX install it as well.

00:05:21.360 --> 00:05:22.020
Ah, okay.

00:05:22.180 --> 00:05:22.360
Yeah.

00:05:22.360 --> 00:05:22.600
Cool.

00:05:22.600 --> 00:05:22.840
Yeah.

00:05:22.840 --> 00:05:23.160
Pretty cool.

00:05:23.160 --> 00:05:25.220
All right, Brian, are you switching to this?

00:05:25.220 --> 00:05:28.020
Are you going to use PyEnv, pipX, and pipEnv?

00:05:28.020 --> 00:05:29.020
Is this your new plan?

00:05:29.020 --> 00:05:33.460
I definitely want to try PyEnv because I want to try new Python versions.

00:05:33.460 --> 00:05:39.620
And my old process was to just download the regular install and install it.

00:05:39.620 --> 00:05:42.060
And then my path is all weird.

00:05:42.060 --> 00:05:43.660
And, yeah, it's a mess.

00:05:43.660 --> 00:05:44.160
Yeah, classic.

00:05:44.160 --> 00:05:44.400
Cool.

00:05:44.400 --> 00:05:45.360
Yeah, this is nice.

00:05:45.360 --> 00:05:47.260
Definitely for people looking for a different workflow.

00:05:47.260 --> 00:05:49.060
It's something they can check out for sure.

00:05:49.060 --> 00:05:51.440
All right, Ines, what's this next one that you got for us?

00:05:51.440 --> 00:05:56.400
This week was actually, or like the past few weeks were actually super exciting also in my field.

00:05:56.400 --> 00:06:01.500
So there was a new release of a fast AI course for natural language processing.

00:06:02.220 --> 00:06:07.620
So fast AI is a very popular free online course for deep learning by Rachel Thomas and Jeremy Howard.

00:06:07.620 --> 00:06:09.640
And it also comes with a Python library.

00:06:09.640 --> 00:06:12.560
It comes with lots of notebooks, really active communities.

00:06:12.560 --> 00:06:15.640
So if you want to get into like the modern machine learning stuff,

00:06:15.640 --> 00:06:19.360
that's like probably the go-to course that I would also recommend to you.

00:06:19.360 --> 00:06:26.020
And they've also produced some very influential research developed alongside the library and the course.

00:06:26.020 --> 00:06:30.280
So, for example, ULM Fit, which was a very popular algorithm for text classification.

00:06:31.080 --> 00:06:34.860
And yeah, the new thing is they've just released a course of natural language processing.

00:06:34.860 --> 00:06:36.400
And it's a very practical introduction.

00:06:36.800 --> 00:06:40.720
And what I thought was really, really interesting and really cool about it is that it, of course,

00:06:40.720 --> 00:06:44.620
covers like the modern neural network approaches and all the like very hip stuff.

00:06:44.620 --> 00:06:47.440
But it also focuses on traditional techniques.

00:06:47.440 --> 00:06:54.020
So just the whole background of like, okay, what did people do before deep learning, topic modeling, linear models,

00:06:54.020 --> 00:06:58.480
just really all the basics and even like rule-based approaches like regular expressions.

00:06:59.080 --> 00:07:01.660
Like, you know, some people might look at this and be like, what regics?

00:07:01.660 --> 00:07:03.740
That's like, you know, I did that 20 years ago.

00:07:03.740 --> 00:07:09.680
But in fact, like, you know, in real life and in like real life practical applications, that's like super important.

00:07:09.680 --> 00:07:12.480
And you can do a lot with that, that, you know, really gets the job done.

00:07:12.480 --> 00:07:13.780
So I thought that was really cool.

00:07:13.780 --> 00:07:17.900
And of course, another thing, the course has a really strong focus on ethics as well.

00:07:18.000 --> 00:07:26.180
So their videos on bias and disinformation and basically just the topic of like, okay, think about the impact that the work you'll be doing has.

00:07:26.180 --> 00:07:27.900
And I thought that was incredibly refreshing.

00:07:27.900 --> 00:07:31.460
And of course, disclaimer, like I haven't actually watched all the videos yet.

00:07:31.460 --> 00:07:36.460
I don't even think that's like physically possible to do all of that since it was released.

00:07:36.460 --> 00:07:37.940
It's too new and it's too long.

00:07:37.940 --> 00:07:38.160
Yeah.

00:07:38.160 --> 00:07:38.680
Yeah.

00:07:38.680 --> 00:07:42.260
It's like, it's a lot of material, but yeah, I really like the work they're doing.

00:07:42.260 --> 00:07:44.740
And it's like, yeah, it's a very, very significant release.

00:07:44.740 --> 00:07:45.480
And it's all free.

00:07:45.480 --> 00:07:45.720
Yeah.

00:07:45.720 --> 00:07:46.300
It's super cool.

00:07:46.300 --> 00:07:46.420
Yeah.

00:07:46.420 --> 00:07:47.120
It looks like it's free.

00:07:47.260 --> 00:07:50.240
Like I was able to go pull up the videos without even having an account there.

00:07:50.240 --> 00:07:51.440
It just sort of takes you through it.

00:07:51.440 --> 00:07:53.820
More like an online video book.

00:07:53.820 --> 00:07:54.800
You just make your way through, right?

00:07:54.800 --> 00:07:55.100
Yeah.

00:07:55.100 --> 00:07:56.160
And lots of like notebooks.

00:07:56.160 --> 00:07:57.420
So you can open the same notebooks.

00:07:57.420 --> 00:08:04.220
You can play through the examples and of course also use their library to, you know, really work through the things efficiently.

00:08:04.220 --> 00:08:04.580
Sure.

00:08:04.580 --> 00:08:04.820
Yeah.

00:08:04.820 --> 00:08:05.460
That's super cool.

00:08:05.460 --> 00:08:08.340
Does it cover any of the libraries that you all work on?

00:08:08.340 --> 00:08:09.420
Like spaCy or anything?

00:08:09.420 --> 00:08:12.280
spaCy is a much more like high level toolkit and framework.

00:08:12.280 --> 00:08:15.800
So it's like, you know, this is really the basics of the technology.

00:08:16.040 --> 00:08:19.300
So while the Fast AR library, I think it does use spaCy for tokenization.

00:08:19.300 --> 00:08:28.500
But spaCy is really, you know, once you're building applications and you have some problems and you want to construct your pipelines and really ship something into production, that's when you would be using spaCy.

00:08:28.880 --> 00:08:35.600
But actually, in fact, spaCy is not really the best solution if you really want to learn the underlying algorithms and implementations.

00:08:35.600 --> 00:08:37.860
Because we're actually super opinionated.

00:08:37.860 --> 00:08:41.780
You get one implementation and, you know, you kind of take that or you plug in your own.

00:08:41.780 --> 00:08:42.040
I see.

00:08:42.040 --> 00:08:46.020
This is like learning the algorithms and the foundations that maybe spaCy uses so you understand it better.

00:08:46.140 --> 00:08:46.580
Yeah, exactly.

00:08:46.580 --> 00:08:49.320
And also, you know, giving you some, yeah, the background.

00:08:49.320 --> 00:08:54.300
And yeah, even the rule-based ideas, which, yeah, I still think it's so great.

00:08:54.300 --> 00:08:55.160
I scroll through it.

00:08:55.160 --> 00:08:56.460
I'm like, great, regular expressions.

00:08:56.460 --> 00:08:59.380
That's like really what people should think about.

00:08:59.380 --> 00:09:00.500
Yeah, I mean, that's a start, right?

00:09:00.500 --> 00:09:03.280
Like sometimes you just want to pull data out of text and there you go.

00:09:03.400 --> 00:09:11.780
Yeah, and especially then some people really, you know, then they start throwing like a neural network model at it when actually best solution would have been to just write one regular expression.

00:09:11.780 --> 00:09:17.180
Like, I don't know, you work at a company, you have a statistical model that recognizes organization names.

00:09:17.180 --> 00:09:22.700
And then, you know, your manager comes to you and is like, well, it's all great, but like it often gets our own company name wrong.

00:09:22.700 --> 00:09:23.480
Can you fix that?

00:09:23.480 --> 00:09:24.260
That's really embarrassing.

00:09:24.260 --> 00:09:30.740
And, you know, you can spend like hours trying to tune your model and like update it and fine tune it with more examples.

00:09:30.740 --> 00:09:38.140
Or you can just add one regular expression or one rule on top that says, okay, whenever I come across this string, don't get it wrong.

00:09:38.140 --> 00:09:42.640
And that will likely take you like five minutes and it's much more effective in the real world.

00:09:42.640 --> 00:09:46.220
So this is the practical applied natural language processing, right?

00:09:46.220 --> 00:09:46.520
Yeah.

00:09:46.520 --> 00:09:51.320
Speaking of language, this next item that I want to talk about, it just scares me.

00:09:51.320 --> 00:09:52.500
So let me tell you quick about it.

00:09:52.500 --> 00:09:54.180
I'll get your two opinions.

00:09:54.180 --> 00:10:02.960
The idea is that we can clone the human voice by giving it a sample and using some sort of neural network type thing.

00:10:02.960 --> 00:10:03.700
I'm not sure exactly.

00:10:03.700 --> 00:10:05.680
So this was sent in by Brendan.

00:10:05.680 --> 00:10:06.740
Thank you for sending that over.

00:10:06.740 --> 00:10:16.500
And, you know, in just a couple of minutes, you can load up somebody's voice, use some Python, a pre-trained machine learning model, and then type in text.

00:10:16.640 --> 00:10:20.980
It will speak whatever that text is in the voice of that person.

00:10:20.980 --> 00:10:23.560
It's just, I don't know.

00:10:23.560 --> 00:10:26.600
I feel like public discourse is in serious jeopardy here.

00:10:26.600 --> 00:10:27.340
What do you all think?

00:10:27.340 --> 00:10:28.560
This is pretty interesting.

00:10:28.820 --> 00:10:35.000
And I was a little frightened, actually, watching this video of how easy it was to copy somebody's voice.

00:10:35.000 --> 00:10:39.240
I mean, I don't know what the code behind it's probably not easy, but it's a little creepy.

00:10:39.240 --> 00:10:44.460
My first thought was I could use it for if I have solo episodes, I could be my own co-host.

00:10:44.460 --> 00:10:46.580
But that'd be cool.

00:10:46.580 --> 00:10:47.500
That'd be pretty funny.

00:10:47.500 --> 00:10:47.820
Yeah.

00:10:47.820 --> 00:10:52.380
No, but I think I would say, I think it's still quite compute intensive, like, to do that, right?

00:10:52.380 --> 00:11:01.040
I think you still, you know, if you really want to have good results and really want to do it right, but it's true that this, you know, this really, this is a really good, like, example of, wow, that's possible.

00:11:01.040 --> 00:11:09.580
And that's the type of stuff that's been possible for quite a while, especially across, like, you know, video image and, you know, also voice, audio.

00:11:09.580 --> 00:11:09.900
Right.

00:11:09.900 --> 00:11:13.260
I mean, we've heard of the deepfake stuff for videos and whatnot, and that's kind of scary.

00:11:13.260 --> 00:11:16.480
But this is, it's almost like this could be worse, right?

00:11:16.480 --> 00:11:24.840
I can imagine somebody just putting a little static, a little muffling filter on it and saying, oh, here's a hot mic take behind the scenes.

00:11:24.840 --> 00:11:33.340
Somebody said something they weren't supposed to during a presidential debate or some kind of public figure they're trying to discredit and just make them say stuff.

00:11:33.340 --> 00:11:34.800
Now, I don't know what you all think.

00:11:34.800 --> 00:11:36.760
To me, it still sounds a little bit off.

00:11:36.760 --> 00:11:41.820
Like, it doesn't sound exactly like the person, but, you know, it's pretty close.

00:11:42.000 --> 00:11:43.340
But I think you would still use it.

00:11:43.340 --> 00:11:43.940
Yeah.

00:11:43.940 --> 00:11:52.700
And also, I mean, I do think this type of technology will definitely lead to a situation where we will all just take things we hear in, like, recordings or videos much less seriously.

00:11:52.700 --> 00:12:00.400
Like, you know, I do think it will develop into a culture where we don't necessarily trust an audio recording because, you know, it could have been produced by something like this.

00:12:00.400 --> 00:12:10.960
But I do think just for everyday life scam, like, I think it's very timely because, yeah, there are all these news articles about all these, like, financial scams and companies using deepfake audio.

00:12:11.740 --> 00:12:15.280
Or even before, like, using spoofed emails that were quite effective.

00:12:15.280 --> 00:12:22.720
And actually reading that, like, you know, the trick there, I'm like, I can totally see how, like, an accounting department falls for that and thinks, oh, it's their boss in a hurry.

00:12:22.720 --> 00:12:26.660
And then imagine that with a voice of, like, you know, CEO.

00:12:26.660 --> 00:12:27.420
So scary.

00:12:27.420 --> 00:12:28.080
Exactly.

00:12:28.080 --> 00:12:28.420
Yeah.

00:12:28.420 --> 00:12:29.660
So I'm going to link to the video.

00:12:29.660 --> 00:12:30.580
You all can watch it.

00:12:30.580 --> 00:12:33.060
I'm also linking to the software that did this.

00:12:33.060 --> 00:12:40.480
Apparently, it uses something called transfer learning from speaker verification to multi-speaker text-to-speech synthesis.

00:12:41.000 --> 00:12:44.980
And that even has an acronym, SV2-TTS, of course.

00:12:44.980 --> 00:12:47.200
And so this was based on someone's thesis.

00:12:47.200 --> 00:12:49.240
And you can watch the video and get a good sense.

00:12:49.240 --> 00:12:57.220
But, yeah, you just imagine, like, I call, I somehow get the number of the CEO and I call them up and I record that call.

00:12:57.560 --> 00:13:00.720
And then I take their, like, I don't need only five seconds or so with their voice.

00:13:00.720 --> 00:13:04.540
And then I take that and I use some text to, like, real-time generate.

00:13:04.540 --> 00:13:07.100
I'll call up the accounting department and say, hey, this is so-and-so.

00:13:07.100 --> 00:13:08.180
We've got a super emergency.

00:13:08.180 --> 00:13:09.860
Really important client.

00:13:09.860 --> 00:13:10.800
We forgot to pay them.

00:13:10.800 --> 00:13:12.280
We owe them $10,000.

00:13:12.280 --> 00:13:17.900
And you just, like, type and then replay what you type live back to them.

00:13:17.900 --> 00:13:24.880
Yeah, and then you overlay that, yeah, with some background music, background noise and just, like, oh, I'm, like, in a taxi right now.

00:13:24.880 --> 00:13:25.300
Exactly.

00:13:25.300 --> 00:13:26.780
Like, please get this done ASAP.

00:13:26.840 --> 00:13:27.540
Otherwise, we're in trouble.

00:13:27.540 --> 00:13:27.980
Bye.

00:13:27.980 --> 00:13:29.960
Sometimes what usually doesn't work for email.

00:13:29.960 --> 00:13:34.760
But if it's literally a voice that's interacting with you that sounds like the boss, well, it might work.

00:13:34.760 --> 00:13:36.300
Hopefully we didn't give anyone ideas.

00:13:36.300 --> 00:13:38.920
I guess you guys are better criminals than me.

00:13:38.920 --> 00:13:42.680
I was just thinking, like, a different version of Ferris Bueller's Day Off.

00:13:42.680 --> 00:13:45.800
You could just use this to call in and excuse yourself from school.

00:13:45.800 --> 00:13:47.060
Oh, my gosh, you're right.

00:13:47.060 --> 00:13:50.740
This would be beautiful when I was in, like, middle school or high school.

00:13:50.740 --> 00:13:51.640
Oh, my goodness.

00:13:51.640 --> 00:13:51.960
Yeah.

00:13:51.960 --> 00:13:54.060
No, Michael's not feeling well.

00:13:54.060 --> 00:13:54.800
Is he going to be okay?

00:13:54.920 --> 00:13:57.500
He may be out tomorrow, but he'll be back pretty soon.

00:13:57.500 --> 00:13:59.680
All right, then.

00:13:59.680 --> 00:14:01.280
Yeah, that's really horrible.

00:14:01.280 --> 00:14:04.200
Yeah, I mean, pretty soon you have, like, kids recording their parents' voices.

00:14:04.200 --> 00:14:04.980
Yes.

00:14:04.980 --> 00:14:06.020
I don't know if that works.

00:14:06.100 --> 00:14:07.040
These are all bad.

00:14:07.040 --> 00:14:12.600
This is a good example of why, yes, a focus on ethics, you know, when you're learning these technologies is, like, incredibly important.

00:14:12.600 --> 00:14:19.120
Because, you know, we have that technology and every developer should think about, okay, what's the impact of having this and using this?

00:14:19.120 --> 00:14:24.160
And, okay, we can release it to really also, you know, make everyone aware that this exists.

00:14:24.160 --> 00:14:26.280
And, you know, we're talking about this right now, but still.

00:14:26.280 --> 00:14:26.540
Yeah.

00:14:26.540 --> 00:14:27.000
Yeah.

00:14:27.060 --> 00:14:28.540
I guess final thought on this one, Ines.

00:14:28.540 --> 00:14:37.080
What do you think the chances of some sort of fingerprinting or, like, system that can determine that this was faked, right?

00:14:37.080 --> 00:14:48.400
Like, not a human, but if I could take this and feed it to, say, another ML model that knows, like, the little glitches that show up in the system, like, will we be able to verify stuff or not in the future?

00:14:48.400 --> 00:14:49.300
Are we just lost?

00:14:49.300 --> 00:14:49.800
I think so.

00:14:49.800 --> 00:14:52.120
I think there have been, like, some experiments where they tried that.

00:14:52.120 --> 00:14:59.780
And, I mean, another approach would be, okay, you can always encode things in the model that, like, only show up under very, very certain circumstances.

00:14:59.780 --> 00:15:01.800
So, that's how, you know, you can watermark that model.

00:15:01.800 --> 00:15:03.680
You can release that.

00:15:03.680 --> 00:15:12.940
And then if you say a very, very, very specific sequence or if you type nonsense secrets in there, it will always produce something nonsense but very differently.

00:15:12.940 --> 00:15:15.260
And then you're like, ah, that's the system that was used.

00:15:15.260 --> 00:15:17.040
And, you know, that's how we can.

00:15:17.280 --> 00:15:23.400
It won't work on the output, but, like, at least, you know, we can at least have some way of kind of finding out what type of system.

00:15:23.400 --> 00:15:25.260
Yeah, that's part of the ethics part, right?

00:15:25.260 --> 00:15:29.520
Like, that you embed these little watermarks rather than just, like, put it out there.

00:15:29.520 --> 00:15:30.020
I don't know.

00:15:30.020 --> 00:15:35.160
It's pretty scary to me, but I think as a society, we'll come around to figure out what to do about it.

00:15:35.160 --> 00:15:35.580
Cool.

00:15:35.580 --> 00:15:37.500
Well, not scary is DigitalOcean.

00:15:37.500 --> 00:15:39.360
I just want to tell you quickly about them.

00:15:39.360 --> 00:15:40.420
And they're supporting the show.

00:15:40.420 --> 00:15:41.560
So, thanks to DigitalOcean.

00:15:41.560 --> 00:15:44.940
All of our software runs on top of DigitalOcean infrastructure.

00:15:45.260 --> 00:15:49.880
You get the MP3s, it delivers either streams or downloads out of there, things like that.

00:15:49.880 --> 00:15:51.020
So, they're really, really great.

00:15:51.020 --> 00:15:54.920
You can get started for as little as $5 per month for a server.

00:15:54.920 --> 00:15:58.420
And they got a bunch of cool services, managed databases, load balancers, and whatnot.

00:15:59.120 --> 00:16:02.600
And it's, you know, it's not like EC2, which is so complicated.

00:16:02.600 --> 00:16:03.380
It could run Netflix.

00:16:03.380 --> 00:16:06.940
It's like the simple thing that you just need to build your app and get it going.

00:16:06.940 --> 00:16:10.220
So, check them out at pythonbytes.fm/DigitalOcean.

00:16:10.220 --> 00:16:12.640
And you get a $50 credit for new users there.

00:16:12.640 --> 00:16:14.280
And definitely highly recommend it.

00:16:14.280 --> 00:16:16.860
Brian, what's this next one that you're working on here?

00:16:16.860 --> 00:16:17.220
Okay.

00:16:17.300 --> 00:16:20.700
Well, another contributed by a listener, this one from Andrew.

00:16:20.700 --> 00:16:26.320
He contributed a little snippet that was on a Reddit stream.

00:16:26.320 --> 00:16:35.480
And it was, I'm going to just guess, just describe it as abusing the pyproject.tomo file by putting any file stuff in it.

00:16:35.480 --> 00:16:44.240
So, the example that he gave was you can have the pytest any file and the mypy any file or two any files for tools.

00:16:44.240 --> 00:16:46.560
And you can, they're in any file format.

00:16:46.560 --> 00:16:51.020
And Tommel files kind of look like any files, but they're not.

00:16:51.020 --> 00:16:51.940
They're different.

00:16:51.940 --> 00:16:57.060
And you can break any with Tommel syntax and you can break Tommel with any syntax.

00:16:57.060 --> 00:17:04.740
However, you can write them such that they are, if you're careful, you can write them such that they comply with both.

00:17:04.740 --> 00:17:07.000
And I went ahead and tried this out.

00:17:07.000 --> 00:17:13.380
I was able to try putting pytest any, like, options within the Tommel file.

00:17:13.380 --> 00:17:17.800
And, you know, both pytest and mypy do not support doing this.

00:17:17.800 --> 00:17:21.960
But they do support passing in a path of where their config file is.

00:17:21.960 --> 00:17:27.000
And if you pass in the project.tommel file, you can get it to work.

00:17:27.000 --> 00:17:32.780
And if all you're trying to do is reduce the number of files in your project, yeah, this kind of works.

00:17:32.780 --> 00:17:33.940
Why would you want to do that?

00:17:34.000 --> 00:17:37.520
Just to try to reduce the number of files in your top level directory.

00:17:37.520 --> 00:17:37.940
Okay.

00:17:37.940 --> 00:17:38.960
I don't know.

00:17:38.960 --> 00:17:41.380
I should, like, use all of these, like, files more.

00:17:41.380 --> 00:17:44.820
And I feel like, you know, I love this idea of imagine if there was one config file.

00:17:44.820 --> 00:17:47.900
Like, really, you know, only one place where you put everything.

00:17:47.900 --> 00:17:49.040
Also, your dependencies.

00:17:49.460 --> 00:17:51.080
Everything just goes in one file.

00:17:51.080 --> 00:17:52.300
And then you have that.

00:17:52.300 --> 00:17:55.400
But for some reason, it's never actually worked out that way in practice.

00:17:55.400 --> 00:17:57.520
You can put it in the setup.cfg.

00:17:57.520 --> 00:17:59.060
That's a possibility.

00:17:59.060 --> 00:18:01.640
But those are any file syntax also.

00:18:01.640 --> 00:18:04.700
I have to admit, like, our projects don't even have a setup.cfg.

00:18:04.700 --> 00:18:06.160
We have a setup.py.

00:18:06.160 --> 00:18:07.840
And then we have the requirements.txt.

00:18:07.840 --> 00:18:08.260
Okay.

00:18:08.420 --> 00:18:10.300
I have an admission as well.

00:18:10.300 --> 00:18:15.840
Like, I know we're talking about pyproject.toml, but I'm still just using requirements.txt as well for some of my projects.

00:18:15.840 --> 00:18:17.080
Because, you know what?

00:18:17.080 --> 00:18:18.100
The workflow works.

00:18:18.260 --> 00:18:24.420
I've got, like, external systems, like PyUp that are out there, like, automatically doing PRs for changes.

00:18:24.420 --> 00:18:26.280
I mean, it's just, like, it's super cool.

00:18:26.280 --> 00:18:28.680
But at the same time, I already got a flow working.

00:18:28.680 --> 00:18:29.960
And I just, you know.

00:18:29.960 --> 00:18:30.280
Yeah.

00:18:30.280 --> 00:18:31.340
No, I can relate.

00:18:31.340 --> 00:18:35.940
And so a user once, I think, contributed a pyproject.toml to spaCy.

00:18:35.940 --> 00:18:38.600
And, you know, I really appreciated that because I'm like, great.

00:18:38.600 --> 00:18:43.640
But it's still, I don't think, yeah, we can't really ditch requirements.txt yet.

00:18:43.640 --> 00:18:45.800
And so now we also have that.

00:18:45.940 --> 00:18:50.580
And now if we update, like, a dependency, I have to manually edit that in three places.

00:18:50.580 --> 00:18:50.940
Yeah.

00:18:50.940 --> 00:18:51.640
Yeah, yeah.

00:18:51.640 --> 00:18:53.860
That's how it goes.

00:18:53.860 --> 00:18:54.920
I'm on the bandwagon.

00:18:54.920 --> 00:18:56.080
I'm switching.

00:18:56.080 --> 00:18:57.380
I'm using Flit now.

00:18:57.380 --> 00:19:00.760
So I'm using pyproject.toml and Flit.

00:19:00.760 --> 00:19:01.040
Okay.

00:19:01.040 --> 00:19:04.100
And that works cross-platform, cross-Python?

00:19:04.100 --> 00:19:04.780
I don't know.

00:19:04.780 --> 00:19:06.560
It works for me.

00:19:06.560 --> 00:19:07.300
Well, that's always good.

00:19:07.300 --> 00:19:07.640
Yeah.

00:19:07.640 --> 00:19:12.200
I'm using it for mostly 3.6 and above, 3.6, 3.7, 3.8.

00:19:12.200 --> 00:19:14.860
My personal projects, I think it's sufficient.

00:19:15.060 --> 00:19:19.360
And the ones I'm supporting for other people, I think it's fine for an individual project

00:19:19.360 --> 00:19:21.840
owner to say, I'm not supporting 2.7.

00:19:21.840 --> 00:19:22.220
So.

00:19:22.220 --> 00:19:22.820
No, of course.

00:19:22.820 --> 00:19:25.640
Like, I would never, you know, and I also would never go and just, like, whine about, like,

00:19:25.640 --> 00:19:29.580
oh, there's, of course, there's, like, an edge case for 2.7 on Windows.

00:19:29.580 --> 00:19:30.600
And there's something there.

00:19:30.600 --> 00:19:34.620
Like, I understand it's not, like, as easy if, like, you know, there was, like, the Python

00:19:34.620 --> 00:19:36.500
that could just, like, magically fix everything.

00:19:36.500 --> 00:19:36.800
Yeah.

00:19:36.800 --> 00:19:37.700
You know, I appreciate it.

00:19:37.700 --> 00:19:39.360
There's a lot of work that went into all of this.

00:19:39.360 --> 00:19:41.640
And it's like, yeah, something's a bit tricky.

00:19:41.800 --> 00:19:44.880
One of the interesting things was coverage.py.

00:19:44.880 --> 00:19:45.960
I use that a lot.

00:19:45.960 --> 00:19:51.780
And it got, there was a request to put pyproject.toml support on coverage.

00:19:52.180 --> 00:19:56.960
The reason why it isn't there isn't because of any sort of, like, not that it would be

00:19:56.960 --> 00:20:01.060
cool, but the Toml parsing is not part of the standard library.

00:20:01.060 --> 00:20:07.980
And coverage has the strict policy that the only dependencies that it has are standard library

00:20:07.980 --> 00:20:08.460
dependencies.

00:20:08.460 --> 00:20:11.280
That's a reasonable desire also.

00:20:11.280 --> 00:20:11.720
Well, yeah.

00:20:11.720 --> 00:20:12.040
Yeah.

00:20:12.040 --> 00:20:12.260
Yeah.

00:20:12.260 --> 00:20:12.580
That's cool.

00:20:12.580 --> 00:20:15.480
You just get coverage.py and just run the file or whatever, right?

00:20:15.480 --> 00:20:15.720
Yeah.

00:20:15.720 --> 00:20:19.580
But maybe we should get Toml support added to the standard library and then it wouldn't be

00:20:19.580 --> 00:20:19.940
an issue.

00:20:19.940 --> 00:20:20.460
There you go.

00:20:20.580 --> 00:20:20.780
Yeah.

00:20:20.780 --> 00:20:21.080
Yeah.

00:20:21.080 --> 00:20:22.100
That's a whole different discussion.

00:20:22.100 --> 00:20:26.060
I know that's quite a heated debate about what should be on the standard library these

00:20:26.060 --> 00:20:26.340
days.

00:20:26.340 --> 00:20:27.980
And the trend is less, not more.

00:20:27.980 --> 00:20:29.820
I think if you take the poll.

00:20:29.820 --> 00:20:30.760
Yeah.

00:20:30.760 --> 00:20:31.020
Yeah.

00:20:31.020 --> 00:20:32.100
Yeah.

00:20:32.100 --> 00:20:38.800
So some of the tools that you build are absolutely about making machine learning easier and do that

00:20:38.800 --> 00:20:39.260
across teams.

00:20:39.260 --> 00:20:42.220
So I know that you're really turned on to that space and pay a lot of attention.

00:20:42.460 --> 00:20:46.740
So this Polyaxon one that you found for our next item must be pretty interesting.

00:20:46.740 --> 00:20:47.020
Yeah.

00:20:47.020 --> 00:20:50.360
So basically, it's actually quite funny because, you know, I've obviously like, you know, thought

00:20:50.360 --> 00:20:53.320
about what I was going to talk about and had like something else planned.

00:20:53.320 --> 00:20:58.520
And then really today, earlier today, that release came out version 0.5 of Polyaxon.

00:20:58.520 --> 00:20:59.340
So I was like, okay, great.

00:20:59.340 --> 00:21:00.160
This is perfect.

00:21:00.160 --> 00:21:05.660
It's like as if like, you know, they'd waited for my podcast recordings.

00:21:06.260 --> 00:21:06.380
Yeah.

00:21:06.380 --> 00:21:08.360
So basically, we've been using Polyaxon internally.

00:21:08.360 --> 00:21:11.480
And essentially, it's a tool for experiment management.

00:21:11.480 --> 00:21:14.920
So, you know, if you work in machine learning and you train your models, you have to like

00:21:14.920 --> 00:21:16.440
run tons of experiments.

00:21:16.440 --> 00:21:20.540
And you have to, you know, you run an experiment, train a model, look at the results, then you

00:21:20.540 --> 00:21:21.140
stop it.

00:21:21.140 --> 00:21:24.380
Then you tweak some other knobs, then you try again.

00:21:24.380 --> 00:21:26.480
And you keep doing that until you have a good result.

00:21:26.480 --> 00:21:31.020
And one thing we always do when we travel and like visit universities and research labs,

00:21:31.020 --> 00:21:35.060
we usually always ask them like, hey, how do you run your experiments?

00:21:35.060 --> 00:21:39.800
And usually they're like, well, yeah, you know, we got this GPU and it sits on my desk.

00:21:39.800 --> 00:21:43.220
And then I start an experiment and then I sit around and then I wait.

00:21:43.220 --> 00:21:47.880
And, you know, that's at like the top, some of the top like labs and like, you know, people

00:21:47.880 --> 00:21:51.100
where you'd think like, oh, they must have everything taken care of, tons of money.

00:21:51.100 --> 00:21:53.580
It's like, no, they're sitting there with their little GPU on their desk.

00:21:53.580 --> 00:21:56.120
And that's how it's done.

00:21:56.120 --> 00:21:59.460
And basically, Polyaxon basically, you know, helps you solve this.

00:21:59.460 --> 00:22:01.580
So it's like super, you know, it's built on Kubernetes.

00:22:01.580 --> 00:22:03.140
It's like very easy to set up.

00:22:03.400 --> 00:22:07.820
And especially, you know, if you're already set up with cloud computing and yeah, and you

00:22:07.820 --> 00:22:11.420
can also do stuff like hyperparameter search where like, you know, every hyperparameter

00:22:11.420 --> 00:22:13.500
is a tiny knob and you have like tons of them.

00:22:13.500 --> 00:22:17.300
And then you want to find the one combination that gives you better accuracy.

00:22:17.300 --> 00:22:22.340
And so you can run lots of experiments, see them, you know, in their little graphs and like

00:22:22.340 --> 00:22:23.220
try things out.

00:22:23.220 --> 00:22:25.080
So it's been a very great tool.

00:22:25.180 --> 00:22:28.000
It's all open source, which is, you know, very much in our spirit.

00:22:28.000 --> 00:22:35.180
And yeah, they just released 0.5 and which comes with a plugin system, which is also great.

00:22:35.180 --> 00:22:36.240
It's very much in our spirit.

00:22:36.240 --> 00:22:39.260
That's also how we like to do things with spaCy.

00:22:39.260 --> 00:22:40.920
You can run it locally.

00:22:40.920 --> 00:22:44.320
And like, you know, it comes with some new features for chaining stuff together.

00:22:44.320 --> 00:22:46.300
If you have your experiments have lots of steps.

00:22:46.300 --> 00:22:47.980
So yeah, it's a great tool.

00:22:47.980 --> 00:22:49.300
If you're working in the field.

00:22:49.300 --> 00:22:50.120
It looks super cool.

00:22:50.240 --> 00:22:51.200
Yeah, I can definitely recommend it.

00:22:51.200 --> 00:22:51.380
Yeah.

00:22:51.380 --> 00:22:53.220
So it's got a platform as a service offering.

00:22:53.220 --> 00:22:55.560
So you just, you know, kick it off and have it go.

00:22:55.560 --> 00:22:59.180
But also like on-premise enterprise option too.

00:22:59.180 --> 00:22:59.920
Yeah, that's cool.

00:22:59.920 --> 00:23:00.780
I think that's the focus.

00:23:00.780 --> 00:23:04.140
It's like, you know, you run it and then it gives you like a little UI and you just like,

00:23:04.140 --> 00:23:08.340
you know, you set it up yourself on your service and then it manages that.

00:23:08.340 --> 00:23:09.380
Yeah, this looks really great.

00:23:09.380 --> 00:23:12.820
Runs on Google's Kubernetes engine, among other things.

00:23:12.820 --> 00:23:16.520
Probably pretty much any Kubernetes cluster, I guess.

00:23:16.520 --> 00:23:17.500
I haven't tried it.

00:23:17.500 --> 00:23:19.900
Yeah, I think you might have to do a bit more like setup.

00:23:20.200 --> 00:23:24.060
If, you know, you're bringing your own, but like it should be quite very straightforward.

00:23:24.060 --> 00:23:26.880
Google actually makes this quite straightforward.

00:23:26.880 --> 00:23:30.300
And yeah, and another nice thing here is with the hyperparameter search.

00:23:30.300 --> 00:23:35.640
Like if you, yeah, most machine learning stuff is done on GPU, but not everyone has GPUs.

00:23:35.640 --> 00:23:36.380
They're very expensive.

00:23:36.380 --> 00:23:41.220
And we actually say it's not always the best choice necessarily, because if you just want

00:23:41.220 --> 00:23:43.540
to run lots of experiments, you can run them all in parallel.

00:23:43.540 --> 00:23:46.580
You can run like thousands in parallel.

00:23:46.580 --> 00:23:50.360
And then, you know, if you have a tool like Polyaxon that can help you do that.

00:23:50.360 --> 00:23:52.520
So, you know, you don't have to kick them all off manually.

00:23:52.520 --> 00:23:55.840
It's actually going to be much cheaper and much more efficient.

00:23:56.300 --> 00:23:58.220
And you don't need a fancy GPU.

00:23:58.220 --> 00:23:59.760
You can just run it on CPU.

00:23:59.760 --> 00:24:00.100
Right.

00:24:00.100 --> 00:24:00.300
Yeah.

00:24:00.300 --> 00:24:03.000
The GPUs are great, but they're much harder to come by.

00:24:03.000 --> 00:24:04.020
So that's cool.

00:24:04.020 --> 00:24:04.220
Yeah.

00:24:04.220 --> 00:24:04.440
Yeah.

00:24:04.440 --> 00:24:07.200
It also has something about you can run it on your laptop as well.

00:24:07.200 --> 00:24:07.540
Yeah.

00:24:07.540 --> 00:24:10.040
It's a little data science of the box thing they talk about there at the end.

00:24:10.040 --> 00:24:11.520
So, yeah, super cool.

00:24:11.520 --> 00:24:12.400
A nice one.

00:24:12.400 --> 00:24:12.900
All right.

00:24:12.900 --> 00:24:14.920
This last one I want to talk about here.

00:24:14.920 --> 00:24:18.400
Actually, the way I got it onto my system is I use PipX.

00:24:18.400 --> 00:24:20.380
It's my PipX installed.

00:24:20.380 --> 00:24:21.700
This thing called Flint.

00:24:21.700 --> 00:24:26.160
So we've heard about linting and we've heard about f-strings.

00:24:26.160 --> 00:24:31.820
And I'm guessing some combination thereof is where the name of the thing called Flint came

00:24:31.820 --> 00:24:32.000
from.

00:24:32.000 --> 00:24:32.720
It's quite new.

00:24:32.720 --> 00:24:36.280
It's not super popular yet, but it works really, really well.

00:24:36.280 --> 00:24:38.700
So the idea is I've got some code.

00:24:38.700 --> 00:24:41.220
Maybe it's old code.

00:24:41.220 --> 00:24:44.060
Maybe I just haven't bothered to write everything using f-strings.

00:24:44.060 --> 00:24:47.800
And I would like to modernize it in its string processing.

00:24:47.800 --> 00:24:53.160
So this tool, what you can do is you can point it at a single Python file, or you can just point

00:24:53.160 --> 00:24:57.140
it as a directory, like a top level directory to just go to every, you know, traverse the

00:24:57.140 --> 00:25:03.580
whole directory tree and find all the Python files and then rewrite all the string operations

00:25:03.580 --> 00:25:04.780
to be f-strings.

00:25:04.780 --> 00:25:05.320
Nice.

00:25:05.320 --> 00:25:06.640
And it does a pretty good job.

00:25:06.640 --> 00:25:13.780
It'll do the percent, you know, Python 2 style formats, as well as the, you know, dot format

00:25:13.780 --> 00:25:14.260
style.

00:25:14.260 --> 00:25:16.200
And it'll just replace all those with f-strings.

00:25:16.200 --> 00:25:18.100
There's a couple of things it doesn't do.

00:25:18.100 --> 00:25:22.900
If it's like multi-line, really long stuff, it won't replace those.

00:25:22.900 --> 00:25:28.660
And when I first tried it, it actually was making a mistake on digit grouping format.

00:25:28.660 --> 00:25:34.200
So if you have curly braces colon comma, because you want, you know, thousands, millions grouping

00:25:34.200 --> 00:25:37.080
and so on, that like just went insane and broke my code.

00:25:37.080 --> 00:25:41.480
But I submitted a bug over to the guys working on it, fixed it.

00:25:41.480 --> 00:25:43.300
I believe a new release is already out.

00:25:43.300 --> 00:25:47.160
So that shouldn't be there, but just, you know, run it on something you have under source

00:25:47.160 --> 00:25:52.160
control and just look at the lines that have changed before you do the commit or, you know,

00:25:52.160 --> 00:25:53.240
run your task, something like that.

00:25:53.240 --> 00:25:53.400
Yeah.

00:25:53.400 --> 00:25:55.140
Well, you're such a good open source user.

00:25:55.140 --> 00:26:01.260
Like, you know, found a bug, you know, reported it probably with like a nice, you know, description

00:26:01.260 --> 00:26:01.760
fixed.

00:26:01.760 --> 00:26:06.480
I'm like, I ran this on all of Talk Python training and all of Python bytes and some of it broke.

00:26:06.480 --> 00:26:08.860
So what I found out is it's exactly this.

00:26:08.860 --> 00:26:10.160
If it has digit grouping, it broke.

00:26:10.160 --> 00:26:12.480
And so then they fixed it, but it was no big deal.

00:26:12.480 --> 00:26:18.540
I think I converted about 500 to 700 string formats over to f-strings.

00:26:18.540 --> 00:26:21.100
And it just, it's cleaner, shorter, nicer.

00:26:21.100 --> 00:26:26.060
The thing with f-strings is I always, I don't know if you all use it, I'll ask you a sec,

00:26:26.060 --> 00:26:28.560
but like, I'm always like, okay, I'm going to write the string.

00:26:28.640 --> 00:26:30.380
I'd say quote, type, type, type.

00:26:30.380 --> 00:26:31.900
Oh, I want to put something in here.

00:26:31.900 --> 00:26:33.160
Curly brace.

00:26:33.160 --> 00:26:37.460
I wish I would have done the F back, back, back, back, back, back, back, put the F and then

00:26:37.460 --> 00:26:38.360
back, back, back, back, back.

00:26:38.360 --> 00:26:39.020
And then type the thing.

00:26:39.020 --> 00:26:40.900
I'm like, well, that was more work than just dot format.

00:26:40.900 --> 00:26:43.960
Cause the IDE will auto-complete us like dot F and then boom.

00:26:43.960 --> 00:26:48.740
Like, so a lot of times I ended up using the format anyway, but I still prefer to have the

00:26:48.740 --> 00:26:49.540
f-strings and read them.

00:26:49.540 --> 00:26:53.080
So this way I can write it however I want and then just hit it with this before I do a check-in.

00:26:53.240 --> 00:26:58.740
I think that we should ask VS Code and PyCharm to detect when we put a curly brace in a string

00:26:58.740 --> 00:27:00.360
and automatically add the F.

00:27:00.360 --> 00:27:00.740
Yes.

00:27:00.740 --> 00:27:01.500
Just like a hockey.

00:27:01.500 --> 00:27:03.700
I was going to say the exact same thing.

00:27:03.700 --> 00:27:04.060
So it's not.

00:27:04.060 --> 00:27:05.420
That's awesome.

00:27:05.420 --> 00:27:07.020
You all are in the same boat.

00:27:07.020 --> 00:27:08.820
So yeah, this is, this is really cool.

00:27:08.820 --> 00:27:10.720
I definitely think my code is nicer.

00:27:10.720 --> 00:27:14.860
I originally created like when I created the Python bytes website and I created Talk Python

00:27:14.860 --> 00:27:15.220
training.

00:27:15.220 --> 00:27:20.200
This was when the latest version of Python and Ubuntu was three, five.

00:27:20.200 --> 00:27:21.700
So we didn't have f-strings.

00:27:22.000 --> 00:27:25.880
And I actually took the server down once on accident because I used an F string and a

00:27:25.880 --> 00:27:30.200
little utility file that was like in the same directory and like the scanning path, looking

00:27:30.200 --> 00:27:34.000
for the routes, found that, couldn't parse it and the website couldn't start.

00:27:34.000 --> 00:27:35.060
I'm like, why is it down?

00:27:35.060 --> 00:27:35.640
What have I done?

00:27:35.640 --> 00:27:36.620
I didn't even change it.

00:27:36.620 --> 00:27:41.380
So anyway, I'm really happy now that I could just take all that code that I used to like

00:27:41.380 --> 00:27:45.100
leave in the format style and just flint space, you know, just run on this directory.

00:27:45.100 --> 00:27:45.940
Boom, it's done.

00:27:45.940 --> 00:27:47.220
So yeah, it's really nice.

00:27:47.220 --> 00:27:50.680
I can't wait to just like intuitively just use like f-strings and all that stuff.

00:27:50.680 --> 00:27:53.060
It's still kind of, I don't know, just ingrained in like my brain.

00:27:53.060 --> 00:27:56.920
Like even, I know, I go to conferences and I see people use all the new syntax and I'm

00:27:56.920 --> 00:27:58.680
like, yeah, oh, that's so nice.

00:27:58.680 --> 00:28:03.920
But it's just like, you know, in my day to day work, you know, even if we don't support

00:28:03.920 --> 00:28:05.660
two, seven, we support three, five.

00:28:05.660 --> 00:28:07.700
And they're just like a lot of these.

00:28:07.700 --> 00:28:08.560
Yeah, exactly.

00:28:08.560 --> 00:28:12.180
You know, there is this thing called, I can't remember what it was called, Brian.

00:28:12.260 --> 00:28:15.640
We covered it where it lets you add F string support to Python two.

00:28:15.640 --> 00:28:18.380
It may also work for Python three, five.

00:28:18.380 --> 00:28:22.600
You can definitely retroactively add f-strings to the format.

00:28:22.600 --> 00:28:23.560
It's some weird way.

00:28:23.560 --> 00:28:26.380
But then you need like another runtime dependency, which.

00:28:26.380 --> 00:28:26.740
Yeah.

00:28:26.740 --> 00:28:26.960
Yeah.

00:28:26.960 --> 00:28:27.740
It's not worth it.

00:28:27.740 --> 00:28:28.820
It does some weird thing.

00:28:28.820 --> 00:28:29.520
That's how it works.

00:28:29.520 --> 00:28:29.720
Yeah.

00:28:29.720 --> 00:28:30.800
That's a bit unattractive.

00:28:30.880 --> 00:28:35.380
It like rewrites like the file loader with a certain weird encoder.

00:28:35.380 --> 00:28:36.620
It's like, it's pretty sketchy.

00:28:36.620 --> 00:28:36.900
Yeah.

00:28:36.900 --> 00:28:37.180
Okay.

00:28:37.180 --> 00:28:39.640
Now I wouldn't want to ship that in like our libraries.

00:28:39.640 --> 00:28:40.540
Oh, come on.

00:28:40.540 --> 00:28:40.960
Why not?

00:28:40.960 --> 00:28:42.180
Just run your tests.

00:28:42.180 --> 00:28:43.200
Make sure they pass.

00:28:43.200 --> 00:28:43.720
That's good.

00:28:43.720 --> 00:28:44.080
Yeah.

00:28:44.080 --> 00:28:44.440
Good.

00:28:44.440 --> 00:28:47.880
But it's cool that something like this is out so that when you decide like we're no

00:28:47.880 --> 00:28:51.120
longer supporting three, five, you just hit it with this and like, you know, a quick

00:28:51.120 --> 00:28:53.440
scan through the files and it's, it's F stringified.

00:28:53.440 --> 00:28:54.580
That's going to be so, so nice.

00:28:54.580 --> 00:28:55.520
Like I can't wait.

00:28:55.520 --> 00:29:00.200
I'm yet all that and all the type hints and like, you know, once we can drop all of the,

00:29:00.200 --> 00:29:03.420
the older versions, like I can be so, also nice.

00:29:03.420 --> 00:29:06.760
So yeah, I'm really, I won't even mind like rewriting all of the code.

00:29:06.760 --> 00:29:09.980
Like I think with our team, we're just going to sit down and be like, yay, let's do this.

00:29:09.980 --> 00:29:10.700
We're going to do it.

00:29:10.700 --> 00:29:11.080
Yes.

00:29:11.080 --> 00:29:11.420
Here we come.

00:29:11.420 --> 00:29:11.640
Yeah.

00:29:11.640 --> 00:29:12.660
It's going to be so satisfying.

00:29:12.660 --> 00:29:14.080
Like years later.

00:29:14.080 --> 00:29:14.380
Yeah.

00:29:14.380 --> 00:29:16.340
Well, it's the curse of success, right?

00:29:16.340 --> 00:29:20.340
You have so many people using your libraries that you just got to keep it sort of a little

00:29:20.340 --> 00:29:20.760
bit backwards.

00:29:20.760 --> 00:29:21.020
Yeah.

00:29:21.020 --> 00:29:21.260
Sure.

00:29:21.260 --> 00:29:23.180
And like some people are still stuck on legacy code.

00:29:23.180 --> 00:29:26.820
Like, I mean, I'm not, it's not, you know, some people like look down on like companies

00:29:26.820 --> 00:29:29.320
that are still on like Python too, but it's like, you know, it's not

00:29:29.520 --> 00:29:35.180
like many of them like really enjoy using all this legacy software and legacy like stuff.

00:29:35.180 --> 00:29:37.200
They're just like, it just exists.

00:29:37.200 --> 00:29:40.260
And we might as well keep supporting it if we can.

00:29:40.260 --> 00:29:40.520
Yeah.

00:29:40.520 --> 00:29:42.600
What's the Python 2 story for you all?

00:29:42.600 --> 00:29:44.160
You're still supporting it for now?

00:29:44.160 --> 00:29:44.480
Yeah.

00:29:44.480 --> 00:29:45.780
And I think we will for a while.

00:29:45.780 --> 00:29:46.560
After January?

00:29:46.560 --> 00:29:46.940
Yeah.

00:29:47.020 --> 00:29:47.780
We probably will.

00:29:47.780 --> 00:29:52.580
Like there will just naturally be a point where like we cannot upgrade any of our dependencies.

00:29:52.580 --> 00:29:54.120
Like, I don't know, NumPy for example.

00:29:54.120 --> 00:29:54.500
Okay.

00:29:54.500 --> 00:29:59.140
If we ever, you know, it is a good reason why we want to use a newer version of that.

00:29:59.140 --> 00:30:00.320
We just can't.

00:30:00.320 --> 00:30:03.700
And if everyone else drops it, we just have to be like, okay, that's it.

00:30:03.700 --> 00:30:04.200
We can't.

00:30:04.200 --> 00:30:06.320
And it's also not like the old versions are going away.

00:30:06.400 --> 00:30:12.280
Like if we make sure we don't have any major bugs, like you can still use an old version

00:30:12.280 --> 00:30:14.360
of spaCy and like, we're not going to take that away from you.

00:30:14.360 --> 00:30:14.580
Right.

00:30:14.580 --> 00:30:16.320
Just pin the version and you'll be good.

00:30:16.320 --> 00:30:16.540
Yeah.

00:30:16.540 --> 00:30:17.160
Very cool.

00:30:17.160 --> 00:30:17.580
Very cool.

00:30:17.580 --> 00:30:18.100
All right.

00:30:18.100 --> 00:30:19.860
Well, that's it for all of our main items.

00:30:19.860 --> 00:30:22.980
Brian, you want to, I know we've got a few little extra things just thrown here at the

00:30:22.980 --> 00:30:23.080
end.

00:30:23.080 --> 00:30:23.660
Do you want to kick it off?

00:30:23.660 --> 00:30:23.900
Yeah.

00:30:23.960 --> 00:30:26.300
So we had an email from Andre Janisch.

00:30:26.300 --> 00:30:27.880
I think that's how you say his name.

00:30:27.880 --> 00:30:33.320
Saying that we were, in one of our episodes, we talked about regular expressions taking down,

00:30:33.320 --> 00:30:35.720
and I even forgot, took down something.

00:30:35.720 --> 00:30:36.580
It was something major.

00:30:36.580 --> 00:30:36.920
Yeah.

00:30:36.920 --> 00:30:40.140
I can't remember, but some major cloud provider went down because of it.

00:30:40.140 --> 00:30:40.300
Yeah.

00:30:40.300 --> 00:30:41.740
And how that could happen.

00:30:41.740 --> 00:30:46.960
So there's an interesting video talking about regular expression denial of service attacks

00:30:46.960 --> 00:30:48.420
and how it happens.

00:30:48.420 --> 00:30:49.800
It was just an interesting video.

00:30:49.800 --> 00:30:52.620
We'll have a link to it in the show notes if anybody wants to watch.

00:30:52.620 --> 00:30:52.940
Okay.

00:30:52.940 --> 00:30:53.260
Yeah.

00:30:53.360 --> 00:30:53.540
Yeah.

00:30:53.540 --> 00:30:54.040
Super cool.

00:30:54.040 --> 00:30:55.900
So I got a couple I want to throw out there.

00:30:55.900 --> 00:31:02.980
One is if you're doing any work where you're working with like microservices or you want to

00:31:02.980 --> 00:31:07.700
have some kind of application that's talking to some API endpoint, you want to debug it.

00:31:07.700 --> 00:31:13.760
There's a new thing called HTTP toolkit, and it has like special Python support.

00:31:13.760 --> 00:31:19.260
So this is like a proxy you can run on your computer and say, start recording, and it'll

00:31:19.260 --> 00:31:21.800
start recording all the requests that you're making.

00:31:22.140 --> 00:31:29.260
So it integrates with url.lib.request, url.lib2, request, pip, Python 2 and 3, photo, all those

00:31:29.260 --> 00:31:32.860
things, and specifically catches traffic from those.

00:31:33.260 --> 00:31:39.020
And it does interesting stuff by changing the Python path and environment variables.

00:31:39.020 --> 00:31:44.760
And then all of these libraries that I talked about apparently respect certain proxy settings

00:31:44.760 --> 00:31:45.640
and things you can set.

00:31:45.640 --> 00:31:47.520
So you don't have to change your app at all.

00:31:47.520 --> 00:31:52.260
You just start a terminal with HTTP toolkit and then run your code, and it can record it.

00:31:52.260 --> 00:31:52.680
That's cool.

00:31:52.880 --> 00:31:53.000
Yeah.

00:31:53.000 --> 00:31:55.240
So if you're like, why is this crashing?

00:31:55.240 --> 00:31:59.980
You know, I run my request thing, and then I get some kind of crash.

00:31:59.980 --> 00:32:03.900
And how am I supposed to, you know, you don't have like the developer tools in your web browser

00:32:03.900 --> 00:32:05.820
to like look at the headers and whatnot.

00:32:05.820 --> 00:32:07.060
So you can do it with this.

00:32:07.060 --> 00:32:07.500
It's pretty cool.

00:32:07.500 --> 00:32:09.800
It's free, but there's also a paid version.

00:32:09.800 --> 00:32:10.400
Just heads up.

00:32:10.560 --> 00:32:13.300
Also, there's a nice little link.

00:32:13.300 --> 00:32:16.880
Last time, time before, Brian, we were talking about magic, Python magic.

00:32:16.880 --> 00:32:22.020
You're like, well, that's a pretty strong, strong name to be magic.

00:32:22.020 --> 00:32:23.800
And all it does is detect file types.

00:32:23.800 --> 00:32:24.780
Right?

00:32:24.780 --> 00:32:25.540
Do you remember that thing?

00:32:25.540 --> 00:32:32.140
David Martinez said, well, the reason it's called magic is there's basically these magic

00:32:32.140 --> 00:32:36.360
number signatures that appear at the beginning of files.

00:32:36.360 --> 00:32:39.100
And that's like teaches you about the syntax.

00:32:39.320 --> 00:32:44.120
So for example, if you had a SQLite file, it would start with 53, 51, 4C, 69, et cetera.

00:32:44.120 --> 00:32:47.220
If you see those numbers up the front, that means SQLite, right?

00:32:47.220 --> 00:32:49.100
So wait, did you actually know this by heart?

00:32:49.100 --> 00:32:50.660
Or did you write this down?

00:32:50.660 --> 00:32:51.920
No, no.

00:32:51.920 --> 00:32:53.340
I don't know.

00:32:53.340 --> 00:32:54.620
Oh, of course.

00:32:54.620 --> 00:32:55.360
Yeah, I know that one.

00:32:55.360 --> 00:32:55.660
Sure.

00:32:55.660 --> 00:32:56.860
No, I just, I pulled it up.

00:32:56.860 --> 00:32:58.240
Let's see.

00:32:58.240 --> 00:33:01.160
Really quickly, Python 374 is out.

00:33:01.160 --> 00:33:06.660
So I brew and upgraded my Python 37, which is how I'm getting on my machine.

00:33:06.660 --> 00:33:08.580
And it's already on homebrew as well.

00:33:08.700 --> 00:33:11.040
So that was like, I don't know, six, seven hours delay there.

00:33:11.040 --> 00:33:12.640
It was really nice to see that come out real quick.

00:33:12.640 --> 00:33:15.360
Or if you have pyenv, you can do pyenv.

00:33:15.360 --> 00:33:18.620
I don't even know the command, but like install something and then...

00:33:18.620 --> 00:33:19.560
Right away have it.

00:33:19.560 --> 00:33:20.140
That's awesome.

00:33:20.140 --> 00:33:20.540
Yeah.

00:33:20.540 --> 00:33:24.280
And then the last one, I want to point out this thing called flying.

00:33:24.280 --> 00:33:25.920
I just call it flying fractals.

00:33:26.460 --> 00:33:31.120
This person put together this project using Py Wonderland.

00:33:31.120 --> 00:33:35.880
And it automates some other libraries that are based on C.

00:33:35.880 --> 00:33:42.800
So they made some really cool videos of like flying through three-dimensional, like animated

00:33:42.800 --> 00:33:45.260
Mandelbrot sets and other kinds of stuff.

00:33:45.320 --> 00:33:50.500
When I just watched it, I thought just, wow, this is super cool computational stuff over

00:33:50.500 --> 00:33:50.760
here.

00:33:50.760 --> 00:33:54.600
I've done a bunch of work in like complex dynamics and like trying to visualize that.

00:33:54.600 --> 00:33:56.320
And like this kind of blew me away.

00:33:56.320 --> 00:33:59.640
So if you care at all about that stuff, I think you'll just enjoy like a minute of that video.

00:33:59.860 --> 00:34:00.120
Yeah.

00:34:00.120 --> 00:34:00.500
Yeah.

00:34:00.500 --> 00:34:04.600
So yeah, actually, you might have actually noticed that my voice still isn't like 100%

00:34:04.600 --> 00:34:06.500
and it's a bit rough.

00:34:06.500 --> 00:34:11.820
And that's because last weekend we had our very, very first conference here in Berlin called

00:34:11.820 --> 00:34:14.500
spaCy IRL, like, you know, spaCy in real life.

00:34:14.500 --> 00:34:18.960
So our community came together and I'm still like absolutely blown away.

00:34:18.960 --> 00:34:20.700
Like there was, you know, the vibe was amazing.

00:34:20.700 --> 00:34:26.160
We had like 200 people there and a lovely like old theater, 12 really amazing talks by people

00:34:26.160 --> 00:34:27.940
from research, industry, community.

00:34:28.620 --> 00:34:33.100
So it was really a lot of fun and all talks were recorded and we're currently uploading

00:34:33.100 --> 00:34:34.240
them to our YouTube channel.

00:34:34.240 --> 00:34:37.480
So probably by the time this airs, they might've already been released.

00:34:37.480 --> 00:34:42.000
And yeah, it'd be a bunch of, yeah, if you're interested in natural language processing, spaCy,

00:34:42.000 --> 00:34:43.740
those, the talks were really, really great.

00:34:43.740 --> 00:34:46.340
And yeah, I hope you, you enjoy watching them.

00:34:46.340 --> 00:34:46.820
That's awesome.

00:34:46.820 --> 00:34:50.260
I'm so glad you're putting them on YouTube and wow, congratulations.

00:34:50.260 --> 00:34:55.600
You must be just blown away at how awesome it is to put on a conference about your own stuff,

00:34:55.600 --> 00:34:55.800
right?

00:34:55.800 --> 00:34:58.560
And so many people came and the energy and like you could tell your voices.

00:34:58.560 --> 00:34:59.280
And it's great.

00:34:59.280 --> 00:35:00.600
I know that was like, yeah.

00:35:00.600 --> 00:35:01.120
Wow.

00:35:01.120 --> 00:35:04.060
And it was also, it's actually quite refreshing to organize your own conference.

00:35:04.060 --> 00:35:08.300
Like, you know, we were like, okay, let's do all the things that we think a conference

00:35:08.300 --> 00:35:09.800
should do and like try them out.

00:35:09.800 --> 00:35:11.220
And it actually worked quite well.

00:35:11.220 --> 00:35:13.760
Like, you know, only one track, for example, stuff like that.

00:35:13.760 --> 00:35:19.840
No questions from the audience, much more social time, some, you know, really healthy food,

00:35:19.840 --> 00:35:20.500
stuff like that.

00:35:20.540 --> 00:35:21.700
So it was, it was, it was great.

00:35:21.700 --> 00:35:25.720
Like my voice suffered a bit, but you know, we're giving a lot back to the community as

00:35:25.720 --> 00:35:27.540
in the videos, photos, stuff.

00:35:27.540 --> 00:35:28.160
So yeah.

00:35:28.160 --> 00:35:29.220
Sounds great.

00:35:29.220 --> 00:35:29.560
Awesome.

00:35:29.560 --> 00:35:30.140
Congratulations.

00:35:30.140 --> 00:35:35.360
A couple of episodes ago, Brian actually talked about FastAPI, not to be confused with fast

00:35:35.360 --> 00:35:37.320
AI, which I talked about earlier.

00:35:37.880 --> 00:35:42.500
So yeah, it's a great, very modern, cool Python library for FastAPIs.

00:35:42.500 --> 00:35:44.980
And we're like, yeah, we've been big fans.

00:35:44.980 --> 00:35:46.900
We've started switching all our APIs over.

00:35:46.900 --> 00:35:52.580
The exciting news here is that their core developer, Sebastian Ramirez is actually going to join our

00:35:52.580 --> 00:35:53.440
team here in Berlin.

00:35:53.440 --> 00:35:58.280
This means like a lot of cool development for us, but also we obviously, since we love the

00:35:58.280 --> 00:36:03.080
FastAPI project, we'll keep supporting that and we'll definitely give him enough time to

00:36:03.080 --> 00:36:03.780
keep working on it.

00:36:03.780 --> 00:36:04.480
That's great news.

00:36:04.480 --> 00:36:05.580
We found him through the project.

00:36:05.580 --> 00:36:07.580
We saw, oh, he's doing like some consulting work.

00:36:07.660 --> 00:36:09.760
We're like, hey, we'd love to work with him.

00:36:09.760 --> 00:36:13.660
And one thing came to another and now, yeah, he'd be part of our Explosion team, which is

00:36:13.660 --> 00:36:14.800
still growing, by the way.

00:36:14.800 --> 00:36:19.440
So we've been very lucky that we were able to work with more people and expand our team.

00:36:19.440 --> 00:36:19.740
Yeah.

00:36:19.740 --> 00:36:22.020
That's so cool that, yeah, that your business is growing.

00:36:22.020 --> 00:36:28.560
And I guess it's worth pointing out that back on Talk Python To Me, we talked about Explosion

00:36:28.560 --> 00:36:28.800
AI.

00:36:28.800 --> 00:36:31.100
I interviewed you about building a software business.

00:36:31.100 --> 00:36:32.760
So back on episode 202.

00:36:32.760 --> 00:36:36.360
So, you know, this is just like more, more evidence that that's all good advice.

00:36:36.360 --> 00:36:36.700
Thanks.

00:36:36.860 --> 00:36:37.780
Yeah, super cool.

00:36:37.780 --> 00:36:39.380
Well, great, great news.

00:36:39.380 --> 00:36:42.560
I guess it's probably time for a joke here too.

00:36:42.560 --> 00:36:44.500
A pie joke, if you will, maybe.

00:36:44.500 --> 00:36:46.740
So I think this, I'll do the first one.

00:36:46.740 --> 00:36:48.460
This one, I think came from pie jokes.

00:36:48.460 --> 00:36:48.960
We'll see.

00:36:48.960 --> 00:36:50.740
We're starting to run that well dry.

00:36:50.740 --> 00:36:52.460
So people send in your jokes, please.

00:36:52.460 --> 00:36:57.960
But a programmer walks into the bar and orders 1.38 root beers.

00:36:58.500 --> 00:37:02.720
The bartender informs her that it's a root beer float.

00:37:02.720 --> 00:37:04.240
She says, no, make it a double.

00:37:04.240 --> 00:37:05.480
All right.

00:37:05.480 --> 00:37:06.500
It's pretty bad type system.

00:37:06.500 --> 00:37:08.060
Maybe it doesn't work so well in Python.

00:37:08.060 --> 00:37:10.240
Like we don't care so much about types, but you know, still.

00:37:10.240 --> 00:37:11.000
So it's all right.

00:37:11.000 --> 00:37:11.560
I like it.

00:37:11.560 --> 00:37:11.940
All right.

00:37:11.980 --> 00:37:12.700
We got one more up here.

00:37:12.700 --> 00:37:13.720
Who put this one in?

00:37:13.720 --> 00:37:13.960
Brian?

00:37:13.960 --> 00:37:14.320
Yeah.

00:37:14.320 --> 00:37:19.760
So just last night I was researching for this podcast, writing notes for the other podcast,

00:37:19.760 --> 00:37:22.680
and working on an open source project.

00:37:22.680 --> 00:37:24.500
And I came up with this.

00:37:24.500 --> 00:37:27.140
What do you call a developer without a side project?

00:37:27.140 --> 00:37:27.540
What's that?

00:37:27.540 --> 00:37:28.160
Well rested.

00:37:28.160 --> 00:37:28.940
Yeah, that's true.

00:37:28.940 --> 00:37:29.840
That's totally true.

00:37:29.840 --> 00:37:31.740
It's almost a bit sad in that sense.

00:37:31.740 --> 00:37:35.360
Yeah.

00:37:35.360 --> 00:37:36.740
I know it's too real.

00:37:36.740 --> 00:37:37.200
Too real.

00:37:37.200 --> 00:37:40.760
I personally shouldn't be complaining.

00:37:40.760 --> 00:37:42.080
That's right.

00:37:42.080 --> 00:37:45.580
But you know, there are some comments we could make here about like, you know, the culture

00:37:45.580 --> 00:37:49.280
and like what's expected of developers these days and how that's maybe not ideal.

00:37:49.280 --> 00:37:51.820
You know, sleeping enough, stuff like that.

00:37:51.820 --> 00:37:52.480
Oh, definitely.

00:37:52.480 --> 00:37:53.660
People should be.

00:37:53.660 --> 00:37:56.040
And I was, it's mostly a self-reflection.

00:37:56.040 --> 00:37:57.580
No, I mean, it is a good joke.

00:37:57.580 --> 00:37:59.040
I'm not, I wasn't criticizing your joke.

00:37:59.040 --> 00:38:00.920
It's a totally fine joke.

00:38:00.920 --> 00:38:02.360
I'm just saying it's also, it's very real.

00:38:02.360 --> 00:38:05.300
You know how jokes can be like too real and then you're like, oh.

00:38:05.300 --> 00:38:09.080
Yeah, I'm really uncomfortable now.

00:38:09.080 --> 00:38:11.800
Exactly.

00:38:11.800 --> 00:38:12.080
All right.

00:38:12.080 --> 00:38:13.680
Well, I think that's a good place to leave it.

00:38:13.680 --> 00:38:14.780
Brian, thank you as always.

00:38:14.780 --> 00:38:15.080
Thank you.

00:38:15.080 --> 00:38:16.160
It was great to have you here.

00:38:16.160 --> 00:38:16.700
Thanks for coming.

00:38:16.700 --> 00:38:17.260
Yeah, thanks.

00:38:17.260 --> 00:38:17.620
Bye.

00:38:17.620 --> 00:38:17.860
Bye.

00:38:17.860 --> 00:38:19.640
Thank you for listening to Python Bytes.

00:38:19.640 --> 00:38:22.200
Follow the show on Twitter via at Python Bytes.

00:38:22.200 --> 00:38:25.040
That's Python Bytes as in B-Y-T-E-S.

00:38:25.040 --> 00:38:28.280
And get the full show notes at Pythonbytes.fm.

00:38:28.280 --> 00:38:32.500
If you have a news item you want featured, just visit Pythonbytes.fm and send it our way.

00:38:32.500 --> 00:38:35.200
We're always on the lookout for sharing something cool.

00:38:35.200 --> 00:38:38.300
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:38:38.300 --> 00:38:41.740
Thank you for listening and sharing this podcast with your friends and colleagues.

