WEBVTT

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

00:00:04.300 --> 00:00:10.520
your earbuds. This is episode 228, recorded April 7th, 2021. I'm Michael Kennedy.

00:00:10.520 --> 00:00:11.720
And I'm Brian Okken.

00:00:11.720 --> 00:00:13.120
And I'm Guy Royce.

00:00:13.120 --> 00:00:17.900
Hey, Guy. Welcome. Special guest Guy Royce here to be part of the show this week.

00:00:17.900 --> 00:00:18.800
Thanks for having me.

00:00:18.800 --> 00:00:19.480
It's exciting.

00:00:19.480 --> 00:00:20.700
I know that's what they all say, right?

00:00:20.700 --> 00:00:27.600
It's great to have you here, though. You know, we met on a panel at the Python Web Conference,

00:00:27.600 --> 00:00:33.520
and we recently had Calvin Hendryx-Parker here who was organizing that as well. So,

00:00:33.520 --> 00:00:36.640
you know, a little more Python Web Conference going on.

00:00:36.640 --> 00:00:37.980
Yeah, it was a good event.

00:00:37.980 --> 00:00:41.540
Absolutely. You want to tell folks a bit about yourself before we jump into the topics?

00:00:41.540 --> 00:00:45.980
Yeah, sure. You know, you can see my name right here on the screen, but for those listening to

00:00:45.980 --> 00:00:51.240
the podcast, my name's Guy. Yes, it's my real name. I sometimes get asked if it's short for something.

00:00:51.240 --> 00:00:55.560
It's not, in fact, short for Guy Tholomew. It's actually just my name, Guy.

00:00:56.120 --> 00:01:01.940
I work for Redis Labs. I'm a developer advocate there, and I've been doing developer relations

00:01:01.940 --> 00:01:05.760
type of work for, you know, I've been paid to do it for about five years. I've been doing it

00:01:05.760 --> 00:01:12.220
unpaid, as an unpaid just fan of doing community things for about 10 years on top of that. So,

00:01:12.220 --> 00:01:18.500
a lot of different tech stacks. I'm not really a Python person by trade. I tend to spend more time

00:01:18.500 --> 00:01:20.640
in the vile, vile JavaScript space.

00:01:20.640 --> 00:01:25.160
The other very popular language these days.

00:01:25.160 --> 00:01:31.720
It is. But I know a lot of different things. I'm a bit of a generalist, so I do Python as well.

00:01:31.720 --> 00:01:35.160
Fantastic. How do you enjoy being a developer evangelist? It seems like a really fun job.

00:01:35.320 --> 00:01:40.320
Well, I like to joke that the best thing about being a developer advocate is that it lets me

00:01:40.320 --> 00:01:48.720
monetize my narcissism. But the reality of it is, I mean, it's actually a lot more work than you would

00:01:48.720 --> 00:01:53.760
think. It is fun, but there's a lot of challenge there. You know, I spent a lot of my time making

00:01:53.760 --> 00:01:59.020
content, advocating with the product group for, you know, the ways that we should change Redis and our

00:01:59.020 --> 00:02:04.740
clients and that kind of stuff. And also going out and speaking at events. This obviously has been a

00:02:04.740 --> 00:02:05.740
very weird year for that.

00:02:05.740 --> 00:02:07.080
Yeah, it has.

00:02:07.080 --> 00:02:13.560
But, you know, that's a lot to balance. It's actually kind of a lot of hats to wear. And there's a degree

00:02:13.560 --> 00:02:18.080
where we're being a generalist is very useful. Like today, I'm spending a lot of time working on a

00:02:18.080 --> 00:02:23.400
.NET course, helping someone out with that because I've got some .NET experience. But, you know, it's,

00:02:23.400 --> 00:02:27.760
but then I'm doing stuff in JavaScript and then, oh, let's look at graph databases. And so I'm just

00:02:27.760 --> 00:02:28.960
looking at different things all the time.

00:02:28.960 --> 00:02:30.960
And you got dragged to this Python podcast as well.

00:02:30.960 --> 00:02:33.980
Yeah. And then someone thinks I know Python and put me on this podcast.

00:02:33.980 --> 00:02:36.420
You've got a couple of good items to talk about. I think that'd be good.

00:02:36.420 --> 00:02:37.580
Yeah.

00:02:37.580 --> 00:02:41.160
All right. Well, cool. Welcome. Brian, you want to kick us off here?

00:02:41.160 --> 00:02:44.580
I can't believe it's already March. I was going to say it's already March.

00:02:44.580 --> 00:02:46.560
It's almost March and it's actually blown out. So.

00:02:46.560 --> 00:02:54.560
Yeah. Yeah. Yeah. So here's an article called How to Make Awesome Python Package. How to Make an Awesome Python

00:02:54.560 --> 00:03:01.040
Package in 2021. And this is, I really love this article because it's kind of my workflow.

00:03:01.040 --> 00:03:06.560
I've just never written it down. And so I'm really grateful for Anton for writing it down.

00:03:06.560 --> 00:03:13.560
I'm also grateful to John Mitchell on Twitter to post that so that I could see it. So it's great.

00:03:13.560 --> 00:03:18.960
I really love it. Anyway. Well, so what is this? It isn't about how to make an awesome package.

00:03:18.960 --> 00:03:25.060
It's all of the extra stuff. It's the workflow. So we, he starts and he starts just like at the basics,

00:03:25.060 --> 00:03:30.980
just stubbing a package. And I really actually really liked that. This is, this is where you start. So

00:03:30.980 --> 00:03:38.600
the start was in unique, just grabbing a directory and stubbing it out and then having an, a, a,

00:03:38.600 --> 00:03:45.160
a __init__() file and a, an initial file that just does like, has one function you can call just so that

00:03:45.160 --> 00:03:50.640
it's something there. And it actually throws a, a, not, not implemented yet exception, which is,

00:03:50.640 --> 00:03:57.180
that's a great thing to throw. Right. And then pardon the birds. Like anyway,

00:03:57.180 --> 00:04:01.120
Brian's recorded from Hawaii and he's didn't like the forest. So it's fine.

00:04:01.120 --> 00:04:06.160
Yeah. He's got a virtual background to make it look more, more, more tropical birds. Yeah.

00:04:06.160 --> 00:04:14.140
Yeah. So then using flit to, to, to package it up and then go ahead and publish, not publish for real

00:04:14.140 --> 00:04:20.660
published to the test by PI repository, which I love this workflow of, if you're going to plan on

00:04:20.660 --> 00:04:26.880
sharing something, just go ahead and do this right away. The one thing missing there is go ahead and

00:04:26.880 --> 00:04:32.980
check the real PI PI to make sure your project name isn't taken already or else the test might work,

00:04:32.980 --> 00:04:38.460
but your real one won't. So adding that in is a good step, but then I'm blown away at some of the

00:04:38.460 --> 00:04:43.620
Python packages that are still available, like secure, right? I mean, that's not available now,

00:04:43.620 --> 00:04:48.360
but there was a thing that got, got to just call it, call itself secure. Like a couple of years ago,

00:04:48.360 --> 00:04:53.640
how is that still a thing? Right. Oh my God. Yeah. So one of the, one of the tricks with doing the test

00:04:53.640 --> 00:05:01.820
PI PI PI though is getting your, is, getting the PI PI RC correct. So it, he talks about how to do

00:05:01.820 --> 00:05:08.600
that. and then publishing using flip publish. and then, you know, adding, adding more detail,

00:05:08.600 --> 00:05:13.860
like, now you actually have to implement it. So, an implementation of something and then push to

00:05:13.860 --> 00:05:20.220
the real repository. And then, you know, then all the, everything else is like extras. And he lists them

00:05:20.220 --> 00:05:26.460
as appendices almost, like adding a read me and a change log and, and then, you know,

00:05:26.460 --> 00:05:32.960
linters and tests testing, you should maybe test earlier than this, but, setting up talks and make

00:05:32.960 --> 00:05:38.960
files and cloud building and the whole gamut. So this is a really great, comprehensive article.

00:05:38.960 --> 00:05:44.020
And you can, what I like is you can start at the beginning. And if you're not even publishing publicly,

00:05:44.020 --> 00:05:49.560
if you're just publishing in-house, this still makes sense up to, up to a certain point. So this is great.

00:05:49.560 --> 00:05:53.500
Yeah. It looks like really good advice. I love having a well-structured projects where,

00:05:53.500 --> 00:05:57.120
you know, if I have a problem or there's something I want to do, I know right where to go. I don't

00:05:57.120 --> 00:06:01.420
need to go through all the coders. Like here's the 50 lines of code that could possibly be about this.

00:06:01.420 --> 00:06:03.760
Let me go find it and get started. Guy, what do you do?

00:06:03.760 --> 00:06:09.740
I, this is, I like that it's an awesome Python package and it's not about the contents. It's about

00:06:09.740 --> 00:06:14.720
the stuff around it, right? This is the kind of stuff that is just noobs need this, right?

00:06:15.180 --> 00:06:19.360
Yeah. It's just, these are exactly the sorts of resources I like to find. It's the, here's the

00:06:19.360 --> 00:06:24.100
canonical way to do this thing. well, right. And a lot of times the tutorials are like, well,

00:06:24.100 --> 00:06:28.380
create the one file and that's what you do. And then off you go. And I feel like that kind of leads

00:06:28.380 --> 00:06:33.180
people down the wrong path a lot of times. So, yeah, love it. All right. Well, I think I got the

00:06:33.180 --> 00:06:41.160
next one here, Brian. Okay. Cube striker as in Kubernetes. So this is a security tool for anyone

00:06:41.160 --> 00:06:48.180
who is running or being a tenant on a Kubernetes cluster. So it's really fast way to audit an

00:06:48.180 --> 00:06:54.340
existing Kubernetes clusters for best practices. And like all beautiful repositories, it has an

00:06:54.340 --> 00:06:57.480
animated gift. So you don't have to read anything. You just watch it for a little like, oh, this is

00:06:57.480 --> 00:07:02.540
what it does. That's kind of cool. Maybe I'll use this. Yes. We love those who are listening.

00:07:02.540 --> 00:07:07.260
There's an animated GIF on the screen right now. That's right. Absolutely. You should totally see

00:07:07.260 --> 00:07:11.040
it. It's amazing. Yeah. Yeah. Guy, I mean, sometimes we cover, there'll be like UI frameworks,

00:07:11.040 --> 00:07:15.100
like, oh, we built this whole UI framework. We do this thing. And there's like no screenshot or no way

00:07:15.100 --> 00:07:19.880
to see what it looks like. Well, if it's about the UI, we should probably see some pictures. So,

00:07:19.880 --> 00:07:24.240
uh, Brian and I are always on a bit of a kick about this. Yeah. Yeah. So it performs a bunch

00:07:24.240 --> 00:07:31.440
of in-depth analysis, self-hosted Kubernetes on Amazon EKS, Azure EKS, I suspect pretty much

00:07:31.440 --> 00:07:36.960
you name it the EKS and it'll do it. Let's see if I can find where it talks about the things that it

00:07:36.960 --> 00:07:44.320
does. Yeah. So it scans, your infrastructure. Like I said, it checks for various services and open

00:07:44.320 --> 00:07:50.360
ports, tells you that they should or shouldn't be open. it looks for insecure things or,

00:07:50.660 --> 00:07:54.620
read, right. Or you can even set it up to be read only and it can check, you know, give it like

00:07:54.620 --> 00:08:00.960
lower permissions and it'll still do that. It'll look for misconfigured IAM, settings, identity

00:08:00.960 --> 00:08:06.520
from Azure, sorry, AWS, misconfigured containers, pod security policies, network policies,

00:08:06.520 --> 00:08:12.860
and extra privileges, all that kind of stuff. So running containers is pretty easy. Running containers

00:08:12.860 --> 00:08:18.480
in Kubernetes is pretty easy. Running a Kubernetes cluster, not easy. There's a lot going on if you're

00:08:18.480 --> 00:08:22.380
the one running the Kubernetes cluster. And so here's a really nice tool that you just point at

00:08:22.380 --> 00:08:27.060
your cluster and say, how am I doing? Right. Give it a quick check to see if anything's wrong.

00:08:27.060 --> 00:08:33.880
Yeah. Yeah. Yeah. Thanks. You guys, guy, you do anything with Kubernetes or Docker or things like

00:08:33.880 --> 00:08:39.400
that? I do basic developer things that developers tend to do with Docker. I'm, containerization

00:08:39.400 --> 00:08:44.380
isn't necessarily my jam. I mean, you know, I certainly will spin up a Redis instance, for example,

00:08:44.380 --> 00:08:49.320
using Docker or something like that, because that's super convenient, but, beyond using

00:08:49.320 --> 00:08:53.280
some basic Docker compose, I don't do much of anything. Yeah. Same, same here. I feel like

00:08:53.280 --> 00:08:57.240
every time I start to work with them, I go, this is really neat, but it feels like I'm just moving

00:08:57.240 --> 00:09:02.080
code complexity to DevOps complexity and I'm better at code than I'm at DevOps. So let me not do that.

00:09:02.080 --> 00:09:06.160
You got to write it down somewhere, right? Yeah. At the end of the day.

00:09:07.140 --> 00:09:11.200
Exactly. Exactly. All right. So, guy, you got this next one here. This is something I'm,

00:09:11.200 --> 00:09:17.400
I'm pretty excited about. I'm a big fan of the possibility of WebAssembly. Sounds like you are

00:09:17.400 --> 00:09:21.980
as well. Yeah, I'm an enormous fan of WebAssembly. and I mean, there's a couple of reasons for

00:09:21.980 --> 00:09:26.440
that. Some of it's that it kind of reminds me of the early days, like, like in the eighties,

00:09:26.440 --> 00:09:32.140
when I was learning programming, I got into 6502 assembly language. So that low level,

00:09:32.520 --> 00:09:38.360
machine level coding has got a, it's got a, nostalgic joy to it. And so WebAssembly has

00:09:38.360 --> 00:09:43.220
drawn me in. if you don't know much about WebAssembly, just to put context around it,

00:09:43.220 --> 00:09:47.020
WebAssembly is byte code for the browser. That's where it started. the idea is,

00:09:47.020 --> 00:09:50.880
is you can take some code, write it in C or rust or some higher level compiled language.

00:09:50.880 --> 00:09:55.680
And then you get a, bunch of byte code, a binary file that can be downloaded and run

00:09:55.680 --> 00:09:58.540
from the browser. So that's WebAssembly in 30 seconds.

00:09:59.180 --> 00:10:03.740
People, you have been done really crazy stuff with things like asm.js, where they're like,

00:10:03.740 --> 00:10:08.640
Oh, let's take some code and send it over to some fancy JavaScript that then we'll compile it in

00:10:08.640 --> 00:10:12.420
Java. And there's just all this wild stuff that you can do. And it's really, really impressive.

00:10:12.420 --> 00:10:16.720
But this is like, you know, if you're going to do that, let's make this an actual thing.

00:10:16.720 --> 00:10:21.740
That's actually expected to be this runtime, this low level runtime. And yeah, it's cool.

00:10:21.740 --> 00:10:25.900
Well, and it turns out it's actually a lot more performant too. I mean,

00:10:25.900 --> 00:10:30.200
I've seen benchmarks say as much as 20% faster, all the way up to 20 times faster, but regardless,

00:10:30.200 --> 00:10:33.320
they always say faster, which is good.

00:10:33.320 --> 00:10:37.820
And smaller probably coming down as binary bits and probably loads faster. It doesn't have to jet it.

00:10:37.820 --> 00:10:38.040
Yeah.

00:10:38.040 --> 00:10:38.520
It gets there.

00:10:38.520 --> 00:10:41.960
Well, and it's, it's just another file that could be served from the file server. So,

00:10:41.960 --> 00:10:45.340
or from the web server. So it can be cached and all the other things that you would do with any web

00:10:45.340 --> 00:10:49.380
content. So, lots of advantages and optimizations to be had.

00:10:49.900 --> 00:10:51.600
All right. So what's this thing that you're, you're telling us.

00:10:51.600 --> 00:10:56.120
So, so wasm time, you know, it says, Hey, we built this bike code for the browser.

00:10:56.120 --> 00:11:00.620
wasm time said, you know, what if we put the bike code wherever we want it?

00:11:00.620 --> 00:11:07.060
And instead, so in much the way that node, brought JavaScript to the server side, wasm time,

00:11:07.060 --> 00:11:12.240
wasm time brings a WebAssembly to the server side by adding, IO capabilities.

00:11:12.460 --> 00:11:18.800
And by adding a command line tool that can run it, by adding, run times that you can load up

00:11:18.800 --> 00:11:23.940
in other languages. So, wasm time, it is simplest is, is you've got a WebAssembly module

00:11:23.940 --> 00:11:28.400
and you say wasm time space in that module on the command line, and it just runs it and does whatever

00:11:28.400 --> 00:11:28.840
it does.

00:11:28.840 --> 00:11:31.660
Fantastic. And there's different languages supported, right?

00:11:31.660 --> 00:11:36.640
Right. So, and this isn't language support from a, take that language and compile it to web

00:11:36.640 --> 00:11:40.300
assembly. This is take WebAssembly modules and run it in those environments.

00:11:40.540 --> 00:11:45.960
So in rust, python, go.net and in C, although it's not listed here on the screen, there

00:11:45.960 --> 00:11:51.660
are run times that you can load up, load a WebAssembly module from whatever, you

00:11:51.660 --> 00:11:56.000
know, read it from the file system, read it out of whatever. Right. and instantiate that

00:11:56.000 --> 00:12:00.880
WebAssembly module and run it. And so, yeah. So if I found like a cool library, it happened

00:12:00.880 --> 00:12:05.720
to be written in rust and it has a WebAssembly version. I could then use that in Python.

00:12:05.720 --> 00:12:10.160
Absolutely. I've actually done,

00:12:10.160 --> 00:12:14.700
WebAssembly text format, which is the assembly language to go with WebAssembly. I've used

00:12:14.700 --> 00:12:19.240
that to compile simple modules and just like add numbers and stuff like that. And then loaded

00:12:19.240 --> 00:12:25.460
that up from Python code. And I actually even run it inside of Redis. but yeah, so now

00:12:25.460 --> 00:12:30.580
all of a sudden it brings that those compiled chunks of code that's that are really just data.

00:12:30.580 --> 00:12:34.660
You can handle them around any way you want and bring them into, all these different

00:12:34.660 --> 00:12:36.120
platforms. That's pretty cool.

00:12:36.740 --> 00:12:40.580
Yeah. This is really neat. Brian, what do you think? just the intermediate

00:12:40.580 --> 00:12:45.820
part to where you can, you can have, a group of people, like even if it's not some

00:12:45.820 --> 00:12:50.680
third-party package, it's just within one company that can write in whatever language they want to

00:12:50.680 --> 00:12:55.800
write in and then have an intermediate language that, you can, you can glue it all together

00:12:55.800 --> 00:13:00.820
down the pipeline. I think that just makes people more efficient. I'd like to see that,

00:13:00.820 --> 00:13:03.580
that sort of take off. I think it's a neat, neat place to go.

00:13:03.580 --> 00:13:09.000
Yeah. Guy, could I use this to say if I had like a .NET library, a go library and a rust library,

00:13:09.000 --> 00:13:12.640
and I was writing in Python. Could I bring those all together to interoperate with this thing?

00:13:12.640 --> 00:13:17.700
in theory, I mean, there's a lot of, a lot of work to be involved to do that.

00:13:17.700 --> 00:13:23.100
and there are limitations, out of the box WebAssembly, just like out of the box, JavaScript

00:13:23.100 --> 00:13:29.100
didn't have any kind of IO because you don't need IO in a browser that you have fetch, right? You know,

00:13:29.100 --> 00:13:34.520
that's, that's all the IO you get. WebAssembly is the same way, but, web,

00:13:34.520 --> 00:13:39.700
as some time is support supports the WASI standard. all these things start with W. They're actually

00:13:39.700 --> 00:13:46.620
kind of hard to say. and what I see is the WebAssembly systems interface, which gives you a file IO

00:13:46.620 --> 00:13:52.460
and, we'll eventually give us network IO right now. It will support reading and writing a sockets,

00:13:52.460 --> 00:13:56.440
but it won't support opening a socket, which is tantitizingly frustrating.

00:13:57.720 --> 00:14:01.700
That extra ability though, that actually kind of scares me a little bit. And I'm,

00:14:01.700 --> 00:14:08.060
I'm concerned about the security part since you're grabbing some binary blob or it's a sem WebAssembly

00:14:08.060 --> 00:14:13.980
blob. It's still not human readable. Right. So how do I know it's not going to be a virus or something

00:14:13.980 --> 00:14:19.180
like that? Yeah, that's, that's actually a totally legitimate concern. it's, it's honestly echoes

00:14:19.180 --> 00:14:25.160
the same concerns that we had with a node, JS when it first came out. It's like, cause, cause in the

00:14:25.160 --> 00:14:29.420
browser, it's all nice and neat and sandboxed. Right. and as soon as JavaScript escaped the

00:14:29.420 --> 00:14:33.420
browser and got under your server side, everyone's like, well, but we can pull JavaScript code and call

00:14:33.420 --> 00:14:38.460
you Val on it from anywhere. It's like, well, yeah, you could. and so it's the same, I think we end

00:14:38.460 --> 00:14:45.280
up in the same situation where, it's got the same caveats once we go there. you know, I, you know,

00:14:45.280 --> 00:14:52.380
I guess the advice is don't run strange code, right? Yeah. But, these are particularly like

00:14:52.380 --> 00:14:57.740
a JavaScript. You can look at it and say, you know, I see what's going here. And I suppose if it's

00:14:57.740 --> 00:15:01.800
minified, that's not that easy, but, with WebAssembly, it's actually just bytes and it's even

00:15:01.800 --> 00:15:06.220
hard. It's even more opaque. Yeah. Yeah. I mean, there's so much stuff going on in the supply chain

00:15:06.220 --> 00:15:15.280
space now, right? IPI, there was the PHP itself got a backdoor put into it, but luckily never got

00:15:15.280 --> 00:15:20.560
into any of their releases. But yeah, I mean, it's a good concern, Brian, or a valid. Certainly it is.

00:15:20.560 --> 00:15:26.160
It's still cool. Yeah, absolutely. You know what else is cool, Brian? This episode is brought to you

00:15:26.160 --> 00:15:30.060
by you and me this time. So all of the cool things we're doing, I want to tell people if they want to

00:15:30.060 --> 00:15:36.200
take some Python courses, they can check out talkpython.fm and just click on courses. And we've got a

00:15:36.200 --> 00:15:41.060
and about to release a brand new free course that people will be able to check out as well.

00:15:41.060 --> 00:15:44.460
Probably I'll be able to talk about that next time, but it's on the data science side and that'll be a

00:15:44.460 --> 00:15:49.500
lot of fun. And then, people want to test things. They should probably test it with a pie test so they

00:15:49.500 --> 00:15:54.120
can check out your book as well. Yeah. Yeah. That'd be great. I can't wait to get the best sponsors.

00:15:54.120 --> 00:15:59.980
Thanks. Yeah. And I can't wait to get back to conferences so I can get back to handing out

00:15:59.980 --> 00:16:05.900
stickers and stuff. That was so great. Yeah. I know. Imagine that with other people. So crazy. Yeah.

00:16:06.180 --> 00:16:12.040
I hand them to myself, but you know, I'm a risk of becoming agoraphobic at this point. Yeah.

00:16:12.040 --> 00:16:20.220
Yeah. so I wanted to talk about something cool that Anthony shop put together. So, he, he,

00:16:20.220 --> 00:16:27.280
I just saw about this. I think don't you use a dependent bot? I, Oh yeah. I, my,

00:16:27.280 --> 00:16:33.980
my Monday morning means go in and like close 20 PRs and about four of them are conflicting with depend,

00:16:33.980 --> 00:16:39.140
a bot where depend a bot was the other PR that also did the PR that I conflict with. So yeah,

00:16:39.140 --> 00:16:43.680
I've got this special relationship, but I'm still very glad to have it there. Cause it's fantastic to

00:16:43.680 --> 00:16:47.460
know there's a security problem for this thing. Fix it now. that's really good to know.

00:16:47.460 --> 00:16:52.920
Yeah. So, okay. So I probably am a bad one to introduce the depend a bot side. So this is,

00:16:52.920 --> 00:16:58.760
we're actually talking about depend a lot bot, but depend a bot. If people haven't heard it,

00:16:58.820 --> 00:17:04.480
like the 90 times we've talked about it. it, it, it, tell me what it does. It goes out and

00:17:04.480 --> 00:17:10.460
checks to, so it looks at, it supports different languages. The Python world. That means, it,

00:17:10.460 --> 00:17:16.880
if it sees a requirements.txt or it sees like a pyproject.toml or whatever, it will look in there

00:17:16.880 --> 00:17:21.180
for pinned versions. If they're not pinned, it will pin it to the current version and then submit that

00:17:21.180 --> 00:17:26.600
change to the requirements.txt as a PR. Yeah. If they are there and it sees there's a new version

00:17:26.600 --> 00:17:31.840
of that library, it will do a PR and in the PR, it'll say things like, here's the change log and

00:17:31.840 --> 00:17:36.760
all the commits since the last time you use this library. Here's the release notes around this

00:17:36.760 --> 00:17:42.720
library. Click this button to apply the new, you know, upgrade your pinning. So, you know,

00:17:42.720 --> 00:17:48.240
requests equal, equal something higher than it is currently automatically to your system. So that's

00:17:48.240 --> 00:17:55.040
the job of depend a bot. The thing, the complaint is that if I've got a requirements.txt file with 30

00:17:55.040 --> 00:18:02.560
packages in it, I, and 10 of them change, I get 10 PRs instead of one PR with 10 changes. Yeah.

00:18:02.560 --> 00:18:06.680
It's anyway. Yeah. And they conflict with each other cause they're like all like right by each

00:18:06.680 --> 00:18:10.380
other. And you like, as you accept them, they start to like get merge requests. You got to

00:18:10.380 --> 00:18:15.200
merge conflicts. You got to resolve. And anyway, that's, that's the deal, but that's what it does.

00:18:15.200 --> 00:18:24.020
So this depend a lot bot is a bot that looks at all of this and decides, and you create a list to say,

00:18:24.020 --> 00:18:29.660
certain, some of my dependencies can be automatically figured out. and then like,

00:18:29.660 --> 00:18:35.880
say talks. So you're not, you're using talks, but you're not really using it. You're using it to test

00:18:35.880 --> 00:18:43.260
and stuff. You're not using it for everything. So, like that's an example and the depend a lot bot

00:18:43.260 --> 00:18:50.920
makes sure that the PR request from dependent bot, if it passes the tests, it goes ahead and merges it.

00:18:50.920 --> 00:18:56.800
So that's really all it does. And I think that's cool to just, because that's what I would do. If I

00:18:56.800 --> 00:19:01.400
got one of those PR requests, I would make sure it all works fine. And then probably in some of them,

00:19:01.400 --> 00:19:05.580
I would probably just push through if I trust the, where it comes from and stuff. So yeah,

00:19:05.580 --> 00:19:10.760
exactly. But it's a well-known package. The chances are it's going to be fine, right? Like Bodo from

00:19:10.760 --> 00:19:16.320
AWS, there's fine to take it. Yeah. And especially the tools around your project or, or you're,

00:19:16.320 --> 00:19:20.640
you're only using a little part of something. As long as your test pass, it's probably going to be

00:19:20.640 --> 00:19:26.560
fine. Things like updating Django. You may want to have some more manual procedures for that,

00:19:26.560 --> 00:19:32.780
but something, something, some minor thing, like I'm only using, you know, a fraction of a package,

00:19:32.780 --> 00:19:38.480
go ahead and update it and see if the test passes. Yeah, exactly. I totally agree. Guy, if one space

00:19:38.480 --> 00:19:41.300
has more dependencies than Python, it's gotta be JavaScript.

00:19:41.300 --> 00:19:48.320
Ain't that the truth? yeah. you know, my, my interaction would depend about, the vast

00:19:48.320 --> 00:19:53.400
majority of my repos online are sample codes to go with talks and, and, and videos and that kind of stuff.

00:19:53.660 --> 00:19:57.800
And, I always get depend about notifications for, Hey, this project that you did a year and a

00:19:57.800 --> 00:20:03.380
half ago that you forgot about, that tends to be my interaction with depend about. I can see

00:20:03.380 --> 00:20:07.080
how something like this would be very useful. I don't know that, I don't know. It might be something

00:20:07.080 --> 00:20:10.740
I could use to just, I have to think about those old packages anymore. It seems like this could be

00:20:10.740 --> 00:20:14.560
really helpful. Yeah. I do like the other guys, the developer's name is Tony baloney. That's a

00:20:14.560 --> 00:20:15.840
fantastic username, by the way.

00:20:15.840 --> 00:20:21.980
Yeah. He's, he's been on the show. He's a great friend of the show. yeah, it's a good,

00:20:21.980 --> 00:20:25.340
I don't, I've, I've never met him. I just think that's really funny. Kudos.

00:20:25.340 --> 00:20:30.300
Yeah. This is really cool. I want to check this. I'm, I've definitely think I'm putting this,

00:20:30.300 --> 00:20:34.440
putting this on. I'll probably do it. Like, for example, things like talks and pie test

00:20:34.440 --> 00:20:40.060
and my testing tools and the linters and stuff like that. I definitely want to just update those

00:20:40.060 --> 00:20:46.400
like and try. And if it doesn't, if I'm always going to update those, if there, if there's a new

00:20:46.400 --> 00:20:50.260
one in it and everything passes. So yeah. Yeah. Just roll it back. It doesn't work.

00:20:50.260 --> 00:20:54.960
Yeah. And tangentially related Dean out there says he can't seem to be able to pip install dash

00:20:54.960 --> 00:21:00.860
E dot bracket extra, but then he quickly posted his own little fix that, Oh, in a Z shell,

00:21:00.860 --> 00:21:05.440
you got to escape the brackets. Anyone else there's trying to do that. That's, that's great. But yeah,

00:21:05.800 --> 00:21:12.720
well done on this Tony, Anthony, this is really, this could be a dream. If this works the way I

00:21:12.720 --> 00:21:17.620
see it working, I will be so happy. My Mondays won't be like, well, here's the next hour emerging

00:21:17.620 --> 00:21:23.120
PRs and resolving its own self-conflict. So I'm excited. Very cool. All right. Well,

00:21:23.120 --> 00:21:28.260
what is the next one? I want to take us a little bit, like take a step back just a little bit

00:21:28.260 --> 00:21:33.280
from low level tech and talk about the Supreme court of the United States, Brian.

00:21:33.280 --> 00:21:38.460
I want to talk about this too. I also want to take you back to the early two thousands.

00:21:38.460 --> 00:21:43.860
I mean, this is like early days in my programming career, honestly, but here we are with a ruling

00:21:43.860 --> 00:21:49.000
about something that happened in the early two thousands. And what it is, is that way, way back

00:21:49.000 --> 00:21:54.860
son created Java, Google, when they created, I actually, whoever created Android, I think before

00:21:54.860 --> 00:21:58.840
Google bought them created Android and said, you know, what would be cool is if we could program

00:21:58.840 --> 00:22:05.620
this with Java and use the API of Java. So the common ways to like write files and open

00:22:05.620 --> 00:22:12.240
sockets, all that kind of stuff, it just may get exactly what the Java runtime libraries do,

00:22:12.240 --> 00:22:17.960
but they did not actually take Java. They actually re-implemented it from scratch. So none of the

00:22:17.960 --> 00:22:23.560
runtime details had anything to do with Java, but the API, the way you talk to it looked just like

00:22:23.560 --> 00:22:30.440
the Java base class library library. So Oracle buys Java, Oracle thinks that's not super cool.

00:22:30.440 --> 00:22:36.680
We want part of that action. Sues Google for copyright infringement by using the Java APIs.

00:22:36.680 --> 00:22:42.920
And so then this throws a huge uncertainty into the space of basically all these libraries,

00:22:42.920 --> 00:22:47.660
right? What if, what if I want to create a new web framework and the way it works is a little bit

00:22:47.660 --> 00:22:53.180
like Flask, but it turns out that Flask copyrighted, you know, the way it uses decorators, you know,

00:22:53.180 --> 00:22:57.960
app.route or whatever. And then I get sued. That seems, I don't know, that seems weird, right?

00:22:57.960 --> 00:22:58.540
Yeah.

00:22:58.540 --> 00:23:00.940
So does this mean that, yeah, go ahead, guy.

00:23:00.940 --> 00:23:05.820
So does this mean that this ruling mean that you can't copyright an interface in essence?

00:23:05.820 --> 00:23:12.000
Yes. Well, the ruling is interesting because it didn't actually address the copyright ability

00:23:12.000 --> 00:23:19.580
of APIs. They said potentially they still could be copyrighted, but the use of the API, as I described

00:23:19.580 --> 00:23:23.860
it in the beginning of like, this is the way you talk to it, not the implementation, but the,

00:23:23.860 --> 00:23:29.760
the way you speak to the thing, they said that that is fair use. So when things are copyrighted,

00:23:29.760 --> 00:23:34.440
you're allowed to speak about them in limited ways. You're not allowed to take a movie and publish it,

00:23:34.440 --> 00:23:39.100
republish it, but you're allowed to take a scene of it and analyze it and, and maybe have that

00:23:39.100 --> 00:23:41.700
soundtrack, that 30 second soundtrack or something like that.

00:23:41.700 --> 00:23:47.440
Right. So that'd be fair use. And so they said the way in which they're using APIs is like fair use.

00:23:47.440 --> 00:23:52.400
And they, they talked about the knowledge, having a thing, you might copyright the thing,

00:23:52.400 --> 00:23:57.640
but having knowledge, how to operate the thing that you can't copyright. So like knowing how to drive a

00:23:57.640 --> 00:24:03.080
car, you can't copyright that. And so having the API without the implementation is kind of like

00:24:03.080 --> 00:24:09.080
the knowledge of how to operate the thing that the API goes to, but the API itself is fair use,

00:24:09.080 --> 00:24:14.280
which is pretty interesting. So I guess just to sort of put the bow on it is the Supreme Court ruled

00:24:14.280 --> 00:24:23.200
that Oracle suit is dismissed. They cannot sue Google. And it stopped actually a huge wave of

00:24:23.200 --> 00:24:26.900
lawsuits that would have followed around all sorts of different things for all different sorts of

00:24:26.900 --> 00:24:28.820
people. So I think I'm happy with this.

00:24:28.820 --> 00:24:33.100
I think I am too, actually. I mean, if I, if I were to sum up everything I just heard,

00:24:33.100 --> 00:24:35.960
what I heard is reverse engineering is fair use.

00:24:35.960 --> 00:24:37.960
Yes. That sounds about right.

00:24:37.960 --> 00:24:38.900
So for example,

00:24:38.900 --> 00:24:41.460
the Twitter version of this ruling.

00:24:41.460 --> 00:24:42.100
Yeah.

00:24:42.620 --> 00:24:48.300
You know, the example that came to mind for me, and it, this is the thing, like this exact

00:24:48.300 --> 00:24:53.160
example that was the lawsuit, it seems really clear to me that it shouldn't really, I don't think that

00:24:53.160 --> 00:24:59.640
should be a thing. But on the other hand, you know, AWS was hosting, like reselling the open source

00:24:59.640 --> 00:25:05.060
free version of MongoDB as a service without paying any money to the MongoDB folks who actually

00:25:05.060 --> 00:25:11.480
created and maintained it. They changed their license. And so what AWS did was kept the API for

00:25:11.480 --> 00:25:18.480
MongoDB identical, but re-implemented the database server in their own version. I feel like that's a

00:25:18.480 --> 00:25:21.640
real interesting example. That's a little more close to the edge. It's like, well, here's an open source

00:25:21.640 --> 00:25:27.580
project that built something neat. Here's somebody who was literally running it and taking profits off

00:25:27.580 --> 00:25:33.360
of it exactly. And then, then they sort of changed it to this mode and it now, now it's okay. And I think

00:25:33.360 --> 00:25:38.300
it probably is okay. Although I feel like Redis could get itself into the same situation, probably,

00:25:38.660 --> 00:25:43.300
unless the license already explicitly says that you can't do that.

00:25:43.300 --> 00:25:50.380
The only licenses we have that's specifically explicit that are the ones for the modules, which extend it,

00:25:50.380 --> 00:25:58.460
extend Redis. Redis itself is open source. And so, and Amazon does have an implementation of Redis that they sell.

00:25:58.660 --> 00:26:11.800
Okay. Yeah. Tal out there in the live stream says, you know, another example would be AWS could sue all the other places like Linode and DigitalOcean and stuff that offer S3 compatible storage.

00:26:11.800 --> 00:26:13.020
That's such a good point.

00:26:13.380 --> 00:26:18.420
Yeah. Right. Like they, they both, both Linode and DigitalOcean have something that's like,

00:26:18.420 --> 00:26:29.280
like S3 and you literally can talk to it with a Bodo 3 API because it, on the surface, it is S3. And so there's another example of something that is spared being destroyed.

00:26:30.020 --> 00:26:31.540
Yeah. In the courts.

00:26:31.540 --> 00:26:37.300
I hope this holds up. I really want APIs to be something that you, you can't copyright.

00:26:37.300 --> 00:26:46.520
I think this is it. I think this is it. I mean, this, it actually Google won and then it was overturned by a higher court and then Google won again.

00:26:46.520 --> 00:26:50.820
Then it was overturned by a higher court and it like literally worked its way all the way to the Supreme court.

00:26:50.820 --> 00:27:00.860
And then this is it. And the Supreme court operates so much on prior, prior rulings and precedent and stuff that it's very unlikely that it could be changed at this point.

00:27:00.860 --> 00:27:11.060
And the entire, the entire like story of Java is just riddled with these gross lawsuits. And it's just, I just have to shake my head about it.

00:27:11.060 --> 00:27:17.980
It really would be nice if it had a nicer history. I think people would be, you know, trashing Java a lot less at this point.

00:27:19.540 --> 00:27:21.900
Yeah. We come up with other reasons. It wouldn't be a problem.

00:27:21.900 --> 00:27:29.300
Ben Thompson from strategy had a really interesting analysis, taking apart what the Supreme court said.

00:27:29.300 --> 00:27:35.220
And one of the things they focused on was the meaning and the essence of copyrights.

00:27:35.220 --> 00:27:43.580
Like the reason to have copyrights is so that somebody might invest 10 years in something that could easily be copied, copied, but doesn't yet exist and sort of drive innovation.

00:27:43.580 --> 00:27:51.420
And they talked a lot about the Supreme court talked about, does this application of copyright actually benefit or restrict innovation?

00:27:51.420 --> 00:27:55.920
And it was interesting that they were actually thinking in those terms, not just like, well, what is the legal definition of copyright?

00:27:55.920 --> 00:28:00.340
But they're like, this would be very harmful to so many people if it went the other way.

00:28:00.440 --> 00:28:02.160
And so we got to consider that as well.

00:28:02.160 --> 00:28:07.380
And, let's see, Dean says, so, Java lost this closed case.

00:28:07.380 --> 00:28:09.700
I guess the case is now public static void.

00:28:09.700 --> 00:28:10.840
It's final.

00:28:10.840 --> 00:28:11.380
Yeah.

00:28:12.380 --> 00:28:13.380
Exactly.

00:28:13.380 --> 00:28:16.740
Exactly.

00:28:16.740 --> 00:28:17.320
Cool.

00:28:17.320 --> 00:28:17.520
All right.

00:28:17.520 --> 00:28:19.420
Apparently we have a Supreme court factory.

00:28:19.420 --> 00:28:20.000
So, you know,

00:28:20.000 --> 00:28:21.640
yeah, yeah.

00:28:21.640 --> 00:28:27.120
We've got an eye Supreme court and the Supreme court factory generates eye Supreme court implementations.

00:28:27.120 --> 00:28:29.020
And we got a Supreme court manager.

00:28:29.020 --> 00:28:29.400
Yeah.

00:28:29.400 --> 00:28:30.440
Oh gosh.

00:28:30.440 --> 00:28:31.520
Yeah.

00:28:31.520 --> 00:28:33.280
That's, no, I don't know.

00:28:33.280 --> 00:28:36.180
That's, that's going to be down too far, too far down.

00:28:36.180 --> 00:28:38.020
It's a bridge too far, isn't it?

00:28:38.020 --> 00:28:38.220
Yeah.

00:28:38.220 --> 00:28:39.600
It definitely is.

00:28:39.600 --> 00:28:40.180
It definitely is.

00:28:40.180 --> 00:28:40.980
All right.

00:28:41.060 --> 00:28:44.240
guy, you got the last one here and I'm not sure I pulled it up.

00:28:44.240 --> 00:28:46.680
Let me make sure I got it pulled up here.

00:28:46.680 --> 00:28:47.460
Here we go.

00:28:47.460 --> 00:28:48.000
Yeah.

00:28:48.000 --> 00:28:54.080
So, you already talked about how you work for Redis and, machine learning is absolutely

00:28:54.080 --> 00:28:55.660
front and center in the Python world.

00:28:55.660 --> 00:28:57.720
And you guys are doing some interesting stuff there.

00:28:57.720 --> 00:28:58.380
You want to tell us about it?

00:28:58.380 --> 00:28:58.940
Yeah.

00:28:58.940 --> 00:29:04.440
So, I sort of mentioned this earlier, but, it's kind of a good segue is Redis

00:29:04.440 --> 00:29:07.100
has modules, which are, you know, things you can use.

00:29:07.100 --> 00:29:08.740
They're like plugins to extend what Redis can do.

00:29:08.740 --> 00:29:10.060
So you can, there's like a module.

00:29:10.140 --> 00:29:10.960
It's a graph database.

00:29:10.960 --> 00:29:14.060
And so now boom, we got new, some new types and some new functionality.

00:29:14.060 --> 00:29:16.940
We can do graph databases or time series or whatever.

00:29:16.940 --> 00:29:22.020
And, one of the modules that, Redis lab, and, and this is part of Redis.

00:29:22.020 --> 00:29:22.480
It's standard.

00:29:22.480 --> 00:29:23.520
Anyone can create a module.

00:29:23.520 --> 00:29:26.160
You know, any, there are lots of open source ones out there.

00:29:26.160 --> 00:29:28.500
Redis labs has a few that we've created.

00:29:28.560 --> 00:29:33.980
One of those is Redis AI and Redis AI turns Redis into a model server.

00:29:33.980 --> 00:29:44.280
So the idea is, is that, I can take the binary output of a model, in there's TensorFlow or whether it's a PyTorch or whether it's an Onyx model.

00:29:44.460 --> 00:29:51.000
And for those who don't know what Onyx is, that's the open neural network exchange, which is a standard Microsoft put together for, models.

00:29:51.000 --> 00:29:53.960
so it's sort of like a universal model standard.

00:29:54.120 --> 00:29:59.340
And just like in, in, in, XKCD, it's like, there's too many standards.

00:29:59.340 --> 00:30:00.780
We need a new one to bring these all together.

00:30:00.780 --> 00:30:03.220
Onyx has created yet another standard.

00:30:03.220 --> 00:30:05.140
yeah, exactly.

00:30:05.140 --> 00:30:06.840
This is what always happens.

00:30:06.840 --> 00:30:07.060
Right.

00:30:07.060 --> 00:30:09.680
but Redis supports those three, model types.

00:30:09.680 --> 00:30:15.500
So you can take an Onyx model, for example, and load it into Redis, and then you can use Redis commands to, to execute that model.

00:30:15.500 --> 00:30:18.700
And, so it, it provides a nice little abstraction.

00:30:18.700 --> 00:30:26.340
And the thing that's cool here, I think, is that, normally if you want to bring AI into your application as a developer, you got the data science team.

00:30:26.340 --> 00:30:27.940
They build, they do their thing.

00:30:27.940 --> 00:30:33.820
They build their, models and you get, these binary files out and then you need to bring them into your application some way.

00:30:33.820 --> 00:30:35.260
And there's a few ways to do that, right?

00:30:35.260 --> 00:30:41.760
You can, you can just wrap it up in a, in a, you could containerize it and make a little flask app around it, which is a really common solution.

00:30:41.760 --> 00:30:44.960
there are, other model servers.

00:30:44.960 --> 00:30:47.720
You can just put it right in your application, but then you have to use Python.

00:30:48.140 --> 00:30:50.440
which, is well, not a terrible problem.

00:30:50.440 --> 00:30:51.580
It can sometimes be a problem.

00:30:51.580 --> 00:30:52.020
Yeah.

00:30:52.020 --> 00:30:56.000
If you're not using Python, you might see it as a, like, wait a minute, this is going to be a big change.

00:30:56.000 --> 00:31:02.480
And so, the thing that gets me excited about Redis AI, which is kind of not the thing that gets my bosses excited, but it's the thing that gets me excited.

00:31:02.480 --> 00:31:08.120
Is that, because we support Onyx, the data science team can build their model and convert it to Onyx.

00:31:08.120 --> 00:31:13.660
And they sort of have a universal standard so they can pick whatever tech stack they want, as long as they can spit out an Onyx model.

00:31:14.040 --> 00:31:18.420
And then Redis, Redis being Redis, it's got a client for every language under the sun.

00:31:18.420 --> 00:31:26.060
So if you're, you know, using Haskell, for example, you know, there's a, there's a Redis client for, I don't know that there's a Redis client for Haskell, but I would assume there is.

00:31:26.060 --> 00:31:28.060
It's, it's, it's, it's, odds are there is.

00:31:28.500 --> 00:31:39.500
then you can get to that model from whatever language you're at, regardless of what that data science, you know, how amenable to data science tooling that platform is.

00:31:39.500 --> 00:31:42.040
And so it creates a nice architectural layer of abstraction.

00:31:42.040 --> 00:31:44.700
And so that's actually what I think is kind of cool about Redis AI.

00:31:45.300 --> 00:31:53.700
it just provides that, that, that abstraction that makes the developers and the data science folks both not have to, well, speak the same language in a lot of ways.

00:31:53.700 --> 00:31:53.840
Yeah.

00:31:53.840 --> 00:31:54.840
That that's really neat.

00:31:54.840 --> 00:31:59.440
And it sounds to me a lot like what ACP APIs did previously.

00:31:59.440 --> 00:31:59.960
Right.

00:31:59.960 --> 00:32:09.180
And if you wanted to talk, talk to somebody instead of directly, you know, plugging in that library or exchanging some binary data, you like, all right, everybody's going to just agree on JSON.

00:32:09.180 --> 00:32:10.940
Why didn't they agree on dates?

00:32:10.940 --> 00:32:13.400
But come on, other than that, it's working out just fine.

00:32:13.400 --> 00:32:16.860
We're just going to exchange this and, and that'll be the way we can talk to it.

00:32:16.860 --> 00:32:20.700
And nobody worries about what language you're using to consume the API.

00:32:20.700 --> 00:32:21.760
It's like, that's your problem.

00:32:21.760 --> 00:32:23.740
Hopefully your language has a nice way to do that.

00:32:23.740 --> 00:32:24.260
Yeah.

00:32:24.480 --> 00:32:26.540
It's, it's, it's a similar thing.

00:32:26.540 --> 00:32:31.300
the other thing it does, which I think is kind of interesting is that it introduces a new data type.

00:32:31.300 --> 00:32:34.260
So the models as inputs and outputs take tensors.

00:32:34.260 --> 00:32:37.480
They can put in a couple of tensors as input, your model or one or however many you need.

00:32:37.480 --> 00:32:40.100
And then your output would be whatever tensors make sense.

00:32:40.100 --> 00:32:44.140
And, and a tensor is just a, you know, I don't know.

00:32:44.140 --> 00:32:46.940
I think, I think the word tensor is, I'm going to say pretentious.

00:32:46.940 --> 00:32:54.100
I'm probably going to anger a lot of people by saying that, but cause really what a tensor is in practical terms.

00:32:54.120 --> 00:32:56.800
It's just a multi-dimensional array, right?

00:32:56.800 --> 00:32:59.560
You know, you got a tensor that's got a particular shape.

00:32:59.560 --> 00:33:04.180
It's just like, well, this is an array that's 10 by five by three and it's made up of ints.

00:33:04.180 --> 00:33:05.620
And that's all a tensor is.

00:33:06.460 --> 00:33:10.800
And so it sounds all mystical, but it's really just a multi-dimensional array that's being handed in.

00:33:10.800 --> 00:33:18.840
but because tensors tend to be the things that are put into and taken out of machine learning models, Redis AI has a tensor data type.

00:33:18.840 --> 00:33:21.460
And so you could use that capability in Redis as well.

00:33:21.460 --> 00:33:25.340
If you needed to store multi-dimensional arrays in Redis, you've got a type that does that now.

00:33:25.340 --> 00:33:36.840
And so even if you didn't care about the data science, the predictive capabilities, the model hosting, that's the word I'm looking for in Redis AI, you can still use the tensors for various data storage uses.

00:33:36.840 --> 00:33:37.420
Yeah.

00:33:37.420 --> 00:33:37.620
So.

00:33:37.620 --> 00:33:38.040
Yeah.

00:33:38.040 --> 00:33:38.480
Okay.

00:33:38.480 --> 00:33:38.880
Interesting.

00:33:38.880 --> 00:33:39.100
Yeah.

00:33:39.100 --> 00:33:40.840
So you kind of hijack the data type as well.

00:33:40.840 --> 00:33:41.360
Yeah.

00:33:41.720 --> 00:33:42.860
So this looks really interesting.

00:33:42.860 --> 00:33:49.680
I think it's, yeah, people should check it out if they're doing machine learning and sharing their models across different technologies or processes.

00:33:49.680 --> 00:33:50.380
Yeah.

00:33:50.380 --> 00:33:52.060
I mean, I'm obviously excited about it.

00:33:52.060 --> 00:33:52.940
Yeah.

00:33:52.940 --> 00:33:58.160
So I'm excited because I'm, I use multi-dimensional arrays and now I can call myself a data scientist.

00:33:58.160 --> 00:33:59.240
That's right.

00:33:59.240 --> 00:33:59.960
There you go.

00:33:59.960 --> 00:34:03.280
Awesome.

00:34:03.280 --> 00:34:03.580
All right.

00:34:03.580 --> 00:34:06.620
Quick follow-up before we get to the extras and the joke.

00:34:06.620 --> 00:34:09.120
I'm more, more of a mad data scientist.

00:34:09.120 --> 00:34:09.420
Yeah.

00:34:09.420 --> 00:34:09.660
Yeah.

00:34:09.660 --> 00:34:13.620
Dune Army Captain says, sorry, I'm late.

00:34:13.620 --> 00:34:15.860
It doesn't depend upon optionally auto merge.

00:34:15.860 --> 00:34:16.740
If CI passes.

00:34:16.740 --> 00:34:17.240
Yes.

00:34:17.240 --> 00:34:20.080
But you got to have CI running on that project.

00:34:20.080 --> 00:34:26.060
And so like, if you've got, you have a 30, 40 repositories that have courses.

00:34:26.060 --> 00:34:28.060
I don't set up CI for the course.

00:34:28.060 --> 00:34:30.060
Like what does it even mean to have CI for the courses?

00:34:30.060 --> 00:34:36.300
But I get depend about stuff all the time on that because, you know, it's checking the repository for the requirements file.

00:34:36.800 --> 00:34:42.840
So, you know, sometimes you can get it to auto merge, but you know, there's certainly circumstances where it doesn't.

00:34:42.840 --> 00:34:45.460
If it would just put it in one PR, here's the 10 changes.

00:34:45.460 --> 00:34:50.820
Like I put that actually as a issue on the pin to bot itself and people upvoted it.

00:34:50.820 --> 00:34:52.160
Comment it like, yes, this please.

00:34:52.160 --> 00:34:53.960
But apparently not yet.

00:34:53.960 --> 00:34:56.760
Anyway, what Anthony's done is pretty excellent.

00:34:56.760 --> 00:34:57.440
Hi, Brian.

00:34:57.560 --> 00:34:58.980
That's it for all of our main items, right?

00:34:58.980 --> 00:34:59.880
Unless I lost track.

00:34:59.880 --> 00:35:00.460
Yeah.

00:35:00.460 --> 00:35:02.520
Got any extras you want to throw out there?

00:35:02.520 --> 00:35:03.540
I don't.

00:35:03.540 --> 00:35:04.820
I've just been working a lot.

00:35:04.820 --> 00:35:05.500
How about you?

00:35:05.500 --> 00:35:05.940
I've got extras.

00:35:05.940 --> 00:35:06.660
I've got plenty.

00:35:06.660 --> 00:35:15.980
So recently did a cool episode over on Talk Python about diving into the get, the dot get folder and like all the internals of what get does there.

00:35:15.980 --> 00:35:22.680
And what all those pieces mean, if you want to go in there and look and see how basically understand how get itself works and then all the storage stuff, like how they all come together.

00:35:22.680 --> 00:35:27.880
And one of the things that got a nice shout out there is get for windows at get for windows.org.

00:35:27.880 --> 00:35:31.220
There's like a special version to install for get.

00:35:31.220 --> 00:35:36.340
I think this actually might have come from Chris Moffitt even as a sort of follow on conversation or something.

00:35:36.340 --> 00:35:41.260
But wherever it came from, if you're doing windows and you want to install get, this is kind of a cool way to do it as well.

00:35:41.260 --> 00:35:42.620
If you're not doing something like choppy.

00:35:42.620 --> 00:35:45.040
I use it every day and it's get for windows.

00:35:45.040 --> 00:35:46.540
Yeah, it's a requirement.

00:35:46.540 --> 00:35:46.960
Yeah.

00:35:46.960 --> 00:35:47.620
Nice.

00:35:47.620 --> 00:35:47.980
Yeah.

00:35:47.980 --> 00:35:48.340
Very cool.

00:35:48.340 --> 00:35:51.520
JupyterLab three is released.

00:35:51.520 --> 00:35:54.620
So this one comes to us from Alan Hanson.

00:35:54.620 --> 00:35:56.120
And thanks for pointing this out.

00:35:56.120 --> 00:36:01.500
It's a little bit, a little bit old, a couple, a couple months, but still very cool that JupyterLab three is out.

00:36:01.500 --> 00:36:06.180
You can check it out and see all the new changes that come along, including a debugger.

00:36:06.180 --> 00:36:06.880
A debugger.

00:36:06.880 --> 00:36:07.500
How about that?

00:36:07.500 --> 00:36:11.220
Table of contents, multiple languages, all sorts of cool stuff.

00:36:11.220 --> 00:36:12.580
So this looks like a major release.

00:36:12.580 --> 00:36:15.860
And if people who love JupyterLab should check it out.

00:36:15.860 --> 00:36:17.480
We'll be too long until it's PyCharm.

00:36:17.480 --> 00:36:19.760
Yeah, that's right.

00:36:19.760 --> 00:36:20.840
It's not, it's on its way.

00:36:20.840 --> 00:36:23.700
And speaking of PyCharm, I've got some on that.

00:36:23.700 --> 00:36:29.340
Brian skin also did a follow-up to not the previous episode, maybe the one before that,

00:36:29.340 --> 00:36:35.860
where we were talking about like, you know, really it's great that I think this is when we had Sebastian Ramirez on

00:36:35.860 --> 00:36:41.020
and we were talking about Google becoming a visionary sponsor of Python, which is great.

00:36:41.020 --> 00:36:43.520
And it's really cool that a couple of companies have done that.

00:36:43.520 --> 00:36:50.260
But then we also pointed out that, you know, Bank of America has like insane amounts of stuff that they depend upon.

00:36:50.260 --> 00:36:53.140
JP Morgan Chase, their core trading engine.

00:36:53.140 --> 00:37:00.400
Some of it is all by like some of these companies that make huge amounts of money and fundamentally depend upon Python itself.

00:37:01.040 --> 00:37:02.260
I generally don't support Python.

00:37:02.260 --> 00:37:07.780
I mean, I don't know the degree to which those two companies do, but you don't see them like at the top of those sponsorship lists.

00:37:07.780 --> 00:37:11.520
And, you know, like Google's was something like $300,000 a year.

00:37:11.520 --> 00:37:14.380
That's the biggest corporate sponsor in the world.

00:37:14.380 --> 00:37:14.920
Right.

00:37:14.920 --> 00:37:15.640
Can we do more?

00:37:15.640 --> 00:37:18.180
So Brian skin said, Hey, I wrote a letter for people.

00:37:18.300 --> 00:37:23.060
And he shared it where it just is mere recipient.

00:37:23.060 --> 00:37:29.140
Given the appreciable business value that we derive from Python and its related scientific tooling over the last few years,

00:37:29.140 --> 00:37:39.840
at no direct cost to the company, would there be room for bracket company to contribute financially to the 501c3 organizations that support these tools?

00:37:39.840 --> 00:37:40.660
Here's a list.

00:37:40.660 --> 00:37:41.200
Here's how.

00:37:41.200 --> 00:37:50.680
And basically it wrote like a template letter that you can send to your company decision makers to help encourage them to support Python and other open source projects.

00:37:50.680 --> 00:37:51.780
Yeah, this is great.

00:37:51.780 --> 00:37:53.320
So well done, Brian.

00:37:53.320 --> 00:37:53.920
That was pretty cool.

00:37:53.920 --> 00:37:54.500
All right.

00:37:54.500 --> 00:37:57.780
Django 3.2 long term support releases out.

00:37:57.780 --> 00:38:03.240
So if you're on a slow roll with Django, you're ready to roll on the new version.

00:38:03.240 --> 00:38:10.040
So this is something you can safely adopt for the next three years and stay happy, but on a brand new version of Django.

00:38:10.040 --> 00:38:10.820
So check that out.

00:38:10.820 --> 00:38:11.580
PyCharm.

00:38:11.580 --> 00:38:12.520
There you go, guy.

00:38:12.520 --> 00:38:13.340
I told you it'd come out.

00:38:13.340 --> 00:38:16.980
PyCharm 2021.1 is out.

00:38:16.980 --> 00:38:19.560
And they've got some really cool stuff in here.

00:38:19.560 --> 00:38:23.460
Really neat things, including the Code With Me stuff is now out.

00:38:23.560 --> 00:38:28.880
So Code With Me is I fire up PyCharm or any of the IntelliJ based things.

00:38:28.880 --> 00:38:31.140
And I say, hey, I would like to say program with Brian.

00:38:31.140 --> 00:38:33.320
Brian, can you help me work on the Python Bytes website?

00:38:33.320 --> 00:38:34.740
So I could send you a link.

00:38:34.740 --> 00:38:39.740
And then we would both have like Google Docs, but in PyCharm, like where we see each other typing.

00:38:39.740 --> 00:38:41.060
We can follow each other along.

00:38:41.520 --> 00:38:48.120
You can debug the code, but it's running on my machine, for example, even as voice call, video call built into PyCharm alongside that.

00:38:48.120 --> 00:38:48.660
Really?

00:38:48.660 --> 00:38:49.940
It's like a Skype client?

00:38:49.940 --> 00:38:52.100
It actually looks like Skype.

00:38:52.100 --> 00:38:55.820
I couldn't be sure because I haven't tried it yet, but I looked at the UI that you get.

00:38:55.820 --> 00:38:56.900
It's like a little in a panel.

00:38:56.900 --> 00:38:58.120
It looks like an embedded Skype.

00:38:58.120 --> 00:38:59.100
Interesting.

00:38:59.100 --> 00:38:59.760
Yeah.

00:38:59.760 --> 00:39:00.180
Yeah.

00:39:00.180 --> 00:39:00.740
All right.

00:39:00.740 --> 00:39:03.180
Well, those are all the extra things for me as well.

00:39:03.180 --> 00:39:13.580
Well, I wanted to bring up, so you reminded me of that, the Google fund thing that when adding, you know, Google give PSF a bunch of money.

00:39:13.580 --> 00:39:17.140
Well, what the PSF is doing with it is they're hiring a developer.

00:39:17.140 --> 00:39:19.000
So I'll drop the link.

00:39:19.000 --> 00:39:23.580
So PSF is hiring a developer in residence to support CPython.

00:39:23.580 --> 00:39:24.660
So this is a good thing.

00:39:24.660 --> 00:39:25.160
Yeah.

00:39:25.160 --> 00:39:25.780
Awesome.

00:39:25.780 --> 00:39:26.400
That's really cool.

00:39:26.880 --> 00:39:33.120
Ding Langsam also says PyCon IL is in a month.

00:39:33.120 --> 00:39:33.760
So, yeah.

00:39:33.760 --> 00:39:34.280
Awesome.

00:39:34.280 --> 00:39:34.980
Check that out.

00:39:34.980 --> 00:39:41.700
And then he also asks about what about the in-browser PyCharm, which we did cover, but that was in some kind of experimental phase.

00:39:41.700 --> 00:39:46.400
I would definitely, if possible, recommend this Code With Me thing over that because then you get the real PyCharm.

00:39:46.400 --> 00:39:49.040
It just happens to be like this live exchange.

00:39:49.040 --> 00:39:51.360
Whereas the other one, there's a lot of setup and whatnot.

00:39:51.360 --> 00:39:57.520
And it had the, this is a private, not necessarily private, but this isn't a beta, don't depend on it sort of way.

00:39:57.520 --> 00:39:59.920
But this is officially this other thing is released.

00:39:59.920 --> 00:40:03.180
Guy, anything else you want to throw out there for the world, for the listeners while you're here?

00:40:03.180 --> 00:40:05.480
Nothing really comes to mind.

00:40:05.480 --> 00:40:07.480
But thanks for having me.

00:40:07.480 --> 00:40:10.380
I see on our schedule we have a joke coming next.

00:40:10.380 --> 00:40:11.020
Is that true?

00:40:11.020 --> 00:40:12.980
We do have a joke coming next.

00:40:12.980 --> 00:40:14.340
We actually have two, I believe.

00:40:14.340 --> 00:40:16.180
I'm going to fire up mine first.

00:40:16.180 --> 00:40:18.600
I have a joke as well, if you don't mind.

00:40:18.600 --> 00:40:19.760
Don't worry, it's safe.

00:40:19.760 --> 00:40:20.880
That was perfect.

00:40:21.340 --> 00:40:21.700
All right.

00:40:21.700 --> 00:40:23.700
So, Brian, you're a fan of Vim, right?

00:40:23.700 --> 00:40:24.500
Yes.

00:40:24.500 --> 00:40:25.220
Okay.

00:40:25.220 --> 00:40:34.400
So, Anthony Shaw, same Anthony Shaw as the depend a lot bot we were just talking about, wrote a little one-liner that fits nicely in Twitter.

00:40:34.400 --> 00:40:36.920
Vim, colon, the original escape room.

00:40:36.920 --> 00:40:39.520
That's an old joke.

00:40:39.520 --> 00:40:41.520
I love it, though.

00:40:41.520 --> 00:40:42.000
I love it.

00:40:42.000 --> 00:40:45.200
And, of course, you put it out on April 1st because you've got to do something funny then, right?

00:40:45.200 --> 00:40:45.780
Yeah.

00:40:45.780 --> 00:40:46.860
And how about you?

00:40:46.860 --> 00:40:47.340
You got one here?

00:40:47.340 --> 00:40:48.400
Oh, yeah.

00:40:48.400 --> 00:40:49.140
We just added it.

00:40:49.520 --> 00:40:52.100
So, this is awesome.

00:40:52.100 --> 00:40:55.680
So, the H in software development stands for happiness.

00:40:55.680 --> 00:41:01.380
Nice.

00:41:02.380 --> 00:41:02.760
Yeah.

00:41:02.760 --> 00:41:08.680
Dean also just wants to point out that IL is Israel, which I did think that was, but I wasn't 100% sure.

00:41:08.680 --> 00:41:10.900
So, I wasn't sure if that was Israel or Illinois.

00:41:10.900 --> 00:41:12.000
Yeah, yeah.

00:41:12.000 --> 00:41:12.900
Israel.

00:41:12.900 --> 00:41:13.220
Perfect.

00:41:13.220 --> 00:41:15.960
I would love to go there, but probably not traveling right now.

00:41:15.960 --> 00:41:17.720
I will get to go there eventually.

00:41:17.720 --> 00:41:19.740
That's actually where Redis Labs is headquartered.

00:41:19.740 --> 00:41:20.540
Oh, is it?

00:41:20.540 --> 00:41:20.920
Interesting.

00:41:21.280 --> 00:41:25.360
I've had some really great vacations in Tel Aviv hanging on the beach that I can't wait to get back.

00:41:25.360 --> 00:41:25.760
All right.

00:41:25.760 --> 00:41:26.320
God, how about you?

00:41:26.320 --> 00:41:28.260
I thought you were excited to go to Illinois.

00:41:28.260 --> 00:41:30.300
Yes.

00:41:30.300 --> 00:41:32.260
You know, Chicago would be nice, maybe.

00:41:32.260 --> 00:41:32.980
Yeah.

00:41:32.980 --> 00:41:33.340
Oh, yeah.

00:41:33.340 --> 00:41:33.740
Nice place.

00:41:33.740 --> 00:41:35.160
I just can't wait to get to Peoria.

00:41:35.160 --> 00:41:35.860
Yeah.

00:41:35.860 --> 00:41:39.820
Well, I've spent a lot of time in Peoria.

00:41:39.820 --> 00:41:40.220
Yeah.

00:41:40.520 --> 00:41:43.600
But I probably hit my lifetime limit.

00:41:43.600 --> 00:41:44.200
I don't need to go.

00:41:44.200 --> 00:41:45.680
I wouldn't take a vacation there.

00:41:45.680 --> 00:41:48.240
It's a nice place, but I wouldn't go travel to it.

00:41:48.240 --> 00:41:48.640
Yeah, yeah.

00:41:48.640 --> 00:41:53.800
So, my joke is, well, it's for you, for you all.

00:41:53.800 --> 00:41:57.340
What would be a pirate's favorite programming language?

00:41:57.340 --> 00:41:59.620
Pirate's favorite programming language?

00:41:59.620 --> 00:42:00.260
See?

00:42:00.260 --> 00:42:01.780
Ah, you ruined it.

00:42:01.780 --> 00:42:06.020
You had to ask me.

00:42:06.020 --> 00:42:06.340
I'm sorry.

00:42:06.340 --> 00:42:10.140
So, the way it's supposed to go is, I say, what would be a pirate's favorite programming

00:42:10.140 --> 00:42:10.500
language?

00:42:10.500 --> 00:42:13.320
And you both, in simultaneous, I go, arrr, right?

00:42:13.320 --> 00:42:14.400
Arr.

00:42:14.400 --> 00:42:14.680
Right.

00:42:14.680 --> 00:42:15.840
Because, or incident.

00:42:15.840 --> 00:42:16.860
Oh, yeah.

00:42:16.860 --> 00:42:21.560
And then the response for me is, you might think it'd be R or maybe, but his first love

00:42:21.560 --> 00:42:22.060
be the C.

00:42:22.060 --> 00:42:23.760
Oh, man.

00:42:23.760 --> 00:42:26.660
Oh, and the audience of the chorus is calling out R.

00:42:26.660 --> 00:42:28.680
Should have looked down.

00:42:28.680 --> 00:42:33.620
It works great live, because, you know, you get an audience, they'll shout back the answer.

00:42:33.620 --> 00:42:34.380
Yeah.

00:42:34.660 --> 00:42:39.180
Because they just can't help themselves, and then you surprise them with the twist.

00:42:39.180 --> 00:42:42.660
Well, it was a trick question, because R is not a programming language.

00:42:42.660 --> 00:42:49.380
Well, it's been nice talking with you, Brian.

00:42:49.380 --> 00:42:55.540
I saw one I would want to work in, honestly.

00:42:56.380 --> 00:43:01.740
I mean, I know it's popular, was popular in a data science stack, but it's, I mean, it's

00:43:01.740 --> 00:43:02.820
got one-based arrays.

00:43:02.820 --> 00:43:04.840
I mean, that's right up there with BB6.

00:43:04.840 --> 00:43:07.700
I've never even tried it.

00:43:07.700 --> 00:43:11.560
I just, I haven't made anybody mad today, so I needed to fill my quota.

00:43:11.560 --> 00:43:15.620
It does have, like, web clients and stuff like that, so you can build web servers.

00:43:15.620 --> 00:43:16.660
It's a full-fledged language.

00:43:16.660 --> 00:43:21.020
But I've never done anything more than attend a one-hour talk on the language.

00:43:21.500 --> 00:43:21.680
Yeah.

00:43:21.680 --> 00:43:22.720
Yeah, I haven't either.

00:43:22.720 --> 00:43:23.340
All right.

00:43:23.340 --> 00:43:26.500
Well, Guy, thanks so much for being here with us.

00:43:26.500 --> 00:43:29.160
And Brian, as always, great to get by them with you.

00:43:29.160 --> 00:43:29.600
Good to talk.

00:43:29.600 --> 00:43:30.680
Yeah, thanks for having me.

00:43:30.680 --> 00:43:31.220
Yep.

00:43:31.220 --> 00:43:31.820
Thanks.

00:43:31.820 --> 00:43:33.040
Thanks everyone for the live stream as well.

00:43:33.040 --> 00:43:33.460
Bye, all.

