WEBVTT

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

00:00:04.820 --> 00:00:11.340
This is episode 279, recorded on lucky April 13th, 2022.

00:00:11.340 --> 00:00:12.460
I'm Michael Kennedy.

00:00:12.460 --> 00:00:13.360
And I'm Brian Okken.

00:00:13.360 --> 00:00:15.020
And I'm Brian Skin.

00:00:15.020 --> 00:00:18.020
Hello, Brians. Great to have you.

00:00:18.020 --> 00:00:19.420
Hello, singular Michael.

00:00:19.420 --> 00:00:21.900
Great Brians think alike.

00:00:21.900 --> 00:00:24.420
That's right. That's the saying.

00:00:24.420 --> 00:00:27.440
Brian Skin, welcome. It's great to have you here.

00:00:27.440 --> 00:00:31.760
You are now completing the trifecta of podcasts, I understand.

00:00:31.760 --> 00:00:37.780
Yes, indeed. I was on a panel for Talk Python and an episode of Test & Code a little while back.

00:00:37.780 --> 00:00:40.580
And excited to be here for Python Bytes.

00:00:40.580 --> 00:00:45.380
Yes. You've been a big contributor in terms of sending topics our way.

00:00:45.380 --> 00:00:47.560
So it's only fitting that you're here.

00:00:47.560 --> 00:00:50.500
Tell people real quick about yourself before we jump into the topics.

00:00:50.500 --> 00:00:52.600
Sure. I'm a chemical engineer by training.

00:00:52.600 --> 00:00:54.640
I am not actually a software dev by day.

00:00:54.640 --> 00:00:57.160
I have a PhD in chemical engineering.

00:00:57.160 --> 00:01:04.720
I've been working for the last 10 years or so at a company here in Dayton, Ohio, Faraday Technology, working on electrochemical process R&D.

00:01:05.700 --> 00:01:11.280
So there's a lot of science there, some programming, mostly for data analysis, things like that.

00:01:11.280 --> 00:01:17.940
But I also have done quite a bit of Python on the side in the documentation area and various things like that.

00:01:17.940 --> 00:01:19.660
So excellent.

00:01:19.660 --> 00:01:21.280
Cool. Chemical engineering is pretty awesome.

00:01:21.280 --> 00:01:24.580
And it's great to have someone here who's not a straight software developer.

00:01:24.980 --> 00:01:29.660
You know, we get a lot of myopic views and I think you'll have some interesting perspectives.

00:01:29.660 --> 00:01:30.640
Hope so.

00:01:30.640 --> 00:01:31.420
Yeah.

00:01:31.420 --> 00:01:32.700
I hope so as well.

00:01:32.700 --> 00:01:32.980
I'm sure.

00:01:32.980 --> 00:01:37.220
Now, before we kick this off, I want to say this episode is brought to you by Datadog.

00:01:37.220 --> 00:01:39.840
Check them out at pythonbytes.fm/Datadog.

00:01:39.840 --> 00:01:41.760
We'll talk more about them later.

00:01:41.760 --> 00:01:44.540
Right now, Brian, maybe we could talk about f-strings.

00:01:44.540 --> 00:01:45.120
What do you think?

00:01:45.360 --> 00:01:45.680
Yeah.

00:01:45.680 --> 00:01:47.160
I mean, I love f-strings.

00:01:47.160 --> 00:01:48.700
I use them all the time.

00:01:48.700 --> 00:01:51.640
But I was like really thought it was cool.

00:01:51.640 --> 00:01:54.880
There were a couple of new resources that I kind of wish I had had earlier.

00:01:54.880 --> 00:01:57.300
This one, a couple, they're new.

00:01:57.300 --> 00:02:00.740
So we've got from Florian Bruin.

00:02:00.740 --> 00:02:10.500
And he's hugely helpful to getting, doing the code review or book review and code review and all that stuff on the pytest book.

00:02:10.500 --> 00:02:14.680
So I definitely want to shout out to him for thank him for doing that.

00:02:14.680 --> 00:02:15.080
Yeah.

00:02:15.080 --> 00:02:18.360
But so he generated this Python f-strings.

00:02:18.360 --> 00:02:19.920
It's called f-strings.help.

00:02:19.920 --> 00:02:25.180
And it's just like it's a Jupyter Notebook looking thing.

00:02:25.180 --> 00:02:27.500
I think he created it with Jupyter Notebook.

00:02:27.500 --> 00:02:32.660
But it just quickly goes through all of the formatting stuff of f-strings.

00:02:32.660 --> 00:02:42.860
And there's a little bit of explanation, but it just sort of exactly shows you what the syntax is and what the output is really concisely.

00:02:43.680 --> 00:02:47.000
This is a nice, nice run through of the F-string features.

00:02:47.000 --> 00:02:47.920
Yeah, that's cool.

00:02:47.920 --> 00:02:56.860
Well, it looks like if you were trying to either learn Python strings or trying to help someone learn Python strings, you could just send them this and go, here, scan this.

00:02:56.860 --> 00:02:57.560
You'll be good to go.

00:02:57.560 --> 00:03:00.800
What I like about it is just the terseness as well.

00:03:00.800 --> 00:03:05.100
So this is a decent reference to Bookmark for looking things up.

00:03:05.100 --> 00:03:11.340
The other thing I wanted to point out was an article called Python f-strings are more powerful than you might think.

00:03:11.340 --> 00:03:13.900
And that's exactly kind of the gist of it.

00:03:13.900 --> 00:03:16.260
It's more discussion.

00:03:16.260 --> 00:03:21.640
It doesn't, I mean, it does sort of tell you what they are, but it kind of assumes you already know.

00:03:21.640 --> 00:03:30.540
But some really cool things like date and time formatting, using it for debugging with variable names.

00:03:30.540 --> 00:03:31.860
We've talked about that on the show.

00:03:31.860 --> 00:03:35.560
Taking advantage of string representations.

00:03:35.560 --> 00:03:41.760
There's even embedded, I didn't know you could put f-strings inside of f-strings.

00:03:42.500 --> 00:03:46.180
So there's part nested f-strings, they call it.

00:03:46.180 --> 00:03:48.140
So interesting stuff here.

00:03:48.140 --> 00:03:48.920
Yes.

00:03:48.920 --> 00:03:49.680
Yes.

00:03:49.680 --> 00:03:51.340
So, yes.

00:03:51.340 --> 00:03:52.200
Nested f-strings.

00:03:52.200 --> 00:03:53.140
I had no idea.

00:03:53.140 --> 00:03:53.920
I didn't either.

00:03:53.920 --> 00:03:55.620
I've totally done that before.

00:03:55.620 --> 00:03:56.500
Really?

00:03:56.500 --> 00:03:56.840
Totally.

00:03:56.840 --> 00:03:57.420
Yeah.

00:03:57.420 --> 00:03:59.960
Templating one thing to then template into another thing.

00:03:59.960 --> 00:04:00.640
Absolutely.

00:04:00.640 --> 00:04:01.780
It's super helpful.

00:04:01.780 --> 00:04:03.020
Nice.

00:04:03.020 --> 00:04:03.360
Very cool.

00:04:03.360 --> 00:04:04.340
So, yeah.

00:04:04.340 --> 00:04:04.660
Yeah.

00:04:04.660 --> 00:04:12.140
It's easy to forget that you can apply the standard, I guess, string.format type of operators.

00:04:12.360 --> 00:04:18.700
Like colon, 0.3F or colon, comma to put digit grouping, but in f-strings, right?

00:04:18.700 --> 00:04:23.540
Because it's, I don't know, it feels more like you're working with a variable than you are with a format character.

00:04:23.540 --> 00:04:32.540
I mean, short examples like this of, here's a cool thing you can do with, you know, even a well-established basic feature like that can really help people go, oh, hey, that's just what I need.

00:04:32.540 --> 00:04:33.460
And run with it.

00:04:33.460 --> 00:04:34.300
Yeah.

00:04:34.300 --> 00:04:35.700
Very nice.

00:04:35.700 --> 00:04:36.720
Oh, this is great, Brian.

00:04:36.720 --> 00:04:37.320
I love it.

00:04:37.320 --> 00:04:40.580
Now, are we ready to move on?

00:04:40.580 --> 00:04:41.420
Yeah, definitely.

00:04:41.420 --> 00:04:41.700
Cool.

00:04:42.220 --> 00:04:42.540
All right.

00:04:42.540 --> 00:04:45.240
I kind of want to blow your mind with this thing here.

00:04:45.240 --> 00:04:48.800
You've probably heard about Bloomberg terminals.

00:04:49.460 --> 00:05:06.100
So, if you're in the investment space, like if you work at a hedge fund or an investment company, especially in Manhattan, you know, you'll sit down and you'll see like these six monitor crazy setups that would make gamers jealous, you know, around them.

00:05:06.180 --> 00:05:07.760
And look at what's going on here.

00:05:07.760 --> 00:05:19.700
And one of the tools they use a lot is this thing called the Bloomberg terminal that lets them look at all kinds of different visualizations and real-time instant updating things around the stock market and whatnot.

00:05:20.040 --> 00:05:24.560
That is a commercial project that, best I can tell.

00:05:24.560 --> 00:05:34.680
I mean, there's probably discounts or whatever, but it costs around $2,000 per user per month, which is a non-trivial amount of cost, right?

00:05:36.260 --> 00:05:46.040
I mean, no wonder we're all getting like little percentages of money sucked out of our 401k retirements because all of those people are like paying that much money to like manage our accounts.

00:05:46.040 --> 00:05:47.140
Yes, exactly.

00:05:48.020 --> 00:05:53.340
So, I want to introduce you all to OpenBB at OpenBB.co.

00:05:53.340 --> 00:05:59.000
This is the equivalent thing, but several interesting aspects.

00:05:59.000 --> 00:06:00.460
One, it's open source.

00:06:00.460 --> 00:06:01.440
Two, it's free.

00:06:01.440 --> 00:06:02.500
That's cheaper.

00:06:02.500 --> 00:06:03.680
It's cheaper.

00:06:03.680 --> 00:06:13.800
It's not necessarily the most important thing, but it also gives you access to all sorts of tools that we know and love from Python, especially on the data science side.

00:06:14.000 --> 00:06:19.780
So, this OpenBB thing is this terminal type thing you can install.

00:06:19.780 --> 00:06:23.360
It's really got this sort of weird blend of like CLI.

00:06:23.360 --> 00:06:29.800
I know Will McGugan would be super impressed with all of its like terminal UI, its TUI aspects.

00:06:29.800 --> 00:06:34.820
But then it also pops open interactive windows that are like graphs and all those kinds of things.

00:06:34.820 --> 00:06:37.020
We'll pull up some examples in a minute.

00:06:37.020 --> 00:06:38.600
So, you get access.

00:06:38.600 --> 00:06:42.400
It's not just that it's free, but you get access to all the Python data science stack.

00:06:42.780 --> 00:06:45.140
And it is itself created in Python.

00:06:45.140 --> 00:06:47.000
So, pretty cool.

00:06:47.000 --> 00:06:49.240
It's pretty popular.

00:06:49.240 --> 00:06:51.200
It's got 11,000 GitHub stars.

00:06:51.200 --> 00:06:53.940
And what you do is you show up at this terminal.

00:06:53.940 --> 00:06:56.360
And there's even an interactive live version.

00:06:56.360 --> 00:06:59.800
You can have dark mode or not dark mode turned on the website.

00:06:59.800 --> 00:07:00.500
I mean, I love it.

00:07:00.500 --> 00:07:02.560
This is really a polished thing.

00:07:02.560 --> 00:07:04.720
And you can type things like stocks.

00:07:04.720 --> 00:07:07.060
If you could spell stocks, you could type stocks.

00:07:07.060 --> 00:07:10.240
And it'll come up with all these ways that you could explore them.

00:07:10.240 --> 00:07:13.980
If you could type BA and it'll come and give you these things.

00:07:13.980 --> 00:07:16.620
And eventually, if you get to the right spot, it doesn't happen on the website.

00:07:16.620 --> 00:07:22.080
But it'll pop up these extra windows that then like let you explore things with graphs and so on.

00:07:22.080 --> 00:07:24.680
So, very, very cool.

00:07:25.720 --> 00:07:29.520
Let's pull up some of the terminal things here.

00:07:29.520 --> 00:07:31.420
And look at the features.

00:07:31.420 --> 00:07:33.080
Where are the features?

00:07:33.080 --> 00:07:36.760
So, you can install it through its own installer.

00:07:36.760 --> 00:07:38.820
You can install it through Anaconda.

00:07:39.080 --> 00:07:42.320
Or you can run a Docker image of it to get it to run.

00:07:42.320 --> 00:07:51.920
So, it's sort of summary is Python-based integrated environment for investing research that leverages state-of-the-art data science tools and machine learning technologies.

00:07:51.920 --> 00:07:56.860
And navigate through over 500 different views and functionality.

00:07:57.560 --> 00:07:59.840
So, here's some of the pictures that we can look at.

00:07:59.840 --> 00:08:02.720
If you go to the product terminal and just scroll down.

00:08:02.720 --> 00:08:10.780
You can have these really cool graphs of like significant events happening along here and extra information.

00:08:10.780 --> 00:08:14.420
You can look at basically an Excel view.

00:08:14.420 --> 00:08:17.820
You can look at 3D volatility sections.

00:08:18.000 --> 00:08:21.120
You can look at sentiment analysis here.

00:08:21.120 --> 00:08:24.600
The Bitcoin rainbow chart.

00:08:24.600 --> 00:08:27.640
I don't know how to read rainbow charts.

00:08:27.640 --> 00:08:31.420
But isn't this an amazing view for something that runs in the terminal?

00:08:31.420 --> 00:08:33.080
Yeah, this is great.

00:08:33.080 --> 00:08:34.340
That's astonishing.

00:08:34.340 --> 00:08:37.140
Yeah, it really is pretty astonishing.

00:08:37.140 --> 00:08:39.740
And like the things just keep coming.

00:08:39.740 --> 00:08:44.380
So, if you just keep scrolling through this, there's such a way to like to understand how is the economy doing.

00:08:44.380 --> 00:08:50.860
Apply AI predictions to like GDP and all sorts of wild stuff.

00:08:50.860 --> 00:08:57.860
So, it's this really crazy blend of terminal TUI plus pop open a bunch of data science explorations.

00:08:57.860 --> 00:09:01.000
And then being Python, I'm sure you can explore it yourself.

00:09:01.000 --> 00:09:03.300
I looked at the requirements file.

00:09:03.300 --> 00:09:06.440
It's like maxed on requirements in there.

00:09:06.440 --> 00:09:07.140
Let me tell you.

00:09:07.140 --> 00:09:12.380
But I think it's based on Tornado as far as I can tell.

00:09:12.380 --> 00:09:14.580
So, and...

00:09:14.580 --> 00:09:14.720
Yeah.

00:09:14.720 --> 00:09:15.240
Go ahead.

00:09:15.240 --> 00:09:17.880
Will points out it also uses rich.

00:09:17.880 --> 00:09:20.420
Yeah, well, it uses rich.

00:09:20.420 --> 00:09:21.240
Very cool.

00:09:21.240 --> 00:09:21.460
Thank you.

00:09:21.460 --> 00:09:22.800
And tested with pytest.

00:09:22.800 --> 00:09:24.160
Oh, my goodness.

00:09:24.160 --> 00:09:24.460
Yeah.

00:09:24.460 --> 00:09:25.080
So, that's awesome.

00:09:25.080 --> 00:09:27.620
Anyway, I am super impressed with this.

00:09:27.620 --> 00:09:32.960
It's an open source project based on Python sort of democratizing a lot of these things.

00:09:33.760 --> 00:09:39.540
And if that wasn't enough, I think here's one more sort of side story that I think is interesting.

00:09:39.540 --> 00:09:48.680
So, I'm sure you two have seen, you go, it's not as common as it used to be, but you go to some open source project or some application and says, buy us a coffee.

00:09:48.680 --> 00:09:50.800
Help make that next feature happen.

00:09:51.580 --> 00:09:54.140
This one has a different banner at the top instead of coffee.

00:09:54.140 --> 00:09:59.940
It says, we've just landed our $8.5 million seed funding round and we're about ready to get started.

00:09:59.940 --> 00:10:03.700
I mean, that's some kind of crushing it for open source, isn't it?

00:10:03.700 --> 00:10:04.360
Yeah, definitely.

00:10:04.360 --> 00:10:05.960
That's a lot of coffee.

00:10:05.960 --> 00:10:07.080
That is a...

00:10:07.080 --> 00:10:09.020
They're going to be so jittery.

00:10:11.420 --> 00:10:12.700
Just like the stock prices.

00:10:12.700 --> 00:10:13.700
Exactly.

00:10:13.700 --> 00:10:15.660
Look, so much fluctuation.

00:10:15.660 --> 00:10:16.020
Oh, no, no.

00:10:16.020 --> 00:10:16.600
That's just me.

00:10:16.600 --> 00:10:17.540
It's actually very still.

00:10:17.540 --> 00:10:20.200
Maybe that's why stocks go up and down so rapidly.

00:10:20.200 --> 00:10:23.140
Too many traders and too much coffee.

00:10:23.140 --> 00:10:23.720
Yeah.

00:10:23.720 --> 00:10:25.320
That's probably actually true.

00:10:25.320 --> 00:10:28.400
Anyway, I think this is a really cool Python application.

00:10:28.400 --> 00:10:30.000
It looks well done.

00:10:30.000 --> 00:10:31.120
It looks pretty modern.

00:10:31.120 --> 00:10:35.540
And yeah, it just looks like a neat way to apply some data science to investing.

00:10:35.540 --> 00:10:36.960
Do you have a sense of the learning curve?

00:10:36.960 --> 00:10:43.560
Is it mainly directed at investment professionals or is there an on-ramp for casual use?

00:10:43.560 --> 00:10:52.300
If you look at their description, it does seem to be focused on a casual use case here.

00:10:52.300 --> 00:10:54.660
Let me see.

00:10:54.660 --> 00:10:57.260
It says, a terminal built by the community, Shape Artes.

00:10:57.260 --> 00:10:59.720
Where did I see this?

00:10:59.720 --> 00:10:59.980
Somewhere.

00:10:59.980 --> 00:11:01.880
I can't remember where I ran across it.

00:11:01.880 --> 00:11:12.620
But they do talk about sort of like individual investors getting access to the tools that the companies, the people at the big banks and hedge funds would have.

00:11:12.620 --> 00:11:15.060
So it does sort of seem to be aimed at that.

00:11:15.060 --> 00:11:17.040
And my experience is it's pretty easy to use.

00:11:17.040 --> 00:11:17.500
I don't know.

00:11:17.500 --> 00:11:19.880
It's easy to understand the output, right?

00:11:19.880 --> 00:11:23.100
That's more of a investing economics problem, though.

00:11:23.100 --> 00:11:24.440
That's a perpetual problem.

00:11:24.440 --> 00:11:24.740
Yeah.

00:11:24.740 --> 00:11:25.560
Yeah.

00:11:25.560 --> 00:11:26.740
Yeah, indeed.

00:11:26.740 --> 00:11:27.640
All right.

00:11:27.660 --> 00:11:29.920
Well, people can check this out if it sounds interesting to them.

00:11:29.920 --> 00:11:32.160
Brian Skin, what you got for us?

00:11:32.160 --> 00:11:42.960
So my first item is PyProject.com and PEP621 for project metadata and PyProject.com coming to set up tools.

00:11:42.960 --> 00:11:50.180
So, you know, people in Python land are going to be pretty well familiar with PyProject.com at this point.

00:11:50.380 --> 00:11:58.720
You know, originally was the PEP517 and PEP518, you know, that created it and, you know, started the basics there.

00:11:58.720 --> 00:12:01.200
And then you had Black doing project configuration in there.

00:12:01.200 --> 00:12:03.940
And it's kind of been slowly snowballing over the past few years.

00:12:04.820 --> 00:12:21.860
And one of the big pushes of PEP621, you know, who's who of Python packaging authors here, was trying to standardize project metadata and also standardize it in a way that the metadata could be specified statically.

00:12:22.580 --> 00:12:29.980
Because that, you know, for things to get uploaded to PyPI, if you want to have information about dependencies or, you know, various other things like that.

00:12:29.980 --> 00:12:33.380
If you have the metadata specified statically, it's much easier to get to.

00:12:33.380 --> 00:12:34.920
It's you can trust it more.

00:12:36.200 --> 00:12:46.640
And so, the PEP, you know, it's how it's defining how to put project metadata in PyProject.com how to tell the build tools like build or flit.

00:12:46.640 --> 00:12:54.300
What is a static defined in declaratively in the metadata and what's dynamic that is going to be provided dynamically later on.

00:12:55.880 --> 00:12:59.840
And a number of tools had implemented PyProject.com support.

00:12:59.840 --> 00:13:02.700
Things like flit, hatch, PDM.

00:13:02.700 --> 00:13:05.740
Not poetry yet, though they're discussing it.

00:13:05.740 --> 00:13:08.580
But setup tools was still missing it.

00:13:08.580 --> 00:13:12.640
It's been an issue on the setup tools GitHub tracker for a while.

00:13:12.640 --> 00:13:15.880
And with a lot of discussion there about what it would take to bring it in.

00:13:15.880 --> 00:13:25.400
One of the big appeals of moving to this for setup tools specifically, you know, there'd been the move from to try to bring static metadata

00:13:25.400 --> 00:13:26.760
in the setup.cfg.

00:13:26.760 --> 00:13:34.460
But there's some, you know, in that discussion, there's some, you know, problems with the INI format because it's not structured.

00:13:34.460 --> 00:13:38.160
It doesn't have good, like, complex data type support.

00:13:38.160 --> 00:13:38.680
Right.

00:13:38.680 --> 00:13:40.360
Nesting and embedded things don't work.

00:13:40.360 --> 00:13:40.600
Yeah.

00:13:40.600 --> 00:13:44.780
You know, like, there's no, INI has no sense of an array.

00:13:44.780 --> 00:13:54.920
So, if you had a setup.cfg with an array in it, setup tools actually had to take that as a string representation of an array and then arrayify it.

00:13:54.920 --> 00:13:56.360
By executing it basically.

00:13:56.360 --> 00:14:01.980
Instead of the Tumble where it actually knows it as a, a, an array in a table.

00:14:01.980 --> 00:14:13.680
But in any event, Anderson Bravo Harry has just within the last month or so, I think it was, finished an experimental implementation of pep621.

00:14:15.060 --> 00:14:15.860
In setup tools.

00:14:15.860 --> 00:14:20.640
There was a discuss thread seeking feedback from the community.

00:14:20.640 --> 00:14:21.340
Try it out.

00:14:21.340 --> 00:14:21.640
Yeah.

00:14:21.640 --> 00:14:22.320
Report bugs.

00:14:22.320 --> 00:14:25.440
I tried it on one of my projects and it mostly worked.

00:14:25.440 --> 00:14:35.040
I actually turned up a bug that Anderson fixed super quickly where I do dynamic long description, which turns into the readme for, you know, for the PyPI page.

00:14:35.040 --> 00:14:35.620
Right.

00:14:35.620 --> 00:14:38.100
Do you mean you read it out of like a text file or something?

00:14:38.100 --> 00:14:43.600
Well, so what I have is I've got documentation links on, in my readme that point into like the main branch.

00:14:43.840 --> 00:14:50.700
But when I do a build to PyPI to do a release, I want it to point to an archival version of the docs on read the docs.

00:14:50.700 --> 00:14:56.880
And so I dynamically do a replace on the docs branch for those links.

00:14:56.880 --> 00:14:59.860
Well, aren't you a special butterfly?

00:14:59.860 --> 00:15:03.440
I have complicated needs.

00:15:03.440 --> 00:15:04.380
It's, I'm sorry.

00:15:04.380 --> 00:15:10.380
But, you know, so I, you know, I have that set up and it broke and I reported it and he fixed it.

00:15:10.560 --> 00:15:20.580
So, as far as I can tell, you know, it's, it may, it may be experimental and it probably will change, especially some of the issues around specifying dynamic, metadata.

00:15:20.580 --> 00:15:24.480
but it's, it's, it's at least working reasonably.

00:15:24.480 --> 00:15:28.260
and, so check it, check it out.

00:15:28.260 --> 00:15:32.020
And if you're using setup tools, take a look at, switching over to that.

00:15:32.020 --> 00:15:39.120
he, he made a tool that'll, that can convert, setup.cfg, to pyproject.toml.

00:15:39.120 --> 00:15:42.100
the project is, ini2toml.

00:15:42.100 --> 00:15:44.420
and there's some others.

00:15:44.420 --> 00:15:45.360
You can check the show notes.

00:15:45.360 --> 00:15:47.160
I've got a number of things, listed there.

00:15:47.160 --> 00:15:48.140
Yeah, very cool.

00:15:48.140 --> 00:15:51.960
I suspect that ini2toml might be more generally useful, actually.

00:15:51.960 --> 00:15:54.020
I think that's why he titled it that way.

00:15:54.020 --> 00:15:57.900
instead of, you know, setup.cfg to toml or whatever.

00:15:57.900 --> 00:15:58.800
Right.

00:15:58.800 --> 00:15:59.180
So.

00:15:59.180 --> 00:16:00.420
Cool.

00:16:00.420 --> 00:16:01.280
Yeah, this is great.

00:16:01.280 --> 00:16:04.400
More progress on the pyproject.toml stuff.

00:16:04.400 --> 00:16:05.180
Definitely.

00:16:05.180 --> 00:16:05.960
Very cool.

00:16:05.960 --> 00:16:10.480
Now, before we move on, let me tell you all about our sponsor this week.

00:16:10.480 --> 00:16:11.120
Datadog.

00:16:11.120 --> 00:16:13.680
They've been supporting the show for a really, really long time.

00:16:13.680 --> 00:16:14.640
Datadog is great.

00:16:14.640 --> 00:16:20.960
They have a real-time monitoring platform that unifies metrics, traces, and logs into one

00:16:20.960 --> 00:16:21.980
integrated system.

00:16:22.440 --> 00:16:29.100
Their APM empowers developers and teams to identify anomalies and resolve issues and improve

00:16:29.100 --> 00:16:30.100
application performance.

00:16:30.100 --> 00:16:35.400
So you can begin collecting stack traces and visualizing them as flame graphs and organizing

00:16:35.400 --> 00:16:40.100
them into profile types, such as CPU or IO types of reports.

00:16:40.940 --> 00:16:46.220
Teams can search for specific profiles and correlate them into distributed traces and identify slow

00:16:46.220 --> 00:16:49.420
or underperforming code for later analysis and optimization.

00:16:49.420 --> 00:16:56.180
And with Datadog's APM live search, you can perform searches across the full stream of ingest

00:16:56.180 --> 00:16:58.640
traces of your app over the last 15 minutes.

00:16:58.640 --> 00:17:03.500
Like, I need to figure out what the database is doing and the API and the front end and all

00:17:03.500 --> 00:17:03.860
those things.

00:17:04.340 --> 00:17:10.140
So try them for free with a 14-day free trial and Datadog will send you a free t-shirt.

00:17:10.140 --> 00:17:15.800
So just check them out and support the show by visiting pythonbytes.fm/Datadog or just

00:17:15.800 --> 00:17:18.240
click the link in your podcast player show notes to get started.

00:17:18.240 --> 00:17:18.780
Nice.

00:17:18.780 --> 00:17:19.600
Indeed.

00:17:19.600 --> 00:17:20.620
All right.

00:17:20.620 --> 00:17:23.060
Ryan, what do you got next?

00:17:23.060 --> 00:17:23.920
I've got Git.

00:17:23.920 --> 00:17:31.940
So this isn't necessarily Python only related, but I use Git a lot and I didn't know you could

00:17:31.940 --> 00:17:33.360
do autocorrect with Git.

00:17:33.620 --> 00:17:35.180
So this is Wayland Walker.

00:17:35.180 --> 00:17:39.760
I think he's been submitted other things to us on the show.

00:17:39.760 --> 00:17:46.580
But he wrote this article called configure Git to autocorrect your fat fingers, you know,

00:17:46.580 --> 00:17:48.880
or just your sloppy typing.

00:17:48.880 --> 00:17:57.280
So there's this, like, let's say you do Git checkout dev, but you spell checkout C-H-E-K-O-U-T

00:17:57.280 --> 00:17:58.300
and misspell it.

00:17:58.300 --> 00:18:05.840
Well, Git will, like, tell you that you did it wrong and it guesses what you meant and

00:18:05.840 --> 00:18:06.420
tells you.

00:18:06.420 --> 00:18:08.140
This is a similar command as this.

00:18:08.140 --> 00:18:14.300
But there's a configuration option that I didn't know about called help.autocorrect that you

00:18:14.300 --> 00:18:18.680
can set a timeout and it just automatically runs the command it thinks you wanted.

00:18:20.920 --> 00:18:22.900
I'm playing with it.

00:18:22.900 --> 00:18:24.820
And so far, it hasn't got anything wrong.

00:18:24.820 --> 00:18:29.980
So you can, I've set it to one second also, but you can set it to things like 10 seconds

00:18:29.980 --> 00:18:31.160
or I don't know why you'd want.

00:18:31.160 --> 00:18:33.800
Did you mean for, did you mean RM-RF?

00:18:33.800 --> 00:18:35.160
Applying.

00:18:35.880 --> 00:18:37.160
Just Git commands.

00:18:37.160 --> 00:18:38.240
It's not everything.

00:18:38.240 --> 00:18:40.980
Formatting hard drive.

00:18:40.980 --> 00:18:42.460
Git reset-dash-hard.

00:18:42.460 --> 00:18:45.520
Oh, yeah.

00:18:45.520 --> 00:18:47.320
That one actually would be kind of destructive.

00:18:47.320 --> 00:18:48.000
That would be bad.

00:18:48.000 --> 00:18:54.320
But I, so I realized that I added this to my workflow, but I realized that I hadn't really

00:18:54.320 --> 00:18:56.400
talked about my workflow at all on my blog.

00:18:56.540 --> 00:19:01.700
So I went ahead and just showed the things that I do normally for a quick change.

00:19:01.700 --> 00:19:08.280
I usually check out main, do a poll, then create a branch with checkout-b.

00:19:08.280 --> 00:19:14.080
And then I commit, I usually do commit-a-m with a message.

00:19:14.080 --> 00:19:20.860
I want to talk about these, that one a little bit, the dash-a, and then also push because

00:19:20.860 --> 00:19:23.520
I want that to be faster.

00:19:24.000 --> 00:19:29.360
So the dash-a, what that does is, that's that push.

00:19:29.360 --> 00:19:31.440
Anyway, I got, got these backwards.

00:19:31.440 --> 00:19:38.020
Anyway, the dash-a will just say, instead of having to, to stage a file or, or add them.

00:19:38.020 --> 00:19:41.600
So normally you have to add your changes and then you commit them.

00:19:41.600 --> 00:19:47.920
But I just want to, usually just want to commit everything that I've changed or delete

00:19:47.920 --> 00:19:48.380
it also.

00:19:48.380 --> 00:19:50.160
If I delete something, I want that to change.

00:19:50.160 --> 00:19:51.700
So the dash-a does that.

00:19:51.700 --> 00:19:53.280
I just learned about that recently.

00:19:53.540 --> 00:19:54.360
Oh, interesting.

00:19:54.360 --> 00:19:56.800
So you can basically skip the git add dot.

00:19:56.800 --> 00:19:57.240
Yeah.

00:19:57.240 --> 00:19:59.680
Or something equivalent to that, or the git add file names.

00:19:59.680 --> 00:19:59.940
Right.

00:19:59.940 --> 00:20:04.480
And the add dot is a little dangerous because it'll add everything, the unstaged stuff too.

00:20:04.480 --> 00:20:09.420
So if you have temporary files or, or just play, you know, you get a test file or a goofy

00:20:09.420 --> 00:20:10.860
file that you're just playing out with.

00:20:10.860 --> 00:20:12.400
I don't want to add that stuff.

00:20:12.500 --> 00:20:18.420
I, I intentionally add things that I want, or I mean, add, what's the other one?

00:20:18.420 --> 00:20:21.380
You know, uncommitted things.

00:20:21.380 --> 00:20:22.680
I don't usually want to add that.

00:20:22.680 --> 00:20:25.660
So the dash-a is nice that it doesn't do that.

00:20:26.060 --> 00:20:31.960
And then the last thing that I did was the global, there's another configuration change

00:20:31.960 --> 00:20:36.320
of global push dot default current.

00:20:36.800 --> 00:20:38.040
So weird.

00:20:38.040 --> 00:20:42.700
But what this does is that the current, there's a bunch of values for that.

00:20:42.700 --> 00:20:47.800
I'm going to have a link to the other show notes and the other, the documentation about

00:20:47.800 --> 00:20:49.840
all the different values in the show notes.

00:20:50.060 --> 00:20:54.500
But the, I like current because what that says is the branch that I'm using branch name I'm

00:20:54.500 --> 00:20:57.920
using now, just make that the one on online.

00:20:57.920 --> 00:21:02.900
So if you do, or upstream, if you don't do that, it says, oh, there's no upstream named

00:21:02.900 --> 00:21:05.460
this branch and you, you have to do this.

00:21:05.460 --> 00:21:06.120
I'm like, okay.

00:21:06.120 --> 00:21:08.020
And you can do it with push.

00:21:08.020 --> 00:21:12.740
You can do a dash you in push to make it automatically do that, but it's just for both.

00:21:12.740 --> 00:21:14.340
And I always wanted to do that.

00:21:14.340 --> 00:21:18.820
So anyway, that's, that's my new get workflow for simple stuff.

00:21:18.820 --> 00:21:19.720
I love it.

00:21:19.720 --> 00:21:20.160
Very nice.

00:21:20.160 --> 00:21:20.920
Yeah.

00:21:20.920 --> 00:21:25.300
I really liked that, that, that current having to do that, all that extra typing, even with

00:21:25.300 --> 00:21:26.740
autocomplete is just annoying.

00:21:26.740 --> 00:21:27.580
Yeah.

00:21:27.580 --> 00:21:28.800
So, yeah.

00:21:28.800 --> 00:21:30.540
Brian S.

00:21:30.540 --> 00:21:32.200
It sounds like you use get a lot.

00:21:32.200 --> 00:21:36.940
What's your view of source control from a chemical engineer perspective?

00:21:36.940 --> 00:21:41.560
Like in that ecosystem and that, that environment, how do people view this kind of stuff?

00:21:41.560 --> 00:21:48.380
they don't basically, I mean, you know, it, it, anyone who's, who's familiar with

00:21:49.380 --> 00:21:52.740
with the, you know, much development probably uses it.

00:21:52.740 --> 00:21:57.700
Some, actually there's a 3d physics modeling, multi-physics modeling tool, console that just

00:21:57.700 --> 00:22:01.600
added a, source control like feature into it.

00:22:01.600 --> 00:22:05.000
So it's, it's starting, you know, the data reproducibility and the history

00:22:05.000 --> 00:22:07.320
tracking has started to become more of a thing.

00:22:07.320 --> 00:22:13.700
but yeah, it's, it's very often the, you know, V2, V3, 2020.

00:22:13.700 --> 00:22:14.140
2020.

00:22:14.140 --> 00:22:15.760
V3, V3.

00:22:15.760 --> 00:22:16.320
V3.

00:22:16.320 --> 00:22:17.140
Final.

00:22:17.140 --> 00:22:17.780
Final.

00:22:17.780 --> 00:22:18.040
Final.

00:22:18.480 --> 00:22:18.900
Yeah.

00:22:18.900 --> 00:22:18.980
Yeah.

00:22:18.980 --> 00:22:24.560
So, I mean, you know, I have, you know, I have blog posts churning about strategies

00:22:24.560 --> 00:22:30.200
for, version control on, data analysis code.

00:22:30.200 --> 00:22:35.440
because of the reproducibility and needing to, to, to track environments precisely for

00:22:35.440 --> 00:22:37.120
reproducibility at a point in the past.

00:22:37.840 --> 00:22:42.960
And, you know, tagging, tagging commits for, you know, just like, oh, I, this, you know,

00:22:42.960 --> 00:22:46.660
basically every time I run the code, I need to know what the state of it was.

00:22:46.660 --> 00:22:50.920
And, and the tooling is not that great for doing, doing that.

00:22:50.920 --> 00:22:51.900
At least I haven't found much.

00:22:51.900 --> 00:22:54.380
So, it's still evolving, I think.

00:22:54.380 --> 00:22:55.440
Indeed.

00:22:55.440 --> 00:22:56.300
Okay, cool.

00:22:56.300 --> 00:23:03.220
Alvaro points out at work, they have a project with 6,000 lines of, in an INI final that INI

00:23:03.220 --> 00:23:04.740
might be just what they need.

00:23:04.740 --> 00:23:07.300
That sounds like, that sounds like a lot.

00:23:07.300 --> 00:23:11.380
You definitely have to, you know, you have to, you have to proof them afterwards because,

00:23:11.380 --> 00:23:15.220
you know, there, there may be some stuff that doesn't, translate cleanly, but yeah.

00:23:15.220 --> 00:23:16.100
Yeah.

00:23:16.100 --> 00:23:19.700
We need a Toml to INI and if you can round trip it and it's the same, then you're good to go.

00:23:19.700 --> 00:23:22.900
Yeah.

00:23:22.900 --> 00:23:24.780
Don't know if that'll work.

00:23:24.780 --> 00:23:26.860
Keep your sanity.

00:23:26.860 --> 00:23:27.440
All right.

00:23:27.440 --> 00:23:31.660
This next one's a quick one for me, but it'll be useful for people who are working with

00:23:31.660 --> 00:23:33.080
JSON web tokens.

00:23:33.920 --> 00:23:41.380
So JSON web tokens are a thing that you can exchange with maybe a distributed login system.

00:23:41.380 --> 00:23:45.520
So instead of using like an API key that you just pass around all the time, you could say,

00:23:45.520 --> 00:23:50.460
I'm going to either share a certificate or somehow log into some other system and I'll

00:23:50.460 --> 00:23:55.820
get back this token that I can share on to other places to communicate who I am, communicate

00:23:55.820 --> 00:23:59.460
what roles or permissions I should be granted and so on.

00:23:59.840 --> 00:24:05.820
So if you work in that world, you work in a world of dealing with cryptographic signatures

00:24:05.820 --> 00:24:08.600
and picky algorithms and stuff like that.

00:24:08.600 --> 00:24:11.940
So I just wanted to give a shout out to JWT.io.

00:24:11.940 --> 00:24:17.420
So this is a place that allows you to decode, verify and debug JWTs.

00:24:17.420 --> 00:24:18.520
It's pretty cool.

00:24:18.520 --> 00:24:24.420
So you come down here and what you do is you put in some encoded token and you say, which

00:24:24.420 --> 00:24:27.620
algorithm of the encryption algorithms are using.

00:24:27.620 --> 00:24:33.480
And then what pops out is the separated JSON result that says, here's the header.

00:24:33.480 --> 00:24:37.780
It says what algorithm and what type it is, what version of JWT and so on.

00:24:37.780 --> 00:24:42.000
And then what the actual data was like, this person is a subscriber.

00:24:42.000 --> 00:24:43.260
Their name is John Doe.

00:24:43.260 --> 00:24:45.260
I shouldn't scroll it because it doesn't seem to work.

00:24:45.820 --> 00:24:50.780
And then here's like the signature and whether or not the signature was verified and stuff

00:24:50.780 --> 00:24:51.200
like that.

00:24:51.200 --> 00:24:53.100
So I think that's pretty cool.

00:24:53.100 --> 00:24:57.280
You can hit share JWT and it'll just copy that.

00:24:57.280 --> 00:24:58.300
You can sit in along.

00:24:58.300 --> 00:25:02.120
But anyway, I think if you're working with stuff, this might be pretty handy.

00:25:02.120 --> 00:25:08.140
And while you're at it, there's somewhere in here, the libraries, you can say, see the JWT

00:25:08.140 --> 00:25:08.720
libraries.

00:25:08.720 --> 00:25:11.820
And let me make that smaller ish.

00:25:12.300 --> 00:25:14.640
So the way it shows, it's a little bit weird.

00:25:14.640 --> 00:25:18.120
It has the technology and then a whole bunch of checklists.

00:25:18.120 --> 00:25:20.800
And then if you go down to the bottom, you can see the actual package name.

00:25:20.800 --> 00:25:23.420
So like there's a bunch of .NET ones here.

00:25:23.420 --> 00:25:24.600
Don't care about those.

00:25:24.600 --> 00:25:29.300
But the Python ones are down here and says, who's created them, right?

00:25:29.300 --> 00:25:32.720
Like CMO source or Michael Davis.

00:25:32.720 --> 00:25:38.580
And then this one's called Python Jose JW crypto or PI JW.

00:25:38.580 --> 00:25:42.040
And it shows you which algorithms are supported and how it works and so on.

00:25:42.840 --> 00:25:45.800
So I think this is pretty cool if you're going to work with these things.

00:25:45.800 --> 00:25:46.680
What do you think?

00:25:46.680 --> 00:25:51.260
I don't have a lot of expertise with authentication and tokens of this sort.

00:25:51.260 --> 00:25:56.460
How is this different from something like macaroons where it's more like an advanced cookie?

00:25:56.460 --> 00:25:58.920
Is this separate from the browser or?

00:25:59.980 --> 00:26:03.260
This is done in several ways, I think.

00:26:03.260 --> 00:26:07.040
So you can go like to a federated identity provider.

00:26:07.040 --> 00:26:14.180
So something like Auth0 or Microsoft Azure Active Directory or something like that.

00:26:14.180 --> 00:26:20.000
Or you can have your own identity provider from like identity servers, like one of these implementations.

00:26:20.780 --> 00:26:29.240
And basically it allows you to do single sign-on and federated sign-on across different platforms without just taking and using straight cookies.

00:26:29.240 --> 00:26:29.860
Okay.

00:26:29.860 --> 00:26:33.880
So it works both for APIs and for other types of apps.

00:26:33.880 --> 00:26:35.740
You can do it within an app or with an API.

00:26:35.940 --> 00:26:46.800
So like if I call an API, if I log in with me and I call an API and I want to communicate onto my identity onto the APIs that API is calling.

00:26:46.800 --> 00:26:50.120
You know, it's like those kinds of sort of more complicated scenarios.

00:26:50.120 --> 00:26:51.160
Gotcha.

00:26:51.160 --> 00:26:51.800
Yeah.

00:26:51.800 --> 00:26:52.660
Yeah.

00:26:53.120 --> 00:26:55.380
Anyway, JWT.io.

00:26:55.380 --> 00:26:56.160
Check it out.

00:26:56.160 --> 00:26:57.660
What do you got, Brian's again?

00:26:57.660 --> 00:26:59.040
Okay.

00:26:59.040 --> 00:27:07.280
For my second item, I'm going to appreciate the opportunity, Michael and Brian Okken, to do a little bit of self-promotion.

00:27:07.280 --> 00:27:13.060
I have a new project I'm calling Jupyter Temphars.

00:27:13.060 --> 00:27:17.220
So one of the really powerful things about, you know, Jupyter notebooks are great.

00:27:17.220 --> 00:27:19.020
You can do a whole lot with them.

00:27:19.020 --> 00:27:22.320
They're obviously being used everywhere, data science, scientific analysis.

00:27:22.960 --> 00:27:29.160
And one of the features of at least the Python kernel of Jupyter is that you have a global namespace that you work in.

00:27:29.160 --> 00:27:35.980
And this really adds to the power of it in some ways because everything you do in the notebook flows from one cell to another.

00:27:35.980 --> 00:27:38.000
You don't have to worry about shuttling things back and forth.

00:27:38.000 --> 00:27:52.800
But, you know, as has come up, you know, countless times here and elsewhere, you have namespace contamination problems where you accidentally assign something in one cell and then you foot on yourself because either, you know, you use something and have it.

00:27:52.800 --> 00:27:59.300
Have a typo and accidentally use something from another cell or something's lingering on and you have the same variable name in multiple cells.

00:27:59.300 --> 00:28:06.740
And all of a sudden, you know, you close down for the day and start back up and the whole worksheet blows up.

00:28:08.040 --> 00:28:12.640
And so what I put together is a notebook extension for Jupyter.

00:28:12.640 --> 00:28:17.800
It's based upon another library of mine, tempvars, which I need to freshen a bit.

00:28:17.800 --> 00:28:21.120
But this is a front-end extension for Jupyter.

00:28:22.320 --> 00:28:30.280
And so what the underlying library does is you import from tempvars, you import the capital tempvars context manager.

00:28:30.280 --> 00:28:32.700
Then I'll just define a variable here.

00:28:33.840 --> 00:28:45.180
And then in this cell, I've got as a context manager tempvars, and I declare to it, all right, anything, this syntax says anything that starts with T underscore is going to be treated as a temporary variable.

00:28:45.180 --> 00:28:56.220
And so when I run this, the first line is checks to see if T underscore A is in the namespace, and it's not because it's inside the temporary variables context.

00:28:56.600 --> 00:28:59.340
Then I assign it, and indeed, it assigns.

00:28:59.340 --> 00:29:04.300
And then when I pop out the back end, the previous value, 5, is now restored to it.

00:29:04.300 --> 00:29:14.260
So what this does is it makes sure that you don't have contamination coming into the cell, and anything you do in here is reverted to the prior state out the back end.

00:29:14.260 --> 00:29:17.240
So that's using the underlying library.

00:29:17.240 --> 00:29:22.460
But what I did, it's like, you know, okay, fine, it works, but you have to have this whole thing that you type out, and it's cumbersome.

00:29:22.780 --> 00:29:34.120
So what the Jupyter plugin, the Jupyter extension does is it lets you, you can turn on this toolbar for tags for each cell, and then if you define, go away.

00:29:34.120 --> 00:29:40.420
Then if you define a tag with this syntax, you can also do a tempvars end, but here tempvars start T underscore.

00:29:40.420 --> 00:29:44.980
Now, this variable will automatically be treated as a temporary variable.

00:29:44.980 --> 00:29:48.200
It's no longer in the namespace when you execute the cell.

00:29:48.200 --> 00:30:02.820
And what it's doing behind the scenes is it's actually taking the code, patching the execute functionality for the cell, and wrapping it in a tempvars context manager behind the scenes, so that anything you use in here, T underscore, is a temporary variable.

00:30:02.820 --> 00:30:07.100
You don't have to worry about it getting contamination from the rest of the namespace.

00:30:07.100 --> 00:30:10.140
And then just like the other, it's still there, yeah.

00:30:10.620 --> 00:30:10.860
Yeah.

00:30:10.860 --> 00:30:13.060
So it's brand new.

00:30:13.060 --> 00:30:15.020
0.1 is out on PyPI.

00:30:15.020 --> 00:30:22.220
The readme is, in order to satisfy the audience here, I have animated gifs.

00:30:22.220 --> 00:30:25.120
Are those screenshots on a UI tool?

00:30:25.120 --> 00:30:25.680
I love it.

00:30:25.680 --> 00:30:26.620
Yeah.

00:30:26.620 --> 00:30:28.520
Animated to boot.

00:30:29.660 --> 00:30:32.060
So readme has the user's instructions.

00:30:32.060 --> 00:30:40.140
It's on PyPI, just a pip install, Jupyter tempvars, and then I have a shortcut script to actually install the extension into your Jupyter environment.

00:30:40.140 --> 00:30:47.180
I have a number of features that could be added to it, different things that the underlying library could have added to it.

00:30:47.680 --> 00:30:53.620
But I'd really love it if anybody who is intrigued would try it out, find and report bugs, suggest features that you want.

00:30:53.620 --> 00:30:57.700
Because, you know, it's a small thing, but it can be a big problem.

00:30:57.700 --> 00:31:02.700
And if this could be at least a partial or substantial solution for people, that would be awesome.

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

00:31:03.520 --> 00:31:04.920
Yeah, nice work.

00:31:04.920 --> 00:31:05.540
This looks great.

00:31:05.540 --> 00:31:06.320
Those are good.

00:31:06.320 --> 00:31:15.180
Yeah, the problem of having variables shared across those things when you didn't intend them to be, so tricky in so many ways.

00:31:15.320 --> 00:31:21.780
I mean, Jupyter cells are like go-to statements with no traceability, right?

00:31:21.780 --> 00:31:26.740
Because you could run them down, then you could go back and run the one in the middle again, and then you could go run another.

00:31:26.740 --> 00:31:32.100
Except for just a little in and out numbering, you have no idea the order they ran in.

00:31:32.100 --> 00:31:32.760
Yeah.

00:31:32.760 --> 00:31:34.140
Notebook hygiene is really tricky.

00:31:34.140 --> 00:31:35.220
And yeah.

00:31:35.220 --> 00:31:38.100
Brian, I feel like I cut you off.

00:31:38.100 --> 00:31:38.640
We can say something.

00:31:38.640 --> 00:31:45.300
Oh, just he commented that to satisfy us, he's got, or the entire Python community has got animated GIFs.

00:31:45.300 --> 00:31:50.520
But to be fair, it's not just technical books and read me's.

00:31:50.520 --> 00:31:52.700
I don't use cookbooks that don't have pictures either.

00:31:52.700 --> 00:31:56.220
Yeah, that sounds good.

00:31:56.220 --> 00:32:00.220
I do read novels that don't have pictures, so it's not everything.

00:32:00.220 --> 00:32:05.700
I really hate the graphical novels that don't have pictures.

00:32:07.080 --> 00:32:08.140
Those are the worst.

00:32:08.140 --> 00:32:09.440
They're the worst.

00:32:09.440 --> 00:32:10.460
All right.

00:32:10.460 --> 00:32:11.500
Real-time follow-up.

00:32:11.500 --> 00:32:19.580
Brandon Brainer, former co-host here, says, this is talking about going back to why JWT over something like cookies.

00:32:19.860 --> 00:32:24.300
So imagine having something like auto zero when you log, maybe auth zero.

00:32:24.300 --> 00:32:28.520
When you log in, it gives you back this JWT, which has a timeout.

00:32:28.520 --> 00:32:30.160
The front end has this.

00:32:30.160 --> 00:32:31.260
It can send it to your API.

00:32:31.260 --> 00:32:35.900
And then also it has the signature that verifies it wasn't tampered with.

00:32:35.900 --> 00:32:40.560
And you can verify the sender because you can decrypt it and stuff like that.

00:32:40.560 --> 00:32:41.120
Okay.

00:32:41.120 --> 00:32:42.020
Better chain of custody.

00:32:42.020 --> 00:32:42.600
Okay.

00:32:43.180 --> 00:32:45.900
All that tricky cryptography stuff.

00:32:45.900 --> 00:32:52.200
Speaking of other things, extra things, you guys got some extras we should cover?

00:32:52.200 --> 00:32:54.880
I have a few, actually, some quick ones.

00:32:54.880 --> 00:32:55.760
All right.

00:32:55.760 --> 00:32:56.120
Bring it on.

00:32:56.120 --> 00:33:00.300
So we've got GitHub issues are finally live.

00:33:00.300 --> 00:33:04.740
So their Python issues are now on GitHub.

00:33:04.740 --> 00:33:06.680
We didn't jinx it this time.

00:33:06.680 --> 00:33:07.880
It really is there.

00:33:07.880 --> 00:33:09.240
So enough said.

00:33:09.240 --> 00:33:12.760
I was, you know, I've used lorem ipsum before.

00:33:13.100 --> 00:33:15.080
I think everybody doing front end stuff has.

00:33:15.080 --> 00:33:16.640
But I didn't know.

00:33:16.640 --> 00:33:21.820
There's a cool page like lorem ipsum.com that has a translation.

00:33:21.820 --> 00:33:24.400
So you can read what it means.

00:33:24.400 --> 00:33:29.840
At least a 1500s, 1914 translation.

00:33:29.840 --> 00:33:33.120
So it's sort of an interesting read.

00:33:33.120 --> 00:33:36.280
I won't get into it here, but it's worth a read if you're curious.

00:33:36.280 --> 00:33:40.540
And then one of the things we do sometimes at the end is funny stuff.

00:33:41.220 --> 00:33:46.100
And one of the things we've covered is various O'Reilly covers.

00:33:46.100 --> 00:33:51.040
So I found this Dev2 O'Reilly cover generator.

00:33:51.040 --> 00:33:52.120
I didn't know where it was.

00:33:52.120 --> 00:33:53.460
Somebody had.

00:33:53.460 --> 00:33:54.320
Oh, nice.

00:33:54.320 --> 00:33:55.680
And you can just make up your own.

00:33:55.680 --> 00:33:57.080
So I made one up.

00:33:57.080 --> 00:33:59.260
Passed it around last night.

00:33:59.900 --> 00:34:01.580
So it's kind of a fun thing.

00:34:01.580 --> 00:34:02.800
Yeah.

00:34:02.800 --> 00:34:05.420
I pulled that from the show notes and passed it on to my friends.

00:34:05.420 --> 00:34:06.780
And they have run with it.

00:34:06.780 --> 00:34:07.440
They're delighted.

00:34:07.440 --> 00:34:08.400
Awesome.

00:34:08.400 --> 00:34:09.780
100% test coverage.

00:34:09.780 --> 00:34:11.220
You need to test with no asserts.

00:34:11.220 --> 00:34:12.240
At least CI is happy.

00:34:13.840 --> 00:34:14.620
So anyway.

00:34:14.620 --> 00:34:15.540
This is awesome.

00:34:15.540 --> 00:34:16.340
How about you?

00:34:16.340 --> 00:34:17.060
Got any extras?

00:34:17.060 --> 00:34:19.640
I have a few.

00:34:19.640 --> 00:34:23.220
Now, your mention made me add a third one.

00:34:23.220 --> 00:34:24.880
Or another one, rather.

00:34:24.880 --> 00:34:26.540
Let's go here.

00:34:27.180 --> 00:34:29.200
So hipster ipsum.

00:34:29.200 --> 00:34:36.200
If you just need a little more pizzazz in that lorem ipsum, and you don't want people asking

00:34:36.200 --> 00:34:41.240
questions, this is a hipster ipsum at hipsum.co.

00:34:41.240 --> 00:34:42.260
This is a generator.

00:34:42.260 --> 00:34:43.840
You can give it your flavor.

00:34:43.840 --> 00:34:48.420
So you can go over here and say, like, how many paragraphs?

00:34:48.660 --> 00:34:49.840
We only need two paragraphs.

00:34:49.840 --> 00:34:52.640
And hipster neat, or you can do it with a shot of Latin.

00:34:52.640 --> 00:34:53.520
Nice.

00:34:53.520 --> 00:34:56.420
And it starts out with, I'm baby.

00:34:56.420 --> 00:34:57.420
Gentrified.

00:34:57.420 --> 00:34:57.900
Tumblr.

00:34:57.900 --> 00:34:58.420
Butcher.

00:34:58.420 --> 00:34:59.100
Cronut.

00:34:59.100 --> 00:34:59.880
Succulents.

00:34:59.880 --> 00:35:01.140
Poor locos.

00:35:01.140 --> 00:35:01.640
Subway.

00:35:01.640 --> 00:35:01.960
Tile.

00:35:01.960 --> 00:35:02.500
Food truck.

00:35:02.500 --> 00:35:03.060
Letterpress.

00:35:03.060 --> 00:35:03.720
Tote bag.

00:35:03.720 --> 00:35:04.180
Toe fu.

00:35:04.180 --> 00:35:05.820
Anyway.

00:35:05.820 --> 00:35:08.400
Doesn't flow quite the same as the Latin, but it works.

00:35:08.400 --> 00:35:09.680
Yeah, exactly.

00:35:09.680 --> 00:35:11.120
You got the fashion accent and all that.

00:35:11.120 --> 00:35:12.860
So anyway, that one's kind of fun.

00:35:12.860 --> 00:35:14.760
More seriously, quick shout out.

00:35:14.940 --> 00:35:21.180
Worked with Christos Meskus from the Microsoft Identity team, speaking of JWTs.

00:35:21.180 --> 00:35:26.260
And he and I just put together a course, Secure APIs with FastAPI in the Microsoft Identity

00:35:26.260 --> 00:35:26.620
Platform.

00:35:26.620 --> 00:35:32.440
So people can check that out if they want to do JWT and other types of federated identity

00:35:32.440 --> 00:35:33.700
with FastAPI.

00:35:33.700 --> 00:35:36.160
That's a fun course we just launched yesterday.

00:35:36.160 --> 00:35:36.860
Nice.

00:35:36.860 --> 00:35:37.360
Excellent.

00:35:37.360 --> 00:35:37.820
Cool.

00:35:37.820 --> 00:35:38.780
Yeah.

00:35:38.780 --> 00:35:39.200
Thanks.

00:35:39.200 --> 00:35:40.220
And then a quick shout out.

00:35:40.940 --> 00:35:45.320
Seth sent over this thing called Python Virtual ENV for Windows Sorta-ish.

00:35:45.320 --> 00:35:54.040
And it's this idea to bring some of the Py ENV virtual environment features to Windows.

00:35:54.040 --> 00:35:59.860
I haven't really played with this, but I guess some of the features there for the virtual environments

00:35:59.860 --> 00:36:04.600
don't work on Windows, but his sort of plug-in script does.

00:36:04.600 --> 00:36:09.820
So you can check that out, which I think will be helpful for some people, for the Windows

00:36:09.820 --> 00:36:10.160
people.

00:36:10.160 --> 00:36:12.160
And, you know, that's it for my items.

00:36:12.160 --> 00:36:13.880
Brian Skin, do you got anything you want to share as well?

00:36:13.880 --> 00:36:14.540
Yep.

00:36:14.540 --> 00:36:15.600
I've got a few quick ones.

00:36:15.600 --> 00:36:24.160
First of all, as many probably know, Eva stepped down, Jalaska stepped down as the executive

00:36:24.160 --> 00:36:25.180
director of the PSF.

00:36:25.180 --> 00:36:27.340
I believe it was at the end of last year.

00:36:28.120 --> 00:36:30.940
PSF has found their new executive director, Deb Nicholson.

00:36:30.940 --> 00:36:34.700
So congratulations to all there.

00:36:34.700 --> 00:36:36.580
Yeah.

00:36:36.580 --> 00:36:37.020
Congratulations.

00:36:37.020 --> 00:36:38.140
Yeah.

00:36:38.140 --> 00:36:42.180
So, and more generally, the PSF has been hiring lately.

00:36:42.180 --> 00:36:46.120
Last year, there was the packaging project manager, Shamika Mohanan.

00:36:46.120 --> 00:36:48.440
And the developer in residence.

00:36:48.440 --> 00:36:49.300
Absolutely.

00:36:49.300 --> 00:36:55.160
They also, there was a posting for an infrastructure engineer to assist with the facilities that

00:36:55.160 --> 00:36:57.500
the link now 404s.

00:36:57.500 --> 00:36:58.620
So maybe they've made their hire.

00:36:58.620 --> 00:36:59.120
I don't know.

00:36:59.120 --> 00:37:01.500
But the posting was there and now it's not.

00:37:01.500 --> 00:37:07.840
And then actually in the steering council notes released for March, there is beginnings of

00:37:07.840 --> 00:37:12.340
discussion about hiring a second developer in residence, which would be terrific.

00:37:12.340 --> 00:37:13.360
So.

00:37:13.360 --> 00:37:14.540
Yeah.

00:37:14.540 --> 00:37:16.220
It seems like it's been a big success.

00:37:16.220 --> 00:37:18.720
So getting someone to help Łukasz out would be really great.

00:37:18.720 --> 00:37:19.520
Definitely.

00:37:19.520 --> 00:37:21.600
Two more quick things.

00:37:21.600 --> 00:37:25.140
One, PyOhio, the regional Ohio conference, the call for

00:37:25.140 --> 00:37:26.060
proposals is open.

00:37:26.060 --> 00:37:28.160
It's going to be a fully virtual conference again this year.

00:37:28.160 --> 00:37:32.620
So anybody who is interested, submit, submit, submit.

00:37:32.620 --> 00:37:34.540
Nice.

00:37:34.540 --> 00:37:39.340
And then, and then one interesting tidbit relevant to, you know, we have to talk about

00:37:39.340 --> 00:37:40.800
Pydantic at least once, I think.

00:37:40.800 --> 00:37:41.160
Right.

00:37:41.160 --> 00:37:44.440
Along with Anthony Shaw and Wilma Guggen.

00:37:45.200 --> 00:37:46.480
This was a couple of days ago.

00:37:46.480 --> 00:37:59.100
Samuel Colvin of Pydantic fame posted this somewhat cryptic tweet here showing over a tenfold increase in speed or some sort of Pydantic features here.

00:37:59.880 --> 00:38:03.800
So I don't believe the, you know, this is actually dropped yet.

00:38:03.800 --> 00:38:07.020
This is all I know, but this looks pretty exciting.

00:38:07.020 --> 00:38:10.280
The magic, magical Pydantic core is coming.

00:38:10.280 --> 00:38:11.400
Yes.

00:38:11.400 --> 00:38:12.040
Cool.

00:38:12.040 --> 00:38:13.740
I have no idea what it is, but very exciting.

00:38:13.740 --> 00:38:15.460
But I want one.

00:38:15.460 --> 00:38:18.380
Ten times faster.

00:38:18.380 --> 00:38:20.140
Maybe it's the Pydantic pony.

00:38:20.140 --> 00:38:22.380
The Pydantic unicorn.

00:38:22.660 --> 00:38:23.140
No, that's great.

00:38:23.140 --> 00:38:25.280
All right.

00:38:25.280 --> 00:38:29.460
I got no more extras, but I have some jokes.

00:38:29.460 --> 00:38:30.080
Yay.

00:38:30.080 --> 00:38:30.880
Bring them.

00:38:30.880 --> 00:38:31.880
All right.

00:38:31.880 --> 00:38:33.640
I think this first one might be from you, Brian Skin.

00:38:33.640 --> 00:38:34.140
Is that right?

00:38:34.140 --> 00:38:35.220
Yeah.

00:38:35.220 --> 00:38:35.920
I can't.

00:38:35.920 --> 00:38:37.380
You want to tell us this joke here?

00:38:37.380 --> 00:38:38.080
Give us this one.

00:38:38.080 --> 00:38:38.240
Yeah.

00:38:38.240 --> 00:38:46.620
So it's a riff off of the various elements of a business enterprise trying to bring a product to a customer that's what they actually want.

00:38:46.620 --> 00:38:52.000
You know, with the tree and the swing and the armchair swing and the swing with no ropes and that.

00:38:52.500 --> 00:38:54.940
This one is more cat directed.

00:38:54.940 --> 00:38:57.160
And the left panel says product features.

00:38:57.160 --> 00:39:04.100
And it shows this really nice multi-level cat tower with beds and scratching posts and, you know, very attractive.

00:39:04.100 --> 00:39:06.180
And on the right, it says user needs.

00:39:06.180 --> 00:39:09.680
And it has a cat peeking up out of a cardboard box.

00:39:09.680 --> 00:39:10.920
Exactly.

00:39:10.920 --> 00:39:13.640
Slightly over designed, would you say?

00:39:13.640 --> 00:39:15.320
Just a bit.

00:39:15.320 --> 00:39:17.760
And, you know, I think there was somebody responded to that.

00:39:17.760 --> 00:39:20.540
There's a tweet lower down saying, this is exactly my life.

00:39:20.620 --> 00:39:25.100
I have an untouched, you know, cat tree in the corner and all the cat sits in is the box.

00:39:25.100 --> 00:39:25.500
So.

00:39:26.280 --> 00:39:27.600
This is also true for children.

00:39:27.600 --> 00:39:29.360
A lot of times the box is the best part.

00:39:29.360 --> 00:39:30.160
Definitely.

00:39:30.160 --> 00:39:31.160
All right.

00:39:31.160 --> 00:39:35.580
I brought two more for us just because they're both, they're all short and I thought this would be fun.

00:39:35.580 --> 00:39:39.840
So here's one that says junior developer.

00:39:39.840 --> 00:39:41.920
How did you find the bug so fast?

00:39:42.240 --> 00:39:45.040
And it has a senior developer who has this sort of lion meme.

00:39:45.040 --> 00:39:47.620
I was there when it was written.

00:39:47.620 --> 00:39:51.900
Lion witch and the wardrobe reference there, I think.

00:39:51.900 --> 00:39:53.420
I think so.

00:39:53.420 --> 00:39:53.820
All right.

00:39:53.820 --> 00:39:56.780
And then this one really, I really appreciate this one.

00:39:56.780 --> 00:40:03.060
So there's two sort of time-lapsed Google search pages with text overlaid on it.

00:40:03.060 --> 00:40:05.920
And it says 831 C++ hello world.

00:40:05.920 --> 00:40:08.520
833 alternatives to C++.

00:40:12.040 --> 00:40:14.040
And of course, it's complete with a top.

00:40:14.040 --> 00:40:16.720
STD colon colon C out.

00:40:16.720 --> 00:40:18.160
Less than, less than hello world.

00:40:18.160 --> 00:40:19.740
Less than, less than standard out.

00:40:19.740 --> 00:40:20.720
Colon colon end out.

00:40:20.720 --> 00:40:26.080
You know, the formal C++ style of like S pre-dum or pre-dum, whatever.

00:40:26.080 --> 00:40:27.300
Yeah.

00:40:27.300 --> 00:40:29.500
Hello, C++ hello world.

00:40:29.500 --> 00:40:31.000
Alternatives to C++.

00:40:31.000 --> 00:40:32.520
All right.

00:40:32.520 --> 00:40:33.720
I just leave it with that, you guys.

00:40:33.720 --> 00:40:38.540
I had one semester of C++ in college and I don't miss the compiler errors at all.

00:40:39.080 --> 00:40:39.340
No.

00:40:39.340 --> 00:40:40.260
Yeah.

00:40:40.260 --> 00:40:42.260
C++ is some, some wild stuff.

00:40:42.260 --> 00:40:43.680
I used to work in it somewhat.

00:40:43.680 --> 00:40:49.280
I did a couple of years of professional C++ and it was okay, but a lot, a lot of craziness.

00:40:49.280 --> 00:40:50.060
Yeah.

00:40:50.060 --> 00:40:52.060
You don't have to use the crazy parts though.

00:40:52.060 --> 00:40:59.840
So with this, at least in the embedded world, we use, it's, it's C++, but we just selectively

00:40:59.840 --> 00:41:00.880
use the cool features.

00:41:00.880 --> 00:41:02.440
Mostly it looks like C.

00:41:02.440 --> 00:41:03.760
Yeah.

00:41:03.760 --> 00:41:07.200
I think C++ is getting a big update as well, isn't it?

00:41:07.200 --> 00:41:08.140
I think there's.

00:41:08.240 --> 00:41:09.240
There's regular updates.

00:41:09.240 --> 00:41:11.420
There's so many new things coming on.

00:41:11.420 --> 00:41:15.980
It, it was fairly stagnant for like, like decades.

00:41:15.980 --> 00:41:19.440
And then, but in the last 10 years, there's been a lot of new changes.

00:41:19.440 --> 00:41:24.200
I feel like I've, I've read people griping that they're making C++ too much like Python

00:41:24.200 --> 00:41:24.880
or something.

00:41:24.880 --> 00:41:28.200
Adding, I don't know exactly what that means, but, but.

00:41:28.200 --> 00:41:31.240
We propose taking away the semicolons.

00:41:31.240 --> 00:41:31.540
What?

00:41:34.100 --> 00:41:34.780
Too much.

00:41:34.780 --> 00:41:35.380
Too much.

00:41:35.380 --> 00:41:37.600
I could definitely get rid of the curly brackets.

00:41:37.600 --> 00:41:38.740
So.

00:41:38.740 --> 00:41:39.120
Yeah.

00:41:39.120 --> 00:41:39.380
Yeah.

00:41:39.380 --> 00:41:39.540
Yeah.

00:41:39.540 --> 00:41:41.420
There's a lot of parentheses when you don't really need them.

00:41:41.420 --> 00:41:41.900
So.

00:41:41.900 --> 00:41:42.620
Yeah.

00:41:42.620 --> 00:41:43.260
All right.

00:41:43.260 --> 00:41:45.400
Well, Brian Okken, thank you as always.

00:41:45.400 --> 00:41:47.480
And Brian Skin, thanks for being here.

00:41:47.480 --> 00:41:47.800
Thank you.

00:41:47.800 --> 00:41:48.640
Thanks.

00:41:48.640 --> 00:41:49.700
Thanks for having me.

00:41:49.700 --> 00:41:50.540
You bet.

00:41:50.540 --> 00:41:51.160
Bye everyone.

00:41:51.160 --> 00:41:51.360
Bye.