WEBVTT
00:00:00.001 -->
00:00:04.580Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:04.580 -->
00:00:11.220This is episode 367, recorded January 16, 2024. And I am Brian Okken.
00:00:11.220 -->
00:00:12.380And I'm Michael Kennedy.
00:00:12.380 -->
00:00:18.540And I guess we do have a sponsor today, so that's awesome.
00:00:18.540 -->
00:00:23.520But Michael, do you want to tell us why you're not?
00:00:23.520 -->
00:00:29.400Yeah, for people who are listening, maybe they hear a slightly different setup for me.
00:00:29.400 -->
00:00:36.780For people who might watch the video, well, that right there in the background is lovely and very icy Portland, Oregon.
00:00:36.780 -->
00:00:41.040And so I'll go ahead and put this on the screen.
00:00:41.040 -->
00:00:47.260People can check out if they feel like they can check out the YouTube stream at like one minute, 19 seconds.
00:00:47.260 -->
00:00:49.620This is the entrance to my house, Brian.
00:00:49.620 -->
00:00:51.440And it looks like an apocalypse.
00:00:51.440 -->
00:00:57.820Just every, I would say every block or so, there's like a hundred foot tree that's fallen somewhere.
00:00:58.800 -->
00:01:01.180And it's just taken out the power in so many ways.
00:01:01.180 -->
00:01:06.180It's like it was now, it was 13, now it's 18 degrees Fahrenheit.
00:01:06.180 -->
00:01:08.320So negative nine, something like that Celsius.
00:01:08.320 -->
00:01:10.420No power, four or five days.
00:01:10.420 -->
00:01:11.840Not a place for podcasting.
00:01:11.940 -->
00:01:17.820So I'm hanging out here in a hotel with the family until the power comes back on.
00:01:17.820 -->
00:01:19.420Hopefully today, fingers crossed.
00:01:19.420 -->
00:01:21.340Well, hopefully, yeah.
00:01:21.340 -->
00:01:31.520Hopefully there's actually quite a few people in Portland without power and did experience power outages and pipes bursting and things like that.
00:01:31.940 -->
00:01:39.760And, you know, for people that are in parts of the country where they get like way colder than us, it might seem like we're just being wusses.
00:01:40.320 -->
00:01:47.820But what we get here is often very heavy rain, heavy snow or freezing rain.
00:01:47.940 -->
00:01:53.220And the freezing rain just weighs down trees and breaks power lines and stuff like that.
00:01:53.220 -->
00:01:53.680Absolutely.
00:01:53.680 -->
00:01:56.340And this had up to 100 mile an hour winds with these really old trees.
00:01:56.340 -->
00:01:59.520And also just the city is not really built for it.
00:01:59.520 -->
00:02:01.880We don't get it enough that they have infrastructures for it.
00:02:01.880 -->
00:02:03.820So it's like, oh, it snowed three inches.
00:02:03.820 -->
00:02:05.180So just good luck with that.
00:02:05.180 -->
00:02:06.960We're not going to do anything, right?
00:02:06.960 -->
00:02:08.280No salt, no gravel.
00:02:08.280 -->
00:02:09.740Just hope that works out.
00:02:10.220 -->
00:02:12.000So anyway, it's been all right.
00:02:12.000 -->
00:02:13.200But yeah, different setup, Brian.
00:02:13.200 -->
00:02:16.080So thanks everyone for the understanding.
00:02:16.080 -->
00:02:16.940Indeed.
00:02:16.940 -->
00:02:21.520And also I want to say thanks to Bright Data.
00:02:21.520 -->
00:02:24.040We'll talk more about them for sponsoring the show.
00:02:24.040 -->
00:02:30.020But let's talk about something contrarian, I guess you would say, Brian.
00:02:30.020 -->
00:02:30.620Okay.
00:02:30.620 -->
00:02:35.460You know, many people I'm sure have heard of 37 Signals, right?
00:02:35.460 -->
00:02:37.100David Hennemeyer Hansen.
00:02:37.100 -->
00:02:38.940He's the guy who created Ruby on Rails.
00:02:39.260 -->
00:02:44.640Most notably, but there's also Basecamp and Heymail and all that kind of stuff, right?
00:02:44.640 -->
00:02:45.200Yeah.
00:02:45.200 -->
00:02:48.980So needless to say, they run a ton of SaaS products in the cloud.
00:02:48.980 -->
00:02:57.560And I came across what I guess was more or less some kind of conclusion to a bunch of conversations
00:02:57.560 -->
00:02:59.060and stuff they've been working on.
00:02:59.060 -->
00:03:01.800And so I'll work my way backwards just a little bit.
00:03:01.800 -->
00:03:02.780But it's pretty fascinating.
00:03:02.780 -->
00:03:07.660And the headline on the post is, we have left the cloud.
00:03:07.920 -->
00:03:10.040Brian, I thought we were all told to go to the cloud.
00:03:10.040 -->
00:03:13.080I mean, we saw the picture of what happens when the clouds get angry.
00:03:13.080 -->
00:03:15.280So I understand why you might leave the clouds.
00:03:15.280 -->
00:03:18.780But more seriously, like clouds are supposed to save us.
00:03:18.780 -->
00:03:19.640They save us money.
00:03:19.640 -->
00:03:21.760They give us agility, et cetera, et cetera.
00:03:21.760 -->
00:03:22.420Right?
00:03:22.420 -->
00:03:22.920Yeah.
00:03:23.200 -->
00:03:25.340So hence the contrarian aspect, right?
00:03:25.340 -->
00:03:26.080Yeah.
00:03:26.080 -->
00:03:32.900Like, I guess it's not like 37 Signals is the same sort of place as like a lot of startups.
00:03:32.900 -->
00:03:33.660But, you know.
00:03:33.660 -->
00:03:34.360That's true.
00:03:34.360 -->
00:03:36.860If you're in, they do make that point.
00:03:36.860 -->
00:03:42.180Like if you are an early stage startup where the costs are low, by all means, cloud it up.
00:03:42.180 -->
00:03:56.660But as I guess one of the big lessons here is the more that you get like the cloud hooks in the abstract sense into your app, the more it might set you up for a tough time as you get bigger.
00:03:56.660 -->
00:03:57.000Right?
00:03:57.000 -->
00:03:59.860So let me get through this and we can talk a bit more about that.
00:03:59.860 -->
00:04:09.080So they say we stand to save over $7 million in five years from our cloud exit.
00:04:09.080 -->
00:04:17.100And so why do they not just say, well, that's 1.2 or 1. whatever it is, 1.1 million per year because of our cloud exit?
00:04:17.100 -->
00:04:19.860Because what they did is they went and they bought.
00:04:19.860 -->
00:04:28.560So when they said they left the cloud, they didn't mean just like we're not using Kubernetes or we're not using Lambdas and serverless.
00:04:28.780 -->
00:04:32.220Like they are, they bought physical hardware.
00:04:32.220 -->
00:04:33.100Okay.
00:04:33.100 -->
00:04:35.480So they've got these, these big pallets.
00:04:35.480 -->
00:04:45.460And what they did is they bought this Dell, 20 Dell R7 625 servers, which don't mean a lot to me, maybe due to some people.
00:04:45.460 -->
00:04:49.000But it basically takes up like two server racks.
00:04:49.320 -->
00:05:00.320And that means 4,000 CPUs, 7.7 terabytes of RAM and almost a half a petabyte of high speed SSD storage.
00:05:00.320 -->
00:05:05.900And that cost them $600,000 to buy that, which is a lot of money.
00:05:06.580 -->
00:05:15.980However, they were paying, like 1.2 million a year in cloud prices and cloud to AWS basically.
00:05:16.400 -->
00:05:18.420And so after six months it's paid for.
00:05:18.420 -->
00:05:22.400And the five years part is they expect this hardware to last them five years.
00:05:22.400 -->
00:05:24.440And apparently it's super, super fast.
00:05:24.440 -->
00:05:27.460So, it's, it's pretty interesting.
00:05:27.460 -->
00:05:33.320I would really recommend people go through and read this, what some of the values were.
00:05:33.320 -->
00:05:37.740And basically what they did is they said, we're going to buy like a really big server.
00:05:37.740 -->
00:05:44.200I know it's a bunch of kind of CPUs and stuff, but they kind of clustered into like one compute cluster.
00:05:44.200 -->
00:05:50.560And then they, they came up with this thing called, it's kind of like Kubernetes called Camel, which would work for Python.
00:05:50.560 -->
00:05:58.280But I think originally they're deploying Rails apps on it and basically gives you zero downtime slices of this giant server.
00:05:58.600 -->
00:06:04.100And the reason this really fascinates me is this, this whole philosophy here.
00:06:04.100 -->
00:06:15.020It's, it's also not just, Hey, they're leaving the cloud because, you know, many people are running to the cloud, but it's also, they're getting a really huge server.
00:06:15.020 -->
00:06:24.620Like one huge server rather than a whole bunch of small distributed servers, which also was like a little bit the way that, the cloud was initially sold, right?
00:06:24.620 -->
00:06:25.900We'll get commodity hardware.
00:06:26.280 -->
00:06:29.020You buy a bunch of little small slices all over the place.
00:06:29.020 -->
00:06:31.940You can buy more small slices with auto scaling if you need.
00:06:31.940 -->
00:06:41.780And instead they're like, no, this, and sort of along those same lines is I little while ago interviewed Mark Rusinovich, the CTO of Azure at Microsoft.
00:06:41.780 -->
00:06:46.040Super cool guy, really, really smart, but also CTO of Azure.
00:06:46.700 -->
00:06:50.180And he talked about how they started out with a bunch of small machines as well.
00:06:50.180 -->
00:06:55.800And they're just getting bigger and bigger ones and slicing them up for tenants to be using them.
00:06:55.800 -->
00:07:08.980So I think this is also a really interesting trend that we're going to see more of is like more, more big machines rather than a bunch of small machines that then maybe you slice up with Docker or Kubernetes or other things.
00:07:09.360 -->
00:07:20.820And Brian, we've hardly even talked about this yet, but that has changed the way I got to type holding, pulling the mic in the wrong hand here for typing.
00:07:20.820 -->
00:07:23.300That's changed the way that I'm running a lot of our infrastructure.
00:07:23.700 -->
00:07:26.260So I've been thinking about this for a while and reading this stuff.
00:07:26.260 -->
00:07:37.740I thought I'd make it the first topic of our show, but also I had eight servers for all the talk Python and Python bytes infrastructure, you know, some database server stuff.
00:07:37.740 -->
00:07:42.100One that ran Python bytes, a bunch of services and a bunch of small machines.
00:07:42.100 -->
00:07:42.300Right.
00:07:42.300 -->
00:07:44.340And I'm like, you know, why am I messing with all these small machines?
00:07:44.340 -->
00:07:55.300So I ended up consolidating like last week, all of that into one big, big server, just running a bunch of multi-tier Docker setups over there.
00:07:55.300 -->
00:07:56.880And it's glorious, right?
00:07:56.880 -->
00:07:58.360One machine runs great.
00:07:58.360 -->
00:08:00.320There's a single command.
00:08:00.320 -->
00:08:04.760I typed to upgrade like 13 different web apps all at once.
00:08:04.760 -->
00:08:11.540That means upgrade their server infrastructure, upgrade their, potentially to ship their new dependencies to rebuild them.
00:08:11.540 -->
00:08:12.620All of that kind of stuff.
00:08:12.620 -->
00:08:13.580One command.
00:08:13.980 -->
00:08:14.340Interesting.
00:08:14.340 -->
00:08:16.400So yeah, it's really interesting.
00:08:16.400 -->
00:08:17.020And it's really different.
00:08:17.020 -->
00:08:19.920It let me like quickly and easily throw in some more things.
00:08:19.920 -->
00:08:22.440And also I think it's better for security, right?
00:08:22.440 -->
00:08:31.960Like I had like little, FastAPI apps that were just like little utility things running that I didn't pay this much attention to as I did the other apps.
00:08:31.960 -->
00:08:40.040And so, you know, they just didn't, they didn't get their dependencies updated as frequently, frequently in their Python versions revved as frequently.
00:08:40.040 -->
00:08:42.520And if something happened to them, right.
00:08:42.560 -->
00:08:44.560It's on technically on the same VM, right?
00:08:44.560 -->
00:08:44.980That's an issue.
00:08:44.980 -->
00:08:48.000But now they're, they're all locked up behind like a Docker container.
00:08:48.000 -->
00:08:50.820so it's a little more isolation as well.
00:08:50.820 -->
00:08:53.400Anyway, it's this whole, I encourage people to read through.
00:08:53.520 -->
00:08:59.300I put a bunch of different, parts of this story in for the 37 signals.
00:08:59.300 -->
00:09:00.140We've left the cloud.
00:09:00.140 -->
00:09:01.840It's worth reading.
00:09:01.980 -->
00:09:03.660I'll just go through really quick, the five values.
00:09:03.660 -->
00:09:04.940And then this is kind of a long segment.
00:09:04.940 -->
00:09:06.900So I'll, I'll move us on.
00:09:06.900 -->
00:09:10.360But here are the five values guiding our cloud exit.
00:09:10.360 -->
00:09:13.640We value independence above all else.
00:09:13.640 -->
00:09:17.260And being trapped in Amazon cloud is not great.
00:09:17.260 -->
00:09:18.620We serve the internet.
00:09:18.620 -->
00:09:24.080This business owes its entire existence to societal and economic aberration.
00:09:24.080 -->
00:09:26.120That is the internet in a positive way.
00:09:26.120 -->
00:09:30.060And we don't want to just be locked up behind a few hyperscalers.
00:09:30.060 -->
00:09:35.100We want to be kind of just on the internet on our own terms, spend money wisely.
00:09:35.100 -->
00:09:38.340Even if you have lots of money, you know, they're getting better value for money.
00:09:39.680 -->
00:09:43.740leading the way, the cloud has been sold as the answer to SAS companies.
00:09:43.740 -->
00:09:44.420We're not so sure.
00:09:44.420 -->
00:09:47.240And they seek adventure and you bet that they do.
00:09:47.240 -->
00:09:50.200So anyway, it's not leaving data centers.
00:09:50.200 -->
00:09:51.900They have that in a managed data center.
00:09:51.900 -->
00:09:53.540They just have it on hardware that they own.
00:09:53.540 -->
00:09:55.000So anyway, what do you think about all this?
00:09:55.000 -->
00:10:04.120so a lot of this is, I think it's interesting that, that it affects you even like that you, but you're, you're not okay.
00:10:04.120 -->
00:10:09.260When you said you, you put them all on one machine, you're not, it's, you don't have like a, a server in your
00:10:09.260 -->
00:10:10.480basement or something.
00:10:10.480 -->
00:10:11.140No, no.
00:10:11.140 -->
00:10:16.140So what I did is I, instead of having a bunch of small VMs at digital ocean, I bought one big VM.
00:10:16.140 -->
00:10:16.660Okay.
00:10:16.660 -->
00:10:20.520The one I have right now is like eight gigs, four CPUs, but I'm pretty sure I'm going to
00:10:20.520 -->
00:10:22.980switch to like 16 gigs and eight CPUs.
00:10:22.980 -->
00:10:25.660And even that would be cheaper than what I was doing before.
00:10:25.660 -->
00:10:30.600And it's still, it, and the other thing that's interesting or in danger of going super long in
00:10:30.600 -->
00:10:35.480this, but, but because all those different apps are sharing, let's say the final destination of
00:10:35.480 -->
00:10:40.160eight CPUs, there's spikes in performance are not at the same time.
00:10:40.160 -->
00:10:45.280Like what makes talk Python or Python bytes spike in, in load is not the same that what
00:10:45.280 -->
00:10:50.220makes the courses spike on load, like a new course release or like black Friday or something
00:10:50.220 -->
00:10:55.160like that is very unlikely to intersect with when a podcast is released because I'm busy
00:10:55.160 -->
00:10:56.140doing one or the other.
00:10:56.140 -->
00:10:56.320Right.
00:10:56.640 -->
00:11:02.080And so they basically has access to all eight cores instead of that one gets two cores, that
00:11:02.080 -->
00:11:03.060one gets one core.
00:11:03.060 -->
00:11:07.320And even though they're sharing like basically in aggregate, it's the same number because the
00:11:07.320 -->
00:11:11.740spikes don't line up, they get more capacity for whatever they're doing.
00:11:11.740 -->
00:11:12.480It's pretty interesting.
00:11:12.480 -->
00:11:13.020Yeah.
00:11:13.020 -->
00:11:13.540Okay.
00:11:13.540 -->
00:11:15.460It is interesting.
00:11:15.460 -->
00:11:15.820Back to you.
00:11:15.820 -->
00:11:19.700Well, let's, let's completely go to a short topic.
00:11:20.380 -->
00:11:27.600And I'd like to talk about little tiny scripts or maybe big scripts, but single file applications.
00:11:27.600 -->
00:11:29.560So single file scripts.
00:11:29.560 -->
00:11:35.140So I wanted to talk about PEP 723 and that is inline script metadata.
00:11:35.140 -->
00:11:41.880And one of the things that we've noticed come recently in this, this is authored, it's interesting
00:11:41.880 -->
00:11:42.260author.
00:11:42.260 -->
00:11:44.500So the author is Ofec Lev.
00:11:44.600 -->
00:11:46.000I think that's how you say his name.
00:11:46.000 -->
00:11:47.580He's the dude from hatch.
00:11:47.580 -->
00:11:51.780So hatch is, I guess, in packaging.
00:11:51.780 -->
00:11:53.080So this is around packaging.
00:11:53.080 -->
00:12:00.820And the idea is that you've got a script has depend, might have dependencies also, and it
00:12:00.820 -->
00:12:07.620also might depend on Python and how we can't really tell Python currently that a script needs
00:12:07.620 -->
00:12:10.540a dependency or a particular version of Python.
00:12:10.540 -->
00:12:13.160So this is an attempt to kind of fix that.
00:12:13.300 -->
00:12:18.100And there's some, some motivation and stuff at the top that I like, you know, kind of
00:12:18.100 -->
00:12:19.160skimmed through a little bit.
00:12:19.160 -->
00:12:20.000No, I read it.
00:12:20.000 -->
00:12:27.780But the real at the end is we're going to put stuff like pyproject.toml, but
00:12:27.780 -->
00:12:29.500you can do it in a script.
00:12:29.500 -->
00:12:36.660And this isn't there yet, but there's an example where you just sort of do a pound sign and then
00:12:36.660 -->
00:12:39.640like a few slashes and then say script.
00:12:39.640 -->
00:12:44.980And then after that, you can put a little bit of like toml right in your, as a comment.
00:12:44.980 -->
00:12:48.320And the idea is something like a pip.
00:12:48.320 -->
00:12:48.520Right.
00:12:48.520 -->
00:12:53.100This is like the world's craziest docstring sort of thing.
00:12:53.100 -->
00:12:53.300Right.
00:12:53.300 -->
00:12:53.660Almost.
00:12:53.660 -->
00:12:54.600I don't understand.
00:12:54.600 -->
00:12:58.320So supposedly there's, there's reasons behind this syntax.
00:12:58.500 -->
00:13:02.520It's the weirdest syntax I've ever seen, but maybe it's just, it's not quite shebang, but
00:13:02.520 -->
00:13:03.880it's kind of shebang ish.
00:13:03.880 -->
00:13:04.380Yeah.
00:13:04.760 -->
00:13:09.140But like the, in their example, they're saying, okay, well, you've got a little, a little
00:13:09.140 -->
00:13:12.460script that just requires, you know, and this is going to be common.
00:13:12.460 -->
00:13:17.180I think actually requires requests and rich.
00:13:17.180 -->
00:13:20.940So, cause it's going to like grab something off the internet and it's going to print some
00:13:20.940 -->
00:13:23.160stuff and wants to do it with color and whatever.
00:13:23.540 -->
00:13:26.160But how do you do that without packaging it?
00:13:26.160 -->
00:13:31.620And, and here's one way is to just tell Python that it needs these other things.
00:13:31.620 -->
00:13:36.640So there's a, it's, I don't really completely understand this.
00:13:36.640 -->
00:13:39.640Like how, what are the backend, what's going to happen?
00:13:39.640 -->
00:13:45.240What is, I think the different tools will treat this different because my question is really,
00:13:45.380 -->
00:13:47.600where are these dependencies going to be installed at?
00:13:47.600 -->
00:13:51.900Is it like, if I just say, I guess it depends on the thing.
00:13:51.900 -->
00:13:56.140So if you're going to do, if it hatched for instance, or pipX might handle this.
00:13:56.140 -->
00:14:01.840So if I say pipX, you know, run this script and it finds this, it'll probably create a pipX
00:14:01.840 -->
00:14:02.980virtual environment area.
00:14:02.980 -->
00:14:06.040And hatch will do the same thing in a different manner.
00:14:06.040 -->
00:14:10.520But behind the scenes grab, like create a little virtual environment.
00:14:10.520 -->
00:14:14.400This kind of, it mostly, it seems like it's hiding virtual environment.
00:14:14.400 -->
00:14:19.120And dependency installs from users, but it's probably needed.
00:14:19.120 -->
00:14:20.980So anyway, what do you think of this?
00:14:20.980 -->
00:14:22.020It gets interesting.
00:14:22.020 -->
00:14:30.180Similar to installed, as Liz is pointing out, sounds very similar to installed that we talked
00:14:30.180 -->
00:14:31.300about not too long ago.
00:14:31.300 -->
00:14:33.900And I think it solves an interesting problem.
00:14:33.900 -->
00:14:38.780All of these do have that, that little bit of a bootstrap that has to happen, right?
00:14:38.780 -->
00:14:44.340For, or something for, for this work, it's not built into Python, right?
00:14:44.340 -->
00:14:51.180And so you've got to have like one library installed that then you can use to run and kick off all the other runs.
00:14:51.180 -->
00:14:59.720But if, if you somehow make that happen or get a, get your company to agree, like we're all going to have this foundation and then it just runs.
00:14:59.720 -->
00:15:02.900I think that's pretty cool.
00:15:02.900 -->
00:15:05.040And I think OFAC is killing it, right?
00:15:05.040 -->
00:15:09.060He's, he's being really creative and working a lot of different things.
00:15:09.060 -->
00:15:10.860And this is a PEP, right?
00:15:10.920 -->
00:15:17.560So if this was built into Python, then, then all of a sudden, yeah, we can have, have it run.
00:15:17.560 -->
00:15:18.140So I, okay.
00:15:18.140 -->
00:15:22.480So for some reason I flew right over my head that it's a PEP and not just an extension to Hatch.
00:15:22.480 -->
00:15:28.040So yeah, this, this is going to be, this could be super, super important.
00:15:28.040 -->
00:15:30.320And it was last updated in December.
00:15:30.320 -->
00:15:31.880It's accepted now.
00:15:31.880 -->
00:15:35.680I'm not sure how long it's been accepted, but it's around the packaging.
00:15:35.680 -->
00:15:44.480So PEPs with packaging are interesting because we don't really have to wait for, once they're accepted, we don't really have to wait for a release of Python.
00:15:44.480 -->
00:15:52.460Because things like PEP and Hatch and other things don't have the same, you know, release cadence as Python.
00:15:52.460 -->
00:16:01.920So this could be like, there's a note here that says it's not going to be declared final until at least a couple of tools utilize it.
00:16:01.920 -->
00:16:04.400So, so far, there's no tools that utilize it.
00:16:04.400 -->
00:16:08.040But their example is possibly pip run and pip X.
00:16:08.040 -->
00:16:10.860So, and, and probably Hatch as well.
00:16:10.860 -->
00:16:13.040It's considering who wrote it.
00:16:13.040 -->
00:16:17.720But yeah, yeah, I would imagine it might show up and might get support from Hatch as well.
00:16:17.720 -->
00:16:18.160Yeah.
00:16:18.160 -->
00:16:18.440Yeah.
00:16:18.440 -->
00:16:20.280Funny, funny comments out there in the audience.
00:16:20.400 -->
00:16:23.560About being Rust inspired indeed.
00:16:23.560 -->
00:16:26.460Brian, you want to know what else is inspiring?
00:16:26.460 -->
00:16:27.180What?
00:16:27.180 -->
00:16:29.460Our sponsor, Bright Data.
00:16:29.460 -->
00:16:30.220Yeah.
00:16:30.220 -->
00:16:30.980Indeed.
00:16:30.980 -->
00:16:35.380So I just want to say thank you to Bright Data for supporting the show.
00:16:35.380 -->
00:16:38.900Check them out at pythonbytes.fm/bright data.
00:16:38.900 -->
00:16:40.760And there's, go ahead, yeah.
00:16:40.760 -->
00:16:42.940Do we want to put their stuff on the?
00:16:42.940 -->
00:16:43.860We do.
00:16:43.860 -->
00:16:47.880And somehow I did not quite, we didn't quite do it.
00:16:47.880 -->
00:16:48.440There we go.
00:16:49.360 -->
00:16:49.760Awesome.
00:16:49.760 -->
00:16:50.000Yeah.
00:16:50.000 -->
00:16:54.120So there's tons and tons of data out on the internet.
00:16:54.120 -->
00:16:56.020Unimaginable amounts of data, right?
00:16:56.020 -->
00:17:00.220And we're lucky to live in a time where so much of this is behind structured APIs.
00:17:00.220 -->
00:17:04.480And you can go and access it with HTTPX or requests or whatever.
00:17:04.480 -->
00:17:08.740But the truth is that most of the data is not served up over clean APIs.
00:17:08.740 -->
00:17:12.700It's just sitting there on a web page as gnarly HTML.
00:17:12.700 -->
00:17:14.440Maybe it's even worse than that.
00:17:14.440 -->
00:17:20.180Maybe it's obscured behind some front-end framework like React, where when you actually look at the
00:17:20.180 -->
00:17:22.600HTML, it just says, pull in the React app.
00:17:22.600 -->
00:17:23.500Good luck with that.
00:17:23.500 -->
00:17:25.740And then something else happens somewhere along the way, right?
00:17:25.740 -->
00:17:28.000So getting access to that data can be hard.
00:17:28.000 -->
00:17:28.760What's the answer?
00:17:28.900 -->
00:17:31.080Well, web scraping, everyone says.
00:17:31.080 -->
00:17:31.760Yes.
00:17:31.760 -->
00:17:32.440True.
00:17:33.220 -->
00:17:36.900But just like you wouldn't want to set up your production infrastructure in your home office,
00:17:36.900 -->
00:17:42.640running web scraping jobs on a single computer, even in a data center, can lead to your program
00:17:42.640 -->
00:17:50.160being potentially unreliable with data pinned to whatever source you're accessing thinks you're
00:17:50.160 -->
00:17:50.800located, right?
00:17:50.840 -->
00:17:55.800So maybe there's different data if you're in the EU than if you're in Ohio, but your computer's in Ohio,
00:17:55.800 -->
00:17:56.440so there you go.
00:17:56.440 -->
00:18:01.220Or, you know, it gets blocked because of rate limiting or other types of things like that,
00:18:01.220 -->
00:18:01.440right?
00:18:01.440 -->
00:18:05.300So if you need to do professional web scraping, check out Bright Data.
00:18:05.300 -->
00:18:11.520They have award-winning proxy network with millions of different places to access data from.
00:18:11.520 -->
00:18:16.760And powerful web scrapers, they have even ready-to-go data sets you can download.
00:18:16.760 -->
00:18:20.620So they've already curated these data sets, and you can just access them.
00:18:20.620 -->
00:18:24.180And get updates from them and not even do web scraping, which is awesome.
00:18:24.180 -->
00:18:25.720So they've got a whole marketplace for that.
00:18:25.720 -->
00:18:31.040And everyone knows, we're probably going to come back to it some more, privacy-conscious
00:18:31.040 -->
00:18:32.540stuff that I really care about.
00:18:32.540 -->
00:18:36.560And they are both CCPA and GDPR compliant.
00:18:36.560 -->
00:18:41.620They have low-code solutions, as well as Python programming models with asyncioM Playwrights.
00:18:41.620 -->
00:18:46.380So if you have serious data needs and those websites that have the data don't offer an API,
00:18:46.380 -->
00:18:48.160then you need to check out Bright Data.
00:18:48.480 -->
00:18:52.040Give them a try at pythonbytes.fm/brightdata.
00:18:52.040 -->
00:18:55.040And please use that URL so you know that they heard from us.
00:18:55.040 -->
00:18:56.920Thank you to Bright Data for supporting the show.
00:18:56.920 -->
00:18:59.660Links in your podcast player show notes.
00:18:59.660 -->
00:19:01.120So pretty awesome.
00:19:01.120 -->
00:19:02.620All right.
00:19:02.620 -->
00:19:05.160Back to the next thing.
00:19:05.740 -->
00:19:07.300So this is super exciting.
00:19:07.300 -->
00:19:10.300And it came, I believe this was sent in by Balaz.
00:19:10.300 -->
00:19:10.660Let me check.
00:19:10.660 -->
00:19:11.600Yeah, Balaz sent this over.
00:19:11.600 -->
00:19:13.680Thank you, Balaz, for pointing this out.
00:19:13.680 -->
00:19:17.420So I've had Fyodor Fitzner on Python before.
00:19:18.480 -->
00:19:21.040And we've talked about Flet.
00:19:21.040 -->
00:19:27.320And Flet is basically Flutter, but with a Python programming API, right?
00:19:27.320 -->
00:19:32.000Flutter is actually how we built the apps at Talk Python, right, for courses.
00:19:32.000 -->
00:19:33.220Super cool framework.
00:19:33.220 -->
00:19:34.640But you're writing Dart.
00:19:35.040 -->
00:19:38.160And Dart is good, but it's not Python, right?
00:19:38.160 -->
00:19:41.820And so it'd be great to be able to write that kind of code.
00:19:41.820 -->
00:19:43.940Here's an example, by the way, Brian.
00:19:43.940 -->
00:19:45.520We talked about fast UI.
00:19:45.520 -->
00:19:52.900And I said, oh, that reminds me, this sort of hierarchical code structure reminds me of Flutter, right?
00:19:53.040 -->
00:19:58.320And so here's the same thing, the Flutter UI, but in Python code instead of Dart.
00:19:58.320 -->
00:20:00.520And the link for this code is in the show notes.
00:20:00.520 -->
00:20:01.680You can check it out, right?
00:20:01.680 -->
00:20:05.980So the big news is you can now build APKs for Android.
00:20:05.980 -->
00:20:10.040And for those of you who have not suffered the indignity of the app stores,
00:20:10.040 -->
00:20:15.860the way you get something into the Google Play store is you build what's called an APK.
00:20:15.860 -->
00:20:17.440And then you send them that.
00:20:17.440 -->
00:20:18.520They process it.
00:20:18.520 -->
00:20:21.780And then that's what gets shipped out to run on the phones on Android.
00:20:22.000 -->
00:20:27.480So this means even though Flutter built Flutter apps, you couldn't really deploy it.
00:20:27.480 -->
00:20:31.400You could kind of get the Flutter app and then put your Python code on there.
00:20:31.400 -->
00:20:32.560But that's not like your app.
00:20:32.560 -->
00:20:35.200That's like Jupyter or something like that kind of.
00:20:35.200 -->
00:20:36.720So this is awesome.
00:20:36.720 -->
00:20:40.800This means that people can now build apps that go in the app store,
00:20:40.800 -->
00:20:45.780at least for Android, with Flutter and Flutter and Python in particular.
00:20:45.780 -->
00:20:47.360We'll see about iOS.
00:20:47.360 -->
00:20:48.080It's on the roadmap.
00:20:48.080 -->
00:20:49.520So super exciting.
00:20:49.520 -->
00:20:50.960Yeah.
00:20:50.960 -->
00:20:59.820I mean, I would have used Flutter if I was sure I could get it to build and ship and on the different things.
00:20:59.820 -->
00:21:03.500I'd much rather have done that than use Flutter or a Dart, you know, for Flutter.
00:21:03.500 -->
00:21:06.280But, you know, you got to work with the building blocks you got.
00:21:06.280 -->
00:21:07.480And this one just got better.
00:21:07.480 -->
00:21:08.280So exciting.
00:21:08.280 -->
00:21:08.900Yeah.
00:21:09.260 -->
00:21:10.180Oh, also really quick.
00:21:10.180 -->
00:21:15.160In those show notes, there's a video by this guy called Neural9.
00:21:15.160 -->
00:21:16.260His channel is called Neural9.
00:21:16.260 -->
00:21:18.840Walking through the steps to do that, all that build.
00:21:18.840 -->
00:21:19.700So you want to see how it works.
00:21:19.700 -->
00:21:21.200You can watch that eight-minute video.
00:21:21.580 -->
00:21:21.680Cool.
00:21:21.680 -->
00:21:21.680Cool.
00:21:21.680 -->
00:21:22.160Neat.
00:21:22.160 -->
00:21:25.420So that's for Android apps.
00:21:25.420 -->
00:21:30.980For command line, normal command line stuff, I was going to talk about Harlequin.
00:21:31.400 -->
00:21:39.360So there's a lot of people that use SQL and SQLite for different purposes, of course, for databases.
00:21:39.840 -->
00:21:46.760But to take a look at your SQLite data, there is an IDE called Harlequin.
00:21:46.760 -->
00:21:48.420I don't think we've covered it.
00:21:48.420 -->
00:21:57.380But it's an open source Python project that it looks like it's pretty cool.
00:21:57.380 -->
00:22:03.620It's got like on the, we're showing on the screen, the little snippet or screenshot.
00:22:03.620 -->
00:22:08.440You've got kind of your tables, your data catalog on the left panel.
00:22:08.840 -->
00:22:13.680They've got a query editor and then some query results at the bottom right.
00:22:13.680 -->
00:22:18.780And it actually looks pretty slick for like quickly going through some data.
00:22:18.780 -->
00:22:24.940It looks like it has hooks to go into DuckDB and SQLite.
00:22:24.940 -->
00:22:26.620That's why I brought up SQLite.
00:22:26.620 -->
00:22:28.800And I'd probably use it for SQLite.
00:22:28.800 -->
00:22:29.580I haven't used DuckDB.
00:22:29.580 -->
00:22:35.000Yeah, for people who don't know, DuckDB is also in process, very much like SQLite,
00:22:35.000 -->
00:22:36.960but it's columnar instead of row-based.
00:22:36.960 -->
00:22:38.760So they're kind of in the same way.
00:22:38.760 -->
00:22:39.200Oh, okay.
00:22:39.200 -->
00:22:39.640I guess.
00:22:39.640 -->
00:22:40.120Yeah.
00:22:40.120 -->
00:22:40.600Okay.
00:22:40.600 -->
00:22:45.020Yeah, I haven't used it, but definitely SQLite use that a lot.
00:22:45.320 -->
00:22:48.100So this is kind of fun.
00:22:48.100 -->
00:22:49.600I like command line tools.
00:22:49.600 -->
00:22:50.580This looks neat.
00:22:50.580 -->
00:22:52.960It's kind of a short topic.
00:22:52.960 -->
00:22:57.520Just, hey, this is a command line interface for SQLite or DuckDB.
00:22:57.520 -->
00:22:59.960And that's fun.
00:22:59.960 -->
00:23:03.360It looks like it runs on Linux, Mac, and Windows, which is cool.
00:23:04.980 -->
00:23:11.680But I was also, one of the things I've noticed is in, like, for instance, a lot of Django tutorials,
00:23:11.680 -->
00:23:14.940Django starts with SQLite.
00:23:14.940 -->
00:23:17.040And you, I mean, by default, it does that.
00:23:17.040 -->
00:23:20.120And I think that you can, and then you can specify other databases.
00:23:20.200 -->
00:23:26.500But I noticed today a discussion on Mastodon that I wanted to bring up kind of SQLite related.
00:23:26.500 -->
00:23:32.460Jeff Triplett posted a post by somebody else, Anze.
00:23:33.460 -->
00:23:40.420But, okay, Jeff's comment is, this is a nice write-up about using SQLite in production with pitfalls and open questions.
00:23:40.420 -->
00:23:46.800I cringe whenever I see some Django Python luminary recommending people use SQLite in production.
00:23:46.800 -->
00:23:48.880I don't care how good you are.
00:23:48.880 -->
00:23:51.620You won't get it right, even if you think you did.
00:23:51.620 -->
00:23:55.380Anyway, so interesting commentary there.
00:23:55.380 -->
00:24:01.500So Anze's post was, I wrote a blog post about using SQLite in production and dealing with DB.
00:24:02.040 -->
00:24:03.840DB is closed errors.
00:24:03.840 -->
00:24:05.580I'm happy to hear your thoughts.
00:24:05.580 -->
00:24:12.880So the article is called Django SQLite and Databases Locked Error, and it walks through those.
00:24:12.880 -->
00:24:20.200And kind of the reality is Django doesn't, I guess, lock the database when it reads correctly.
00:24:20.200 -->
00:24:21.480The transactions are weird.
00:24:21.480 -->
00:24:34.680And a lot of the discussion around this really is if you're using SQLite for a database that's mostly read-only, most people are just reading stuff, it'll probably work fine.
00:24:34.680 -->
00:24:35.720And it might work great.
00:24:35.720 -->
00:24:39.460And it might be way less hassle than doing Postgres or something else.
00:24:39.680 -->
00:24:47.580But if there are a lot of transactions that are writing to it, if you have multiple writers, then you've got issues.
00:24:47.580 -->
00:24:51.640So just thought this was an interesting discussion.
00:24:51.640 -->
00:24:52.580I wanted to bring it up.
00:24:52.580 -->
00:24:53.540Yeah.
00:24:53.780 -->
00:24:57.900I think it really depends on the type of app you got.
00:24:57.900 -->
00:25:00.160Is it an analytics thing that's writing like crazy?
00:25:00.160 -->
00:25:03.040Or is it basically like the database here blog?
00:25:03.440 -->
00:25:09.280Right where it's really just you make an entry once a week if you're a good blogger.
00:25:09.280 -->
00:25:10.160You know what I mean?
00:25:10.160 -->
00:25:10.820That kind of thing.
00:25:10.820 -->
00:25:12.460And then it's all reads.
00:25:12.460 -->
00:25:13.400Probably fine.
00:25:13.400 -->
00:25:13.840Right.
00:25:13.840 -->
00:25:23.340So somewhere in the middle, I guess, like you can sort of turn that bar or watch that gauge turn from green to red as it gets closer to like a full analytics system.
00:25:23.340 -->
00:25:24.660But yeah, it's pretty interesting.
00:25:24.660 -->
00:25:25.220Yeah.
00:25:25.220 -->
00:25:26.860Hey, interesting discussion.
00:25:26.860 -->
00:25:27.840Indeed.
00:25:27.840 -->
00:25:28.320All right.
00:25:28.320 -->
00:25:28.980What you got?
00:25:28.980 -->
00:25:30.360Oh, we're done.
00:25:30.360 -->
00:25:31.020We're done.
00:25:31.020 -->
00:25:31.720We're done.
00:25:31.720 -->
00:25:33.280But we're not done because I have many extras.
00:25:33.280 -->
00:25:33.920Do you have extras?
00:25:33.920 -->
00:25:36.360I've got just a couple extras.
00:25:36.360 -->
00:25:40.340So since I've got my screen up, I'll run through a couple extras.
00:25:40.340 -->
00:25:42.940I've been I've kind of start.
00:25:42.940 -->
00:25:51.500I started Python people podcast last summer and then kind of ran out of time trying to get the pytest course done.
00:25:51.500 -->
00:25:54.580And so now I'm coming back and cleaning up some things.
00:25:54.580 -->
00:25:58.180So there's there's a few recent episodes that finally came out.
00:25:58.180 -->
00:26:01.680So like I stopped in October and then picked it up in January.
00:26:01.680 -->
00:26:06.640So we've got Will Vincent and Julian Seguera and Pamela Fox episodes out now.
00:26:06.640 -->
00:26:07.740So check those out.
00:26:07.740 -->
00:26:08.460Oh, excellent.
00:26:08.460 -->
00:26:09.020Yeah.
00:26:09.020 -->
00:26:09.900Those are all great people.
00:26:09.900 -->
00:26:13.600And many of them have been on this show as well.
00:26:13.600 -->
00:26:14.660So very cool.
00:26:14.660 -->
00:26:15.880Nice to see these going there.
00:26:15.880 -->
00:26:21.380They provide a really interesting look, like really out of bounds looks into what people are doing.
00:26:21.580 -->
00:26:25.640You know, like you and Paul talked a lot about lacrosse.
00:26:25.640 -->
00:26:26.040Right.
00:26:26.040 -->
00:26:30.820And empowering women and and not not the next PEP.
00:26:30.820 -->
00:26:32.060And that was really interesting.
00:26:32.060 -->
00:26:33.100So keep it going.
00:26:33.100 -->
00:26:42.080Some of the fun bits are to try to try to talk to kind of dig deeper into stuff that like I normally don't ask about in.
00:26:42.080 -->
00:26:42.700Yeah.
00:26:42.700 -->
00:26:44.980Like, for instance, Julian Seguera.
00:26:44.980 -->
00:26:47.420Julian's a really pretty positive person.
00:26:47.420 -->
00:26:51.540So I poked at that a bit and tried to ask him, like, really, how did you get this mindset?
00:26:51.660 -->
00:26:53.580I mean, clearly bad stuff must happen to you.
00:26:53.580 -->
00:27:00.460And so we talk about his, you know, how does he get through it and, you know, keep maintaining a positive mindset.
00:27:00.460 -->
00:27:01.400So it's good.
00:27:01.400 -->
00:27:03.680Anyway, what are your extras for us?
00:27:03.680 -->
00:27:05.460Let's see if I can find him here.
00:27:05.460 -->
00:27:05.860Okay.
00:27:05.860 -->
00:27:06.560Page find.
00:27:06.560 -->
00:27:07.900Yes, that's the first one.
00:27:07.900 -->
00:27:08.460Page find.
00:27:08.460 -->
00:27:11.840So, Brian, you and I, we both Hugo, right?
00:27:11.840 -->
00:27:12.260Yeah.
00:27:12.260 -->
00:27:14.140Hugo is awesome.
00:27:14.140 -->
00:27:17.500Go Hugo for people who don't know.
00:27:17.500 -->
00:27:18.940Go Hugo.io.
00:27:18.940 -->
00:27:19.540That's right.
00:27:20.520 -->
00:27:26.820Super, super cool way to build static websites, not just blogs, but static websites that are really, really powerful.
00:27:26.820 -->
00:27:30.480And I learned about this one from Mark Little.
00:27:30.480 -->
00:27:36.720He also does a ton of stuff with Hugo and said, hey, you should check out page find.
00:27:36.720 -->
00:27:38.540So what is this?
00:27:38.540 -->
00:27:39.040I have no idea.
00:27:39.040 -->
00:27:47.020So page find, this is not just a Hugo thing, but for all static sites, it's a fully static search library, right?
00:27:47.020 -->
00:28:00.940So for static sites, whether this is Flask Freeze or Hugo or Pelican or whatever, this is like a post build step thing that runs and it indexes all of your HTML or the parts that you tell it to index.
00:28:01.400 -->
00:28:04.800Or tell it to, you know, you can basically say, don't include this part or whatever.
00:28:04.800 -->
00:28:07.320And it's no configuration.
00:28:07.320 -->
00:28:08.860It has rich filtering.
00:28:08.860 -->
00:28:11.320It has custom sorting attributes.
00:28:11.960 -->
00:28:18.960And the way it structures, what it does basically is JavaScript and it has an index that then the JavaScript reads in.
00:28:18.960 -->
00:28:21.040But the index is broken into a bunch of pieces.
00:28:21.040 -->
00:28:26.180So the front end stuff can like pull just little bits of it and not pull all the results back basically, right?
00:28:26.640 -->
00:28:34.980So I added this over to my website where if you're over here, like Brian, we could see what I said about AI and check that out.
00:28:34.980 -->
00:28:35.420Isn't that awesome?
00:28:35.420 -->
00:28:38.780So it finds all the different things that we could be talking about.
00:28:38.780 -->
00:28:48.640But it also like in my document, in my markdown, I have like H1, H2, H3, and it will actually subdivide the results into sections.
00:28:48.640 -->
00:28:53.520Like what is in this section marked by H2 on this one page?
00:28:53.520 -->
00:28:54.620Oh, that's pretty cool.
00:28:54.900 -->
00:28:55.740That's really cool, right?
00:28:55.740 -->
00:29:05.180And it also does things like, I don't know if I can see any examples here, but if you type Y-O, it'll do like you, yourself, et cetera.
00:29:05.180 -->
00:29:07.240So it's not even just like exact word matching.
00:29:07.240 -->
00:29:09.100It's like a really smart search engine.
00:29:09.100 -->
00:29:17.820And all it takes is just running a script for like a couple of seconds after you build your static site and then dropping the output into like a known location.
00:29:17.820 -->
00:29:18.740Is that cool or what?
00:29:18.740 -->
00:29:19.700That's very cool.
00:29:19.700 -->
00:29:25.720It's one of the issues I've had when switching to a static site is not knowing how to deal with the search part.
00:29:25.720 -->
00:29:26.540Yeah.
00:29:26.540 -->
00:29:27.780So I was psyched when Mark sent this over.
00:29:27.780 -->
00:29:29.240I'm like, yes, this is going in.
00:29:29.240 -->
00:29:29.760Yeah.
00:29:29.980 -->
00:29:34.720The other part that I'm trying to figure out is how to get a decent contact form.
00:29:34.720 -->
00:29:37.500So that's still to be determined.
00:29:37.500 -->
00:29:38.280Yeah.
00:29:38.280 -->
00:29:40.120I don't think Pagefind is going to help with that, but this is cool.
00:29:40.120 -->
00:29:40.880This is really cool.
00:29:40.880 -->
00:29:42.100So I recommend it.
00:29:42.100 -->
00:29:43.340I'll add it to my stuff too.
00:29:43.340 -->
00:29:43.700Neat.
00:29:44.040 -->
00:29:45.900It's incredibly fast.
00:29:45.900 -->
00:29:49.860Like search for AI and I'm on like hotel Wi-Fi and it's nearly instant.
00:29:49.860 -->
00:29:50.400Right.
00:29:50.400 -->
00:29:55.380So that's, that is super, super cool where there's a lot of sites, even static sites.
00:29:55.380 -->
00:29:57.080You'll be like searching, searching.
00:29:57.080 -->
00:29:58.360You'll see the little spinner.
00:29:58.360 -->
00:29:59.220You're like, what is it doing?
00:29:59.220 -->
00:30:00.380Like, why is this search slow?
00:30:00.380 -->
00:30:01.840No, it should be instant.
00:30:01.840 -->
00:30:02.360Right.
00:30:02.360 -->
00:30:08.140And that's, you know, very much in line with like plugging something like this into Hugo means like it's still instant.
00:30:08.140 -->
00:30:08.420All right.
00:30:08.420 -->
00:30:09.220I got a few more.
00:30:09.220 -->
00:30:10.040Let's, let's blaze them.
00:30:10.500 -->
00:30:10.820Okay.
00:30:10.820 -->
00:30:16.100This is not to encourage people like more of a, just an interesting, Hey, careful.
00:30:16.100 -->
00:30:18.540We've got PyPI and pip.
00:30:18.540 -->
00:30:20.640The JavaScript world hasnpm.
00:30:20.640 -->
00:30:27.880There's an article called when everything becomes too much, the npm package chaos of 2024.
00:30:27.880 -->
00:30:37.620An npm user named Patrick JS launched a troll campaign with a package called everything that depended on every npm package there.
00:30:40.100 -->
00:30:45.800So when you install it, it tries to install the, you know, millions of npm packages.
00:30:45.800 -->
00:30:48.080And it just, it destroyed it.
00:30:48.080 -->
00:30:54.540Like, cause people were installing it and, it was just taking too much resources and so on.
00:30:54.540 -->
00:30:56.600So the follies of package management.
00:30:56.600 -->
00:30:57.060How's that?
00:30:57.060 -->
00:30:57.800Yeah.
00:30:57.800 -->
00:30:58.320Nice.
00:30:58.320 -->
00:30:59.160All right.
00:30:59.160 -->
00:31:00.320I'll get a little out of order here.
00:31:00.480 -->
00:31:11.300So Matthew Feikert wanted us, and we're happy to do so, announce that the SciPy conference, is coming and will be in beautiful Tacoma, Washington this year.
00:31:11.760 -->
00:31:16.100So if you're interested, check that out and put a link to that.
00:31:16.100 -->
00:31:24.080And the last thing is I wrote an essay called unsolicited advice from Mozilla and Firefox about four things.
00:31:24.180 -->
00:31:40.860I think, you know, three things I think they did wrong and four things I think they could do to like absolutely both change the way that, the place of Firefox in the market and alleviate their, their insane dependency on Google.
00:31:40.860 -->
00:31:42.720Like I'm not anti-Google.
00:31:42.720 -->
00:31:44.240I, I do stuff with Google.
00:31:44.240 -->
00:31:53.460I love YouTube, things like that necessarily, but I don't think they're congruent with Python, with, Firefox's focus on privacy very much.
00:31:53.460 -->
00:32:01.500And also 95% of your company's revenue from one deal with one company that's kind of at a whim could just change their mind.
00:32:01.500 -->
00:32:02.680That's not a great place to be.
00:32:02.680 -->
00:32:03.980I'd like to see Firefox doing well.
00:32:03.980 -->
00:32:09.080So I thought a lot about it and wrote about it, including they should just lie about their user agent, right?
00:32:09.080 -->
00:32:16.200Like when a website says this site runs best on Chrome and using this crappy old browser, we don't know about, you know why you never see that on Vivaldi or Brave?
00:32:16.200 -->
00:32:19.260Because their user agent is identical to Chrome.
00:32:19.260 -->
00:32:21.820So when you get to the website, like, oh, this is my favorite one.
00:32:21.820 -->
00:32:22.180Perfect.
00:32:22.180 -->
00:32:23.140We're good to go.
00:32:23.140 -->
00:32:23.520Right.
00:32:23.520 -->
00:32:25.400How many people leave Firefox?
00:32:25.400 -->
00:32:29.300Cause when they get to a site, it says, this doesn't work well, you need to go get this other browser.
00:32:29.300 -->
00:32:29.840Yeah.
00:32:29.840 -->
00:32:34.060It would stop saying that if Firefox just said, Hey, our, we're Chrome, you know, things like that.
00:32:34.060 -->
00:32:34.220Right.
00:32:34.220 -->
00:32:35.660And sure.
00:32:35.660 -->
00:32:36.660It would hurt a little.
00:32:36.660 -->
00:32:37.680It would hurt their pride.
00:32:37.800 -->
00:32:41.600But people leave Firefox because the website will refuse to run.
00:32:41.600 -->
00:32:42.140Right.
00:32:42.140 -->
00:32:42.620Yeah.
00:32:42.620 -->
00:32:47.960And if, if it, it probably would work, but if it's going to refuse to work, then it's not going to work.
00:32:47.960 -->
00:32:48.320Right.
00:32:48.320 -->
00:32:48.940Things like that.
00:32:48.940 -->
00:32:50.620So anyway, this is, I think it's a really fun article.
00:32:50.620 -->
00:32:52.180I had a lot of fun thinking about it.
00:32:52.180 -->
00:32:53.120So people can check that out.
00:32:53.120 -->
00:32:59.880And I think, I don't want to dwell on this too much, but the, there are like a lot of internal sites stuff.
00:32:59.880 -->
00:33:05.360So a lot of people, do internal tools at companies and the, they'll do that.
00:33:05.360 -->
00:33:11.440They'll be like, it should use Chrome and somebody will try it with Firefox and they'll be like, Oh, it doesn't work.
00:33:11.440 -->
00:33:12.980And it probably does.
00:33:12.980 -->
00:33:15.520It just, it just blocks it for the heck of it.
00:33:15.520 -->
00:33:15.880So.
00:33:15.880 -->
00:33:16.540Exactly.
00:33:16.540 -->
00:33:17.900And no one's going to update that site.
00:33:17.900 -->
00:33:18.460Right.
00:33:18.540 -->
00:33:19.880It's just, yeah.
00:33:19.880 -->
00:33:24.140Another thing that's just maybe interesting to put on people's radar is another thing.
00:33:24.140 -->
00:33:37.920a friend of mine co-founded is this thing called Island, which is like a enterprise browser meant just for like giving enterprises, super interesting control over things like that.
00:33:37.920 -->
00:33:38.600You're just talking about.
00:33:38.600 -->
00:33:40.120So this is actually a super interesting.
00:33:40.120 -->
00:33:42.600One of the things I think Firefox could do, but also it was just really interesting.
00:33:42.600 -->
00:33:43.300Island.io.
00:33:43.300 -->
00:33:44.080People can check that out.
00:33:44.080 -->
00:33:45.260Sounds weird.
00:33:45.260 -->
00:33:46.200Like, why would you ever want that?
00:33:46.200 -->
00:33:49.000And then you watch the video or listen to it and you're like, actually, that's awesome.
00:33:49.000 -->
00:33:49.420So.
00:33:49.420 -->
00:33:51.240Okay.
00:33:51.240 -->
00:33:52.620Like installed.
00:33:52.620 -->
00:33:53.640All right.
00:33:53.640 -->
00:33:53.860All right.
00:33:53.860 -->
00:33:54.820Shall we joke?
00:33:54.820 -->
00:33:56.140Yeah, let's do a joke.
00:33:56.140 -->
00:33:57.100All right.
00:33:57.100 -->
00:33:58.780Well, this is a Linux joke.
00:33:58.780 -->
00:34:00.740It's more than a Python joke, honestly.
00:34:00.740 -->
00:34:03.380So Brian, have you ever got a bike lock?
00:34:03.380 -->
00:34:05.320One of those, really a combination lock for anything.
00:34:05.320 -->
00:34:06.760But in this case, it's a bike lock, right?
00:34:06.760 -->
00:34:07.360Okay.
00:34:07.360 -->
00:34:13.040So here's a little character says my new bicycle lock to keep my new bicycle secure.
00:34:13.040 -->
00:34:14.480It has three digits.
00:34:14.480 -->
00:34:14.920Let's see.
00:34:14.980 -->
00:34:17.580So that's a thousand combinations of what we could have.
00:34:17.580 -->
00:34:21.500And then they start to rule out what are the ridiculous ones, right?
00:34:21.500 -->
00:34:24.820Like one, two, three and stuff like, hmm, nine, nine, eight, maybe.
00:34:24.820 -->
00:34:31.000I am not silly enough to use 666 or 777 to give full access to everyone.
00:34:31.000 -->
00:34:36.980You know, change mod 777, which gives it full access to the, rewrite access to whatever you
00:34:36.980 -->
00:34:38.020change modded.
00:34:38.020 -->
00:34:39.700That is funny.
00:34:39.700 -->
00:34:40.800Yeah, it's pretty good.
00:34:41.120 -->
00:34:42.760I mean, obviously you wouldn't use 777.
00:34:42.760 -->
00:34:51.040I may be the wrong target market for this because it's sort of funny, but also I'm thinking,
00:34:51.040 -->
00:34:55.220did bike locks really have three combinations, three of those, or were there four?
00:34:55.800 -->
00:34:57.040You're being way too practical.
00:34:57.040 -->
00:34:58.960You're like four or six or something like that.
00:35:00.040 -->
00:35:03.760I had a smartphone smart lock once and it was awesome.
00:35:03.760 -->
00:35:05.700You would hold your phone up to it and it went lock.
00:35:05.700 -->
00:35:09.680I got it from my electric bike before my knees decided electric biking wasn't for me.
00:35:10.420 -->
00:35:16.660And one time I was out biking with a friend and I parked it in the summer in the sun and like the
00:35:16.660 -->
00:35:20.760electronics bit of it got direct sunlight and it's black because it's a lock, right?
00:35:20.760 -->
00:35:25.820Got super hot, like so hot you couldn't hardly touch it, but also so hot that like the electronics
00:35:25.820 -->
00:35:27.060wouldn't run and I couldn't unlock it.
00:35:27.060 -->
00:35:29.500I had to like put it in the shade for an hour before I could go home.
00:35:29.500 -->
00:35:30.460I was so frustrated.
00:35:30.460 -->
00:35:33.980I like covered it with my shirt or something and just sat there till it cooled off so I could
00:35:33.980 -->
00:35:34.400go home.
00:35:34.760 -->
00:35:35.840Oh, that's bad.
00:35:35.840 -->
00:35:41.020And then also I've seen like the combination really kind of doesn't matter.
00:35:41.020 -->
00:35:45.840It's how thick the rest of the lock is because I've seen people just come up with these like
00:35:45.840 -->
00:35:49.700battery powered just cutters and just cut the lock off.
00:35:49.700 -->
00:35:51.200Yeah, exactly.
00:35:51.200 -->
00:35:57.420It's probably not the combination, but if you do have one, don't use 777 because clearly that's
00:35:57.420 -->
00:36:00.320going to, it'll just fall right off if you do that.
00:36:00.320 -->
00:36:03.140Yeah, just go with one, two, three, four.
00:36:03.140 -->
00:36:04.440Yeah, exactly.
00:36:04.440 -->
00:36:05.060It's fine.
00:36:05.060 -->
00:36:05.640Anyway.
00:36:05.640 -->
00:36:07.420Well, thanks a lot.
00:36:07.420 -->
00:36:09.020I hope you get power back at your house soon.
00:36:09.020 -->
00:36:09.540Thanks.
00:36:09.540 -->
00:36:10.220I hope so too.
00:36:10.220 -->
00:36:15.180Probably the power people said probably today, but you never know.
00:36:15.180 -->
00:36:15.860You never know.
00:36:15.860 -->
00:36:16.920All right.
00:36:16.920 -->
00:36:18.220Well, good to be here with you.
00:36:18.220 -->
00:36:18.660Talk to everybody later.
00:36:18.660 -->
00:36:19.080Bye.
00:36:19.080 -->
00:36:19.460Yeah.
00:36:19.460 -->
00:36:19.880Bye everyone.