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:10.260
This is episode 339, recorded June 6th, 2023.

00:00:10.260 --> 00:00:11.460
Is it the 6th? Yeah.

00:00:11.460 --> 00:00:12.860
I am Brian Okken.

00:00:12.860 --> 00:00:13.900
I'm Michael Kennedy.

00:00:13.900 --> 00:00:18.820
Today's episode is sponsored by InfluxDB from Influx Data.

00:00:18.820 --> 00:00:22.860
Thank you, and we'll talk about them more later in the show.

00:00:22.860 --> 00:00:28.300
If you want to reach any of us or the show, we have a contact form, of course.

00:00:28.300 --> 00:00:36.760
And then also mkennedy at Fosstodon and Brian Okken and Python Bytes, all Fosstodon locations.

00:00:36.760 --> 00:00:44.040
If you're listening to us on a recording or on YouTube or on a podcast player,

00:00:44.040 --> 00:00:49.960
please join us on YouTube at pythonbytes.fm/live, at least occasionally,

00:00:49.960 --> 00:00:52.820
because it's fun to have people hanging around while we're recording.

00:00:52.820 --> 00:00:57.440
It's usually Tuesdays at 11, and you can watch older versions there, too.

00:00:57.440 --> 00:01:01.140
So let's kick it off with something stacky.

00:01:01.140 --> 00:01:02.200
Something stacky.

00:01:02.200 --> 00:01:03.820
You feeling like some pancakes?

00:01:03.820 --> 00:01:05.140
A stack of pancakes?

00:01:05.140 --> 00:01:05.580
Yeah.

00:01:05.580 --> 00:01:06.840
How about a PyStack?

00:01:07.040 --> 00:01:13.600
So the reason I was late to this recording, Brian, was I was just talking with Pablo and Matt,

00:01:13.600 --> 00:01:16.940
maintainers and creators of PyStack.

00:01:16.940 --> 00:01:18.040
Have you heard of PyStack?

00:01:18.040 --> 00:01:18.920
I have not.

00:01:19.360 --> 00:01:26.820
So PyStack is a tool that uses forbidden magic to let people inspect the stack frames of a running Python process,

00:01:26.820 --> 00:01:32.580
or even a core dump that was captured from a Python process that crashed,

00:01:32.580 --> 00:01:35.600
helping you quickly and easily learn what it's doing.

00:01:35.600 --> 00:01:36.580
How cool is that?

00:01:36.580 --> 00:01:37.300
Pretty good.

00:01:37.300 --> 00:01:37.800
Yeah.

00:01:37.920 --> 00:01:38.780
So here's the deal.

00:01:38.780 --> 00:01:39.280
Yeah.

00:01:39.280 --> 00:01:39.920
So here's the deal.

00:01:39.920 --> 00:01:41.620
I've got a Python app.

00:01:41.620 --> 00:01:44.500
This is especially important if you have mixed code.

00:01:44.620 --> 00:01:50.680
So if you're talking with C, C++, Rust, those kinds of things, because it will cross those boundaries as well.

00:01:50.680 --> 00:01:52.360
But let's just say pure Python even.

00:01:52.360 --> 00:01:59.000
I've got a Python web app, and I go to the server, and I try to connect to it.

00:01:59.000 --> 00:02:00.120
It won't really respond.

00:02:00.120 --> 00:02:01.860
It connects, but it just hangs.

00:02:01.860 --> 00:02:02.760
Go to the server.

00:02:02.760 --> 00:02:04.000
It's not 100% CPU.

00:02:04.000 --> 00:02:08.240
In fact, it's 0% CPU usage, so it's not spinning and busy.

00:02:08.240 --> 00:02:09.500
What the heck is it doing?

00:02:09.500 --> 00:02:10.580
Is it a deadlock?

00:02:10.580 --> 00:02:12.560
Is it waiting on the database?

00:02:12.560 --> 00:02:13.500
What is going on?

00:02:13.500 --> 00:02:18.400
So what you can do, even in production, you can go up to that process, and you can say,

00:02:18.400 --> 00:02:24.880
give me a snapshot of exactly what this process is doing.

00:02:24.880 --> 00:02:27.540
And what you see is you see a call stack.

00:02:27.540 --> 00:02:30.320
Let me find an example here of what it looks like.

00:02:30.320 --> 00:02:31.060
It looks like this.

00:02:31.060 --> 00:02:32.080
Silly zoom.

00:02:32.640 --> 00:02:38.160
So what you'll see is like, hey, on this particular thread, we're seeing on this file,

00:02:38.160 --> 00:02:40.100
on this line, this function was called.

00:02:40.100 --> 00:02:41.020
And check it out.

00:02:41.020 --> 00:02:44.000
It even has the arguments passed to the function.

00:02:44.000 --> 00:02:44.740
Oh, wow.

00:02:44.740 --> 00:02:45.220
That's nice.

00:02:45.220 --> 00:02:45.720
Yeah.

00:02:45.720 --> 00:02:49.600
And then you can see what function that's calling with the arguments passed to it, and

00:02:49.600 --> 00:02:51.920
what function that's calling with the arguments passed to it.

00:02:51.920 --> 00:02:56.440
You can do this on a running function without altering its behavior, basically.

00:02:56.440 --> 00:02:57.960
It doesn't inject any code or anything.

00:02:57.960 --> 00:03:02.300
The only behavior it alters is that it freezes it for a second, potentially, which could,

00:03:02.460 --> 00:03:03.760
I guess, make something time out.

00:03:03.760 --> 00:03:07.980
But other than that, you could do this in production even to see what's happening.

00:03:07.980 --> 00:03:15.380
And what's extra cool is if even if the process crashes, you can grab the core dump and it will

00:03:15.380 --> 00:03:18.820
go back and analyze that as if it was a running process.

00:03:18.820 --> 00:03:20.080
Oh, that's pretty cool.

00:03:20.360 --> 00:03:20.540
Yeah.

00:03:20.540 --> 00:03:22.760
So there are a ton of features.

00:03:22.760 --> 00:03:26.160
If you can get to the section where it says, what can PyStack do?

00:03:26.160 --> 00:03:29.840
So it works with both running processes and core dump files.

00:03:29.840 --> 00:03:36.560
It'll tell you if a thread is currently holding onto the gill, if it's waiting to acquire it or

00:03:36.560 --> 00:03:37.640
it's trying to drop it.

00:03:37.880 --> 00:03:43.520
So you can, you know, one of the examples that Matt and Pablo spoke about was they were calling

00:03:43.520 --> 00:03:45.420
into custom C code.

00:03:45.420 --> 00:03:46.860
That was a Python extension.

00:03:46.860 --> 00:03:52.920
That call that was coming in, that was, that was acquiring the GIL.

00:03:52.920 --> 00:03:58.760
But then there in the destructor for some object that it was waiting for it to go away, it

00:03:58.760 --> 00:04:02.400
was like waiting on a background thread to do some cleanup.

00:04:02.400 --> 00:04:06.920
That background thread also was trying to do a callback to let Python know what's happening

00:04:06.920 --> 00:04:09.720
and was trying to acquire the gill, but it couldn't.

00:04:09.720 --> 00:04:14.320
So because the one that was waiting on it was already holding the GIL and wasn't going to

00:04:14.320 --> 00:04:15.960
give it up because that's how the GIL works.

00:04:15.960 --> 00:04:16.180
Right.

00:04:16.440 --> 00:04:22.940
So you can use it for like these deadlock situations and see if it's running a GC, you

00:04:22.940 --> 00:04:30.740
can see both the call stack in intertwined for both Python and C or C++ or Rust altogether.

00:04:30.740 --> 00:04:37.020
And it'll even do things like go out and find the debugging symbols for say your Python runtime.

00:04:37.020 --> 00:04:42.380
Even if you don't have it, it can potentially go and get those and bring that extra information

00:04:42.380 --> 00:04:42.660
in.

00:04:42.660 --> 00:04:45.080
What else should we see here?

00:04:45.360 --> 00:04:46.900
Safe to use on running processes.

00:04:46.900 --> 00:04:54.080
You can run it on a process in memory running process without pausing it at all, which will

00:04:54.080 --> 00:04:56.240
minimize the impact it might have.

00:04:56.240 --> 00:05:00.640
But it'll also potentially have like not 100% precise information.

00:05:00.640 --> 00:05:01.500
It could be out of sync.

00:05:01.500 --> 00:05:07.940
So yeah, it even works on like corrupted process core dumps because the process died because it

00:05:07.940 --> 00:05:09.700
got corrupted memory or something.

00:05:09.700 --> 00:05:14.060
So if you've thought about GDB or some of these other types of things because you're like,

00:05:14.060 --> 00:05:17.260
oh my gosh, I've got to figure out why this crashed.

00:05:17.260 --> 00:05:17.980
Here's a core dump.

00:05:17.980 --> 00:05:19.040
Let me start looking at it.

00:05:19.040 --> 00:05:21.520
Well, PyStack may be the thing you want.

00:05:21.520 --> 00:05:22.500
That's pretty cool.

00:05:22.500 --> 00:05:25.420
And one final bonus for you, Brian.

00:05:25.420 --> 00:05:28.620
Suppose you have a pytest test.

00:05:28.620 --> 00:05:30.120
This one.

00:05:30.120 --> 00:05:38.800
Suppose you have a pytest test and that test while it's running deadlocks or is very slow or

00:05:38.800 --> 00:05:43.620
something like that, you can have PyStack as a pytest plugin.

00:05:43.620 --> 00:05:46.920
And then when you run your code, how do you do it?

00:05:46.920 --> 00:05:49.360
I think it's you just, where is it?

00:05:49.360 --> 00:05:55.780
You know, but anyway, when you run it, you can say basically analyze my test.

00:05:55.780 --> 00:06:00.800
And here's a certain threshold to consider a failure and take a snapshot of that and so on.

00:06:00.800 --> 00:06:01.200
Yeah.

00:06:01.300 --> 00:06:05.780
I like the threshold notion of just like, if it gets this bad, tell me why.

00:06:05.780 --> 00:06:06.340
Yeah.

00:06:06.340 --> 00:06:06.980
Nice.

00:06:06.980 --> 00:06:07.720
Cool.

00:06:07.720 --> 00:06:07.900
Cool.

00:06:07.900 --> 00:06:12.940
So if people want the full details, I suppose they could go check out the YouTube live stream

00:06:12.940 --> 00:06:17.300
channel for Talk Python now or in three weeks, they could listen to the podcast.

00:06:17.540 --> 00:06:20.080
But super, super cool tool.

00:06:20.080 --> 00:06:24.560
If you've got a process that is crashing, that is hanging, maybe it's doing this in production

00:06:24.560 --> 00:06:29.280
and it only gets deadlocked after, you know, 12 hours of being hammered on.

00:06:29.280 --> 00:06:32.580
You can't easily just debug it locally and get this to happen.

00:06:32.580 --> 00:06:36.740
Or if it's completely crashed and you have a core dump, this, these guys are doing lots

00:06:36.740 --> 00:06:38.180
of magic to make it possible.

00:06:38.180 --> 00:06:38.820
Nice.

00:06:38.820 --> 00:06:39.300
Yep.

00:06:39.300 --> 00:06:39.640
Cool.

00:06:40.640 --> 00:06:44.940
Well, next, I kind of want to give everybody some news.

00:06:44.940 --> 00:06:49.820
So last year, actually, it was in July last year.

00:06:49.820 --> 00:06:58.000
So we talked about in episode 293, we talked about some giveaway, some PSF, the PSF saying

00:06:58.000 --> 00:07:04.760
that there's like the top 1% of the critical packages are going to have to use two-factor

00:07:04.760 --> 00:07:05.740
authentication.

00:07:05.740 --> 00:07:08.060
And it was big drama at the time, right?

00:07:08.320 --> 00:07:11.760
Yeah, well, because like there was some confusion over the keys and stuff like that,

00:07:11.760 --> 00:07:17.520
or hardware keys and, and, and, and yeah, some pushback against that or just some confusion

00:07:17.520 --> 00:07:18.400
around it, I think.

00:07:18.400 --> 00:07:25.560
But we've seen some, some even more attacks against Python projects in the last year.

00:07:25.560 --> 00:07:28.760
I mean, it's only, it's only, it's been less than a year since that.

00:07:28.760 --> 00:07:37.640
And so the change is this year, PyPI is going to require everybody to use two-factor authentication,

00:07:37.640 --> 00:07:40.040
not the top 1%, the top 100%.

00:07:40.600 --> 00:07:45.560
So, and it's, you got till the end of the year, I think.

00:07:45.560 --> 00:07:53.960
And it's, let's see, we were linking to an article from the Python package index saying,

00:07:53.960 --> 00:07:57.740
securing PyPI accounts via two-factor authentication.

00:07:58.480 --> 00:08:05.860
And as of today, they're going to require, they're announcing that every account that maintains,

00:08:05.860 --> 00:08:12.260
every account that maintains a project or organization on PyPI will be required to enable two-factor

00:08:12.260 --> 00:08:14.840
authentication on their account by the end of 2023.

00:08:14.840 --> 00:08:16.460
So that's the news, really.

00:08:16.960 --> 00:08:25.000
There's some discussion as to why in this article, but there's some information on how to, how to prepare.

00:08:25.000 --> 00:08:27.520
But it's not, I mean, it's not that bad.

00:08:27.520 --> 00:08:28.840
I did it last year.

00:08:28.840 --> 00:08:36.420
If you've got, especially if you're already using a smartphone, I think that using something like Authy

00:08:36.420 --> 00:08:40.360
or something like that on a smartphone would work just fine.

00:08:40.360 --> 00:08:41.180
So, yeah.

00:08:41.180 --> 00:08:42.720
What else?

00:08:42.720 --> 00:08:46.860
There's, it's kind of, I guess there's not much really more to say.

00:08:46.860 --> 00:08:49.940
about it is that this is happening and you got to kind of do it.

00:08:49.940 --> 00:08:51.400
You got to do it by the end of the year.

00:08:51.400 --> 00:08:52.820
But why not?

00:08:52.820 --> 00:08:53.320
Why wait?

00:08:53.320 --> 00:08:54.360
Just go ahead and do it.

00:08:54.360 --> 00:08:55.540
And it's really everybody.

00:08:55.540 --> 00:09:00.180
So it's, so let's say you've got an open source project and there's like, you know, 20 people

00:09:00.180 --> 00:09:00.700
contributing.

00:09:00.700 --> 00:09:01.500
That would be cool.

00:09:01.500 --> 00:09:06.420
Maybe there's like five, but if only one of you is ever pushing to PyPI, then it's just

00:09:06.420 --> 00:09:09.760
one of, I think it's just one of you, unless you're doing an organization thing.

00:09:09.760 --> 00:09:11.400
I think it's just a person pushing.

00:09:11.400 --> 00:09:16.840
So if other people are on Git and not using two-factor for Git, but they're,

00:09:16.840 --> 00:09:18.840
just pushing to your repo.

00:09:18.840 --> 00:09:20.380
I think that's still fine.

00:09:20.380 --> 00:09:21.140
That doesn't matter.

00:09:21.140 --> 00:09:26.200
It's the people actually actively interacting with PyPI that need to be authenticated.

00:09:26.200 --> 00:09:26.620
Yeah.

00:09:26.620 --> 00:09:28.460
That's what it sounds like to me as well.

00:09:28.460 --> 00:09:33.080
It's kind of, if, if you're actually have an active account on PyPI, right?

00:09:33.080 --> 00:09:34.320
It's not necessarily GitHub.

00:09:34.320 --> 00:09:37.820
Although I think GitHub itself also has a 2FA requirement now.

00:09:37.820 --> 00:09:43.000
And there is some discussion here about like people that don't interact with their, with

00:09:43.000 --> 00:09:45.440
a project, but still have a PyPI account.

00:09:45.440 --> 00:09:46.980
And I'm not exactly sure why.

00:09:46.980 --> 00:09:50.780
Apparently there's some people that need it that, I don't know.

00:09:50.780 --> 00:09:53.780
Why would you have a PyPI account if you're not pushing stuff to?

00:09:53.780 --> 00:09:54.340
Yeah.

00:09:54.340 --> 00:09:54.660
Yeah.

00:09:54.660 --> 00:09:55.720
That's a good point.

00:09:55.720 --> 00:09:56.660
It is a good point.

00:09:58.960 --> 00:10:05.660
Well, so there was so much drama about it and there was that person that deleted their,

00:10:05.660 --> 00:10:10.900
all their packages because they were frustrated as like a thing of protests and it caused some

00:10:10.900 --> 00:10:11.240
issues.

00:10:11.240 --> 00:10:13.440
And well, I'm fine with this.

00:10:13.440 --> 00:10:14.680
This is, this is great.

00:10:14.680 --> 00:10:18.340
I think it's supply chain issues are really, really serious.

00:10:18.340 --> 00:10:20.920
So it's, it's okay with me.

00:10:20.920 --> 00:10:21.820
Yeah.

00:10:21.820 --> 00:10:22.400
Me too.

00:10:22.400 --> 00:10:25.400
So shall we thank our sponsor?

00:10:25.920 --> 00:10:28.340
We shall, but first I just want to point out.

00:10:28.340 --> 00:10:28.680
Yeah.

00:10:28.680 --> 00:10:33.840
I think Authy is a fantastic option for the 2FA stuff that you were pointing out, right?

00:10:33.840 --> 00:10:39.460
As you mentioned, like one of the things that is a huge hassle for, for a lot of the systems

00:10:39.460 --> 00:10:40.400
is guess what?

00:10:40.400 --> 00:10:45.220
You can install this 2FA tool onto your phone and it's completely safe.

00:10:45.220 --> 00:10:49.820
And all that local, that 2FA, it'll never go anywhere until you want to get a new phone.

00:10:49.820 --> 00:10:53.740
And then you're completely out of luck and you've got to somehow reset it or worse, you lose

00:10:53.740 --> 00:10:56.740
your phone, but it's not, there's no way to recover the 2FA code.

00:10:56.740 --> 00:11:00.860
So what I really like about Authy is it will, you can install it in multiple locations.

00:11:00.860 --> 00:11:05.060
Like you can install it on your desktop and your mobile device.

00:11:05.060 --> 00:11:06.660
And they're just in sync.

00:11:06.660 --> 00:11:08.820
If you add one somewhere, it appears elsewhere.

00:11:09.080 --> 00:11:13.660
So if people feel like TFA is a huge pain, I think Authy is one of the choices that's

00:11:13.660 --> 00:11:14.320
pretty good for that.

00:11:14.320 --> 00:11:14.940
I didn't know.

00:11:14.940 --> 00:11:17.200
You can also do like 1Password and so on.

00:11:17.200 --> 00:11:22.420
But to me, having the passwords there and the 2FA thing in the same place seems to violate

00:11:22.420 --> 00:11:24.580
some aspect of security.

00:11:24.580 --> 00:11:29.700
I mean, I know 1Password is pretty safe, but 2FA should be about having the password and

00:11:29.700 --> 00:11:31.300
the thing separated in my mind.

00:11:31.300 --> 00:11:34.720
And so I don't use my password managers 2FA thing.

00:11:34.720 --> 00:11:35.120
Yeah.

00:11:35.120 --> 00:11:39.320
I just thought, I thought I had like just a couple accounts with Authy and I just looked

00:11:39.320 --> 00:11:40.980
and I've got like, I got a scroll.

00:11:40.980 --> 00:11:43.160
I've got a whole bunch of things on Authy right now.

00:11:43.160 --> 00:11:43.420
Yeah.

00:11:43.420 --> 00:11:45.260
I think I have 40 or so myself.

00:11:45.260 --> 00:11:46.220
All right.

00:11:46.220 --> 00:11:47.880
Now let's tell people about our sponsor.

00:11:47.880 --> 00:11:48.720
All right.

00:11:48.940 --> 00:11:53.780
This episode of Python Bytes is brought to you by Influx Data, the makers of Influx

00:11:53.780 --> 00:11:54.080
DB.

00:11:54.080 --> 00:12:00.260
Influx DB is a database purpose built for handling time series data at massive scale for real-time

00:12:00.260 --> 00:12:00.800
analytics.

00:12:00.800 --> 00:12:05.860
Developers can ingest, store, and analyze all types of time series data, metrics, events,

00:12:05.860 --> 00:12:07.740
traces on a single platform.

00:12:07.740 --> 00:12:13.640
So dear listener, let me ask the question, how would boundless cardinality and lightning-fast

00:12:13.640 --> 00:12:17.180
SQL queries impact the way you develop real-time applications?

00:12:17.740 --> 00:12:23.940
Influx DB processes large time series data sets and provides low latency SQL queries,

00:12:23.940 --> 00:12:29.580
making it a go-to choice for developers building real-time applications and seeking crucial insights.

00:12:29.580 --> 00:12:35.680
For developer efficiency, Influx DB helps you create IoT, analytics, and cloud applications

00:12:35.680 --> 00:12:38.560
using timestamp data rapidly and at scale.

00:12:38.560 --> 00:12:44.760
It's designed to ingest billions of data points in real-time with unlimited cardinality.

00:12:44.760 --> 00:12:50.600
Influx DB streamlines building once and deploying across various products and environments from

00:12:50.600 --> 00:12:53.000
the edge, on-premise, and to the cloud.

00:12:53.000 --> 00:12:57.080
Try it for free at pythonbytes.fm/influx DB.

00:12:57.080 --> 00:13:00.600
The links are also in your show notes on the podcast.

00:13:00.600 --> 00:13:03.280
Thanks, Influx DB, for supporting the show.

00:13:03.280 --> 00:13:03.780
Yep.

00:13:03.780 --> 00:13:04.240
Thank you.

00:13:04.240 --> 00:13:04.640
Thank you.

00:13:04.640 --> 00:13:07.200
Everyone check them out to help support the show.

00:13:07.200 --> 00:13:07.900
All right.

00:13:08.180 --> 00:13:10.280
Let's talk about queues, Brian.

00:13:10.280 --> 00:13:11.000
Okay.

00:13:11.000 --> 00:13:11.480
Yeah.

00:13:11.480 --> 00:13:13.800
So I want to talk about Propan.

00:13:13.800 --> 00:13:19.400
Now, Propan is a project that's not, you know, tens of thousands of GitHub stars.

00:13:19.400 --> 00:13:22.040
I think it looks pretty compelling.

00:13:22.300 --> 00:13:27.300
It's put together by Lance Nick, Lance Nick, Lance Nick, Lance Nick, I'm going to go with

00:13:27.300 --> 00:13:28.360
over here on GitHub.

00:13:28.360 --> 00:13:34.060
And it is a powerful and easy to use Python framework for building asynchronous web services

00:13:34.060 --> 00:13:36.660
that interact with any message broker.

00:13:36.660 --> 00:13:40.300
So what are some of the options of the message brokers here?

00:13:40.380 --> 00:13:47.900
We've got RabbitMQ, Redis, Nats, Kafka, SQS, some of the other ones like Redis streams.

00:13:47.900 --> 00:13:54.980
If you're using these and you want a cool declarative way to interact with them, then Propan might

00:13:54.980 --> 00:13:55.520
be your thing.

00:13:55.520 --> 00:14:02.100
So right now what they have is async APIs for you, and they're working on synchronous ones,

00:14:02.100 --> 00:14:03.420
but they don't have them yet.

00:14:03.420 --> 00:14:05.620
So let me just give you an example, Brian.

00:14:06.160 --> 00:14:13.020
Over here, it says, first, let's take the quick start from AIO Pika, which is a way to

00:14:13.020 --> 00:14:15.160
talk, way to listen for events.

00:14:15.160 --> 00:14:16.440
This is the important part.

00:14:16.440 --> 00:14:20.240
Listen for a certain set of events coming into a message queue.

00:14:20.240 --> 00:14:20.680
Okay.

00:14:20.680 --> 00:14:21.260
Okay.

00:14:21.260 --> 00:14:27.380
So what you do is you say, I'm going to connect to the message queue server, and I'm going to

00:14:27.380 --> 00:14:28.840
listen to a particular queue.

00:14:28.840 --> 00:14:31.400
Then you await creating the connection.

00:14:31.400 --> 00:14:33.280
You await creating a channel.

00:14:33.280 --> 00:14:35.940
You await connecting to the queue.

00:14:35.940 --> 00:14:39.080
And once you do it, then you use the iterator.

00:14:39.080 --> 00:14:42.720
You loop over the iterator as messages come in, and then you get them.

00:14:42.720 --> 00:14:45.120
And then you, of course, run that code that does that right.

00:14:45.120 --> 00:14:49.400
That's the imperative way where you do all the steps yourself.

00:14:49.400 --> 00:14:54.480
So this other way is what you do is you go to, you basically create this thing called a

00:14:54.480 --> 00:15:00.180
broker using propan, and you point it at one of these queues, like Redis or something.

00:15:00.180 --> 00:15:05.660
And then you just, kind of like you would in FastAPI or Flask, you say, you put a decorator

00:15:05.660 --> 00:15:09.360
on a function, and you say, at broker.handle, and you give it the name of the queue.

00:15:09.360 --> 00:15:12.800
So if a message comes into that named queue, call this function.

00:15:13.080 --> 00:15:13.940
Oh, I like that better.

00:15:13.940 --> 00:15:14.740
Isn't this nice?

00:15:14.740 --> 00:15:20.460
It's kind of like, I'm listening for this URL, like if, you know, slash courses, slash ID

00:15:20.460 --> 00:15:21.040
of a course.

00:15:21.040 --> 00:15:23.400
I want to get you details about that course, right?

00:15:23.400 --> 00:15:26.220
You would put that in Flask or Pyramid or FastAPI.

00:15:26.220 --> 00:15:28.640
This is the same thing, but for message queue.

00:15:28.640 --> 00:15:31.760
So you say, this function receives stuff that goes to that queue.

00:15:31.760 --> 00:15:32.680
Oh, I like it.

00:15:32.680 --> 00:15:33.100
Yeah.

00:15:33.100 --> 00:15:34.960
That's what those interfaces should be like.

00:15:34.960 --> 00:15:36.580
Yeah, absolutely.

00:15:36.580 --> 00:15:37.560
It totally should.

00:15:37.560 --> 00:15:42.060
So this is pretty interesting already, but it gets a little bit cooler.

00:15:42.060 --> 00:15:47.240
You can go and create one of these apps and just run a server directly, right?

00:15:47.240 --> 00:15:52.780
So you can say, I want to run this as a system daemon on Linux, let's say, and it's just going

00:15:52.780 --> 00:15:55.260
to, you know, use the Propan server to run.

00:15:55.260 --> 00:16:01.540
That's fine, but there's tons of infrastructure around running these types of things as web applications.

00:16:01.540 --> 00:16:08.420
And if you already have a web app that receives like JSON requests, you know, it's got some

00:16:08.420 --> 00:16:13.260
kind of API endpoint, but you also want to have it handle stuff that might be put into the

00:16:13.260 --> 00:16:13.980
message queue.

00:16:13.980 --> 00:16:21.300
Then it has integration with the virtual down into, you can do it manually into any web framework,

00:16:21.300 --> 00:16:24.920
or it's got things like a FastAPI plugin, which is pretty cool.

00:16:24.920 --> 00:16:25.480
Oh, cool.

00:16:25.480 --> 00:16:25.980
Yeah.

00:16:25.980 --> 00:16:27.160
So let's see.

00:16:27.160 --> 00:16:29.980
Actually, if I go to the examples, I'll pull up a Flask one.

00:16:29.980 --> 00:16:33.760
That's probably the best, which you got to use Quart because it's only async.

00:16:33.760 --> 00:16:36.200
That's the Flask async variant.

00:16:36.200 --> 00:16:40.940
So what you can do is in your, let's see, I'll just say in your Quart app, you create this

00:16:40.940 --> 00:16:42.540
broker to sort of listen as well.

00:16:42.540 --> 00:16:45.760
In addition to create your, your Flask or Quart app.

00:16:45.760 --> 00:16:51.060
And then you might have, you know, a function that says app.route, listen for forward slash,

00:16:51.060 --> 00:16:52.360
and that's a JSON endpoint.

00:16:52.360 --> 00:16:57.940
Or you might have broker.handle some queue message, and that's the queue coming in.

00:16:57.940 --> 00:17:02.820
So it's kind of like, well, here's the messages coming in over the web, and here are the ones

00:17:02.820 --> 00:17:03.960
coming over, message queuing.

00:17:03.960 --> 00:17:08.040
But, you know, it's just, it runs in Microwisgee or G Unicorn or whatever.

00:17:08.040 --> 00:17:09.120
Yeah, that's nice.

00:17:09.120 --> 00:17:09.660
Yeah.

00:17:09.660 --> 00:17:10.720
Last thing.

00:17:10.720 --> 00:17:14.260
This is inspired by Pydantic and FastAPI.

00:17:14.260 --> 00:17:19.560
And so let me see about a good example here.

00:17:19.560 --> 00:17:28.380
You can do things like declaring that the body of the message is, is a dictionary, or you can

00:17:28.380 --> 00:17:31.260
have Pydantic base models that are coming in.

00:17:31.260 --> 00:17:32.380
So you can say, here's a Pydantic.

00:17:32.660 --> 00:17:36.540
When a message comes to the message queue, it's going to be represented by, let's say,

00:17:36.540 --> 00:17:36.940
JSON.

00:17:36.940 --> 00:17:40.420
And that JSON, I want to parse into a Pydantic model.

00:17:40.420 --> 00:17:45.940
You can just say, much like FastAPI, in your handler, you say body colon, you know, the name

00:17:45.940 --> 00:17:47.360
of your custom Pydantic class.

00:17:47.360 --> 00:17:47.700
Boom.

00:17:47.700 --> 00:17:50.240
Now it's automatically parsing that based on the type.

00:17:50.540 --> 00:17:52.660
Oh, based on, that's neat.

00:17:52.660 --> 00:17:59.360
And the last thing, they also have this concept of modeling pytest fixtures.

00:17:59.360 --> 00:18:04.100
So you can create functions that will do things like, you know, process requests or give you

00:18:04.100 --> 00:18:07.700
extra information or whatever, you know, what you would do with pytest fixture type things.

00:18:07.700 --> 00:18:11.600
And you can have those as well in here, which is pretty cool.

00:18:11.600 --> 00:18:16.280
So there's a lot of cool, it's like a fusion of interesting Python frameworks for message

00:18:16.280 --> 00:18:16.560
queuing.

00:18:16.560 --> 00:18:17.320
I like it.

00:18:17.760 --> 00:18:20.580
So ask your doctor if propane is right for you.

00:18:20.580 --> 00:18:21.580
Ask your doctor.

00:18:21.580 --> 00:18:22.000
That's right.

00:18:22.000 --> 00:18:22.640
Yeah.

00:18:22.640 --> 00:18:27.280
I, you know, it's, it's interesting because this message queuing type of architecture is

00:18:27.280 --> 00:18:31.140
super powerful at unlocking tons of interesting asynchrony.

00:18:31.140 --> 00:18:35.180
Like, well, if I've got a request come in and I got a, you know, place an order and we

00:18:35.180 --> 00:18:36.980
got to check the warehouse, whether we have them.

00:18:36.980 --> 00:18:40.200
And that's a janky old API call that's slow.

00:18:40.200 --> 00:18:44.940
Like, well, how do I scale that would be one option with threads and async and await.

00:18:45.060 --> 00:18:49.320
The other one would be just like, well, throw that into a queue to say, check that out.

00:18:49.320 --> 00:18:52.440
And then, you know, let it run completely disassociated.

00:18:52.440 --> 00:18:52.680
Right?

00:18:52.680 --> 00:18:53.200
Yeah.

00:18:53.200 --> 00:18:56.760
Scroll to the bottom, the key features.

00:18:56.760 --> 00:19:00.160
So one of the things I want right down there, testability.

00:19:00.160 --> 00:19:04.320
Propane allows you to test your app with without external dependencies.

00:19:04.320 --> 00:19:06.980
You do not have to set up a message broker to test.

00:19:06.980 --> 00:19:08.280
You can have a virtual one.

00:19:08.280 --> 00:19:09.240
That's pretty cool.

00:19:09.240 --> 00:19:09.840
Yeah.

00:19:09.840 --> 00:19:10.220
Yeah.

00:19:10.220 --> 00:19:10.780
This is cool.

00:19:10.780 --> 00:19:12.940
So it's, it's not super popular.

00:19:12.940 --> 00:19:15.740
Like I said, however, it does look pretty neat.

00:19:15.740 --> 00:19:16.600
Sure does.

00:19:16.600 --> 00:19:17.200
All right.

00:19:17.200 --> 00:19:17.820
Over to you.

00:19:17.820 --> 00:19:20.560
So that, that was a little bit of a new thing.

00:19:20.560 --> 00:19:23.760
I want to talk about a little bit of an old thing, which is make files.

00:19:23.760 --> 00:19:29.300
We haven't talked about it for a while, but make files are still fairly popular for Python

00:19:29.300 --> 00:19:29.800
projects.

00:19:29.800 --> 00:19:34.220
I think I I've got them on several internal projects at least.

00:19:34.220 --> 00:19:36.180
And they, they come in handy.

00:19:36.180 --> 00:19:40.040
You got to be careful that a lot of people, sometimes people on your team won't be familiar

00:19:40.040 --> 00:19:45.420
with them, but if it's a common thing for your team to use make files or for you, why not

00:19:45.420 --> 00:19:46.740
use them on a Python project?

00:19:46.740 --> 00:19:53.180
So this, what I'm going to cover is a, an article for getting the author name right now.

00:19:53.180 --> 00:19:53.740
Let's see.

00:19:53.740 --> 00:19:58.360
Ricardo and drag called make file tricks for Python projects.

00:19:58.360 --> 00:20:01.520
And I'm going to hop down to the actual template.

00:20:01.520 --> 00:20:06.720
What it is, it's a, it's a little, it's a small template as a starter template for a Python

00:20:06.720 --> 00:20:09.080
project, but it has some pretty cool features.

00:20:09.080 --> 00:20:14.640
And the actual templates at the bottom of the article, but we kind of go through some

00:20:14.640 --> 00:20:17.320
of the different things that you might want to put in there.

00:20:17.320 --> 00:20:21.940
And so to start off some, a little bit, I always forget to do this.

00:20:21.940 --> 00:20:25.300
These are things I want to, I always want to do, but I forget in my make files, things

00:20:25.300 --> 00:20:27.580
like making sure that it fails.

00:20:27.580 --> 00:20:30.180
If anything throws a incorrect error code.

00:20:30.980 --> 00:20:37.120
And also warning, if you did something wrong, like undefined variables or you're using, you

00:20:37.120 --> 00:20:39.140
can turn off this built-in rules.

00:20:39.140 --> 00:20:41.840
And I don't really know what the built-in rules thing does.

00:20:41.840 --> 00:20:46.640
It's just, I find my make files more pleasant if I disabled them.

00:20:46.760 --> 00:20:47.720
So this is good.

00:20:47.720 --> 00:20:49.360
The virtual environment thing.

00:20:49.360 --> 00:20:57.400
So there's a little snippet that he includes that you can use the PY variable to select which

00:20:57.400 --> 00:20:58.120
Python to run.

00:20:58.120 --> 00:21:02.200
So if you already have a virtual environment, it uses that, which is cool.

00:21:02.200 --> 00:21:03.320
That's pretty clever.

00:21:03.320 --> 00:21:03.580
Yeah.

00:21:03.580 --> 00:21:04.100
Yeah.

00:21:04.100 --> 00:21:06.160
And if you don't, it uses the global one.

00:21:06.880 --> 00:21:08.740
And then also with pip.

00:21:08.740 --> 00:21:15.100
So use the, it uses that PY variable to pick pip if it's there or not.

00:21:15.100 --> 00:21:16.320
And it uses the global one.

00:21:16.320 --> 00:21:17.540
So that's pretty cool.

00:21:17.540 --> 00:21:22.100
Actually, it'd probably be better to just blow up if you didn't have a virtual environment.

00:21:22.360 --> 00:21:29.560
Anyway, some of the, some stuff like PWD and current working directory and work root.

00:21:29.560 --> 00:21:36.240
These are good things to add in because sometimes you'll call a make script from a different directory.

00:21:36.240 --> 00:21:39.460
So your actual current directory is different and it mucks things up.

00:21:39.460 --> 00:21:41.440
So there's some good correction there.

00:21:41.440 --> 00:21:43.280
I do like this.

00:21:43.280 --> 00:21:47.700
There's some little magic stuff about default goal and help message.

00:21:47.700 --> 00:21:50.640
And I had to read this a little bit to understand what's going on.

00:21:50.640 --> 00:21:57.140
But what happens is it, the default goal being help means that if you just type make with

00:21:57.140 --> 00:21:59.560
nothing, no arguments, what should it do?

00:21:59.560 --> 00:22:05.020
And a cool thing to have make do is to print out all the things that you can do with the

00:22:05.020 --> 00:22:08.480
make file, like all the, all the targets and what they do.

00:22:08.480 --> 00:22:14.560
And so that's what this does by having these, having this little greps thing.

00:22:14.560 --> 00:22:17.160
Is it grep?

00:22:17.160 --> 00:22:19.720
I don't know if it's anyway, it's searching through your file.

00:22:19.920 --> 00:22:27.540
And, using awk and saying, Hey, if you've got a comment against, at the site of a target,

00:22:27.540 --> 00:22:29.240
that means that's the help message.

00:22:29.240 --> 00:22:30.420
So it'll print that stuff out.

00:22:30.420 --> 00:22:31.800
Oh, that's cool.

00:22:31.800 --> 00:22:32.400
Yeah.

00:22:32.400 --> 00:22:37.220
some, I don't really muck with my Python path too much, but if you have to muck with

00:22:37.220 --> 00:22:43.240
your Python path for a make file to, to find libraries or something like that, or find

00:22:43.240 --> 00:22:48.180
the code that you're running, there's examples on how to do that, which is nice.

00:22:48.180 --> 00:22:51.560
I guess that's really kind of what I wanted to talk about.

00:22:51.560 --> 00:22:56.700
and I was surprised it's doing all this stuff and it's really, and some examples on how

00:22:56.700 --> 00:22:57.920
you can use the path thing.

00:22:58.120 --> 00:23:01.860
Oh, having, adding a little, create virtual environment within a make file.

00:23:01.860 --> 00:23:02.600
This is nice.

00:23:02.600 --> 00:23:04.660
Just so that people working on the project.

00:23:04.660 --> 00:23:05.180
Yeah.

00:23:05.180 --> 00:23:07.000
Make dot V and V.

00:23:07.000 --> 00:23:08.700
You could have V and V also.

00:23:08.700 --> 00:23:10.660
And it just makes your virtual environment.

00:23:10.660 --> 00:23:12.660
Why do you need a target for that?

00:23:12.660 --> 00:23:18.540
And it's because, and you've, you've discovered this, but sometimes, new Python developers

00:23:18.540 --> 00:23:22.780
kind of forget is that it's, it's kind of annoying to just create a virtual environment.

00:23:22.780 --> 00:23:28.740
It's good to, after you've created it, update the update setup tools and wheel and build.

00:23:28.740 --> 00:23:33.160
And then also if you have a requirements file, why not just install it right away instead

00:23:33.160 --> 00:23:35.660
of having, having that as another command.

00:23:35.900 --> 00:23:40.000
So kind of a fun template for starting make files with Python project.

00:23:40.000 --> 00:23:40.960
Yeah.

00:23:40.960 --> 00:23:42.700
That's, what is that?

00:23:42.700 --> 00:23:44.200
A modern take on an old idea.

00:23:44.200 --> 00:23:45.280
Yeah.

00:23:45.280 --> 00:23:50.880
the, and if you are new to make files, one of the things to be careful about that some

00:23:50.880 --> 00:23:56.560
people don't quite sometimes real remember is spaces matter within make files kind of like

00:23:56.560 --> 00:23:59.300
they do in Python, but spaces and tabs matter.

00:23:59.300 --> 00:24:02.340
So in, in make files, you're using tabs.

00:24:02.340 --> 00:24:03.460
It has to be a tab.

00:24:03.560 --> 00:24:08.180
It cannot be space, unless something's changed that I don't know about, but that,

00:24:08.180 --> 00:24:10.080
that, that has messed me up before.

00:24:10.080 --> 00:24:12.260
So use tabs within make files.

00:24:12.260 --> 00:24:13.680
All right.

00:24:13.680 --> 00:24:14.000
Yep.

00:24:14.000 --> 00:24:14.800
Sounds good.

00:24:14.800 --> 00:24:15.540
Excellent one.

00:24:15.540 --> 00:24:17.680
I guess that's everything.

00:24:17.680 --> 00:24:18.380
Yeah.

00:24:18.380 --> 00:24:18.680
Yeah.

00:24:18.680 --> 00:24:19.140
Any extras?

00:24:19.140 --> 00:24:20.720
no, not really.

00:24:20.720 --> 00:24:21.180
You.

00:24:21.180 --> 00:24:25.020
I got a couple here, just a couple of conference ones.

00:24:25.020 --> 00:24:29.840
So high con Portugal has their call for participation.

00:24:29.840 --> 00:24:30.840
So.

00:24:30.840 --> 00:24:34.300
got, got a little bit of time left on that.

00:24:34.300 --> 00:24:37.600
What is that till the 30th, June.

00:24:37.800 --> 00:24:43.720
And when will it be, it will be September seven to nine, which is cool.

00:24:43.720 --> 00:24:47.700
So if you're in and around or want to go to Portugal, there you go.

00:24:47.700 --> 00:24:48.100
Cool.

00:24:48.100 --> 00:24:54.160
On the other hand, if you happen to be interested in Django and are in, Europe that just got

00:24:54.160 --> 00:24:55.000
announced as well.

00:24:55.000 --> 00:24:56.820
So people can check that out.

00:24:56.820 --> 00:24:58.740
I want to go soon.

00:24:58.740 --> 00:25:00.500
I'm not going, but I want to go.

00:25:00.500 --> 00:25:01.780
Yeah, indeed.

00:25:01.900 --> 00:25:04.720
So that's also announced link to both of those in the show notes.

00:25:04.720 --> 00:25:05.900
Are you ready for a joke?

00:25:05.900 --> 00:25:06.480
Yeah.

00:25:06.480 --> 00:25:09.800
Well, this becomes because apple.com.

00:25:09.800 --> 00:25:14.120
Did you see that they announced this crazy vision thing, Brian?

00:25:14.120 --> 00:25:17.060
Yeah, but it doesn't come with the snorkel.

00:25:17.060 --> 00:25:18.640
It's just the snorkel mask.

00:25:18.640 --> 00:25:19.100
Yeah.

00:25:19.100 --> 00:25:20.420
It's just the snorkel mask.

00:25:20.420 --> 00:25:26.260
It's, it doesn't even come with that little, handheld sub submarine thing that you can

00:25:26.260 --> 00:25:27.280
drag yourself around either.

00:25:27.280 --> 00:25:28.560
So, yeah.

00:25:28.560 --> 00:25:35.660
So they announced if you haven't noticed yet, Apple announced vision pro, which is a $3,500

00:25:35.660 --> 00:25:37.680
ski goggle looking thing.

00:25:37.680 --> 00:25:43.020
That is both augmented reality and virtual reality kind of turn the dial.

00:25:43.020 --> 00:25:44.800
I'm highly suspicious of this.

00:25:44.800 --> 00:25:51.260
I think it's going to not do great, but it does look pretty awesome for certain use cases.

00:25:51.260 --> 00:25:56.520
Like for example, you could sit on the sidelines of a football game and, and get like a 3d view.

00:25:56.520 --> 00:26:00.380
So you could look to the right and see down the sideline and then look ahead and watch

00:26:00.380 --> 00:26:00.820
the game.

00:26:00.820 --> 00:26:01.200
I got that.

00:26:01.200 --> 00:26:02.260
That's pretty epic.

00:26:02.260 --> 00:26:03.840
Is it worth $3,500?

00:26:03.840 --> 00:26:05.200
I don't know.

00:26:05.200 --> 00:26:05.620
We'll see.

00:26:05.620 --> 00:26:07.240
but okay.

00:26:07.240 --> 00:26:09.120
So that's setting the stage for the joke.

00:26:09.120 --> 00:26:10.060
So here's the joke.

00:26:10.060 --> 00:26:15.920
The average pseudo technical person has got like an Oculus Rift in there.

00:26:15.920 --> 00:26:18.940
They got their handheld controllers that they're doing.

00:26:18.940 --> 00:26:19.280
Right.

00:26:19.280 --> 00:26:24.720
And then we have the pseudo, the rich pseudo technical people wearing the Apple one sitting

00:26:24.720 --> 00:26:25.600
there watching TV.

00:26:25.600 --> 00:26:31.380
And then Brian, you want to describe the actual technical people, advanced high tech setup they

00:26:31.380 --> 00:26:31.740
got here.

00:26:31.740 --> 00:26:38.740
That's just a dude at a desk with like, you know, with using a computer, but it's, oh,

00:26:38.740 --> 00:26:40.120
there's important stuff to it though.

00:26:40.120 --> 00:26:41.880
It's dual monitor.

00:26:41.880 --> 00:26:43.940
We will note the dual monitor.

00:26:43.940 --> 00:26:44.500
Yes.

00:26:44.600 --> 00:26:45.960
And the mechanical keyboard.

00:26:45.960 --> 00:26:48.520
These, this is not your average desk worker.

00:26:48.520 --> 00:26:49.620
Yeah.

00:26:49.620 --> 00:26:52.720
Anyway, there's my follow on to WWDC.

00:26:52.720 --> 00:26:53.920
I know I would.

00:26:53.920 --> 00:26:55.780
And that's, that's even, okay.

00:26:55.780 --> 00:26:58.180
I've got the big curved monitor.

00:26:58.180 --> 00:27:01.220
So I don't have two right now, but you have two monitors.

00:27:01.220 --> 00:27:07.360
I have one big monitor for my, my working desk and I have a big curved monitor for my gaming

00:27:07.360 --> 00:27:09.000
PC, but just one for both as well.

00:27:09.000 --> 00:27:12.740
I used to have dual monitors and I would, I was always trying to like juggle them.

00:27:12.740 --> 00:27:14.160
I'm like, you know, I just want big monitor.

00:27:14.160 --> 00:27:14.720
That's better.

00:27:14.720 --> 00:27:15.120
Yeah.

00:27:15.120 --> 00:27:19.380
I actually, when we did the pandemic thing, I went to one big monitor at home and then

00:27:19.380 --> 00:27:24.080
at work, I still had the two split ones, but then I was just tired of doing this all day

00:27:24.080 --> 00:27:24.480
long.

00:27:24.480 --> 00:27:24.980
Yeah.

00:27:24.980 --> 00:27:30.020
So I'm like, oh, we got to just, so I went to a big one, but that's kind of privilege

00:27:30.020 --> 00:27:30.620
speak.

00:27:30.620 --> 00:27:31.700
So I don't know.

00:27:31.700 --> 00:27:32.740
It is a little bad.

00:27:32.740 --> 00:27:37.300
Just for people who are interested, I, if I do need a second monitor, like sometimes when

00:27:37.300 --> 00:27:40.880
I'm recording a course, I want to be able to see what the recording is doing.

00:27:40.880 --> 00:27:46.540
So I want to see my video overlaid with maybe what's on the screen with whatever settings,

00:27:46.540 --> 00:27:51.360
like scale, like exactly what's being recorded as the person's going to see it in case something

00:27:51.360 --> 00:27:52.280
goes weird with that.

00:27:52.440 --> 00:27:58.100
So I'll take my iPad, plug it into my mini and then use Duet.

00:27:58.100 --> 00:28:04.220
Duet is a really cool software that I think works on Mac and Windows and basically turns

00:28:04.220 --> 00:28:07.220
that into a second monitor just periodically when you want it.

00:28:07.220 --> 00:28:07.640
You know?

00:28:07.720 --> 00:28:11.840
So that's, that's what I do if I really feel like I need extra, extra space.

00:28:11.840 --> 00:28:15.220
So, so go back to the Apple vision thing or the eye dork.

00:28:15.220 --> 00:28:15.800
What's it called?

00:28:15.800 --> 00:28:16.500
Apple vision.

00:28:16.500 --> 00:28:16.720
Yeah.

00:28:16.720 --> 00:28:18.960
I think it's, I dork pro.

00:28:18.960 --> 00:28:27.040
there's part of one of the things on there is somebody doing a, like a meeting

00:28:27.040 --> 00:28:32.660
where you can supposedly see other people in the meeting, like as if you were still there,

00:28:32.660 --> 00:28:37.180
they were with you or something and I thought, well, that one go up a little bit.

00:28:37.180 --> 00:28:37.620
Yeah.

00:28:37.620 --> 00:28:40.240
This is like the group FaceTime is what that is.

00:28:40.240 --> 00:28:40.440
Yeah.

00:28:40.440 --> 00:28:41.780
Except for, oh no.

00:28:41.780 --> 00:28:42.060
Yeah.

00:28:42.060 --> 00:28:42.220
Yeah.

00:28:42.220 --> 00:28:42.660
I see it.

00:28:42.660 --> 00:28:42.900
Okay.

00:28:42.900 --> 00:28:46.020
Wouldn't, wouldn't they see you with the goggles on?

00:28:46.020 --> 00:28:50.980
So if everybody's doing it, wouldn't everybody just, you just be able to see people with goggles.

00:28:50.980 --> 00:28:52.240
that's interesting.

00:28:52.240 --> 00:28:55.880
I think it might scan you and put an avatar of you up there.

00:28:55.880 --> 00:28:56.640
Oh yeah.

00:28:56.640 --> 00:28:57.500
It's an AI you.

00:28:57.500 --> 00:28:59.940
It's not really, I think it's, I think it's an AI you actually.

00:28:59.940 --> 00:29:00.160
Yeah.

00:29:00.160 --> 00:29:00.860
I think so.

00:29:01.540 --> 00:29:03.040
I haven't tried this out.

00:29:03.040 --> 00:29:04.880
And where's your camera?

00:29:04.880 --> 00:29:05.980
Where do you put your camera?

00:29:05.980 --> 00:29:07.960
Like for, so anyway.

00:29:07.960 --> 00:29:08.500
Yeah.

00:29:08.500 --> 00:29:10.740
There's a lot of interesting and stuff.

00:29:10.740 --> 00:29:12.240
I'm actually interesting things and stuff.

00:29:12.240 --> 00:29:16.960
I'm actually excited about announced at, at WWDC vision pro.

00:29:16.960 --> 00:29:24.520
yeah, there's, there's like, for example, large language model dictation for iOS and Mac.

00:29:24.520 --> 00:29:30.800
So I don't know how many people know who have tried this, but I, for multiple reasons have tried to do,

00:29:30.800 --> 00:29:32.640
um, dictation on the Mac.

00:29:32.640 --> 00:29:36.880
Partly because I have like mild grade at this point, RSI issues.

00:29:36.880 --> 00:29:38.780
And so if I can limit typing, that's good.

00:29:38.780 --> 00:29:42.480
And maybe I've got a lot of stuff I need to blaze through, like a bunch of email or something.

00:29:42.480 --> 00:29:44.180
I'd love to dictate to it.

00:29:44.180 --> 00:29:48.820
But the dictation system on Mac is like 10 years old or something.

00:29:48.820 --> 00:29:49.600
It's really bad.

00:29:49.600 --> 00:29:51.740
You can't even say new paragraph, for example.

00:29:51.740 --> 00:29:52.300
Like, nope.

00:29:52.300 --> 00:29:54.140
They don't just write out new paragraph.

00:29:54.140 --> 00:29:59.740
Whereas on iPhone, you can say new paragraph or do this, or like you can navigate around way better.

00:29:59.740 --> 00:30:00.960
They're not the same systems.

00:30:00.960 --> 00:30:05.680
So both of those are being replaced with like ChatGPT level of AIs.

00:30:05.680 --> 00:30:10.180
And so dictation to your computer or your device is going to get way better.

00:30:10.180 --> 00:30:14.800
And so that means less typing, less RSI, just different input modalities.

00:30:14.800 --> 00:30:17.380
If you need a break, like those kinds of things, I'm really psyched about.

00:30:17.380 --> 00:30:18.380
Vision Pro, we'll see.

00:30:18.380 --> 00:30:19.760
Yeah.

00:30:19.760 --> 00:30:24.840
There's potential there, but there's also way more potential for jokes.

00:30:24.840 --> 00:30:25.460
Yes.

00:30:25.460 --> 00:30:26.100
It's going to be good.

00:30:26.100 --> 00:30:29.140
Speaking of jokes, we'll wrap it up with one from Kim in the audience.

00:30:29.140 --> 00:30:34.560
If an avatar is an option, T-Rexes will be meeting with the elves and talking frogs in no time.

00:30:34.560 --> 00:30:36.400
That would be great.

00:30:36.400 --> 00:30:37.620
I'm here for that.

00:30:37.620 --> 00:30:38.080
Let's do it.

00:30:38.080 --> 00:30:38.480
Yeah.

00:30:38.480 --> 00:30:39.340
I'm here for it.

00:30:39.340 --> 00:30:39.900
All right.

00:30:39.900 --> 00:30:41.180
Bye, Brian.

00:30:41.180 --> 00:30:41.560
Bye.

00:30:41.560 --> 00:30:42.000
Bye, everyone.

