WEBVTT

00:00:00.001 --> 00:00:04.280
You've heard me talk to a wide cast of people building amazing things with Python.

00:00:04.280 --> 00:00:09.700
Some of them are building bioreactors to remove carbon from the air with artificial intelligence

00:00:09.700 --> 00:00:10.180
and Python.

00:00:10.180 --> 00:00:15.260
Others are optimizing the aerodynamics and race strategy at the highest level of automobile

00:00:15.260 --> 00:00:15.740
racing.

00:00:15.740 --> 00:00:17.420
This episode is different.

00:00:17.420 --> 00:00:22.600
Rather than seeing how far we can push Python to the edges of technology, we're diving into

00:00:22.600 --> 00:00:27.700
the tiny Python applications that might never be released publicly and yet can transform

00:00:27.700 --> 00:00:31.720
our day-to-day lives with simple automation on an individual level.

00:00:31.720 --> 00:00:34.060
We have four great guests here today.

00:00:34.060 --> 00:00:38.040
Rivers Cuomo, Jay Miller, Kim Van Wick, and Rusty Gregory.

00:00:38.040 --> 00:00:42.620
They'll each share a couple of apps and the underlying packages they use to build them.

00:00:42.620 --> 00:00:47.000
I know this will be a super motivational episode for many of you, and I hope that after listening,

00:00:47.000 --> 00:00:52.580
you'll transform something tedious and error-prone in your life to an instantaneous button-click

00:00:52.580 --> 00:00:53.620
solution with Python.

00:00:54.420 --> 00:00:59.360
This is Talk Python To Me, episode 327, recorded July 15th, 2021.

00:00:59.360 --> 00:01:17.440
Welcome to Talk Python To Me, a weekly podcast on Python, the language, the libraries, the ecosystem,

00:01:17.440 --> 00:01:18.400
and the personalities.

00:01:18.400 --> 00:01:20.200
This is your host, Michael Kennedy.

00:01:20.620 --> 00:01:24.360
Follow me on Twitter, where I'm @mkennedy, and keep up with the show and listen to past

00:01:24.360 --> 00:01:29.260
episodes at talkpython.fm, and follow the show on Twitter via at Talk Python.

00:01:29.260 --> 00:01:34.720
This episode is brought to you by Linode, us over at Talk Python Training, and the transcripts

00:01:34.720 --> 00:01:36.320
are brought to you by Assembly AI.

00:01:36.320 --> 00:01:38.940
Please check out what we're all offering during our segments.

00:01:38.940 --> 00:01:40.380
It really helps support the show.

00:01:40.380 --> 00:01:45.620
Rusty, Kim, Jay, and Rivers, welcome all of you to Talk Python To Me.

00:01:45.620 --> 00:01:46.000
Thanks.

00:01:46.000 --> 00:01:46.540
Great to be here.

00:01:46.540 --> 00:01:46.880
Thanks.

00:01:46.880 --> 00:01:47.240
Thanks.

00:01:47.240 --> 00:01:47.500
Thanks.

00:01:47.500 --> 00:01:48.320
Happy to be here.

00:01:48.620 --> 00:01:51.660
It's really excellent to have you here to share this topic.

00:01:51.660 --> 00:01:55.280
A lot of times I have people on the show like, oh, here's how we built Instagram.

00:01:55.280 --> 00:01:59.420
Are we using this cool library to scale the largest Django deployment?

00:01:59.420 --> 00:02:04.580
Or here's how I built Flask and how we're evolving it and something like that in data science.

00:02:04.580 --> 00:02:05.560
And that's great.

00:02:05.560 --> 00:02:10.140
But I think so many people out there listening are like, well, I'm not building those kinds

00:02:10.140 --> 00:02:10.440
of apps.

00:02:10.440 --> 00:02:11.940
I'm building something entirely different.

00:02:11.940 --> 00:02:12.680
Or I don't.

00:02:12.680 --> 00:02:13.780
I just build little things.

00:02:13.780 --> 00:02:18.320
And I think actually that's where a lot of the magic is for everyone out there listening.

00:02:18.320 --> 00:02:21.620
You know, we all have these things that are in our day to day.

00:02:21.620 --> 00:02:25.440
And it's just like, you know, that is, I'm not looking forward to that.

00:02:25.440 --> 00:02:30.580
But so many times, a couple hours of Python or other coding, a little automation, and then

00:02:30.580 --> 00:02:31.700
that becomes automatic.

00:02:31.700 --> 00:02:35.480
And life is just, you know, it's so rewarding to do those little things.

00:02:36.040 --> 00:02:37.720
I'm excited to share the ones that I did.

00:02:37.720 --> 00:02:41.880
They're incredibly simple, but they're, they just make me smile so much as I do them.

00:02:41.880 --> 00:02:44.000
So really looking forward to doing that.

00:02:44.000 --> 00:02:50.220
But before we get into the apps and the details, you know, let's maybe go around the YouTube

00:02:50.220 --> 00:02:52.980
stream picture here and let you all quickly introduce yourself.

00:02:52.980 --> 00:02:56.720
Three of the four of you have been on the show before, but just, you know, a quick introduction.

00:02:56.720 --> 00:02:57.640
Rusty, let's start with you.

00:02:57.640 --> 00:02:57.960
Okay.

00:02:57.960 --> 00:03:00.000
Yeah, I gave my long introduction last time.

00:03:00.000 --> 00:03:02.020
So I'll just say that I'm a reformed teacher.

00:03:02.020 --> 00:03:05.360
About two years ago, or maybe three years ago, I started coding.

00:03:05.360 --> 00:03:09.360
And then I had an opportunity to kind of become the data manager at my school district.

00:03:09.360 --> 00:03:15.480
So I'm trying to build pathways between all the various services that we use and keep our

00:03:15.480 --> 00:03:16.080
data clean.

00:03:16.080 --> 00:03:21.580
And that is so cool because it's not like you had to leave the education space or the public

00:03:21.580 --> 00:03:22.180
school space.

00:03:22.180 --> 00:03:25.680
You just sort of transitioned into this world where you can take what you're really into

00:03:25.680 --> 00:03:27.080
and like help everyone with it, right?

00:03:27.080 --> 00:03:28.560
Yeah, it was a great move for me.

00:03:28.560 --> 00:03:33.240
I was actually trying to learn how to teach coding to the kids and then I just really enjoyed

00:03:33.240 --> 00:03:33.460
it.

00:03:33.460 --> 00:03:34.600
So yeah, so it was great.

00:03:34.680 --> 00:03:35.380
Just do more of that.

00:03:35.380 --> 00:03:37.380
Just the same time big data hit.

00:03:37.380 --> 00:03:38.160
So it was good.

00:03:38.160 --> 00:03:38.560
Yeah.

00:03:38.560 --> 00:03:39.220
Fantastic.

00:03:39.220 --> 00:03:39.740
Kim?

00:03:39.740 --> 00:03:40.140
Right.

00:03:40.140 --> 00:03:44.520
If I can borrow a phrase from Rusty, I'm a reformed embedded software engineer.

00:03:44.520 --> 00:03:49.640
So I've moved from C a couple of years ago to doing mainly DevOps work for a financial services

00:03:49.640 --> 00:03:51.660
organization here in South Africa where I'm based.

00:03:51.660 --> 00:03:52.000
Yeah.

00:03:52.420 --> 00:03:52.780
Fantastic.

00:03:52.780 --> 00:03:52.860
Fantastic.

00:03:52.860 --> 00:03:55.840
And you were also hosting the Ask Me Anything not long ago.

00:03:55.840 --> 00:03:56.760
Thank you for that.

00:03:56.760 --> 00:03:57.440
Yeah, that was great.

00:03:57.440 --> 00:03:59.020
Yes, that was not that long ago.

00:03:59.020 --> 00:03:59.240
Yeah.

00:03:59.240 --> 00:04:00.180
That was very good.

00:04:00.180 --> 00:04:00.360
Yeah.

00:04:00.360 --> 00:04:01.100
Yeah, it was fun.

00:04:01.100 --> 00:04:01.600
Jay.

00:04:01.600 --> 00:04:02.340
Hello, hello.

00:04:02.600 --> 00:04:05.520
I just saw you over on Python Bytes not long ago, but happy to have you here.

00:04:05.520 --> 00:04:07.240
Happy to be back.

00:04:07.360 --> 00:04:13.600
I will crib everyone and say I am also reformed, marketer, veteran, now developer advocate,

00:04:13.600 --> 00:04:19.980
and spend a lot of my time just talking to the community and learning from folks that are

00:04:19.980 --> 00:04:21.040
a lot smarter than I am.

00:04:21.180 --> 00:04:22.920
Like the four people on this panel.

00:04:22.920 --> 00:04:23.460
Yeah.

00:04:23.460 --> 00:04:27.040
And you're doing stuff with Elasticsearch and some cool database-like things, right?

00:04:27.040 --> 00:04:27.560
Absolutely.

00:04:27.560 --> 00:04:28.020
Yeah.

00:04:28.020 --> 00:04:30.180
Rivers, your first time on the show.

00:04:30.180 --> 00:04:31.320
Thank you so much for coming.

00:04:31.320 --> 00:04:32.300
It's really great to have you here.

00:04:32.300 --> 00:04:33.820
Tell people real quickly about yourself.

00:04:33.820 --> 00:04:35.020
My name is Rivers Cuovo.

00:04:35.020 --> 00:04:38.020
I'm the singer and songwriter for the band Weezer.

00:04:38.020 --> 00:04:44.420
Our first album came out in 94 and we've been touring and making records on and off ever since.

00:04:44.420 --> 00:04:46.300
I'm such a fan of your music.

00:04:46.300 --> 00:04:49.840
It came out when I was in college and I've been a fan of what you're doing longer than I've

00:04:49.840 --> 00:04:51.340
been a fan of Python, which is crazy.

00:04:51.340 --> 00:04:52.360
That's so awesome.

00:04:52.360 --> 00:04:53.180
So thank you for that.

00:04:53.180 --> 00:04:53.480
Yeah.

00:04:53.480 --> 00:04:55.760
I'm a huge fan of your show, Michael.

00:04:55.760 --> 00:05:00.740
I listen every morning and of course I've learned so much and gotten turned on to so many

00:05:00.740 --> 00:05:06.760
cool packages, but also it's just nice to get that human connection in the midst of a few

00:05:06.760 --> 00:05:11.320
hours of coding every morning to hear all you guys talking about it.

00:05:11.320 --> 00:05:12.700
It really warms the heart.

00:05:12.700 --> 00:05:13.080
Awesome.

00:05:13.080 --> 00:05:13.520
Thank you.

00:05:13.520 --> 00:05:18.400
I think a lot of people who have told me they listen to the show and some of the guests as

00:05:18.400 --> 00:05:24.140
well, they don't work in like a startup tech place environment, but being able to listen

00:05:24.140 --> 00:05:29.440
to a podcast like Talk Python To Me and others, it kind of brings that community to them, even

00:05:29.440 --> 00:05:33.380
though they're not necessarily like every day showing up with a group of people who would

00:05:33.380 --> 00:05:34.040
be that community.

00:05:34.040 --> 00:05:34.340
Yeah.

00:05:34.340 --> 00:05:36.040
That's exactly my situation.

00:05:36.040 --> 00:05:40.620
I'm working on my own here and I don't know anybody who is into coding.

00:05:40.620 --> 00:05:42.720
So it's great to know you.

00:05:42.720 --> 00:05:42.980
Yeah.

00:05:42.980 --> 00:05:43.300
Awesome.

00:05:43.300 --> 00:05:43.560
Yeah.

00:05:43.600 --> 00:05:44.000
You as well.

00:05:44.000 --> 00:05:49.160
So as you said, people will know you from Weezer and that's amazing, but you are doing

00:05:49.160 --> 00:05:52.960
such cool stuff with automation and Python and code.

00:05:52.960 --> 00:05:56.340
And so I think people are really going to be blown away by what you're doing as well.

00:05:56.340 --> 00:05:59.300
So I'm super excited to get into that.

00:05:59.300 --> 00:06:00.340
Let's just sort of go down.

00:06:00.340 --> 00:06:04.960
We all put together a couple of things that we're working on in a shared doc here.

00:06:04.960 --> 00:06:06.900
And it looks like Rusty, I put you first.

00:06:06.900 --> 00:06:10.540
So Rusty, you want to kick us off with the first sort of automation thing that you built?

00:06:10.540 --> 00:06:15.580
Sure. So when COVID hit, we had to change a lot of different things and adjust like everybody

00:06:15.580 --> 00:06:16.520
else did in the world.

00:06:16.520 --> 00:06:21.300
And we ended up sending out a lot of notifications from our school district when an infection would

00:06:21.300 --> 00:06:23.560
happen at a school and we'd have to notify people.

00:06:23.560 --> 00:06:24.560
And it was this huge thing.

00:06:24.560 --> 00:06:27.060
And at the height, we were getting lots of these things a day.

00:06:27.060 --> 00:06:30.440
And so schools started to put the information up on their website so that you could just go

00:06:30.440 --> 00:06:34.160
and refer to the website instead of get a wall of text every time something happened.

00:06:34.500 --> 00:06:39.180
So my superintendent came in and said she wanted to put this dashboard up and then she showed

00:06:39.180 --> 00:06:40.600
me some other schools that had done it.

00:06:40.600 --> 00:06:44.500
And I looked at what they were doing and just knowing how the web works and schools work.

00:06:44.500 --> 00:06:48.180
I knew that somebody who's going to have to update this information every single day or

00:06:48.180 --> 00:06:51.860
every other day on the website, it was something that could easily fall by the wayside.

00:06:51.860 --> 00:06:54.400
So I thought to myself, you know, who's going to be updating this?

00:06:54.400 --> 00:06:55.600
And then she's like, don't worry about it.

00:06:55.600 --> 00:06:56.280
I'll update it.

00:06:56.280 --> 00:06:58.200
You know, you've got so much to worry about.

00:06:58.200 --> 00:07:00.300
Like, that's not what you want your superintendent doing, right?

00:07:00.300 --> 00:07:02.880
You're updating the website, you know, once a day or whatever.

00:07:02.880 --> 00:07:05.560
So I was like, I should be able to handle this with Python somehow.

00:07:05.560 --> 00:07:10.740
So I hit Reddit and I just asked kind of, you know, or well, first off, I had to find out

00:07:10.740 --> 00:07:11.700
where she was getting the information.

00:07:11.700 --> 00:07:14.620
So the health department put it up on the website, but it was a PDF.

00:07:14.620 --> 00:07:16.040
And I was like, oh, that's crazy.

00:07:16.040 --> 00:07:16.480
Oh, gosh.

00:07:16.480 --> 00:07:16.680
Yeah.

00:07:16.680 --> 00:07:17.880
So I can't scrape that.

00:07:17.880 --> 00:07:22.000
So I was like, all right, well, yeah, maybe I'll just update it every day.

00:07:22.000 --> 00:07:22.400
All right.

00:07:22.400 --> 00:07:27.340
So then I hit Reddit and I was like, is there a way to turn, you know, a PDF into a CSV with

00:07:27.340 --> 00:07:27.680
Python?

00:07:27.680 --> 00:07:28.560
And of course there was.

00:07:28.560 --> 00:07:30.920
So about two or three different packages got recommended.

00:07:31.080 --> 00:07:32.620
I played around with them for about a half an hour.

00:07:32.620 --> 00:07:37.000
And this one called Tabula, which I wasn't crazy about because it depends on Java underneath.

00:07:37.000 --> 00:07:40.940
So it uses Java to kind of like recognize patterns on there.

00:07:40.940 --> 00:07:46.120
And it'll, so it'll, it'll turn your, your PDF, pull out just the tabular data and

00:07:46.120 --> 00:07:47.480
stick it into a CSV for you.

00:07:47.600 --> 00:07:52.780
So I was able to just with a bit of requests, go up, grab that every time, save it, process

00:07:52.780 --> 00:07:57.540
it, wrote a really gnarly little loop that finds my four schools and then puts those into

00:07:57.540 --> 00:07:58.340
my own CSV.

00:07:58.340 --> 00:08:03.260
And then I use Python again, Yagmail to just send it to myself.

00:08:03.260 --> 00:08:06.140
I did it twice a day because it was updated at different times.

00:08:06.140 --> 00:08:11.400
And then on the other end with a little JavaScript, I just went into my email and I find that and

00:08:11.400 --> 00:08:14.780
I just update a Google sheet that's embedded on the, on the website.

00:08:14.780 --> 00:08:19.340
So there's a bunch of little parts on it, but literally the Python was about 96 lines

00:08:19.340 --> 00:08:21.240
of code with comments and stuff.

00:08:21.240 --> 00:08:23.060
And it accomplished this.

00:08:23.060 --> 00:08:23.900
And that's super cool.

00:08:23.900 --> 00:08:25.100
And it's really valuable, right?

00:08:25.100 --> 00:08:29.560
That if something like that gets missed, you know, it could make a big deal or it could be

00:08:29.560 --> 00:08:30.960
some kind of outbreak.

00:08:30.960 --> 00:08:31.240
Yeah.

00:08:31.240 --> 00:08:35.460
And I can apply that to just about, you know, to so many other things as well.

00:08:35.460 --> 00:08:39.300
So the time, all the time I invested in learning how that was, and it was an afternoon and I

00:08:39.300 --> 00:08:43.020
was able to figure that out and, and impress my immediate boss, which was really cool.

00:08:43.060 --> 00:08:44.540
He, he enjoys those types of things.

00:08:44.540 --> 00:08:45.180
So that was good.

00:08:45.180 --> 00:08:45.620
I bet.

00:08:45.620 --> 00:08:47.060
Paul out there in the live stream.

00:08:47.060 --> 00:08:50.780
Hey, Paul says, I use Yagmail to automate sending out emails for the SciPy conference.

00:08:50.780 --> 00:08:51.540
Very cool.

00:08:51.540 --> 00:08:55.520
Rivers, it sounds like you and Rusty share some of the same tool set there.

00:08:55.520 --> 00:09:00.040
Like it turns with like web scraping, PDFs, Google sheets, that kind of stuff.

00:09:00.040 --> 00:09:00.360
Yeah.

00:09:00.460 --> 00:09:05.820
I was just remembering, in fact, I emailed you a few years ago in desperation because

00:09:05.820 --> 00:09:11.620
I was trying to get some data from our agents that they have a web service where they give

00:09:11.620 --> 00:09:17.360
you the artists, tons of details about their upcoming shows, attendance and tickets sold

00:09:17.360 --> 00:09:19.840
and gross income, all this stuff.

00:09:19.940 --> 00:09:25.260
So I wanted to get all that and I had to, I had to deal with Pete, like it's rendered as

00:09:25.260 --> 00:09:25.740
a PDF.

00:09:25.740 --> 00:09:29.680
I made the mistake of going to Stack Overflow first, I guess, instead of Reddit.

00:09:29.680 --> 00:09:32.860
And my question was getting all these downvotes.

00:09:32.860 --> 00:09:33.700
Oh yeah.

00:09:33.700 --> 00:09:34.380
Oh yeah.

00:09:34.740 --> 00:09:34.900
Yeah.

00:09:34.900 --> 00:09:35.460
That's rough.

00:09:35.460 --> 00:09:36.200
That is so, yeah.

00:09:36.200 --> 00:09:37.400
You've got to find your community.

00:09:37.400 --> 00:09:37.720
I turned to Michael.

00:09:37.720 --> 00:09:38.040
Yeah.

00:09:38.040 --> 00:09:38.540
Yeah.

00:09:38.540 --> 00:09:39.540
Michael helped me out.

00:09:39.540 --> 00:09:40.160
Yeah.

00:09:40.160 --> 00:09:40.600
That's awesome.

00:09:40.600 --> 00:09:44.460
I remember you were really frustrated because somehow the wrong information had been given

00:09:44.460 --> 00:09:47.840
to you when you showed up and you're like, this was supposed to be one hour and it's

00:09:47.840 --> 00:09:49.180
two hours and I was at the wrong.

00:09:49.180 --> 00:09:49.420
Yeah.

00:09:49.420 --> 00:09:54.120
I just, I could see, I imagine you're like, how do I get this table or this part of the information

00:09:54.120 --> 00:09:54.740
out of the PDF?

00:09:54.740 --> 00:09:55.880
And yeah, that was perfect.

00:09:55.880 --> 00:09:56.160
Yeah.

00:09:56.160 --> 00:09:57.460
But what is that package?

00:09:57.460 --> 00:09:57.960
Yagmail?

00:09:57.960 --> 00:09:59.740
I think I ought to try that one.

00:09:59.740 --> 00:09:59.960
Yep.

00:09:59.960 --> 00:10:00.380
Yep.

00:10:00.380 --> 00:10:00.820
Yagmail.

00:10:00.820 --> 00:10:01.940
It's really simple.

00:10:02.140 --> 00:10:06.280
The toughest part is going through the hoops with Google, but once you get your little

00:10:06.280 --> 00:10:08.240
file back from them, you can use it for everything.

00:10:08.240 --> 00:10:08.680
So.

00:10:08.680 --> 00:10:09.300
Very cool.

00:10:09.300 --> 00:10:10.080
All right.

00:10:10.080 --> 00:10:10.940
Thanks, Rusty.

00:10:10.940 --> 00:10:12.820
Kim, yours first one's up next.

00:10:12.820 --> 00:10:15.500
Just remind myself which one I wrote down as my first one.

00:10:15.500 --> 00:10:16.460
That was it.

00:10:16.460 --> 00:10:16.640
Yeah.

00:10:16.640 --> 00:10:18.720
This little one, there's no link to it.

00:10:18.720 --> 00:10:19.660
It doesn't have a name or anything.

00:10:19.660 --> 00:10:23.020
It's just a little small script that one of the many that sits on my hard drive.

00:10:23.020 --> 00:10:28.480
And this I think is really kind of an epitome of small time or very small tool Python

00:10:28.480 --> 00:10:28.820
writing.

00:10:29.040 --> 00:10:34.720
It's a small tool I wrote basically as my, my, the team I work with at work is about five

00:10:34.720 --> 00:10:35.260
or six of us.

00:10:35.260 --> 00:10:39.920
We kind of as agile as we need to be, which includes a Trello board because we're no longer

00:10:39.920 --> 00:10:41.700
standing in front of a whiteboard in an office.

00:10:41.700 --> 00:10:42.840
We're all in our own homes.

00:10:42.840 --> 00:10:46.560
And so basically tracking cards of what we're doing for the week.

00:10:46.600 --> 00:10:51.880
And we include in our team, people who have from day to day responsibilities for deployment

00:10:51.880 --> 00:10:52.840
to some of our environments.

00:10:52.840 --> 00:10:57.200
So one of the guys will push changes to staging, a different guy will push changes to our production

00:10:57.200 --> 00:10:57.680
environment.

00:10:57.680 --> 00:10:59.700
And then it's all kind of boring setup.

00:10:59.700 --> 00:11:03.420
But effectively what it means is at the start of the week, I need to generate 10 cards for

00:11:03.420 --> 00:11:04.040
who's doing what.

00:11:04.240 --> 00:11:07.680
So I used to get an email from one of our administrators to say, here's the schedule

00:11:07.680 --> 00:11:08.200
for the week.

00:11:08.200 --> 00:11:12.600
You know, Bob's doing the staging on Monday and Fred's doing production on Tuesday.

00:11:12.600 --> 00:11:14.820
And I want to track those on my Trello board.

00:11:14.820 --> 00:11:17.840
And I reached the point where it shouldn't be a big deal.

00:11:17.840 --> 00:11:19.600
It took me about 10 minutes on Monday morning.

00:11:19.600 --> 00:11:24.420
I would make 10 cards and I'd write down Fred Monday, Bob Tuesday, but it was tedious and

00:11:24.420 --> 00:11:25.000
it was fiddly.

00:11:25.080 --> 00:11:28.500
And I was putting it off because it was 10 minutes I'd rather not spend.

00:11:28.500 --> 00:11:30.620
And it's only 10 minutes, but still it was irritating.

00:11:30.620 --> 00:11:33.760
And that was kind of not the thing I wanted to do on Monday morning.

00:11:33.760 --> 00:11:39.060
So basically I have sitting on my hard drive about 150 lines of Python purely to ask me,

00:11:39.060 --> 00:11:41.900
interrogate when I run it, who's doing what?

00:11:41.900 --> 00:11:43.380
Well, basically I've now got it set up.

00:11:43.380 --> 00:11:47.800
So it says full staging on Monday, which of these six people is the deployer?

00:11:47.800 --> 00:11:50.640
And just repeat for each of those cards.

00:11:50.640 --> 00:11:54.840
And that was literally, it takes me 20 seconds to run it now.

00:11:54.840 --> 00:11:58.140
I have to read the email I get on Monday morning to say, you know, who's doing when.

00:11:58.140 --> 00:11:59.620
And then it all does it for me.

00:11:59.620 --> 00:12:01.760
And it's incredibly daft.

00:12:01.760 --> 00:12:03.600
I mean, I save myself 10 minutes a week.

00:12:03.600 --> 00:12:07.420
It's no big deal, but I also save myself some irritation and scratches that little itch.

00:12:07.420 --> 00:12:10.100
And that's the kind of thing I really love about a really small Python tool.

00:12:10.100 --> 00:12:12.120
It took me a couple hours to write.

00:12:12.120 --> 00:12:16.200
So it's not like it cost the company days of my time.

00:12:16.200 --> 00:12:16.960
Yeah.

00:12:16.960 --> 00:12:17.540
Yeah.

00:12:17.540 --> 00:12:19.580
And it probably saved them some mistake or some forgotten.

00:12:19.580 --> 00:12:20.060
Well, exactly.

00:12:20.060 --> 00:12:20.380
Yeah.

00:12:20.380 --> 00:12:20.740
Yeah.

00:12:20.740 --> 00:12:22.960
What's the Trello communication bit?

00:12:22.960 --> 00:12:24.660
That's all REST API on Trello.

00:12:24.660 --> 00:12:31.360
So like most similar REST API services, you go along to Trello's side, you identify yourself,

00:12:31.360 --> 00:12:34.260
you get back a token from them, and then that's all API queries.

00:12:34.260 --> 00:12:39.620
So of the 150 lines of Python, about 40 are just config files for me mapping the names of

00:12:39.620 --> 00:12:44.360
my team members and various bits of information about the Trello to ID numbers I have to send

00:12:44.360 --> 00:12:44.880
back to Trello.

00:12:44.880 --> 00:12:45.480
Yeah.

00:12:45.480 --> 00:12:46.880
It's a little less actual code.

00:12:47.280 --> 00:12:47.440
Yeah.

00:12:47.440 --> 00:12:48.060
That's fantastic.

00:12:48.060 --> 00:12:53.620
So I don't know how we managed to pull this together when you all arrived for the meeting,

00:12:53.620 --> 00:12:57.700
but we're exactly sort of in the loop of the same order in the docs.

00:12:57.700 --> 00:12:58.340
So awesome.

00:12:58.340 --> 00:12:59.080
Jay, you're next.

00:12:59.080 --> 00:12:59.800
That'll keep it easy.

00:12:59.800 --> 00:13:00.260
Awesome.

00:13:00.260 --> 00:13:05.420
Well, as I mentioned before, I work as a developer advocate and I work for Elastic.

00:13:05.700 --> 00:13:08.040
We do search stuff and search things.

00:13:08.040 --> 00:13:11.240
I'm sure any of my co-workers listening are like, that's it.

00:13:11.240 --> 00:13:11.940
That's all you're going to say.

00:13:11.940 --> 00:13:12.580
Yes.

00:13:13.000 --> 00:13:18.280
But one of the things that we have done because we do a lot of visualization is we build dashboards

00:13:18.280 --> 00:13:19.480
for like everything.

00:13:19.480 --> 00:13:20.720
There's so many dashboards.

00:13:20.720 --> 00:13:26.840
I have actually built a series of my own set of dashboards using one of my new favorite tools

00:13:26.840 --> 00:13:35.240
called Elon, which is like a pandas like data framing tool, but for Elasticsearch.

00:13:35.240 --> 00:13:40.640
And it's great because it's designed to work with pandas, but it's also designed to work like

00:13:40.640 --> 00:13:41.200
pandas.

00:13:41.300 --> 00:13:45.720
So if you've ever done any type of data framing, any type of dealing with big numbers, big,

00:13:45.720 --> 00:13:50.380
any type of information like that, and you're used to those commands, you can just try them

00:13:50.380 --> 00:13:51.740
and usually they work.

00:13:51.740 --> 00:13:58.980
And what I've learned is Elon is amazing for like parsing CSV files, parsing JSON files.

00:13:58.980 --> 00:14:05.060
You don't have to do like the for or with open, whatever the CSV file is as dict reader and

00:14:05.060 --> 00:14:09.460
like all this, like that whole pattern you just do, you know, in pandas, you would just do

00:14:09.460 --> 00:14:14.640
pandas read CSV or in Elon, you would say Elon CSV to Elon.

00:14:14.640 --> 00:14:17.160
And then it just loads that information into your database.

00:14:17.160 --> 00:14:17.980
No questions asked.

00:14:17.980 --> 00:14:18.500
And it just goes.

00:14:18.500 --> 00:14:19.280
Oh, that's super cool.

00:14:19.280 --> 00:14:23.600
So instead of trying to work with it directly with pandas, you put it into the database.

00:14:23.600 --> 00:14:26.440
You can do queries and reporting and stuff like that driven off of it.

00:14:26.440 --> 00:14:26.620
Right?

00:14:26.880 --> 00:14:27.260
Exactly.

00:14:27.260 --> 00:14:31.940
Instead of like, because you're having to figure out all of the mutations that you would need to find

00:14:31.940 --> 00:14:33.060
exactly what you need.

00:14:33.060 --> 00:14:38.600
You just do a general elastic search query and then it shows you the information you're looking for,

00:14:38.600 --> 00:14:41.460
but in like a data frame format, which is sweet.

00:14:41.460 --> 00:14:43.480
And I've used that for a couple of projects.

00:14:43.620 --> 00:14:45.480
I built a tool in react.

00:14:45.480 --> 00:14:49.880
Sorry, I know it's a Python podcast, but it's called diversity orgs.tech.

00:14:49.880 --> 00:14:54.880
I do a lot of diversity work in my job connecting with organizations that work with underrepresented

00:14:54.880 --> 00:14:55.360
folks.

00:14:55.360 --> 00:15:02.320
And this has been a way for me to collect, like, I think at this point, like over 500 different

00:15:02.320 --> 00:15:07.600
organizations that work with underrepresented folks in tech and put it in like its own little

00:15:07.600 --> 00:15:11.600
mini search engine, its own like small meetup and updating it.

00:15:11.600 --> 00:15:15.660
I actually just use Flask, which I think is funny because you have, that is not it.

00:15:15.660 --> 00:15:16.580
I wish that was it.

00:15:16.580 --> 00:15:18.420
Diversityorgs.tech.

00:15:18.420 --> 00:15:21.720
I was like, their design work much better than mine.

00:15:21.720 --> 00:15:24.020
There we go.

00:15:24.020 --> 00:15:24.360
Yeah.

00:15:24.360 --> 00:15:32.300
So you can just search for it and like, but yeah, like it's a lot of people.

00:15:32.300 --> 00:15:36.640
It's cool that like, you can just use things like Flask on the backend and build your own

00:15:36.640 --> 00:15:41.140
little admin portal and you don't have to worry about spinning up a server or like being worried

00:15:41.140 --> 00:15:43.780
that someone's going to try to brute force your backend or anything.

00:15:43.780 --> 00:15:47.480
You're just like, oh, let me start my Flask engine, run it.

00:15:47.480 --> 00:15:52.480
It's sending REST API calls to Elasticsearch and then it just works, which is great.

00:15:52.480 --> 00:15:53.360
Yeah, that's really cool.

00:15:53.360 --> 00:15:58.160
This portion of Talk Python To Me is sponsored by Linode.

00:15:58.160 --> 00:16:02.280
Visit talkpython.fm/Linode to see why Linode has been voted the

00:16:02.280 --> 00:16:06.600
top infrastructure as a service provider by both G2 and TrustRadius.

00:16:06.600 --> 00:16:12.280
From their award-winning support, which is offered 24, 7, 365 to every level of user,

00:16:12.280 --> 00:16:17.160
to the ease of use and setup, it's clear why developers have been trusting Linode for projects

00:16:17.160 --> 00:16:19.320
both big and small since 2003.

00:16:19.320 --> 00:16:24.900
To pull your entire application stack with Linode's one-click app marketplace, or build

00:16:24.900 --> 00:16:28.740
it all from scratch and manage everything yourself with supported centralized tools like

00:16:28.740 --> 00:16:29.240
Terraform.

00:16:29.240 --> 00:16:34.760
Linode offers the best price-to-performance value for all compute instances, including

00:16:34.760 --> 00:16:39.880
GPUs as well as block storage, Kubernetes, and their upcoming bare metal release.

00:16:39.880 --> 00:16:45.780
Linode makes cloud computing fast, simple, and affordable, allowing you to focus on your

00:16:45.780 --> 00:16:47.660
projects, not your infrastructure.

00:16:48.220 --> 00:16:52.940
Visit talkpython.fm/Linode and sign up with your Google account, your GitHub account,

00:16:52.940 --> 00:16:56.080
or your email address, and you'll get $100 in credit.

00:16:56.080 --> 00:17:01.180
That's talkpython.fm/Linode, or just click the link in your podcast player's show notes.

00:17:01.180 --> 00:17:03.200
And thank them for supporting Talk Python.

00:17:05.260 --> 00:17:09.020
I think this whole diversity org tech place is really cool.

00:17:09.020 --> 00:17:15.120
So the idea is, basically, you're trying to create groups that people can reach out to,

00:17:15.120 --> 00:17:20.120
because if you see people who like you, you feel way more like you should be part of that

00:17:20.120 --> 00:17:20.840
community, right?

00:17:20.840 --> 00:17:23.260
Way more part of technology or whatever.

00:17:23.260 --> 00:17:24.100
Yeah, just try it out.

00:17:24.100 --> 00:17:26.760
Just type in Portland and hit search and see what comes up.

00:17:26.760 --> 00:17:28.380
Like, there should be groups.

00:17:28.380 --> 00:17:30.420
In Portland, there will definitely be groups.

00:17:30.420 --> 00:17:30.840
Yeah.

00:17:30.840 --> 00:17:31.340
Oh, yeah.

00:17:31.340 --> 00:17:34.160
There's the PyLadies, Blackson Technologies, Django Girls.

00:17:34.160 --> 00:17:34.620
Keep scrolling.

00:17:34.620 --> 00:17:35.100
There's more.

00:17:35.100 --> 00:17:35.820
There's more.

00:17:35.820 --> 00:17:36.240
Oh, yeah.

00:17:36.240 --> 00:17:37.000
Yeah, there you go.

00:17:37.000 --> 00:17:37.480
Oh, yeah.

00:17:37.480 --> 00:17:37.940
Look at that.

00:17:37.940 --> 00:17:41.600
Which is what I'm telling you is I need a lesson in UI.

00:17:41.600 --> 00:17:43.440
So this is all running React.

00:17:43.440 --> 00:17:46.660
But the way that I update this, like if someone messaged me and says,

00:17:46.660 --> 00:17:49.520
oh, hey, I want my organization added to this list.

00:17:49.520 --> 00:17:54.160
I just have a Flask site that I just spin up locally on my machine that sends all that.

00:17:54.160 --> 00:17:55.480
Like, it's just a quick form.

00:17:55.480 --> 00:17:59.700
And then it sends all the data to my server in Elastic Cloud.

00:17:59.700 --> 00:18:02.240
And then it's up on the website instantly.

00:18:02.240 --> 00:18:15.360
I was just going to point out one of the powerful things that you can do that had only occurred to me much later than I wish it had done is a very fast way to get a GUI tool for something you're only ever going to use for yourself is something like Flask or Django or something like that.

00:18:15.360 --> 00:18:16.440
It doesn't have to be pretty.

00:18:16.440 --> 00:18:17.340
It doesn't have to look good.

00:18:17.420 --> 00:18:19.840
The only place it's ever going to run is on your own machine.

00:18:19.840 --> 00:18:23.160
But you get all the HTML GUI stuff basically for free.

00:18:23.160 --> 00:18:24.060
You're not writing anything.

00:18:24.060 --> 00:18:25.740
You're not writing a desktop app for buttons to click.

00:18:25.740 --> 00:18:27.100
You're just firing up some HTML.

00:18:27.100 --> 00:18:29.380
So that's actually quite a useful thing to do.

00:18:29.380 --> 00:18:30.800
You don't have to worry about deployment.

00:18:30.800 --> 00:18:32.140
There's no security issues, et cetera.

00:18:32.140 --> 00:18:33.100
It never leaves your hard drive.

00:18:33.100 --> 00:18:33.640
Yeah.

00:18:33.640 --> 00:18:34.380
Yeah, absolutely.

00:18:34.380 --> 00:18:36.360
You know, another one that's pretty good is Anvil.

00:18:36.360 --> 00:18:36.800
Yeah.

00:18:36.800 --> 00:18:38.600
In terms of I just kind of want something.

00:18:38.600 --> 00:18:40.580
Probably misspelling again.

00:18:40.580 --> 00:18:42.000
We're watching my Google.

00:18:42.000 --> 00:18:42.900
I know.

00:18:42.900 --> 00:18:44.380
Yeah, there we go.

00:18:44.380 --> 00:18:45.400
There we go.

00:18:45.560 --> 00:18:47.160
I thought that's what I typed, but that's okay.

00:18:47.160 --> 00:18:51.140
It's interesting because you write Python even on the front end and it runs in your browser,

00:18:51.140 --> 00:18:53.320
but it takes care of the hosting and whatnot.

00:18:53.320 --> 00:18:54.400
You don't have to share it publicly.

00:18:54.400 --> 00:18:58.720
So it's kind of, you know, if you want to have a semi-hosted one, that's also a pretty neat option.

00:18:58.720 --> 00:18:59.840
But yeah, Tim, you're right.

00:18:59.840 --> 00:19:04.520
If you're looking for a UI, sometimes the right thing might be just a private blast gap for you

00:19:04.520 --> 00:19:07.800
or maybe just for like your people who are going to work with it behind the scenes.

00:19:07.800 --> 00:19:08.600
It doesn't have to be pretty.

00:19:08.600 --> 00:19:08.940
Exactly.

00:19:08.940 --> 00:19:09.900
Yeah, it doesn't have to be pretty.

00:19:09.900 --> 00:19:10.900
You're not selling it or anything.

00:19:10.900 --> 00:19:12.820
The buttons are in the right places.

00:19:13.340 --> 00:19:16.060
Or for that matter, if it's the only people you know, they can ask you, what do I do?

00:19:16.060 --> 00:19:16.740
And you can tell them.

00:19:16.740 --> 00:19:20.840
It doesn't have to even be particularly attractive or easy to use if it gets the job done.

00:19:20.840 --> 00:19:21.620
Yeah, absolutely.

00:19:21.620 --> 00:19:22.220
Absolutely.

00:19:22.220 --> 00:19:22.880
Very cool.

00:19:22.880 --> 00:19:23.360
All right.

00:19:23.360 --> 00:19:23.680
Thanks.

00:19:23.680 --> 00:19:24.100
Thanks, Jay.

00:19:24.100 --> 00:19:24.820
That's a good one.

00:19:24.820 --> 00:19:26.700
Rivers, what's the first one you want to share?

00:19:26.700 --> 00:19:29.460
First one I want to share is an app called Demolisher.

00:19:29.940 --> 00:19:37.240
And I made this because when I'm writing songs, I very often like to Frankenstein unrelated bits

00:19:37.240 --> 00:19:37.660
together.

00:19:37.660 --> 00:19:40.020
That ends up sounding like a coherent song.

00:19:40.020 --> 00:19:46.540
But for me, it feels like the song feels fresher when I have these unrelated bits where when I

00:19:46.540 --> 00:19:49.500
was writing each bit, it was like, this is the only thing in my mind.

00:19:49.500 --> 00:19:51.140
I'm just making this as good as possible.

00:19:51.140 --> 00:19:53.840
So, I stick a few of those together and it turns into a song.

00:19:54.160 --> 00:20:00.020
However, when I'm looking for a bit to attach to the previous bit, I usually have some idea

00:20:00.020 --> 00:20:01.180
of what I'm looking for.

00:20:01.180 --> 00:20:01.420
Right.

00:20:01.420 --> 00:20:06.340
They can't just be a random combination of different types of music or riffs.

00:20:06.340 --> 00:20:06.780
Yeah.

00:20:06.780 --> 00:20:11.800
Even if it's a very contrasting bit, it's still something somewhat specific.

00:20:11.800 --> 00:20:17.740
So, I don't want to have to look through all 1,500 of my old unused demos.

00:20:17.740 --> 00:20:20.080
So, I needed some kind of filter.

00:20:20.480 --> 00:20:26.760
There's a Windows app called MP3 Tag, which I highly recommend for tagging music files.

00:20:26.760 --> 00:20:28.780
There's a search bar in there.

00:20:28.780 --> 00:20:33.980
And I'm not sure exactly what the language is for that search, but it's some kind of SQL

00:20:33.980 --> 00:20:34.720
looking thing.

00:20:34.720 --> 00:20:41.660
But I would write these filter queries and they'd get quite complicated and long and like all

00:20:41.660 --> 00:20:43.080
these nests with parentheses.

00:20:43.080 --> 00:20:45.820
There's the filter bar down at the very bottom.

00:20:45.820 --> 00:20:46.200
Gotcha.

00:20:46.440 --> 00:20:50.860
I think I was using this app in a way that most people weren't because my filters were

00:20:50.860 --> 00:20:52.700
just gigantic and unmanageable.

00:20:52.700 --> 00:21:00.280
I wrote this app called Demolisher, which is a Tekinter window with a bunch of switches that

00:21:00.280 --> 00:21:06.560
you set all the switches and then you hit a filter and it will copy this long string into

00:21:06.560 --> 00:21:07.720
that filter bar there.

00:21:07.720 --> 00:21:13.040
And you end up with the demos that only match the criteria you're looking for.

00:21:13.040 --> 00:21:14.140
Oh, how interesting.

00:21:14.140 --> 00:21:19.060
So, it basically develops this, the SQL query type thing.

00:21:19.060 --> 00:21:19.420
Yeah.

00:21:19.420 --> 00:21:20.160
For this app.

00:21:20.160 --> 00:21:21.500
Is it okay if I put it up on the screen?

00:21:21.500 --> 00:21:22.040
Do you mind?

00:21:22.040 --> 00:21:22.600
The screenshot?

00:21:22.600 --> 00:21:23.300
Oh, yeah, sure.

00:21:23.300 --> 00:21:23.900
There we go.

00:21:23.900 --> 00:21:26.880
I don't know if you can see, but there's just a bunch of switches here.

00:21:26.880 --> 00:21:28.220
So, tell us about the switches.

00:21:28.220 --> 00:21:29.740
I'm not very musical.

00:21:29.740 --> 00:21:31.300
So, you've got to help me out here.

00:21:31.380 --> 00:21:33.980
On the far right, this is pretty easy to understand.

00:21:33.980 --> 00:21:35.560
It's just a range of BPM.

00:21:35.560 --> 00:21:41.340
I often, I'm looking for a pretty specific BPM for a bit to Frankenstein in.

00:21:41.340 --> 00:21:48.580
And then below the BPM range, you see like a more human readable version of the filter string

00:21:48.580 --> 00:21:50.540
that this app has produced.

00:21:50.540 --> 00:21:54.420
So, then each column to the left there is a different parameter.

00:21:54.420 --> 00:21:59.920
Far left, I can select which folder I want to select from or not select from.

00:22:00.240 --> 00:22:05.500
So, you've got things like feel, section, masterpiece, mode, melody.

00:22:05.500 --> 00:22:09.860
Some of these you guys would probably recognize, but others are just particular to me.

00:22:09.860 --> 00:22:12.260
But they're different tags I put on my demo.

00:22:12.260 --> 00:22:17.620
Genesis, for example, on the far right, that's how I started writing the song, whether I started

00:22:17.620 --> 00:22:22.480
on a piano or I started with a lyric and then piano or just started with a lyric and so on.

00:22:22.480 --> 00:22:25.280
Because I found that those are useful tags.

00:22:25.280 --> 00:22:29.500
They kind of set the direction of how that little composition is going to go.

00:22:29.500 --> 00:22:34.300
This reminds me of like, like almost like a Moog synthesizer, like those giant patch panels

00:22:34.300 --> 00:22:35.100
you see in studios.

00:22:35.100 --> 00:22:37.060
We're just like, I need to find the perfect sound.

00:22:37.060 --> 00:22:40.220
Let me just unplug this wire, plug it in over here and see what happens.

00:22:40.220 --> 00:22:46.140
And then it's like that, but developing like a query for the right track that you have.

00:22:46.140 --> 00:22:46.740
That's awesome.

00:22:46.740 --> 00:22:47.760
Of your own stuff as well.

00:22:47.760 --> 00:22:50.820
And intensely personal because you built it exactly to your needs.

00:22:50.820 --> 00:22:51.460
So, very neat.

00:22:51.560 --> 00:22:51.680
Yeah.

00:22:51.680 --> 00:22:55.540
And it's quite easy to add or remove parameters.

00:22:55.540 --> 00:22:59.420
There's a file in this package called sections.

00:22:59.420 --> 00:23:02.260
And each section is one of these columns.

00:23:02.260 --> 00:23:03.840
So, it's basically just a dictionary.

00:23:03.840 --> 00:23:05.240
That is so cool.

00:23:05.240 --> 00:23:06.220
Works perfectly fine.

00:23:06.220 --> 00:23:06.420
Yeah.

00:23:06.420 --> 00:23:07.120
Excellent.

00:23:07.120 --> 00:23:08.640
I love that there's a feel there.

00:23:08.640 --> 00:23:11.040
It's like, I would add fiddly to it.

00:23:11.040 --> 00:23:12.820
That's the thing I've ever tried to do.

00:23:12.820 --> 00:23:13.960
That's how it always feels.

00:23:14.440 --> 00:23:17.160
I think you had the poetry guy on the podcast.

00:23:17.160 --> 00:23:21.340
So, I've just tried to start converting a bunch of these to real packages.

00:23:21.340 --> 00:23:23.620
And then I could put them up on GitHub.

00:23:23.620 --> 00:23:28.700
So, other MP3 tag users could download this and use it themselves.

00:23:28.700 --> 00:23:29.460
Oh, yeah.

00:23:29.460 --> 00:23:30.180
That'd be really neat.

00:23:30.180 --> 00:23:32.660
And maybe they can add some extra features and stuff as well.

00:23:32.660 --> 00:23:33.020
Yeah.

00:23:33.020 --> 00:23:33.380
Yeah.

00:23:33.380 --> 00:23:34.060
I love this.

00:23:34.060 --> 00:23:35.740
I love how you brought all this stuff together.

00:23:35.740 --> 00:23:40.320
And it's just, it's so exactly what you need to make your life better.

00:23:40.320 --> 00:23:43.800
And like you said, you had thousands of these demos.

00:23:43.800 --> 00:23:45.340
And these pieces you wanted to bring together.

00:23:45.340 --> 00:23:48.040
And it's just such a challenging format to combine.

00:23:48.040 --> 00:23:50.800
And then here's how you just bring it all together, right?

00:23:50.800 --> 00:23:51.140
Yeah.

00:23:51.140 --> 00:23:55.780
So, typically I'll end up with a, it'll return about 10 demos that are, you know,

00:23:55.780 --> 00:23:58.260
very likely to work for what I'm looking for.

00:23:58.260 --> 00:23:59.840
And then I just pick my favorite one.

00:23:59.840 --> 00:24:00.120
Yeah.

00:24:00.120 --> 00:24:00.520
Fantastic.

00:24:00.520 --> 00:24:05.260
Can you share any of the songs that maybe you sort of inspired to, you created through this thing?

00:24:05.260 --> 00:24:07.920
Well, probably not anything you guys would know.

00:24:07.920 --> 00:24:11.120
Because this is only, I've only been using this the last few years.

00:24:11.120 --> 00:24:16.300
And sadly, none of those songs have become massively well known.

00:24:16.820 --> 00:24:23.580
So, like, if you go back to the old Weezer classics, I was cutting and pacing, but I didn't have 1500 demos back then.

00:24:23.580 --> 00:24:26.780
It was just, you know, I had a cassette tape I could look through.

00:24:26.780 --> 00:24:27.280
Awesome.

00:24:27.280 --> 00:24:30.860
At the live stream, Zachary the Hacker, a nice username there.

00:24:30.860 --> 00:24:35.460
So, if I use this and it made us and came up with a search and it didn't return a sound,

00:24:35.460 --> 00:24:40.300
I couldn't help but to see that as a challenge to myself to come up with a sound that matched that query.

00:24:40.300 --> 00:24:41.280
That's a great idea.

00:24:42.980 --> 00:24:46.260
Put in random things and see what comes up and then fill those searches.

00:24:46.260 --> 00:24:52.280
If I could just note, one of the things I think is very kind of really cool about your approach here, Rivers,

00:24:52.280 --> 00:24:58.260
particularly in a small tool approach, is you didn't then sit down and write yourself a replacement MP3 file player or what have you.

00:24:58.260 --> 00:25:01.140
You're quite happy with the tool you had, but once you have the filter query,

00:25:01.140 --> 00:25:03.700
you're quite happy with the existing tool to find them and play them and so forth.

00:25:03.700 --> 00:25:06.140
So, you just wrote yourself a filter maker, basically.

00:25:06.260 --> 00:25:12.860
There can be a strong temptation, or at least I would be tempted to go too far and then throw in file playing and media playback and so forth.

00:25:12.860 --> 00:25:13.840
You don't need any of that.

00:25:13.840 --> 00:25:14.860
You've got a tool for that.

00:25:14.860 --> 00:25:16.260
You just need something to make you a filter.

00:25:16.260 --> 00:25:16.820
Yeah.

00:25:16.820 --> 00:25:17.300
Yeah.

00:25:17.300 --> 00:25:17.980
Good point.

00:25:17.980 --> 00:25:18.240
Yeah.

00:25:18.240 --> 00:25:22.760
I was talking to Matthew Rocklin from Dask and Coiled a little while ago,

00:25:22.760 --> 00:25:26.220
and he said that they have this interesting philosophy.

00:25:26.220 --> 00:25:28.800
I'll probably misquote it just a little bit,

00:25:28.800 --> 00:25:32.260
but something of the principle of minimum or minimal innovation.

00:25:33.260 --> 00:25:35.600
What is the least thing we can introduce,

00:25:35.600 --> 00:25:39.980
and what other pieces could we combine that everyone is already using and knowing about?

00:25:39.980 --> 00:25:41.980
And yeah, I think this sort of matches that.

00:25:41.980 --> 00:25:47.660
Oh, so I should add that one of the packages I used then is called PyWinAuto.

00:25:47.660 --> 00:25:49.900
So, when I start Demolisher,

00:25:49.900 --> 00:25:55.000
the first thing it does is PyWinAuto opens up the MP3 tag Windows app,

00:25:55.000 --> 00:25:58.140
and then when I'm done with creating the filter,

00:25:58.140 --> 00:26:03.800
PyWinAuto copies and pastes it into the filter bar on MP3 tag.

00:26:03.800 --> 00:26:04.580
Oh, how cool.

00:26:04.580 --> 00:26:05.220
Yeah.

00:26:05.220 --> 00:26:09.420
So, basically, the use case is you import the application from it.

00:26:09.420 --> 00:26:12.700
You can tell it to start some EXE on Windows,

00:26:12.700 --> 00:26:15.940
and then just tell it to start typing keys into it.

00:26:15.940 --> 00:26:16.180
Yeah.

00:26:16.180 --> 00:26:17.040
That's awesome.

00:26:17.040 --> 00:26:17.780
It's very cool.

00:26:17.800 --> 00:26:18.740
It's a really cool way to combine it.

00:26:18.740 --> 00:26:18.940
Yeah.

00:26:18.940 --> 00:26:19.520
Yeah.

00:26:19.520 --> 00:26:20.200
Fantastic.

00:26:20.200 --> 00:26:22.060
If I can just maybe make a note,

00:26:22.060 --> 00:26:23.560
you've reminded me about PyWinAuto,

00:26:23.560 --> 00:26:28.640
and I'd forgotten about an episode from my career of 10 years plus ago.

00:26:28.640 --> 00:26:31.760
PyWinAuto is also very useful if anybody's looking for,

00:26:31.760 --> 00:26:33.600
well, exactly what it does, Windows automation.

00:26:33.600 --> 00:26:38.180
What the kind of thing I'm thinking of is that more than once in my previous work,

00:26:38.180 --> 00:26:42.400
we got tools custom made by the supplier, a particular vendor,

00:26:42.400 --> 00:26:44.820
you know, that somebody was asked to knock together in a day.

00:26:44.980 --> 00:26:46.440
So, it was terrible to use.

00:26:46.440 --> 00:26:48.340
You had to click 50 buttons to get what you wanted.

00:26:48.340 --> 00:26:49.660
It didn't remember any settings.

00:26:49.660 --> 00:26:51.940
Every time you fired it up, you had to click all the boxes again

00:26:51.940 --> 00:26:53.860
for exactly what you need for your output.

00:26:53.860 --> 00:26:57.620
And it also means in factory work, you want it as automated as possible.

00:26:57.620 --> 00:27:01.000
You want this all to be running as part of a bigger stream of work.

00:27:01.000 --> 00:27:04.220
And you can't really say, well, do all these automated tasks,

00:27:04.220 --> 00:27:06.460
then send somebody to the computer, take this piece of paper,

00:27:06.460 --> 00:27:09.940
click these five or 15 sections, and then take the resulting file.

00:27:09.940 --> 00:27:12.360
And PyWinAuto was fantastic for that kind of thing,

00:27:12.420 --> 00:27:16.500
because I actually wrote some Python, basically remembered what the tool should be set to do,

00:27:16.500 --> 00:27:20.460
fires the tool up, makes those settings, runs it, and grabs the resulting file.

00:27:20.460 --> 00:27:23.420
Yeah, that's super neat because if you want to automate something on the web,

00:27:23.420 --> 00:27:24.700
you could use something like Selenium.

00:27:24.700 --> 00:27:28.960
But if you want to automate like a custom VV6 app that somebody wrote 20 years ago,

00:27:28.960 --> 00:27:29.820
there's no API for that.

00:27:29.820 --> 00:27:30.580
Well, exactly, yeah.

00:27:30.580 --> 00:27:32.840
And when you open these tools up, there's things like, you know,

00:27:32.840 --> 00:27:36.580
you need to tick a box 27 and, you know, drop down two.

00:27:36.820 --> 00:27:40.120
It's not, it's not, they haven't been designed to be particularly well-written,

00:27:40.120 --> 00:27:41.840
but the PyWinAuto doesn't care.

00:27:41.840 --> 00:27:45.000
I mean, it's happy enough to use dodgy variable names and so forth.

00:27:45.000 --> 00:27:45.180
Yeah.

00:27:45.180 --> 00:27:46.460
Yeah, for sure.

00:27:46.460 --> 00:27:53.020
I think there's a lot of folks that get their Python start doing little like computer automation

00:27:53.020 --> 00:27:54.120
bits like that.

00:27:54.220 --> 00:27:59.940
So I think having those tools, like one, like you said, starting out, it's never going to be perfect.

00:27:59.940 --> 00:28:05.140
I mean, I think probably the hardest part is when you show people code you've written and they go,

00:28:05.140 --> 00:28:05.960
that's not Pythonic.

00:28:05.960 --> 00:28:10.740
Well, for stuff like this, it's probably not going to be because you're not working in Python.

00:28:10.740 --> 00:28:12.960
You're just using Python to work in something else.

00:28:12.960 --> 00:28:18.140
And it allows people to make messy code and just figure it out and hack at it.

00:28:18.140 --> 00:28:23.080
And then over time, you just get better at hacking at it until your code does start to look more Pythonic.

00:28:23.300 --> 00:28:23.660
Exactly.

00:28:23.660 --> 00:28:24.060
Yeah.

00:28:24.060 --> 00:28:25.160
On one hand, you have Pythonic.

00:28:25.160 --> 00:28:27.880
On the other hand, I pressed a button and it happened automatically.

00:28:27.880 --> 00:28:29.300
So I win.

00:28:29.300 --> 00:28:34.060
The toughest parts about getting people to understand how to get into Python is you don't really know

00:28:34.060 --> 00:28:38.320
the little tasks that you can do that you can solve with it until you get in and you can do a few things.

00:28:38.320 --> 00:28:40.780
So little things like that open the door for you.

00:28:40.780 --> 00:28:41.040
Yeah.

00:28:41.040 --> 00:28:41.320
Yeah.

00:28:41.320 --> 00:28:43.780
It's like a comment on LiveShane Brian says,

00:28:43.780 --> 00:28:44.780
Never heard of PyWinAuto.

00:28:44.780 --> 00:28:48.320
This has just opened a lot of quasi-RPA doors for me.

00:28:48.320 --> 00:28:48.680
Indeed.

00:28:48.680 --> 00:28:49.420
Fantastic.

00:28:49.420 --> 00:28:49.820
All right.

00:28:49.820 --> 00:28:52.240
So I wanted to talk about one as well.

00:28:52.320 --> 00:28:54.220
So I'm going to throw out this one that I have to do.

00:28:54.220 --> 00:28:58.680
So over on the course website, we have literally thousands of videos.

00:28:58.680 --> 00:29:00.360
And these are MP4s.

00:29:00.360 --> 00:29:05.180
There's a whole bunch of really cool automation about like geo distributed in them and all sorts

00:29:05.180 --> 00:29:10.720
of stuff that I wrote during a break at my hotel at PyCon one year when I got hired.

00:29:10.720 --> 00:29:12.440
I needed just a break from humanity.

00:29:12.440 --> 00:29:20.080
But the thing I wanted to highlight is I end up with a folder full of folders full of hundreds of MP4s.

00:29:20.080 --> 00:29:23.500
And I need to come up with some way to import those into the database.

00:29:23.880 --> 00:29:27.800
And I was going through figuring out how long is this video.

00:29:27.800 --> 00:29:29.060
I'd go in my Mac finder.

00:29:29.060 --> 00:29:30.920
I said, all right, it's three minutes and 20 seconds.

00:29:30.920 --> 00:29:31.800
So what is that?

00:29:31.800 --> 00:29:33.320
That's 200 seconds.

00:29:33.320 --> 00:29:34.700
And I would put that into the database.

00:29:34.700 --> 00:29:35.820
And the file name is this.

00:29:35.820 --> 00:29:37.060
And then I would do it again and again.

00:29:37.060 --> 00:29:41.580
And after a couple of those and a couple of mistakes and similar stuff with the podcast,

00:29:41.580 --> 00:29:42.860
I would just go crazy.

00:29:42.860 --> 00:29:43.960
I'm like, I can't take this.

00:29:43.960 --> 00:29:46.480
Maybe I have to hire somebody because I make too many mistakes.

00:29:46.480 --> 00:29:51.380
And it's not useful for me to spend so much time converting minutes and seconds to seconds

00:29:51.380 --> 00:29:52.440
and trying to do this.

00:29:52.440 --> 00:29:55.260
So what I ended up doing is writing a little script that I just go to a directory.

00:29:55.260 --> 00:29:57.140
I JSONify the videos.

00:29:57.140 --> 00:29:59.920
I get a giant JSON document that I can just import into MongoDB.

00:29:59.920 --> 00:30:00.720
And boom.

00:30:00.720 --> 00:30:01.960
And it goes through and it finds.

00:30:01.960 --> 00:30:04.020
It does two things that are really fun.

00:30:04.020 --> 00:30:08.540
One is it goes through and it uses a little bit like what Rivers was talking about.

00:30:08.540 --> 00:30:09.660
It uses FF probe.

00:30:09.660 --> 00:30:10.460
Not the same thing.

00:30:10.460 --> 00:30:16.060
But it goes in and figures out information about the audio stream or the video stream.

00:30:16.240 --> 00:30:18.260
And it'll give me back the time and information.

00:30:18.260 --> 00:30:21.240
And the way it works is I'm not using some API for this.

00:30:21.240 --> 00:30:22.780
I'm actually using subprocess.

00:30:22.780 --> 00:30:25.660
And then there's an output format for JSON.

00:30:25.660 --> 00:30:29.320
And I just capture the standard out and then read it into a Python dictionary.

00:30:29.320 --> 00:30:30.320
And then boom.

00:30:30.320 --> 00:30:31.160
I have all that information.

00:30:31.160 --> 00:30:33.840
It's as if FFmpeg had an API for Python.

00:30:33.840 --> 00:30:35.160
So that's really fun.

00:30:35.160 --> 00:30:37.760
And then I want to not bother to scroll back and copy it.

00:30:37.760 --> 00:30:39.040
So I use hyperclip.

00:30:39.040 --> 00:30:41.340
I was wondering how you're going to say that.

00:30:41.340 --> 00:30:44.100
I've used a lot and I've never known quite how to pronounce it.

00:30:44.860 --> 00:30:49.600
And so then I just I generate this huge thing, this composition of all these video files.

00:30:49.600 --> 00:30:52.440
And then I just use hyperclip to copy it to the clipboard.

00:30:52.440 --> 00:30:57.920
And then I just paste it in to the tool that is editing the JSON and like does all the importing

00:30:57.920 --> 00:30:58.220
stuff.

00:30:58.220 --> 00:30:58.860
And boom.

00:30:58.860 --> 00:30:59.420
Off it goes.

00:30:59.420 --> 00:31:01.120
So real simple.

00:31:01.120 --> 00:31:03.620
But this thing was like it's no big deal to say.

00:31:03.620 --> 00:31:07.860
I just want to sort of get the right file name relative to each another and get the time

00:31:07.860 --> 00:31:08.420
and convert it.

00:31:08.760 --> 00:31:10.840
But boy, did it save me a lot of frustration.

00:31:10.840 --> 00:31:13.640
So I want to recommend those two things, especially hyperclip.

00:31:13.640 --> 00:31:14.600
That's a cool one.

00:31:14.600 --> 00:31:14.820
Yeah.

00:31:14.820 --> 00:31:15.860
Hyperclip is very nifty.

00:31:15.860 --> 00:31:19.720
The other thing I would just pick up from what you said there, Michael, is the point that

00:31:19.720 --> 00:31:22.020
you don't have to use Python to solve all the problems.

00:31:22.020 --> 00:31:25.620
If Fprobe exists, it's perfectly good at getting you the data you want.

00:31:25.620 --> 00:31:27.860
Subprocess is a perfectly reasonable way.

00:31:27.860 --> 00:31:30.760
Let the expert tool get you to do the difficult thing.

00:31:30.760 --> 00:31:33.920
If Fprobe is already on your system, it knows how to get you the data you want.

00:31:33.920 --> 00:31:35.620
It can get you the data in a format you can use.

00:31:35.680 --> 00:31:36.780
Just use it to do it.

00:31:36.780 --> 00:31:38.660
You don't have to write Python to do everything.

00:31:38.660 --> 00:31:39.480
It's perfectly.

00:31:39.480 --> 00:31:43.060
There's lots of very useful tools out there that are literally using Python to glue three

00:31:43.060 --> 00:31:44.440
other tools together.

00:31:44.440 --> 00:31:45.360
And that's fine.

00:31:45.360 --> 00:31:46.380
And that works perfectly.

00:31:46.380 --> 00:31:47.200
It works great.

00:31:47.200 --> 00:31:51.900
I'm sure you see this a lot in your world where there's a lot of sort of stuff that is

00:31:51.900 --> 00:31:55.320
more like desktop apps or CLI apps meant to automate things.

00:31:55.320 --> 00:31:59.020
But maybe there's not a programming API for Python to it.

00:31:59.020 --> 00:31:59.980
It's often that kind of thing.

00:31:59.980 --> 00:32:00.160
Yeah.

00:32:00.160 --> 00:32:00.520
Yeah.

00:32:00.520 --> 00:32:00.940
Yeah.

00:32:00.940 --> 00:32:01.580
Fantastic.

00:32:01.580 --> 00:32:02.300
All right.

00:32:02.300 --> 00:32:04.980
I think we've looped around our group here.

00:32:04.980 --> 00:32:05.620
So Rusty.

00:32:05.620 --> 00:32:07.360
Want to pick it up on the next thing you wanted to share?

00:32:07.360 --> 00:32:07.640
Yeah.

00:32:07.640 --> 00:32:11.980
So the next thing I needed to do at work was that I was going to automate was we have to

00:32:11.980 --> 00:32:12.740
do state reporting.

00:32:12.740 --> 00:32:15.020
And it's this big year long thing.

00:32:15.020 --> 00:32:18.300
And it's basically what's caused my position to pop up all over the state.

00:32:18.300 --> 00:32:22.200
So it's to keep giving the state information about our students and what's going on all the

00:32:22.200 --> 00:32:22.460
time.

00:32:22.460 --> 00:32:24.980
And it was a horrible process that they decided to automate.

00:32:24.980 --> 00:32:27.520
It used to be people filling out papers and sending it in.

00:32:27.520 --> 00:32:30.740
And then all of a sudden it just became this computer thing.

00:32:30.740 --> 00:32:35.340
And then computer people had to do it, but it really wasn't their area of expertise before.

00:32:35.340 --> 00:32:40.720
So we have to send our files in, CSV files in, and then they get checked and we get errors

00:32:40.720 --> 00:32:41.020
back.

00:32:41.020 --> 00:32:42.460
Then we have to fix that and do whatever.

00:32:42.460 --> 00:32:44.640
So we're given an automated way to do it.

00:32:44.720 --> 00:32:48.420
So if we can get the files there overnight, we get a time slot and then we get everything

00:32:48.420 --> 00:32:48.920
back.

00:32:48.920 --> 00:32:50.840
But eventually these errors creep in.

00:32:50.840 --> 00:32:54.980
It's a flawed system and they know it's flawed, but since it's a government agency, there's

00:32:54.980 --> 00:32:57.880
like nothing that could be done about it for multiple years or whatever.

00:32:57.880 --> 00:33:00.940
So we're looking something different to kind of combat that.

00:33:00.940 --> 00:33:04.840
Basically, I would get back errors every day and then I would have to go and hunt them down.

00:33:04.840 --> 00:33:06.060
They wouldn't actually be errors.

00:33:06.060 --> 00:33:06.880
It'd be false errors.

00:33:06.880 --> 00:33:07.220
Oh man.

00:33:07.220 --> 00:33:12.380
So what you have to do is upload three sets of blanks and then boom, then you can start over

00:33:12.380 --> 00:33:14.760
and now your files are clean and it can work.

00:33:14.760 --> 00:33:18.120
So what I just did was, I was like, well, we only have the one automated spot.

00:33:18.120 --> 00:33:24.400
So I whipped up a little program in Selenium that goes in and submits my blanks every night

00:33:24.400 --> 00:33:25.940
at nine o'clock at night.

00:33:25.940 --> 00:33:28.880
So I'm always working off of the clean files.

00:33:28.880 --> 00:33:31.460
And it's something I would never think of to do, but I could do.

00:33:31.460 --> 00:33:32.780
It's a bit like Kim's project.

00:33:32.780 --> 00:33:36.080
You know, I could have done that, take five minutes at the end of every night and submitted

00:33:36.080 --> 00:33:39.080
my blanks and then let everything else happen afterwards.

00:33:39.080 --> 00:33:41.420
But it just seemed really easy for me to go ahead.

00:33:41.420 --> 00:33:45.860
It was a, it was a great puzzle to find out, you know, how to navigate around inside Selenium,

00:33:45.860 --> 00:33:48.460
inside this older looking website.

00:33:48.460 --> 00:33:51.820
But it was a, it was a great solution for me and I don't really get the errors anymore.

00:33:51.820 --> 00:33:57.560
And because we can address things, you know, that day, it's really improved my job tremendously.

00:33:57.560 --> 00:34:02.580
So I'd say it takes, I would say it saves me hours a week just being able to have this

00:34:02.580 --> 00:34:03.720
little tool automated.

00:34:03.720 --> 00:34:06.600
That's fantastic to just like reset the errors.

00:34:06.600 --> 00:34:06.900
Yep.

00:34:08.420 --> 00:34:11.480
Talk Python To Me is partially supported by our training courses.

00:34:11.480 --> 00:34:16.260
Do you want to learn Python, but you can't bear to subscribe to yet another service?

00:34:16.260 --> 00:34:19.500
At Talk Python training, we hate subscriptions too.

00:34:19.500 --> 00:34:24.400
That's why our course bundle gives you full access to the entire library of courses for one

00:34:24.400 --> 00:34:25.060
fair price.

00:34:25.060 --> 00:34:26.180
That's right.

00:34:26.180 --> 00:34:30.940
With the course bundle, you save 70% off the full price of our courses and you own them

00:34:30.940 --> 00:34:32.140
all forever.

00:34:32.520 --> 00:34:36.820
That includes courses published at the time of the purchase, as well as courses released

00:34:36.820 --> 00:34:38.240
within about a year of the bundle.

00:34:38.240 --> 00:34:43.720
So stop subscribing and start learning at talkpython.fm/everything.

00:34:44.800 --> 00:34:49.700
So I would say Selenium is the PyWin auto, but for the web, right?

00:34:49.700 --> 00:34:53.380
The equivalent of that is such an amazing tool for that kind of automation.

00:34:53.380 --> 00:34:53.740
Yeah.

00:34:53.740 --> 00:34:58.000
Because we've got things like Beautiful Soup and we've got requests and Scrapey and stuff,

00:34:58.000 --> 00:35:04.180
but they don't so easily just go, let me go over here, log in, you know, enter my username

00:35:04.180 --> 00:35:08.680
and password here, click the button called login, then go to this page and then do that thing.

00:35:08.680 --> 00:35:09.780
It's amazing, right?

00:35:09.780 --> 00:35:11.660
I think that's definitely one of the secrets.

00:35:11.660 --> 00:35:14.480
Select these 10 files and yeah, it's really good.

00:35:14.480 --> 00:35:19.200
That was one of the reasons why, you know, with my previous one, the dashboards, I had

00:35:19.200 --> 00:35:22.900
to create that web app, that simple web app to like upload stuff.

00:35:22.900 --> 00:35:27.240
Because at first, my first thought was like, well, I'll just go to the website and scrape

00:35:27.240 --> 00:35:28.400
it with like Beautiful Soup.

00:35:28.400 --> 00:35:32.500
But then when you start getting like JavaScript frameworks and things like that, that come into

00:35:32.500 --> 00:35:34.220
play, you're just, you can't get that.

00:35:34.220 --> 00:35:38.060
You're scraping little curly braces that are just where the data would go.

00:35:38.060 --> 00:35:38.280
Yeah.

00:35:38.280 --> 00:35:39.760
I cycle in my spare time.

00:35:39.820 --> 00:35:43.860
So they came out of these Velo Sambos from Adidas, which were like cycling shoes, but

00:35:43.860 --> 00:35:46.860
they look like soccer shoes, which I was like instantly in love with.

00:35:46.860 --> 00:35:50.020
They sold out within seconds every time they put a new batch up.

00:35:50.020 --> 00:35:54.620
So I actually used Selenium and I kind of automated a check every three hours to kind of go in and

00:35:54.620 --> 00:35:56.880
scrape it and send me an email if my size was in.

00:35:56.880 --> 00:35:58.480
And I eventually got them.

00:35:58.540 --> 00:36:01.940
But yeah, so it was a really cool little fun project that I just kind of used everything

00:36:01.940 --> 00:36:04.800
I learned in this to go ahead and make that happen.

00:36:04.800 --> 00:36:05.560
That's awesome.

00:36:05.560 --> 00:36:06.680
You should do that for a PlayStation.

00:36:06.680 --> 00:36:10.100
They build everything out of JavaScript.

00:36:10.100 --> 00:36:11.240
So it's really hard to get.

00:36:11.240 --> 00:36:12.920
So you couldn't do it with Beautiful Soup.

00:36:12.920 --> 00:36:15.080
I had to go in and grab it this way.

00:36:15.080 --> 00:36:15.720
Yeah.

00:36:15.720 --> 00:36:16.120
Yeah.

00:36:16.120 --> 00:36:16.480
Very cool.

00:36:16.480 --> 00:36:21.240
Rivers, did you use Selenium when you were getting that schedule for your, when you were

00:36:21.240 --> 00:36:21.680
scoring?

00:36:21.680 --> 00:36:23.720
I definitely use Selenium a lot.

00:36:23.900 --> 00:36:28.280
I think I use it in the app I'm going to mention next, I think.

00:36:28.280 --> 00:36:29.780
So maybe I'll talk about it then.

00:36:29.780 --> 00:36:30.300
Yeah.

00:36:30.300 --> 00:36:30.560
Yeah.

00:36:30.560 --> 00:36:30.780
Yeah.

00:36:30.780 --> 00:36:31.420
That's awesome.

00:36:31.420 --> 00:36:31.900
Yeah.

00:36:31.900 --> 00:36:36.140
When I was trying to scrape from our agent's web service, I was trying to use Selenium.

00:36:36.140 --> 00:36:37.300
Yeah.

00:36:37.300 --> 00:36:37.540
Yeah.

00:36:37.540 --> 00:36:37.900
Very cool.

00:36:37.900 --> 00:36:40.400
I kind of wanted to just mention one other thing, Michael.

00:36:40.400 --> 00:36:41.580
I had the mic here.

00:36:41.580 --> 00:36:44.100
Just the way that I've been automating things.

00:36:44.100 --> 00:36:49.500
I used a lot of Raspberry Pis in the early days to use Cron jobs to kind of fire these off.

00:36:49.500 --> 00:36:53.000
Because I know that's something that I had trouble figuring out when I wanted to start automating

00:36:53.000 --> 00:36:54.760
things was how to make it happen when you wanted.

00:36:54.760 --> 00:36:59.280
And I had a guy that was a heavy Linux guy who was able to help me figure out, you know,

00:36:59.280 --> 00:37:01.060
kind of how to do that with Cron jobs and things.

00:37:01.060 --> 00:37:06.640
And then I moved on to an app on my Mac called Launch Control that helps create demons and things

00:37:06.640 --> 00:37:08.940
like that, which is really, I found really helpful.

00:37:08.940 --> 00:37:13.140
So those are some great tools to help make these things happen on the time that you want it.

00:37:13.140 --> 00:37:13.340
Yeah.

00:37:13.340 --> 00:37:14.160
That's really neat.

00:37:14.160 --> 00:37:16.400
On my Mac, I install stuff with Homebrew.

00:37:16.400 --> 00:37:19.180
And a lot of times you can install it as a service as well.

00:37:19.240 --> 00:37:23.040
And it behind the scenes will basically run the launch control stuff, install something like

00:37:23.040 --> 00:37:27.280
MongoDB or something on your Mac, which gives you slightly simpler commands to do it.

00:37:27.280 --> 00:37:29.480
But it's got to be like lined up just like that.

00:37:29.480 --> 00:37:29.840
That's cool.

00:37:29.840 --> 00:37:31.140
Yeah, that is actually quite handy.

00:37:31.140 --> 00:37:35.200
The other thing that is maybe worth looking at if you wanted to do that kind of automation

00:37:35.200 --> 00:37:39.440
for stuff that's not just on your own machine, the GitHub Actions, which I'm not particularly

00:37:39.440 --> 00:37:45.140
familiar with, or GitLab itself has got some very powerful, effectively free to use until

00:37:45.140 --> 00:37:47.460
you get quite heavily involved CI.

00:37:47.460 --> 00:37:49.240
And I've forgotten what CI stands for right now.

00:37:49.240 --> 00:37:51.060
Continuous integration, that's the word.

00:37:51.060 --> 00:37:52.420
But really, it's just automation.

00:37:52.420 --> 00:37:54.120
At a particular time, do this thing.

00:37:54.120 --> 00:37:55.700
That can be quite powerful.

00:37:55.700 --> 00:37:59.180
I really want to try and figure this out because what I want to do is I put everything on GitHub

00:37:59.180 --> 00:38:04.000
and then I just, you know, get up, pull it on the remote computer that's actually, that's

00:38:04.000 --> 00:38:04.720
on all the time.

00:38:04.720 --> 00:38:08.280
But I want to be able to figure out how to make it update when I, you know, when I push,

00:38:08.280 --> 00:38:09.800
just make it auto updates.

00:38:09.800 --> 00:38:11.000
That should be fairly doable.

00:38:11.000 --> 00:38:12.020
That's what everybody says.

00:38:12.020 --> 00:38:17.180
Again, my GitHub Action experience is not great, but certainly if you can do it on GitLab,

00:38:17.180 --> 00:38:18.100
I'm sure you can do it.

00:38:18.100 --> 00:38:18.660
Yeah, I've heard.

00:38:18.660 --> 00:38:20.940
The CI tools are all geared around this kind of thing.

00:38:20.940 --> 00:38:22.100
I've heard whispers, but I'm looking for it.

00:38:22.100 --> 00:38:23.400
Something's changed in the code chat.

00:38:23.400 --> 00:38:24.200
Do something.

00:38:24.600 --> 00:38:29.360
Let's chat, Rusty, because my topic is actually designed for GitHub Action.

00:38:29.360 --> 00:38:29.920
Wow, fantastic.

00:38:29.920 --> 00:38:33.240
I'm glad I shaved today.

00:38:33.240 --> 00:38:34.160
Yeah, yeah.

00:38:34.160 --> 00:38:40.500
Yeah, I mean, if I can put my DevOps hat on, that CI kind of stuff is bread and butter for

00:38:40.500 --> 00:38:40.860
us.

00:38:40.860 --> 00:38:45.160
It makes a heck of a difference because it means when the developers make changes to their

00:38:45.160 --> 00:38:48.980
code, they don't have to know how to go about and deploy things or build things and so forth.

00:38:48.980 --> 00:38:49.780
It just happens.

00:38:49.780 --> 00:38:51.220
It basically happens for them.

00:38:51.220 --> 00:38:51.980
That's fantastic.

00:38:51.980 --> 00:38:56.300
I also set up an automation, so if I git pushed to a certain branch, I'll just automatically

00:38:56.300 --> 00:39:01.580
do a zero downtime redeploy of the Talk Python training infrastructure and stuff like that,

00:39:01.580 --> 00:39:02.640
which is so fantastic.

00:39:02.640 --> 00:39:05.060
Rivers, you mentioned Source Control before.

00:39:05.060 --> 00:39:08.040
You guys are using GitHub for your kind of stuff.

00:39:08.040 --> 00:39:11.080
Is there Source Control plus music going on here?

00:39:11.080 --> 00:39:15.160
That's one of my many weaknesses because I'm usually just working on my own.

00:39:15.160 --> 00:39:18.540
I haven't had much use for that sort of collaboration tool.

00:39:18.740 --> 00:39:22.580
I do have my own website, so it does go through GitHub.

00:39:22.580 --> 00:39:24.660
I've recently started volunteering.

00:39:24.660 --> 00:39:28.780
I'm like a volunteer coder with this other group of people.

00:39:28.780 --> 00:39:35.180
And I'm going to have to learn a lot more of this, of these Git tools, push, pull, all

00:39:35.180 --> 00:39:35.420
that.

00:39:35.420 --> 00:39:38.540
Once you have a need for it, I think it's easier to learn.

00:39:38.540 --> 00:39:41.080
You know, until then, it's all just something you hear about.

00:39:41.080 --> 00:39:42.620
But then it's like, oh, now I need this.

00:39:42.620 --> 00:39:44.360
Now I can dig in and figure it out.

00:39:44.520 --> 00:39:49.060
Yeah, if I could basically make one suggestion, if you are currently making changes to your

00:39:49.060 --> 00:39:54.280
software by making final final.version.2 kind of files on your hard drive, look into version

00:39:54.280 --> 00:39:54.600
control.

00:39:54.600 --> 00:39:57.280
It doesn't have to be Git, but Git is effectively one in this argument.

00:39:57.280 --> 00:40:00.120
It really is by far the most well-used one.

00:40:00.120 --> 00:40:04.680
Even if you never collaborate with it, just the ability to use a version control system to

00:40:04.680 --> 00:40:09.440
basically see what your code looked like yesterday or when you made the last, the change you made

00:40:09.440 --> 00:40:12.420
three changes ago, compare them to each other, those kinds of things.

00:40:12.420 --> 00:40:16.700
Until you have that capacity, you don't really kind of think about how you thought it would

00:40:16.700 --> 00:40:16.880
be.

00:40:16.880 --> 00:40:21.260
Once you're able to do it, you cannot really imagine not being able to do it.

00:40:21.260 --> 00:40:27.820
You're saying even if I'm not collaborating with anyone, it's still very useful to involve

00:40:27.820 --> 00:40:28.040
Git.

00:40:28.040 --> 00:40:28.160
Yeah.

00:40:28.160 --> 00:40:33.680
I think I've probably collaborated in my personal projects once with someone, but I wouldn't dream

00:40:33.680 --> 00:40:37.960
of not using something like Git for anything I've ever written just because I know I'm not

00:40:37.960 --> 00:40:42.900
going to remember, I'll have this vague memory that a week ago I made some change that actually

00:40:42.900 --> 00:40:44.140
would be useful to have back now.

00:40:44.140 --> 00:40:45.720
And Git's got that kind of history.

00:40:45.720 --> 00:40:49.540
It'll show me that a week ago I made a push that said, you know, tweaks the Prognob Decator

00:40:49.540 --> 00:40:50.520
knob or something like that.

00:40:50.520 --> 00:40:54.020
And I'll go and look at that and do a comparison against what I've got now.

00:40:54.020 --> 00:40:54.360
Yeah.

00:40:54.360 --> 00:40:55.020
That sounds great.

00:40:55.020 --> 00:41:00.380
I've been using the poor man's version control, which is my Dropbox history.

00:41:00.380 --> 00:41:04.220
I just refer to like the state of the folder three months ago.

00:41:04.220 --> 00:41:05.420
Yeah.

00:41:05.420 --> 00:41:05.860
Yeah.

00:41:05.860 --> 00:41:06.540
That is super handy.

00:41:06.660 --> 00:41:10.680
But like just the ability to see, like, I want to see how it was two weeks ago when

00:41:10.680 --> 00:41:11.700
it worked like I expected.

00:41:11.700 --> 00:41:12.720
And now it doesn't anymore.

00:41:12.720 --> 00:41:14.300
Tell me, why did I break it?

00:41:14.300 --> 00:41:14.840
What did I do?

00:41:14.840 --> 00:41:15.500
Right.

00:41:15.500 --> 00:41:18.160
And then you don't make it public, right?

00:41:18.160 --> 00:41:19.880
No, no, definitely not.

00:41:19.880 --> 00:41:21.400
No, no, definitely not.

00:41:21.400 --> 00:41:21.580
Yeah.

00:41:21.580 --> 00:41:22.060
Yeah.

00:41:22.060 --> 00:41:24.540
I feel like we all have been there with Zach the hacker.

00:41:24.540 --> 00:41:28.100
Like once you've accidentally lost eight hours worth of work because of misunderstanding

00:41:28.100 --> 00:41:30.000
of Git, you probably, that's when you.

00:41:30.000 --> 00:41:30.900
Yes.

00:41:30.900 --> 00:41:35.420
I've given talks on the data I've lost from bad Git commands.

00:41:35.420 --> 00:41:38.720
Or because you didn't commit something and you really, really wish you did.

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

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

00:41:39.500 --> 00:41:43.820
If we had more time and some beers, I would definitely be able to tell some good horror

00:41:43.820 --> 00:41:44.400
stories to that.

00:41:44.500 --> 00:41:48.420
But I think it's, Kim, you're up next on the sharing, right?

00:41:48.420 --> 00:41:50.580
I just wanted to just finish off that Git discussion.

00:41:50.580 --> 00:41:54.240
Just another, just to comment on what you were saying there, Rivers.

00:41:54.240 --> 00:41:58.980
In terms of making it public, Git itself never necessarily needs to leave your hard drive.

00:41:58.980 --> 00:42:00.980
You could run Git entirely locally if you wanted to.

00:42:00.980 --> 00:42:03.640
And it's still useful as a version control system.

00:42:03.640 --> 00:42:07.140
GitHub is just a publicly accessible Git tool.

00:42:07.140 --> 00:42:08.260
And it's not the only one.

00:42:08.260 --> 00:42:09.480
GitLab exists as well.

00:42:09.860 --> 00:42:11.640
But even there, you don't have to share anything.

00:42:11.640 --> 00:42:14.980
You can do it all privately as long as you're the only person ever seeing it.

00:42:14.980 --> 00:42:15.860
But it's still useful.

00:42:15.860 --> 00:42:16.280
Right.

00:42:16.280 --> 00:42:17.060
Interesting.

00:42:17.060 --> 00:42:17.700
Yeah.

00:42:17.700 --> 00:42:18.600
I'd never do it that way.

00:42:18.600 --> 00:42:18.920
But you're right.

00:42:18.920 --> 00:42:20.980
You could just do Git and just save it there, right?

00:42:20.980 --> 00:42:22.760
It is something you could do if you wanted to.

00:42:22.760 --> 00:42:22.960
Yeah.

00:42:22.960 --> 00:42:23.260
Yeah.

00:42:23.260 --> 00:42:25.620
If it were in Dropbox, it'd be backed up even.

00:42:25.620 --> 00:42:25.820
Yeah.

00:42:25.820 --> 00:42:26.240
Exactly.

00:42:26.240 --> 00:42:31.920
Lots of us are using GitLab and GitHub as offsite backups of our files, not necessarily to

00:42:31.920 --> 00:42:33.340
collaborate with anyone on them.

00:42:33.340 --> 00:42:33.820
Oh, yeah.

00:42:33.820 --> 00:42:34.980
That's absolutely true.

00:42:34.980 --> 00:42:38.880
In my case, we're back to PDFs, actually.

00:42:39.240 --> 00:42:42.800
And manipulating the data in them, although not CSVs this time.

00:42:42.800 --> 00:42:46.480
The second little tool I wanted to talk about was, again, doesn't have a name.

00:42:46.480 --> 00:42:49.220
And in fact, this ties into a previous example.

00:42:49.220 --> 00:42:54.140
This is in my GitLab, but it's one of my private GitLab repos because it involves some kind of

00:42:54.140 --> 00:42:55.500
data that the world doesn't need to see.

00:42:55.500 --> 00:43:02.500
That has basically my wife and several of her colleagues regularly receive large PDF documents.

00:43:02.500 --> 00:43:04.760
She's in the financial services industry.

00:43:04.760 --> 00:43:08.340
That's got 60 to 70 people's account details in them.

00:43:08.420 --> 00:43:10.000
So it's three pages per person.

00:43:10.000 --> 00:43:11.720
So you can get a 200-page document.

00:43:11.720 --> 00:43:16.300
And they then basically need to split those up and send them to each of the individual recipients.

00:43:16.300 --> 00:43:20.880
And similarly to what you were saying earlier, Rusty, you get your CSV data in a PDF.

00:43:20.880 --> 00:43:23.820
It'd be much more convenient if you could get that CSV directly.

00:43:23.820 --> 00:43:27.580
In this case, it'd be much more convenient if you could get 70 people's separate files.

00:43:27.580 --> 00:43:28.660
But that's just not how they come.

00:43:28.660 --> 00:43:32.740
You can't go to the provider generally and say, do something else.

00:43:32.740 --> 00:43:34.060
What you get is what you get.

00:43:34.060 --> 00:43:40.920
And from various cries of anguish from my wife of hours of doing this and it's era-prone and you're opening up a PDF GUI tool,

00:43:40.920 --> 00:43:44.600
selecting the first three pages and saying, save these three as this person's name.

00:43:44.600 --> 00:43:47.860
Then the next three and save these three as this person's name and that kind of thing.

00:43:48.120 --> 00:43:52.960
It was actually surprisingly easy to use some Python to write them a tool to make life a lot easier on their side,

00:43:52.960 --> 00:43:55.120
which effectively opened the PDF.

00:43:55.120 --> 00:43:57.520
And I had a comment on the name of it.

00:43:57.520 --> 00:43:58.240
What did I use?

00:43:58.240 --> 00:44:01.460
PyMoo PDF, which I had never heard of before.

00:44:01.460 --> 00:44:02.440
I see you've got that one.

00:44:02.440 --> 00:44:03.580
I've never heard of that either.

00:44:03.580 --> 00:44:04.240
I don't know.

00:44:04.240 --> 00:44:07.480
In fact, I haven't looked at it since I wrote this thing.

00:44:07.480 --> 00:44:08.540
I'd forgotten what it was called.

00:44:08.540 --> 00:44:09.940
It used to be called FITZ.

00:44:09.940 --> 00:44:18.500
There's something called FITZ, F-I-T-Z, which this has become, which is what was confusing me because FITZ is what's in my poetry history in my PyProject.automal file.

00:44:18.500 --> 00:44:20.400
And this is actually, it's a remarkable project.

00:44:20.400 --> 00:44:23.880
You split up everything in your PDF.

00:44:23.880 --> 00:44:25.780
You can basically access all the text fields.

00:44:25.820 --> 00:44:29.620
And once I'd done that, it was a lot of kind of trial and error.

00:44:29.620 --> 00:44:33.560
I split up each page and printed out all the fields until it looked like the one I wanted.

00:44:33.560 --> 00:44:36.600
And when I had that, now it's just a simple loop that goes through each page.

00:44:36.600 --> 00:44:40.320
And if the page happens to have the details of an account holder on it, then that's a new document.

00:44:40.320 --> 00:44:48.360
Take the ones I've seen before then and save those three pages or four pages as the person's name that I found in the PDF and repeat.

00:44:48.360 --> 00:44:53.620
And within seconds, it's spitting out 70 PDF files with automated names.

00:44:53.620 --> 00:45:00.180
So maybe not the most best way to do it, particularly if you've got, as is common in South Africa, two or three surname, two or three words in your surname.

00:45:00.180 --> 00:45:01.980
It's trying to be smart about it.

00:45:01.980 --> 00:45:05.180
But ultimately, it's easy enough to identify who the file belongs to.

00:45:05.180 --> 00:45:08.340
And that was saving hours and hours of time.

00:45:08.340 --> 00:45:08.700
Yeah.

00:45:08.700 --> 00:45:13.460
And that's really rough error-prone work that you go to this big PDF and break it up.

00:45:13.460 --> 00:45:14.500
PDF's a bad format.

00:45:14.500 --> 00:45:15.580
That's not right.

00:45:15.580 --> 00:45:16.000
Yeah.

00:45:16.000 --> 00:45:21.280
Once you use a tool like PyMoodie, if you break the PDF up, I mean, it's all, it's little bits of text.

00:45:21.280 --> 00:45:24.280
There's a full stock here and there's two commas in separate text fields.

00:45:24.280 --> 00:45:28.420
They look perfectly fine when rendered, but when broken up, they're terrible data format.

00:45:28.420 --> 00:45:40.200
But the beauty is if for work like this, if a tool made it in the first place, it's likely to be consistent enough that you can break it up and expect to find the same data in the same places because it wasn't written by a human in the first place.

00:45:40.200 --> 00:45:40.600
Yeah.

00:45:40.600 --> 00:45:41.160
Yeah.

00:45:41.160 --> 00:45:41.920
That's super neat.

00:45:41.920 --> 00:45:44.960
Another thing you mentioned in the notes is GUI.

00:45:44.960 --> 00:45:46.000
GUI, yes.

00:45:46.000 --> 00:45:47.460
GUI is a beautiful thing.

00:45:47.660 --> 00:45:49.020
I think GUI is really interesting.

00:45:49.020 --> 00:45:52.940
I vaguely recall every now and then on Python Bytes, you brought them up briefly.

00:45:52.940 --> 00:45:56.760
You don't discuss GUIs much, but every now and then you vaguely discuss that.

00:45:56.760 --> 00:45:56.940
Oh, wow.

00:45:56.940 --> 00:45:57.420
Yeah.

00:45:57.420 --> 00:45:59.180
Yes, actually.

00:45:59.180 --> 00:46:01.240
GUI is magnificent.

00:46:01.240 --> 00:46:02.100
They come in waves.

00:46:02.100 --> 00:46:03.080
GUI.

00:46:03.080 --> 00:46:04.760
G-O-O-E-Y.

00:46:04.760 --> 00:46:08.840
As in UiGUI, but it creates a GUI GUI for applications.

00:46:09.180 --> 00:46:14.500
What I really like about GUI is that when I develop things, I'm very much a Linux-based developer these days.

00:46:14.500 --> 00:46:19.000
So I don't really want to be developing a GUI app at all if I can avoid it.

00:46:19.000 --> 00:46:20.980
A command line is perfectly fine for what I want.

00:46:20.980 --> 00:46:25.240
So I wrote this tool as a command line tool and then just basically attached GUI to it.

00:46:25.240 --> 00:46:26.760
And then I think two or three lines of code.

00:46:26.800 --> 00:46:30.820
I think it's really just a GUI decorator on one of my functions.

00:46:30.820 --> 00:46:32.760
It produces on this.

00:46:32.760 --> 00:46:36.120
If you guys are watching it, people on the live stream, you can have this look at GUI.

00:46:36.120 --> 00:46:43.140
It just makes really basic looking GUIs in form layout that pretty much taking every option you could give in the command line.

00:46:43.140 --> 00:46:43.760
Yeah.

00:46:43.760 --> 00:46:51.000
If you wanted to create an app that would come up and show like a UI that would have a little text fields or even drop downs or stuff.

00:46:51.000 --> 00:46:51.380
Exactly.

00:46:51.380 --> 00:46:52.880
It would be the command line arguments.

00:46:52.880 --> 00:46:53.720
Like this is it.

00:46:53.720 --> 00:46:56.160
And then you package it up with I2 installers.

00:46:56.160 --> 00:46:56.400
Is that right?

00:46:56.400 --> 00:46:57.060
That's what I did.

00:46:57.060 --> 00:46:57.300
Yeah.

00:46:57.300 --> 00:46:58.340
Or PI installer, I think.

00:46:58.340 --> 00:46:59.360
PI installer.

00:46:59.360 --> 00:46:59.540
Yeah.

00:46:59.540 --> 00:46:59.720
Yeah.

00:46:59.720 --> 00:46:59.940
Sorry.

00:46:59.940 --> 00:47:02.120
You're thinking PI2.exe perhaps.

00:47:02.120 --> 00:47:04.120
I'm thinking PI2.app.

00:47:04.120 --> 00:47:04.820
You're thinking PI2.app.

00:47:04.820 --> 00:47:04.980
Sure.

00:47:04.980 --> 00:47:08.420
So PI installer is beautiful.

00:47:08.420 --> 00:47:09.940
So with a bit of, I wrote the code.

00:47:09.940 --> 00:47:11.140
I got it working in the command line.

00:47:11.140 --> 00:47:12.080
I was happy with it.

00:47:12.080 --> 00:47:13.200
Attached GUI to it.

00:47:13.200 --> 00:47:15.820
And suddenly I have a GUI, which isn't a Windows only thing.

00:47:15.820 --> 00:47:17.460
It works just fine on a Linux box too.

00:47:17.460 --> 00:47:19.760
And then PI installer to make an exe.

00:47:19.760 --> 00:47:22.280
And I can hand a tool over to somebody else.

00:47:22.280 --> 00:47:23.320
And they need no Python.

00:47:23.320 --> 00:47:25.020
They need no installation expertise.

00:47:25.520 --> 00:47:28.800
I'm certainly not going to be able to explain to people who aren't in the technical industry

00:47:28.800 --> 00:47:32.540
how to open a command prompt on your Windows machine, find where you put this file, and

00:47:32.540 --> 00:47:33.640
then give it command line arguments.

00:47:33.640 --> 00:47:34.500
That's not reasonable.

00:47:34.500 --> 00:47:34.920
Right.

00:47:34.920 --> 00:47:35.580
Oh, yeah.

00:47:35.580 --> 00:47:37.140
And also set up a virtual environment.

00:47:37.140 --> 00:47:38.600
Make sure you have the right version of Python.

00:47:38.600 --> 00:47:39.920
Install the requirements.

00:47:39.920 --> 00:47:41.200
Like, this is not going to fly.

00:47:41.200 --> 00:47:41.480
No.

00:47:41.480 --> 00:47:41.880
Exactly.

00:47:42.060 --> 00:47:43.340
Like, why did you not build me an app?

00:47:43.340 --> 00:47:47.020
Even at the exe distribution level, I mean, you can make an exe that's command line only,

00:47:47.020 --> 00:47:48.340
but no one's going to want to use that.

00:47:48.340 --> 00:47:51.200
Unless, like me, you prefer not to ever use the mouse.

00:47:51.200 --> 00:47:52.760
But most people aren't like me.

00:47:52.760 --> 00:47:55.260
They want a tool that they understand on the screen.

00:47:55.260 --> 00:47:56.500
So GUI is beautiful for that.

00:47:56.500 --> 00:47:56.700
Yeah.

00:47:56.700 --> 00:47:58.160
Yeah, absolutely.

00:47:58.160 --> 00:47:58.840
That's awesome.

00:47:58.840 --> 00:47:59.660
Thanks for sharing that.

00:47:59.740 --> 00:47:59.900
All right.

00:47:59.900 --> 00:48:02.080
A couple of live stream comments I'll throw out here.

00:48:02.080 --> 00:48:02.840
Got one.

00:48:02.840 --> 00:48:06.780
I once worked for almost like three weeks on a project in a company that had commissioned

00:48:06.780 --> 00:48:07.080
me.

00:48:07.080 --> 00:48:08.240
Then the server crashed.

00:48:08.240 --> 00:48:10.300
My backup got fried and I lost everything.

00:48:10.300 --> 00:48:10.540
Yeah.

00:48:10.540 --> 00:48:12.260
So good reason to put stuff.

00:48:12.260 --> 00:48:13.120
Ouch, indeed.

00:48:13.120 --> 00:48:13.940
Yeah, I've been there.

00:48:13.940 --> 00:48:18.320
Good reason to put stuff up on maybe like GitHub private repos or something like that.

00:48:18.320 --> 00:48:19.320
And then also Reginald.

00:48:19.320 --> 00:48:22.460
Davis came here to show love to my guy, Jay.

00:48:22.460 --> 00:48:23.000
Hey, Reginald.

00:48:23.000 --> 00:48:24.260
Thanks for being here with all of us.

00:48:24.260 --> 00:48:25.060
Let's see.

00:48:25.060 --> 00:48:27.280
So now we're on.

00:48:27.280 --> 00:48:28.360
You're up next, Jay.

00:48:28.360 --> 00:48:28.900
Awesome.

00:48:29.200 --> 00:48:35.000
So like most of us have and at some point in our lives, I built my own website.

00:48:35.000 --> 00:48:39.140
I would say I don't think the show isn't going to be sponsored by like Squarespace or anything,

00:48:39.140 --> 00:48:39.600
is it Mike?

00:48:39.600 --> 00:48:42.460
Because I'm going to I'm going to give you the perfect reason.

00:48:42.460 --> 00:48:45.360
I'm perfectly acceptable to let the sponsor.

00:48:45.360 --> 00:48:49.000
So I built my site.

00:48:49.000 --> 00:48:51.060
I made a static site generator.

00:48:51.060 --> 00:48:57.220
And one of the things that my brain is kind of buzzing right now because I actually just launched

00:48:57.220 --> 00:48:59.380
a new podcast on Relay FM called Conduit.

00:48:59.380 --> 00:49:03.100
And like the first episode went live the same time this live stream did.

00:49:03.100 --> 00:49:06.700
So there's like a bunch of stuff happening in my head.

00:49:06.700 --> 00:49:21.400
But I say all of that to mention that when you run your own site and you're doing stuff on like other people's podcasts and other people's sites and things like that, and you're doing it consistently, you always forget to put it on your website.

00:49:21.480 --> 00:49:36.440
So I built a small tool for my little static site generator that uses feed parser to just check the RSS feeds for the shows that I do regularly and then check for certain information.

00:49:36.440 --> 00:49:39.980
If I'm a guest, like if I'm just a regular guest, it'll just check to see if I'm a guest.

00:49:39.980 --> 00:49:45.160
If it's there, then it'll it'll create the blog post for me using the summary for the show.

00:49:45.600 --> 00:49:50.720
So now I do a show every Tuesday I do, you know, conduits going to be biweekly.

00:49:50.720 --> 00:50:00.100
I'm I guest on another show once a month and every once in a while Mike calls me to to get me on here to to I guess share Python tricks and stuff.

00:50:00.100 --> 00:50:09.780
But I can have all of that running and just have a cron job for through GitHub Actions that checks all of these RSS feeds every, you know, six hours or so.

00:50:09.840 --> 00:50:13.600
And it's perfectly free, perfectly within the realm of it.

00:50:13.600 --> 00:50:15.800
And I don't know, it's just one of those things.

00:50:15.800 --> 00:50:28.520
It's like I love the idea of taking RSS, which is an amazing but often forgotten format, and just say, let me parse this data because it has a very defined schema on it.

00:50:28.520 --> 00:50:31.720
And I mean, I love data and I love data that's well defined.

00:50:31.720 --> 00:50:33.300
So that's kind of my tool.

00:50:33.300 --> 00:50:37.940
And feed parser is kind of the thing that that really makes that happen in conjunction with GitHub Action.

00:50:38.060 --> 00:50:39.840
Yeah, feed parser is super neat.

00:50:39.840 --> 00:50:46.140
If you're working with some kind of RSS feed, you could approach it from a like ground up thing.

00:50:46.140 --> 00:50:51.060
I'm going to use requests and I'm going to use elementary and do my XPath queries.

00:50:51.060 --> 00:50:53.600
And you're like, whoa, but it has just this format, right?

00:50:53.600 --> 00:50:59.020
So you could use feed parser and it just turns this into like a dictionary of dictionaries, which is so much nicer.

00:50:59.020 --> 00:50:59.500
Yeah.

00:50:59.500 --> 00:51:01.320
So you don't have to worry about the RSS format.

00:51:01.320 --> 00:51:02.640
Yeah, it's a quick and easy one.

00:51:02.640 --> 00:51:07.020
So it's a nice example of taking a higher level Python library, you know,

00:51:07.020 --> 00:51:11.040
maybe a good place to look would be awesome Python or something like that to go.

00:51:11.040 --> 00:51:13.200
Instead of just saying, I'm going to start from scratch.

00:51:13.200 --> 00:51:15.660
You're like, OK, well, I'm going to go over here and find the audio section.

00:51:15.660 --> 00:51:20.800
And then over here, I want to do like Liberosa for the audio and music analysis.

00:51:20.800 --> 00:51:24.480
And so we're going to go with that and then like see if that's going to solve my problem.

00:51:24.480 --> 00:51:24.760
Right.

00:51:24.760 --> 00:51:26.940
So I'm trying to start with something higher level.

00:51:26.940 --> 00:51:28.600
You know, something I forgot.

00:51:28.600 --> 00:51:31.100
Now, this reminds me that I was going to ask you about.

00:51:31.320 --> 00:51:33.340
Have you done anything with FoxDot?

00:51:33.340 --> 00:51:33.780
No.

00:51:33.780 --> 00:51:45.620
So with FoxDot, basically you can write little tiny Python things and build up like almost like a growing symphony of a type of it's super, super interesting.

00:51:45.880 --> 00:51:51.260
It's like the sort of interactive and not quite IDE, like a REPL for music.

00:51:51.260 --> 00:51:52.600
It's something pretty interesting.

00:51:52.600 --> 00:51:53.620
For making music?

00:51:53.620 --> 00:51:53.920
Yeah.

00:51:53.920 --> 00:51:55.680
For making for like live performance.

00:51:55.680 --> 00:52:05.480
So you write these little tiny Python elements to like change the tempo or bring in like a background drum or like now I want this, this sort of bass guitar to come in and add to it.

00:52:05.480 --> 00:52:07.780
And the performances of it are really, really interesting.

00:52:07.780 --> 00:52:08.560
I'll check it out.

00:52:08.680 --> 00:52:13.640
I think GitHub Universe used this for like their intro this year.

00:52:13.640 --> 00:52:19.920
Like they had a live DJ that was like writing code to make the actual music live.

00:52:19.920 --> 00:52:22.940
It's like so now DJ sets are being controlled via Python.

00:52:22.940 --> 00:52:23.520
I love that.

00:52:23.520 --> 00:52:24.420
It's fantastic.

00:52:24.420 --> 00:52:24.740
Yeah.

00:52:24.740 --> 00:52:25.160
Yeah.

00:52:25.160 --> 00:52:25.520
I love it.

00:52:25.520 --> 00:52:31.400
Just remembering at the end of the 2020 Python ZA conference, which I was attending, was purely online.

00:52:31.400 --> 00:52:40.560
There was a DJ set by two Brazilian chaps whose name I've forgotten I can look up, who were also doing basically programmatically controlled or at least generated music similar to this.

00:52:40.560 --> 00:52:42.240
It's actually quite an interesting idea.

00:52:42.240 --> 00:52:48.020
This is something that kind of builds up over like 10, 15 minutes, but it's really neat if you just want to like have something in the background.

00:52:48.020 --> 00:52:50.460
But the fact that the way they do it is really impressive.

00:52:50.460 --> 00:52:51.000
Yeah.

00:52:51.000 --> 00:52:51.340
Cool.

00:52:51.340 --> 00:52:53.580
Rivers got a quick shout out in the live stream there.

00:52:53.580 --> 00:52:54.160
I love Rivers.

00:52:54.160 --> 00:52:55.100
You're pretty epic.

00:52:55.100 --> 00:52:57.000
The Sarah DM says awesome.

00:52:57.000 --> 00:52:57.880
Definitely.

00:52:57.880 --> 00:52:58.660
We all agree.

00:52:58.660 --> 00:53:00.360
Speaking of Rivers, I think you're next.

00:53:00.360 --> 00:53:03.020
And before we move on, just Jake, congrats on the new podcast.

00:53:03.020 --> 00:53:03.420
That's cool.

00:53:03.420 --> 00:53:04.360
I'm already subscribed.

00:53:04.360 --> 00:53:05.680
All right, Rivers, you're next.

00:53:05.680 --> 00:53:19.380
Michael, hearing you mention Labrosa and FF Probe reminded me that to maintain the tags of all those 1500 demos, I use a fantastic Python package called ID3.

00:53:19.380 --> 00:53:19.940
Oh, yeah.

00:53:19.940 --> 00:53:24.140
Which makes use of FF Probe and Labrosa.

00:53:24.140 --> 00:53:33.520
So, you know, every night my program will run and using ID3, it opens up the tags of all those files and does a ton of maintenance.

00:53:33.520 --> 00:53:42.000
I'll access spreadsheets of my managers and see what comments they've left on these demos or ratings.

00:53:42.480 --> 00:53:42.820
That's awesome.

00:53:42.820 --> 00:53:46.160
And you have automation back over to Google Sheets as well, right?

00:53:46.160 --> 00:53:51.320
I mean, that's how I got into coding in the first place was from spreadsheets, especially Google Sheets.

00:53:51.320 --> 00:53:56.640
Just getting tired of like trying to work those formulas in those little cells.

00:53:56.640 --> 00:53:59.480
I went on, was it Fiverr?

00:53:59.480 --> 00:54:05.780
And had some people code me some scripts to help with the spreadsheets.

00:54:05.860 --> 00:54:07.680
And then I just started looking at the code.

00:54:07.680 --> 00:54:09.060
I was like, well, this is pretty interesting.

00:54:09.060 --> 00:54:11.900
And from there, I just got into it on my own.

00:54:11.900 --> 00:54:12.220
Yeah.

00:54:12.220 --> 00:54:13.760
So, what's the last one you want to share?

00:54:13.760 --> 00:54:15.280
Is that there or you got another one?

00:54:15.280 --> 00:54:21.800
I love to listen to a lot of music, but also I feel like it's part of my job is to just be aware of new ideas.

00:54:21.800 --> 00:54:24.020
And so, I'm just constantly listening to music.

00:54:24.020 --> 00:54:28.340
I feel like I don't need to hear a song more than once or twice and then I kind of get it.

00:54:28.340 --> 00:54:30.800
And then I just want to hear more new music.

00:54:30.800 --> 00:54:32.660
And by new, I mean new to me.

00:54:32.660 --> 00:54:36.340
So, there's tons of old records, classic records I still haven't heard yet.

00:54:36.340 --> 00:54:41.840
So, it's very tedious to go through the Spotify app every day and try to find stuff for myself.

00:54:41.840 --> 00:54:47.540
So, I have an app called New Music that assembles a playlist for me.

00:54:47.540 --> 00:54:54.040
First of all, using Beautiful Soup, it goes to all the online charts so I can get like the,

00:54:54.040 --> 00:54:57.820
whatever the hot songs in the different formats are, gets a few of those.

00:54:58.860 --> 00:55:01.180
And using a package called Spotify.

00:55:01.180 --> 00:55:02.920
Spotify, okay.

00:55:02.920 --> 00:55:03.340
Yeah.

00:55:03.340 --> 00:55:09.840
It accesses the Spotify API and I can access any playlists from there.

00:55:09.840 --> 00:55:16.280
So, I go on to all the editorial playlists like Today's Top Hits or Wrap Caviar, whatever it is.

00:55:16.280 --> 00:55:22.080
But then I can also access any user playlists, playlists my manager shared with me or playlists I've created.

00:55:22.080 --> 00:55:25.280
And I grab a random sample from each of those.

00:55:25.280 --> 00:55:28.600
Some of the parameters are hard-coded in that script.

00:55:28.600 --> 00:55:34.000
But then I also came up with the idea of creating a front end with a Google sheet.

00:55:34.000 --> 00:55:40.200
So, in the Google sheet, I can see one column is all the different playlists I'm drawing from.

00:55:40.200 --> 00:55:43.360
And then another column is how many songs I want to pull from there each day.

00:55:43.360 --> 00:55:48.720
Another column would be like, how long do I have to wait before a song is allowed to come in again?

00:55:48.860 --> 00:55:49.640
That's super cool.

00:55:49.640 --> 00:55:53.020
I love how you've automated this to go basically scrape through that.

00:55:53.020 --> 00:55:56.160
Because, you know, these streaming services, they're great.

00:55:56.160 --> 00:56:02.880
But when you sort of say, you'll play my channel, they really get in a groove of like, here's the 100 songs we've decided you don't skip.

00:56:03.060 --> 00:56:03.220
Yeah.

00:56:03.220 --> 00:56:08.080
I can also control what songs, what artists, and what genres are banned.

00:56:08.080 --> 00:56:12.400
And, you know, with Python, I can create more complex algorithms.

00:56:12.400 --> 00:56:16.500
So, like, I only want to hear hip-hop from before 1996.

00:56:16.500 --> 00:56:18.960
Except for Kanye and Cardi B.

00:56:18.960 --> 00:56:20.100
I'll let those ones through.

00:56:20.100 --> 00:56:21.120
Yeah, yeah.

00:56:21.120 --> 00:56:21.380
Very cool.

00:56:21.380 --> 00:56:22.040
Whatever you want.

00:56:22.040 --> 00:56:24.300
I only go to that same playlist every day.

00:56:24.300 --> 00:56:25.740
It makes my life a little simpler.

00:56:25.740 --> 00:56:26.120
Wow.

00:56:26.120 --> 00:56:26.940
That is so neat.

00:56:26.940 --> 00:56:28.900
And I, you know, I did not plan this.

00:56:28.900 --> 00:56:29.820
I don't know.

00:56:29.920 --> 00:56:32.260
This is just sort of some awesome inception thing.

00:56:32.260 --> 00:56:35.300
So, I pull up the PyPI listing for Spotify.

00:56:35.300 --> 00:56:42.380
And their documentation shows how to get the show list from you, Rivers.

00:56:42.380 --> 00:56:43.700
This feels like a setup.

00:56:43.700 --> 00:56:45.040
This does feel like a setup.

00:56:45.040 --> 00:56:49.920
I have not seen that before.

00:56:49.920 --> 00:56:51.820
I think that's a recent change.

00:56:51.820 --> 00:56:52.520
Yeah, yeah.

00:56:52.520 --> 00:56:53.920
Brian out in the live stream also.

00:56:53.920 --> 00:56:55.420
I noticed that.

00:56:55.420 --> 00:56:55.820
That's awesome.

00:56:55.820 --> 00:56:59.900
And then Zachary the hacker says, Rivers, please tell me this app.

00:56:59.900 --> 00:57:00.460
It's available.

00:57:00.460 --> 00:57:01.720
This sounds amazing.

00:57:01.720 --> 00:57:02.220
I need it.

00:57:02.220 --> 00:57:06.000
Yeah, it was one of the very first apps I tried to publish online.

00:57:06.000 --> 00:57:08.340
And so, it was super janky.

00:57:08.340 --> 00:57:10.740
And I don't think it works at all anymore.

00:57:10.740 --> 00:57:11.860
But yeah, maybe.

00:57:11.860 --> 00:57:16.040
I found that people didn't use it in the way I expected them to.

00:57:16.040 --> 00:57:21.040
Most people, they would say they would just put in the name of an artist or the name of

00:57:21.040 --> 00:57:21.540
an album.

00:57:21.540 --> 00:57:24.620
And really, it's more useful for sampling from playlists.

00:57:24.620 --> 00:57:26.920
Because then you have a much greater variety.

00:57:27.320 --> 00:57:29.460
People would just go and put in their favorite three bands.

00:57:29.460 --> 00:57:31.620
And the results weren't all that impressive.

00:57:31.620 --> 00:57:32.220
Yeah, yeah.

00:57:32.220 --> 00:57:32.560
Guess what?

00:57:32.560 --> 00:57:34.200
You know, with music from your three favorite bands.

00:57:34.200 --> 00:57:41.680
There was a talk last year by Gotham by Angeline Protasio called The Album Discoverer, which

00:57:41.680 --> 00:57:45.140
was like an album recommendation system that uses something similar to this.

00:57:45.220 --> 00:57:49.620
But it was like going into a deep dive of Spotify's API.

00:57:49.620 --> 00:57:56.920
And I mean, I will give Spotify all the props because there's just so much information and

00:57:56.920 --> 00:58:03.900
stuff that is like similar to like your previous example, Rivers, where you had these variables

00:58:03.900 --> 00:58:08.540
that most people who don't think about music wouldn't think about originally.

00:58:08.780 --> 00:58:10.200
Like they're like, is it somber?

00:58:10.200 --> 00:58:11.600
Does it have good gut feel?

00:58:11.600 --> 00:58:12.860
Like stuff like that.

00:58:12.860 --> 00:58:15.260
And you're just like, I don't know how you quantify that.

00:58:15.260 --> 00:58:20.360
But at the same time, like the talk was really interesting because it showed like a comparison

00:58:20.360 --> 00:58:25.020
of tracks that were in different genres, but had similar feelings.

00:58:25.020 --> 00:58:27.440
And it was a really cool example.

00:58:27.440 --> 00:58:31.340
And I've been trying to find it online while you when you mentioned it, but I can't find it.

00:58:31.340 --> 00:58:35.260
So I'll have to reach out to the PyGotham team and see if I can get, you know, find out where

00:58:35.260 --> 00:58:35.920
that link is.

00:58:35.920 --> 00:58:37.860
Yeah, I know just what you're talking about.

00:58:37.860 --> 00:58:40.600
And Spotify gives you access to all that data.

00:58:40.600 --> 00:58:47.240
That being said, I'm skeptical of a lot of it because I've seen the data on my own songs.

00:58:47.240 --> 00:58:55.580
And like we covered Take On Me by AHA, which is a very danceable song, especially compared

00:58:55.580 --> 00:58:56.660
to a regular one.

00:58:56.660 --> 00:58:58.880
Yeah, especially compared to normal Weezer song.

00:58:59.020 --> 00:59:04.640
You'd think that would be rated very high on the parameter of danceability, but it's

00:59:04.640 --> 00:59:07.180
they rated as one of our least danceable songs.

00:59:07.180 --> 00:59:08.040
Oh, interesting.

00:59:08.040 --> 00:59:09.460
Very cool.

00:59:09.460 --> 00:59:14.200
I love this look at how you're interacting with music because it's really different than

00:59:14.200 --> 00:59:17.680
I think a lot of people out there just looking for something in the background.

00:59:17.680 --> 00:59:18.140
Cool.

00:59:18.140 --> 00:59:20.640
I must admit, I think you're onto something here.

00:59:20.640 --> 00:59:24.120
You were saying there, Michael, if you just let Spotify do its own thing, it'll say to you,

00:59:24.120 --> 00:59:27.040
here's the things you've listened to again and again and again, including the things

00:59:27.040 --> 00:59:29.500
you've always skipped, which we are convinced you'll listen to if you play enough.

00:59:29.500 --> 00:59:31.620
But I should be doing this.

00:59:31.620 --> 00:59:35.880
I should craft it more deeply to kind of get exactly what I want to listen to or at least

00:59:35.880 --> 00:59:38.060
things that sound like stuff I like to listen to.

00:59:38.060 --> 00:59:38.840
This is brilliant.

00:59:38.840 --> 00:59:39.580
Yeah, absolutely.

00:59:39.580 --> 00:59:42.540
And Jesus out there in the live stream.

00:59:42.540 --> 00:59:43.340
Welcome, welcome.

00:59:43.340 --> 00:59:44.900
There's an awesome app reverse.

00:59:45.040 --> 00:59:48.120
Please share so I can get an automated Chimba Wamba playlist.

00:59:48.120 --> 00:59:50.900
Fantastic.

00:59:50.900 --> 00:59:51.360
Yeah, I agree.

00:59:51.360 --> 00:59:52.400
That's a really, really cool one.

00:59:52.400 --> 00:59:52.540
All right.

00:59:52.540 --> 00:59:53.100
I want to share one.

00:59:53.100 --> 00:59:54.560
I'll be really quick since we're at the end.

00:59:54.560 --> 00:59:55.920
This is my second one as well.

00:59:55.920 --> 00:59:57.740
This brings together a lot of pieces.

00:59:57.740 --> 00:59:59.680
It is ridiculously simple.

00:59:59.680 --> 01:00:02.080
Like you're almost like, why would you ever do this?

01:00:02.080 --> 01:00:07.120
So I built this app and it has a screenshot because it's an app that runs in the Mac toolbar

01:00:07.120 --> 01:00:09.600
in the notification area by the clock.

01:00:09.600 --> 01:00:13.480
And this is primarily why I even wanted to bother bringing this up because if you've got

01:00:13.480 --> 01:00:17.880
these little scripts, like Kim talked about GUI, which is a cool thing you package up as

01:00:17.880 --> 01:00:18.840
an EXE you can share.

01:00:18.840 --> 01:00:22.480
But sometimes you just want like a little notification thing or something that might listen to a hot

01:00:22.480 --> 01:00:23.920
key that can just like live up there.

01:00:24.240 --> 01:00:27.820
And so one of the things that I have to do all the time is I'll take the title of a

01:00:27.820 --> 01:00:28.100
podcast.

01:00:28.100 --> 01:00:31.920
I will take the title of a course video and thousands of them.

01:00:31.920 --> 01:00:36.440
And I want to turn that into a file name that will work well.

01:00:36.440 --> 01:00:40.240
So I have this little app I called URLify, which is probably poorly named, but it does like

01:00:40.240 --> 01:00:41.740
simple little text transform.

01:00:41.740 --> 01:00:46.140
So it uses Piperclip again, and I can just click a thing and it'll turn it into something that

01:00:46.140 --> 01:00:47.860
would look as like a slug for URL.

01:00:47.860 --> 01:00:52.880
So like if it was the playlist with spaces and a capital T, it'll be all lowercase with dashes

01:00:52.880 --> 01:00:54.940
and it'll strip out symbols that wouldn't work.

01:00:54.940 --> 01:00:55.160
Right.

01:00:55.160 --> 01:00:59.620
So that actually turned out to be incredibly helpful because I can always reliably name

01:00:59.620 --> 01:01:00.480
stuff the same.

01:01:00.480 --> 01:01:05.300
And anytime I put something in, I just copy like the title of a presentation and then I

01:01:05.300 --> 01:01:08.060
hit that button and it turns it into the, just the right file name.

01:01:08.060 --> 01:01:11.900
And then that app I talked about before, it'll actually read that in the reverse engineer

01:01:11.900 --> 01:01:17.260
it back into like, like a title, like with case, the right casing and stuff again.

01:01:17.260 --> 01:01:21.180
So it actually sort of comes all around about, but the thing to build this is there's this

01:01:21.180 --> 01:01:25.380
app called rumps and I'm just be careful when you search for this, I'll link to it rumps.

01:01:25.380 --> 01:01:31.340
And it's an acronym for ridiculously uncomplicated macOS Python status bar apps.

01:01:31.340 --> 01:01:37.300
So glad it has a shorter name, but just like GUI, like there is a full on application on the

01:01:37.300 --> 01:01:41.920
screen here that you can find on the PyPI listing, which I don't know, what's that?

01:01:41.920 --> 01:01:43.200
12, 15 lines of code.

01:01:43.200 --> 01:01:48.820
And you've got a notification app that pops up little macOS toast runs as a .exe, not

01:01:48.820 --> 01:01:54.160
a .app in your Mac bar there, which I built the .app with, Py2 app.

01:01:54.160 --> 01:01:58.600
So yeah, that's two really cool things to put together to just like, I want something that's

01:01:58.600 --> 01:01:59.720
always up in my Mac bar.

01:01:59.880 --> 01:02:03.420
There's probably something like this for the taskbar and windows, but I haven't found it.

01:02:03.420 --> 01:02:04.380
So,

01:02:04.380 --> 01:02:06.240
That sounds like a great little free course.

01:02:06.240 --> 01:02:08.780
Yeah, it does.

01:02:08.780 --> 01:02:09.560
It does.

01:02:09.560 --> 01:02:11.960
Maybe I should just take a week and fill it down.

01:02:11.960 --> 01:02:15.360
I've actually been thinking about building like little notification app, like a simple,

01:02:15.360 --> 01:02:18.980
simple GUI, like GUI, GUI at G O O E Y.

01:02:19.080 --> 01:02:20.980
And like this, and maybe that taskbar one.

01:02:20.980 --> 01:02:23.580
You can fork archive project that I have then.

01:02:23.580 --> 01:02:28.720
Cause I actually used rumps to make like a, like we've all seen those little timer apps

01:02:28.720 --> 01:02:32.700
where you can put a bunch of dates in and it'll tell you like how soon until that thing was

01:02:32.700 --> 01:02:33.040
happening.

01:02:33.040 --> 01:02:33.400
Yes.

01:02:33.400 --> 01:02:34.940
I made an app called wins at that.

01:02:34.940 --> 01:02:38.160
I just like put on GitHub and it was just like, I'm not going to develop this anymore.

01:02:38.160 --> 01:02:40.460
So I'll send you the link for it, Michael.

01:02:40.460 --> 01:02:45.180
But the thing I like about this is there are so many tools that just do the thing and do

01:02:45.180 --> 01:02:47.080
it like really simple, really quick.

01:02:47.080 --> 01:02:49.120
And when you think of stuff like, what is it?

01:02:49.120 --> 01:02:54.900
PipX, where you can just call a command directly from your command line and it just runs and

01:02:54.900 --> 01:02:55.620
does the thing.

01:02:55.620 --> 01:02:57.160
Like that's always nice.

01:02:57.160 --> 01:03:01.500
And then doing things like rumps where it's like, okay, I want to do this thing normally,

01:03:01.500 --> 01:03:05.500
but I want to put it up in my menu bar so that I can just take a quick look and see it.

01:03:05.500 --> 01:03:10.120
I think it's super awesome to, you know, we've talked about these big programs or these things

01:03:10.120 --> 01:03:14.860
that change our lives, but sometimes it's even just like the little things that you can

01:03:14.860 --> 01:03:19.660
look to see when, how, you know, how soon before your anniversary is coming up so you

01:03:19.660 --> 01:03:24.180
don't forget it or like, Hey, when is that big meeting that I'm supposed to be preparing

01:03:24.180 --> 01:03:24.500
for?

01:03:24.500 --> 01:03:27.640
When is that big conference presentation or when a CFP deadline is due?

01:03:27.640 --> 01:03:32.500
And you can, you can just make a little applet that you just run every now and then and get

01:03:32.500 --> 01:03:33.640
results like that.

01:03:33.640 --> 01:03:33.880
Yeah.

01:03:33.880 --> 01:03:38.340
You're making me think that the next one that I want to build is one for when I go live

01:03:38.340 --> 01:03:39.020
stream on a recording.

01:03:39.020 --> 01:03:40.040
I want to send out a tweet.

01:03:40.120 --> 01:03:41.340
I want to update the website.

01:03:41.340 --> 01:03:44.380
So as a little banner, we're live streaming right now, all those kinds of things.

01:03:44.380 --> 01:03:45.840
That just seems like another one up there.

01:03:45.840 --> 01:03:46.400
I just click.

01:03:46.400 --> 01:03:51.100
I like a little button that opens up my Jupyter notebooks, you know, like I always have to clear

01:03:51.100 --> 01:03:52.480
my desktop all over.

01:03:52.480 --> 01:03:55.180
So I would, I would take the time to make something like that would be cool.

01:03:55.180 --> 01:03:55.460
Yeah.

01:03:55.460 --> 01:03:56.280
That'd be super neat.

01:03:56.280 --> 01:03:56.960
All right, guys.

01:03:56.960 --> 01:04:00.620
It looks like we're a little bit over time, but so many interesting things.

01:04:00.760 --> 01:04:05.300
Thank you all for being here now, since there's so many of us, I'm not going to, and I think

01:04:05.300 --> 01:04:08.640
we've all just, this has basically been the entire show, like these little libraries.

01:04:08.640 --> 01:04:11.680
I normally ask, you know, what's your favorite PyPI package you want to recommend?

01:04:11.680 --> 01:04:13.400
But like, we've got 30 of them.

01:04:13.400 --> 01:04:14.380
So that was a show.

01:04:14.380 --> 01:04:14.780
It was awesome.

01:04:14.780 --> 01:04:17.580
But just really quick, I'll go around for the final question.

01:04:17.580 --> 01:04:18.380
Favorite editor.

01:04:18.380 --> 01:04:19.820
Start VS Code again.

01:04:19.820 --> 01:04:20.260
Rusty.

01:04:20.260 --> 01:04:20.900
Right on.

01:04:20.900 --> 01:04:21.200
Kim?

01:04:21.200 --> 01:04:22.240
Emacs still.

01:04:22.240 --> 01:04:23.420
I'm probably always.

01:04:23.420 --> 01:04:23.820
Emacs.

01:04:23.820 --> 01:04:24.680
Right on.

01:04:24.680 --> 01:04:24.880
Yeah.

01:04:24.880 --> 01:04:28.360
You like to type on an operating system that is itself artificial intelligence.

01:04:28.360 --> 01:04:28.860
Pretty much, yeah.

01:04:29.460 --> 01:04:29.680
Yeah.

01:04:29.680 --> 01:04:30.900
Reverse.

01:04:30.900 --> 01:04:31.460
VS Code.

01:04:31.460 --> 01:04:31.920
Okay.

01:04:31.920 --> 01:04:32.440
Right on.

01:04:32.440 --> 01:04:33.240
That's a good one.

01:04:33.240 --> 01:04:33.480
Jay?

01:04:33.480 --> 01:04:34.660
The war begins, Kim.

01:04:34.660 --> 01:04:35.320
Vim.

01:04:35.320 --> 01:04:37.300
Well, Vim you said at least.

01:04:37.300 --> 01:04:39.060
At least you're using the M version.

01:04:39.060 --> 01:04:39.560
Neo Vim.

01:04:39.560 --> 01:04:39.960
Yeah.

01:04:39.960 --> 01:04:40.440
Yeah.

01:04:40.440 --> 01:04:41.580
Neo Vim, I should say.

01:04:41.580 --> 01:04:42.440
Awesome.

01:04:42.440 --> 01:04:44.100
I can tolerate Vim.

01:04:44.100 --> 01:04:48.480
Basically, yeah, I can tolerate it, but if I have to very, very slowly get things done.

01:04:48.480 --> 01:04:52.060
Because basically the problem, and I'm sure you've, this probably happens less to Vim guys.

01:04:52.060 --> 01:04:57.760
If you're an Emacs guy, then you remember the key bindings for Emacs, and VI is what's on the really primitive servers.

01:04:58.220 --> 01:05:03.520
And you cannot remember how to make it do things because you keep pushing the wrong buttons because your fingers remember Emacs commands.

01:05:03.520 --> 01:05:08.560
The same would probably happen to you, but you probably don't necessarily have to use Emacs very often because VI is everywhere.

01:05:08.560 --> 01:05:09.300
Yeah.

01:05:09.440 --> 01:05:16.440
If I have to use a text editor, there will be like HJKLs just all over the place because I think I'm in normal mode.

01:05:16.440 --> 01:05:18.500
And I'm just like, oh, no, it's just typing.

01:05:18.500 --> 01:05:18.920
Yeah.

01:05:18.920 --> 01:05:20.340
I'm reminded of the joke.

01:05:20.340 --> 01:05:22.620
Like, how do you generate a random string?

01:05:22.620 --> 01:05:26.840
You give a first year computer science student Vim and you tell them to exit it.

01:05:26.840 --> 01:05:27.440
Yes.

01:05:30.240 --> 01:05:31.140
All right, you guys.

01:05:31.140 --> 01:05:32.440
Thank you so much for being here.

01:05:32.440 --> 01:05:33.560
It's been really great.

01:05:33.560 --> 01:05:35.820
Everyone is doing such neat stuff.

01:05:35.820 --> 01:05:38.140
And I'm sure we're going to inspire a lot of people, even ourselves.

01:05:38.140 --> 01:05:40.720
Like Rusty's like, I need a button to launch on my Jupyter Notebooks, right?

01:05:40.720 --> 01:05:42.440
I'm going to do one for live streaming.

01:05:42.440 --> 01:05:43.320
So thank you.

01:05:43.320 --> 01:05:44.260
Thank you all for being here.

01:05:44.260 --> 01:05:45.140
It's been great.

01:05:45.140 --> 01:05:45.420
Thank you.

01:05:45.420 --> 01:05:46.000
Thanks, Michael.

01:05:46.000 --> 01:05:46.580
That was fantastic.

01:05:46.580 --> 01:05:47.200
Thank you, everyone.

01:05:47.200 --> 01:05:47.420
Yeah.

01:05:47.420 --> 01:05:47.780
Yeah.

01:05:47.780 --> 01:05:48.380
You bet.

01:05:48.380 --> 01:05:48.800
Bye.

01:05:48.800 --> 01:05:49.040
Bye.

01:05:49.040 --> 01:05:49.080
Bye.

01:05:49.540 --> 01:05:50.540
Bye.

01:05:50.540 --> 01:05:53.000
This has been another episode of Talk Python To Me.

01:05:53.000 --> 01:05:59.300
Our guests on this episode have been Rivers Cuomo, Jay Miller, Kim VanWaik, and Rusty Gregory.

01:05:59.300 --> 01:06:03.860
And it's been brought to you by Linode, us over at Talk Python Training, and the transcripts

01:06:03.860 --> 01:06:05.240
are provided by Assembly AI.

01:06:05.240 --> 01:06:10.160
Simplify your infrastructure and cut your cloud bills in half with Linode's Linux virtual machines.

01:06:10.160 --> 01:06:13.540
Develop, deploy, and scale your modern applications faster and easier.

01:06:13.540 --> 01:06:18.500
Visit talkpython.fm/Linode and click the create free account button to get started.

01:06:19.460 --> 01:06:23.060
Transcripts for this and all of our episodes are brought to you by Assembly AI.

01:06:23.060 --> 01:06:25.740
Do you need a great automatic speech-to-text API?

01:06:25.740 --> 01:06:28.260
Get human-level accuracy in just a few lines of code.

01:06:28.260 --> 01:06:31.120
Visit talkpython.fm/assembly AI.

01:06:31.120 --> 01:06:32.900
Want to level up your Python?

01:06:32.900 --> 01:06:36.960
We have one of the largest catalogs of Python video courses over at Talk Python.

01:06:36.960 --> 01:06:42.120
Our content ranges from true beginners to deeply advanced topics like memory and async.

01:06:42.120 --> 01:06:44.800
And best of all, there's not a subscription in sight.

01:06:44.800 --> 01:06:47.700
Check it out for yourself at training.talkpython.fm.

01:06:47.880 --> 01:06:49.600
Be sure to subscribe to the show.

01:06:49.600 --> 01:06:52.380
Open your favorite podcast app and search for Python.

01:06:52.380 --> 01:06:53.680
We should be right at the top.

01:06:53.680 --> 01:06:58.840
You can also find the iTunes feed at /itunes, the Google Play feed at /play,

01:06:58.840 --> 01:07:03.060
and the direct RSS feed at /rss on talkpython.fm.

01:07:04.000 --> 01:07:06.480
We're live streaming most of our recordings these days.

01:07:06.480 --> 01:07:09.900
If you want to be part of the show and have your comments featured on the air,

01:07:09.900 --> 01:07:14.320
be sure to subscribe to our YouTube channel at talkpython.fm/youtube.

01:07:14.320 --> 01:07:16.160
This is your host, Michael Kennedy.

01:07:16.160 --> 01:07:17.460
Thanks so much for listening.

01:07:17.460 --> 01:07:18.620
I really appreciate it.

01:07:18.880 --> 01:07:20.540
Now get out there and write some Python code.

01:07:20.540 --> 01:07:20.540
Now get out there and write some Python code.

01:07:20.540 --> 01:07:41.300
I'll see you next time.