Learn Python with Talk Python's 270 hours of courses

#327: Little Automation Tools in Python Transcript

Recorded on Thursday, Jul 15, 2021.

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

00:04 Some of them are building bioreactors to remove carbon from the air with artificial intelligence

00:09 and Python.

00:10 Others are optimizing the aerodynamics and race strategy at the highest level of automobile

00:15 racing.

00:15 This episode is different.

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

00:22 the tiny Python applications that might never be released publicly and yet can transform

00:27 our day-to-day lives with simple automation on an individual level.

00:31 We have four great guests here today.

00:34 Rivers Cuomo, Jay Miller, Kim Van Wick, and Rusty Gregory.

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

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

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

00:52 solution with Python.

00:54 This is Talk Python to Me, episode 327, recorded July 15th, 2021.

00:59 Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the ecosystem,

01:17 and the personalities.

01:18 This is your host, Michael Kennedy.

01:20 Follow me on Twitter, where I'm @mkennedy, and keep up with the show and listen to past

01:24 episodes at talkpython.fm, and follow the show on Twitter via at Talk Python.

01:29 This episode is brought to you by Linode, us over at Talk Python Training, and the transcripts

01:34 are brought to you by Assembly AI.

01:36 Please check out what we're all offering during our segments.

01:38 It really helps support the show.

01:40 Rusty, Kim, Jay, and Rivers, welcome all of you to Talk Python to Me.

01:45 Thanks.

01:46 Great to be here.

01:46 Thanks.

01:46 Thanks.

01:47 Thanks.

01:47 Happy to be here.

01:48 It's really excellent to have you here to share this topic.

01:51 A lot of times I have people on the show like, oh, here's how we built Instagram.

01:55 Are we using this cool library to scale the largest Django deployment?

01:59 Or here's how I built Flask and how we're evolving it and something like that in data science.

02:04 And that's great.

02:05 But I think so many people out there listening are like, well, I'm not building those kinds

02:10 of apps.

02:10 I'm building something entirely different.

02:11 Or I don't.

02:12 I just build little things.

02:13 And I think actually that's where a lot of the magic is for everyone out there listening.

02:18 You know, we all have these things that are in our day to day.

02:21 And it's just like, you know, that is, I'm not looking forward to that.

02:25 But so many times, a couple hours of Python or other coding, a little automation, and then

02:30 that becomes automatic.

02:31 And life is just, you know, it's so rewarding to do those little things.

02:36 I'm excited to share the ones that I did.

02:37 They're incredibly simple, but they're, they just make me smile so much as I do them.

02:41 So really looking forward to doing that.

02:44 But before we get into the apps and the details, you know, let's maybe go around the YouTube

02:50 stream picture here and let you all quickly introduce yourself.

02:52 Three of the four of you have been on the show before, but just, you know, a quick introduction.

02:56 Rusty, let's start with you.

02:57 Okay.

02:57 Yeah, I gave my long introduction last time.

03:00 So I'll just say that I'm a reformed teacher.

03:02 About two years ago, or maybe three years ago, I started coding.

03:05 And then I had an opportunity to kind of become the data manager at my school district.

03:09 So I'm trying to build pathways between all the various services that we use and keep our

03:15 data clean.

03:16 And that is so cool because it's not like you had to leave the education space or the public

03:21 school space.

03:22 You just sort of transitioned into this world where you can take what you're really into

03:25 and like help everyone with it, right?

03:27 Yeah, it was a great move for me.

03:28 I was actually trying to learn how to teach coding to the kids and then I just really enjoyed

03:33 it.

03:33 So yeah, so it was great.

03:34 Just do more of that.

03:35 Just the same time big data hit.

03:37 So it was good.

03:38 Yeah.

03:38 Fantastic.

03:39 Kim?

03:39 Right.

03:40 If I can borrow a phrase from Rusty, I'm a reformed embedded software engineer.

03:44 So I've moved from C a couple of years ago to doing mainly DevOps work for a financial services

03:49 organization here in South Africa where I'm based.

03:51 Yeah.

03:52 Fantastic.

03:52 Fantastic.

03:52 And you were also hosting the Ask Me Anything not long ago.

03:55 Thank you for that.

03:56 Yeah, that was great.

03:57 Yes, that was not that long ago.

03:59 Yeah.

03:59 That was very good.

04:00 Yeah.

04:00 Yeah, it was fun.

04:01 Jay.

04:01 Hello, hello.

04:02 I just saw you over on Python Bytes not long ago, but happy to have you here.

04:05 Happy to be back.

04:07 I will crib everyone and say I am also reformed, marketer, veteran, now developer advocate,

04:13 and spend a lot of my time just talking to the community and learning from folks that are

04:19 a lot smarter than I am.

04:21 Like the four people on this panel.

04:22 Yeah.

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

04:27 Absolutely.

04:27 Yeah.

04:28 Rivers, your first time on the show.

04:30 Thank you so much for coming.

04:31 It's really great to have you here.

04:32 Tell people real quickly about yourself.

04:33 My name is Rivers Cuovo.

04:35 I'm the singer and songwriter for the band Weezer.

04:38 Our first album came out in 94 and we've been touring and making records on and off ever since.

04:44 I'm such a fan of your music.

04:46 It came out when I was in college and I've been a fan of what you're doing longer than I've

04:49 been a fan of Python, which is crazy.

04:51 That's so awesome.

04:52 So thank you for that.

04:53 Yeah.

04:53 I'm a huge fan of your show, Michael.

04:55 I listen every morning and of course I've learned so much and gotten turned on to so many

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

05:06 hours of coding every morning to hear all you guys talking about it.

05:11 It really warms the heart.

05:12 Awesome.

05:13 Thank you.

05:13 I think a lot of people who have told me they listen to the show and some of the guests as

05:18 well, they don't work in like a startup tech place environment, but being able to listen

05:24 to a podcast like Talk Python To Me and others, it kind of brings that community to them, even

05:29 though they're not necessarily like every day showing up with a group of people who would

05:33 be that community.

05:34 Yeah.

05:34 That's exactly my situation.

05:36 I'm working on my own here and I don't know anybody who is into coding.

05:40 So it's great to know you.

05:42 Yeah.

05:42 Awesome.

05:43 Yeah.

05:43 You as well.

05:44 So as you said, people will know you from Weezer and that's amazing, but you are doing

05:49 such cool stuff with automation and Python and code.

05:52 And so I think people are really going to be blown away by what you're doing as well.

05:56 So I'm super excited to get into that.

05:59 Let's just sort of go down.

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

06:04 And it looks like Rusty, I put you first.

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

06:10 Sure. So when COVID hit, we had to change a lot of different things and adjust like everybody

06:15 else did in the world.

06:16 And we ended up sending out a lot of notifications from our school district when an infection would

06:21 happen at a school and we'd have to notify people.

06:23 And it was this huge thing.

06:24 And at the height, we were getting lots of these things a day.

06:27 And so schools started to put the information up on their website so that you could just go

06:30 and refer to the website instead of get a wall of text every time something happened.

06:34 So my superintendent came in and said she wanted to put this dashboard up and then she showed

06:39 me some other schools that had done it.

06:40 And I looked at what they were doing and just knowing how the web works and schools work.

06:44 I knew that somebody who's going to have to update this information every single day or

06:48 every other day on the website, it was something that could easily fall by the wayside.

06:51 So I thought to myself, you know, who's going to be updating this?

06:54 And then she's like, don't worry about it.

06:55 I'll update it.

06:56 You know, you've got so much to worry about.

06:58 Like, that's not what you want your superintendent doing, right?

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

07:02 So I was like, I should be able to handle this with Python somehow.

07:05 So I hit Reddit and I just asked kind of, you know, or well, first off, I had to find out

07:10 where she was getting the information.

07:11 So the health department put it up on the website, but it was a PDF.

07:14 And I was like, oh, that's crazy.

07:16 Oh, gosh.

07:16 Yeah.

07:16 So I can't scrape that.

07:17 So I was like, all right, well, yeah, maybe I'll just update it every day.

07:22 All right.

07:22 So then I hit Reddit and I was like, is there a way to turn, you know, a PDF into a CSV with

07:27 Python?

07:27 And of course there was.

07:28 So about two or three different packages got recommended.

07:31 I played around with them for about a half an hour.

07:32 And this one called Tabula, which I wasn't crazy about because it depends on Java underneath.

07:37 So it uses Java to kind of like recognize patterns on there.

07:40 And it'll, so it'll, it'll turn your, your PDF, pull out just the, the tabular data and

07:46 stick it into a CSV for you.

07:47 So I was able to just with a bit of requests, go up, grab that every time, save it, process

07:52 it, wrote a really gnarly little loop that finds my four schools and then puts those into

07:57 my own CSV.

07:58 And then I use Python again, Yagmail to just send it to myself.

08:03 I did it twice a day because it was updated at different times.

08:06 And then on the other end with a little JavaScript, I just went into my email and I find that and

08:11 I just update a Google sheet that's embedded on the, on the website.

08:14 So there's a bunch of little parts on it, but literally the Python was about 96 lines

08:19 of code with comments and stuff.

08:21 And it accomplished this.

08:23 And that's super cool.

08:23 And it's really valuable, right?

08:25 That if something like that gets missed, you know, it could make a big deal or it could be

08:29 some kind of outbreak.

08:30 Yeah.

08:31 And I can apply that to just about, you know, to so many other things as well.

08:35 So the time, all the time I invested in learning how that was, and it was an afternoon and I

08:39 was able to figure that out and, and impress my immediate boss, which was really cool.

08:43 He, he enjoys those types of things.

08:44 So that was good.

08:45 I bet.

08:45 Paul out there in the live stream.

08:47 Hey, Paul says, I use Yagmail to automate sending out emails for the SciPy conference.

08:50 Very cool.

08:51 Rivers, it sounds like you and Rusty share some of the same tool set there.

08:55 Like it turns with like web scraping, PDFs, Google sheets, that kind of stuff.

09:00 Yeah.

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

09:05 I was trying to get some data from our agents that they have a web service where they give

09:11 you the artists, tons of details about their upcoming shows, attendance and tickets sold

09:17 and gross income, all this stuff.

09:19 So I wanted to get all that and I had to, I had to deal with Pete, like it's rendered as

09:25 a PDF.

09:25 I made the mistake of going to Stack Overflow first, I guess, instead of Reddit.

09:29 And my question was getting all these downvotes.

09:32 Oh yeah.

09:33 Oh yeah.

09:34 Yeah.

09:34 That's rough.

09:35 That is so, yeah.

09:36 You've got to find your community.

09:37 I turned to Michael.

09:37 Yeah.

09:38 Yeah.

09:38 Michael helped me out.

09:39 Yeah.

09:40 That's awesome.

09:40 I remember you were really frustrated because somehow the wrong information had been given

09:44 to you when you showed up and you're like, this was supposed to be one hour and it's

09:47 two hours and I was at the wrong.

09:49 Yeah.

09:49 I just, I could see, I imagine you're like, how do I get this table or this part of the information

09:54 out of the PDF?

09:54 And yeah, that was perfect.

09:55 Yeah.

09:56 But what is that package?

09:57 Yagmail?

09:57 I think I ought to try that one.

09:59 Yep.

09:59 Yep.

10:00 Yagmail.

10:00 It's really simple.

10:02 The toughest part is going through the hoops with Google, but once you get your little

10:06 file back from them, you can use it for everything.

10:08 So.

10:08 Very cool.

10:09 All right.

10:10 Thanks, Rusty.

10:10 Kim, yours first one's up next.

10:12 Just remind myself which one I wrote down as my first one.

10:15 That was it.

10:16 Yeah.

10:16 This little one, there's no link to it.

10:18 It doesn't have a name or anything.

10:19 It's just a little small script that one of the many that sits on my hard drive.

10:23 And this I think is really kind of an epitome of small time or very small tool Python

10:28 writing.

10:29 It's a small tool I wrote basically as my, my, the team I work with at work is about five

10:34 or six of us.

10:35 We kind of as agile as we need to be, which includes a Trello board because we're no longer

10:39 standing in front of a whiteboard in an office.

10:41 We're all in our own homes.

10:42 And so basically tracking cards of what we're doing for the week.

10:46 And we include in our team, people who have from day to day responsibilities for deployment

10:51 to some of our environments.

10:52 So one of the guys will push changes to staging, a different guy will push changes to our production

10:57 environment.

10:57 And then it's all kind of boring setup.

10:59 But effectively what it means is at the start of the week, I need to generate 10 cards for

11:03 who's doing what.

11:04 So I used to get an email from one of our administrators to say, here's the schedule

11:07 for the week.

11:08 You know, Bob's doing the staging on Monday and Fred's doing production on Tuesday.

11:12 And I want to track those on my Trello board.

11:14 And I reached the point where it shouldn't be a big deal.

11:17 It took me about 10 minutes on Monday morning.

11:19 I would make 10 cards and I'd write down Fred Monday, Bob Tuesday, but it was tedious and

11:24 it was fiddly.

11:25 And I was putting it off because it was 10 minutes I'd rather not spend.

11:28 And it's only 10 minutes, but still it was irritating.

11:30 And that was kind of not the thing I wanted to do on Monday morning.

11:33 So basically I have sitting on my hard drive about 150 lines of Python purely to ask me,

11:39 interrogate when I run it, who's doing what?

11:41 Well, basically I've now got it set up.

11:43 So it says full staging on Monday, which of these six people is the deployer?

11:47 And just repeat for each of those cards.

11:50 And that was literally, it takes me 20 seconds to run it now.

11:54 I have to read the email I get on Monday morning to say, you know, who's doing when.

11:58 And then it all does it for me.

11:59 And it's incredibly daft.

12:01 I mean, I save myself 10 minutes a week.

12:03 It's no big deal, but I also save myself some irritation and scratches that little itch.

12:07 And that's the kind of thing I really love about a really small Python tool.

12:10 It took me a couple hours to write.

12:12 So it's not like it cost the company days of my time.

12:16 Yeah.

12:16 Yeah.

12:17 And it probably saved them some mistake or some forgotten.

12:19 Well, exactly.

12:20 Yeah.

12:20 Yeah.

12:20 What's the Trello communication bit?

12:22 That's all REST API on Trello.

12:24 So like most similar REST API services, you go along to Trello's side, you identify yourself,

12:31 you get back a token from them, and then that's all API queries.

12:34 So of the 150 lines of Python, about 40 are just config files for me mapping the names of

12:39 my team members and various bits of information about the Trello to ID numbers I have to send

12:44 back to Trello.

12:44 Yeah.

12:45 It's a little less actual code.

12:47 Yeah.

12:47 That's fantastic.

12:48 So I don't know how we managed to pull this together when you all arrived for the meeting,

12:53 but we're exactly sort of in the loop of the same order in the docs.

12:57 So awesome.

12:58 Jay, you're next.

12:59 That'll keep it easy.

12:59 Awesome.

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

13:05 We do search stuff and search things.

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

13:11 That's all you're going to say.

13:11 Yes.

13:13 But one of the things that we have done because we do a lot of visualization is we build dashboards

13:18 for like everything.

13:19 There's so many dashboards.

13:20 I have actually built a series of my own set of dashboards using one of my new favorite tools

13:26 called Elon, which is like a pandas like data framing tool, but for Elasticsearch.

13:35 And it's great because it's designed to work with pandas, but it's also designed to work like

13:40 pandas.

13:41 So if you've ever done any type of data framing, any type of dealing with big numbers, big,

13:45 any type of information like that, and you're used to those commands, you can just try them

13:50 and usually they work.

13:51 And what I've learned is Elon is amazing for like parsing CSV files, parsing JSON files.

13:58 You don't have to do like the for or with open, whatever the CSV file is as dict reader and

14:05 like all this, like that whole pattern you just do, you know, in pandas, you would just do

14:09 pandas read CSV or in Elon, you would say Elon CSV to Elon.

14:14 And then it just loads that information into your database.

14:17 No questions asked.

14:17 And it just goes.

14:18 Oh, that's super cool.

14:19 So instead of trying to work with it directly with pandas, you put it into the database.

14:23 You can do queries and reporting and stuff like that driven off of it.

14:26 Right?

14:26 Exactly.

14:27 Instead of like, because you're having to figure out all of the mutations that you would need to find

14:31 exactly what you need.

14:33 You just do a general elastic search query and then it shows you the information you're looking for,

14:38 but in like a data frame format, which is sweet.

14:41 And I've used that for a couple of projects.

14:43 I built a tool in react.

14:45 Sorry, I know it's a Python podcast, but it's called diversity orgs.tech.

14:49 I do a lot of diversity work in my job connecting with organizations that work with underrepresented

14:54 folks.

14:55 And this has been a way for me to collect, like, I think at this point, like over 500 different

15:02 organizations that work with underrepresented folks in tech and put it in like its own little

15:07 mini search engine, its own like small meetup and updating it.

15:11 I actually just use Flask, which I think is funny because you have, that is not it.

15:15 I wish that was it.

15:16 Diversityorgs.tech.

15:18 I was like, their design work much better than mine.

15:21 There we go.

15:24 Yeah.

15:24 So you can just search for it and like, but yeah, like it's a lot of people.

15:32 It's cool that like, you can just use things like Flask on the backend and build your own

15:36 little admin portal and you don't have to worry about spinning up a server or like being worried

15:41 that someone's going to try to brute force your backend or anything.

15:43 You're just like, oh, let me start my Flask engine, run it.

15:47 It's sending REST API calls to Elasticsearch and then it just works, which is great.

15:52 Yeah, that's really cool.

15:53 This portion of Talk Python to Me is sponsored by Linode.

15:58 Visit talkpython.fm/Linode to see why Linode has been voted the top infrastructure as a service provider by both G2 and TrustRadius.

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

16:12 to the ease of use and setup, it's clear why developers have been trusting Linode for projects

16:17 both big and small since 2003.

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

16:24 it all from scratch and manage everything yourself with supported centralized tools like

16:28 Terraform.

16:29 Linode offers the best price-to-performance value for all compute instances, including

16:34 GPUs as well as block storage, Kubernetes, and their upcoming bare metal release.

16:39 Linode makes cloud computing fast, simple, and affordable, allowing you to focus on your

16:45 projects, not your infrastructure.

16:48 Visit talkpython.fm/Linode and sign up with your Google account, your GitHub account,

16:52 or your email address, and you'll get $100 in credit.

16:56 That's talkpython.fm/Linode, or just click the link in your podcast player's show notes.

17:01 And thank them for supporting Talk Python.

17:05 I think this whole diversity org tech place is really cool.

17:09 So the idea is, basically, you're trying to create groups that people can reach out to,

17:15 because if you see people who like you, you feel way more like you should be part of that

17:20 community, right?

17:20 Way more part of technology or whatever.

17:23 Yeah, just try it out.

17:24 Just type in Portland and hit search and see what comes up.

17:26 Like, there should be groups.

17:28 In Portland, there will definitely be groups.

17:30 Yeah.

17:30 Oh, yeah.

17:31 There's the PyLadies, Blackson Technologies, Django Girls.

17:34 Keep scrolling.

17:34 There's more.

17:35 There's more.

17:35 Oh, yeah.

17:36 Yeah, there you go.

17:37 Oh, yeah.

17:37 Look at that.

17:37 Which is what I'm telling you is I need a lesson in UI.

17:41 So this is all running React.

17:43 But the way that I update this, like if someone messaged me and says, oh, hey, I want my organization added to this list.

17:49 I just have a Flask site that I just spin up locally on my machine that sends all that.

17:54 Like, it's just a quick form.

17:55 And then it sends all the data to my server in Elastic Cloud.

17:59 And then it's up on the website instantly.

18:02 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.

18:15 It doesn't have to be pretty.

18:16 It doesn't have to look good.

18:17 The only place it's ever going to run is on your own machine.

18:19 But you get all the HTML GUI stuff basically for free.

18:23 You're not writing anything.

18:24 You're not writing a desktop app for buttons to click.

18:25 You're just firing up some HTML.

18:27 So that's actually quite a useful thing to do.

18:29 You don't have to worry about deployment.

18:30 There's no security issues, et cetera.

18:32 It never leaves your hard drive.

18:33 Yeah.

18:33 Yeah, absolutely.

18:34 You know, another one that's pretty good is Anvil.

18:36 Yeah.

18:36 In terms of I just kind of want something.

18:38 Probably misspelling again.

18:40 We're watching my Google.

18:42 I know.

18:42 Yeah, there we go.

18:44 There we go.

18:45 I thought that's what I typed, but that's okay.

18:47 It's interesting because you write Python even on the front end and it runs in your browser,

18:51 but it takes care of the hosting and whatnot.

18:53 You don't have to share it publicly.

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

18:58 But yeah, Tim, you're right.

18:59 If you're looking for a UI, sometimes the right thing might be just a private blast gap for you

19:04 or maybe just for like your people who are going to work with it behind the scenes.

19:07 It doesn't have to be pretty.

19:08 Exactly.

19:08 Yeah, it doesn't have to be pretty.

19:09 You're not selling it or anything.

19:10 The buttons are in the right places.

19:13 Or for that matter, if it's the only people you know, they can ask you, what do I do?

19:16 And you can tell them.

19:16 It doesn't have to even be particularly attractive or easy to use if it gets the job done.

19:20 Yeah, absolutely.

19:21 Absolutely.

19:22 Very cool.

19:22 All right.

19:23 Thanks.

19:23 Thanks, Jay.

19:24 That's a good one.

19:24 Rivers, what's the first one you want to share?

19:26 First one I want to share is an app called Demolisher.

19:29 And I made this because when I'm writing songs, I very often like to Frankenstein unrelated bits

19:37 together.

19:37 That ends up sounding like a coherent song.

19:40 But for me, it feels like the song feels fresher when I have these unrelated bits where when I

19:46 was writing each bit, it was like, this is the only thing in my mind.

19:49 I'm just making this as good as possible.

19:51 So, I stick a few of those together and it turns into a song.

19:54 However, when I'm looking for a bit to attach to the previous bit, I usually have some idea

20:00 of what I'm looking for.

20:01 Right.

20:01 They can't just be a random combination of different types of music or riffs.

20:06 Yeah.

20:06 Even if it's a very contrasting bit, it's still something somewhat specific.

20:11 So, I don't want to have to look through all 1,500 of my old unused demos.

20:17 So, I needed some kind of filter.

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

20:26 There's a search bar in there.

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

20:33 looking thing.

20:34 But I would write these filter queries and they'd get quite complicated and long and like all

20:41 these nests with parentheses.

20:43 There's the filter bar down at the very bottom.

20:45 Gotcha.

20:46 I think I was using this app in a way that most people weren't because my filters were

20:50 just gigantic and unmanageable.

20:52 I wrote this app called Demolisher, which is a Tekinter window with a bunch of switches that

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

21:06 that filter bar there.

21:07 And you end up with the demos that only match the criteria you're looking for.

21:13 Oh, how interesting.

21:14 So, it basically develops this, the SQL query type thing.

21:19 Yeah.

21:19 For this app.

21:20 Is it okay if I put it up on the screen?

21:21 Do you mind?

21:22 The screenshot?

21:22 Oh, yeah, sure.

21:23 There we go.

21:23 I don't know if you can see, but there's just a bunch of switches here.

21:26 So, tell us about the switches.

21:28 I'm not very musical.

21:29 So, you've got to help me out here.

21:31 On the far right, this is pretty easy to understand.

21:33 It's just a range of BPM.

21:35 I often, I'm looking for a pretty specific BPM for a bit to Frankenstein in.

21:41 And then below the BPM range, you see like a more human readable version of the filter string

21:48 that this app has produced.

21:50 So, then each column to the left there is a different parameter.

21:54 Far left, I can select which folder I want to select from or not select from.

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

22:05 Some of these you guys would probably recognize, but others are just particular to me.

22:09 But they're different tags I put on my demo.

22:12 Genesis, for example, on the far right, that's how I started writing the song, whether I started

22:17 on a piano or I started with a lyric and then piano or just started with a lyric and so on.

22:22 Because I found that those are useful tags.

22:25 They kind of set the direction of how that little composition is going to go.

22:29 This reminds me of like, like almost like a Moog synthesizer, like those giant patch panels

22:34 you see in studios.

22:35 We're just like, I need to find the perfect sound.

22:37 Let me just unplug this wire, plug it in over here and see what happens.

22:40 And then it's like that, but developing like a query for the right track that you have.

22:46 That's awesome.

22:46 Of your own stuff as well.

22:47 And intensely personal because you built it exactly to your needs.

22:50 So, very neat.

22:51 Yeah.

22:51 And it's quite easy to add or remove parameters.

22:55 There's a file in this package called sections.

22:59 And each section is one of these columns.

23:02 So, it's basically just a dictionary.

23:03 That is so cool.

23:05 Works perfectly fine.

23:06 Yeah.

23:06 Excellent.

23:07 I love that there's a feel there.

23:08 It's like, I would add fiddly to it.

23:11 That's the thing I've ever tried to do.

23:12 That's how it always feels.

23:14 I think you had the poetry guy on the podcast.

23:17 So, I've just tried to start converting a bunch of these to real packages.

23:21 And then I could put them up on GitHub.

23:23 So, other MP3 tag users could download this and use it themselves.

23:28 Oh, yeah.

23:29 That'd be really neat.

23:30 And maybe they can add some extra features and stuff as well.

23:32 Yeah.

23:33 Yeah.

23:33 I love this.

23:34 I love how you brought all this stuff together.

23:35 And it's just, it's so exactly what you need to make your life better.

23:40 And like you said, you had thousands of these demos.

23:43 And these pieces you wanted to bring together.

23:45 And it's just such a challenging format to combine.

23:48 And then here's how you just bring it all together, right?

23:50 Yeah.

23:51 So, typically I'll end up with a, it'll return about 10 demos that are, you know,

23:55 very likely to work for what I'm looking for.

23:58 And then I just pick my favorite one.

23:59 Yeah.

24:00 Fantastic.

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

24:05 Well, probably not anything you guys would know.

24:07 Because this is only, I've only been using this the last few years.

24:11 And sadly, none of those songs have become massively well known.

24:16 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.

24:23 It was just, you know, I had a cassette tape I could look through.

24:26 Awesome.

24:27 At the live stream, Zachary the Hacker, a nice username there.

24:30 So, if I use this and it made us and came up with a search and it didn't return a sound,

24:35 I couldn't help but to see that as a challenge to myself to come up with a sound that matched that query.

24:40 That's a great idea.

24:42 Put in random things and see what comes up and then fill those searches.

24:46 If I could just note, one of the things I think is very kind of really cool about your approach here, Rivers,

24:52 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.

24:58 You're quite happy with the tool you had, but once you have the filter query,

25:01 you're quite happy with the existing tool to find them and play them and so forth.

25:03 So, you just wrote yourself a filter maker, basically.

25:06 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.

25:12 You don't need any of that.

25:13 You've got a tool for that.

25:14 You just need something to make you a filter.

25:16 Yeah.

25:16 Yeah.

25:17 Good point.

25:17 Yeah.

25:18 I was talking to Matthew Rocklin from Dask and Coiled a little while ago,

25:22 and he said that they have this interesting philosophy.

25:26 I'll probably misquote it just a little bit, but something of the principle of minimum or minimal innovation.

25:33 What is the least thing we can introduce, and what other pieces could we combine that everyone is already using and knowing about?

25:39 And yeah, I think this sort of matches that.

25:41 Oh, so I should add that one of the packages I used then is called PyWinAuto.

25:47 So, when I start Demolisher, the first thing it does is PyWinAuto opens up the MP3 tag Windows app,

25:55 and then when I'm done with creating the filter, PyWinAuto copies and pastes it into the filter bar on MP3 tag.

26:03 Oh, how cool.

26:04 Yeah.

26:05 So, basically, the use case is you import the application from it.

26:09 You can tell it to start some EXE on Windows, and then just tell it to start typing keys into it.

26:15 Yeah.

26:16 That's awesome.

26:17 It's very cool.

26:17 It's a really cool way to combine it.

26:18 Yeah.

26:18 Yeah.

26:19 Fantastic.

26:20 If I can just maybe make a note, you've reminded me about PyWinAuto, and I'd forgotten about an episode from my career of 10 years plus ago.

26:28 PyWinAuto is also very useful if anybody's looking for, well, exactly what it does, Windows automation.

26:33 What the kind of thing I'm thinking of is that more than once in my previous work,

26:38 we got tools custom made by the supplier, a particular vendor, you know, that somebody was asked to knock together in a day.

26:44 So, it was terrible to use.

26:46 You had to click 50 buttons to get what you wanted.

26:48 It didn't remember any settings.

26:49 Every time you fired it up, you had to click all the boxes again for exactly what you need for your output.

26:53 And it also means in factory work, you want it as automated as possible.

26:57 You want this all to be running as part of a bigger stream of work.

27:01 And you can't really say, well, do all these automated tasks, then send somebody to the computer, take this piece of paper,

27:06 click these five or 15 sections, and then take the resulting file.

27:09 And PyWinAuto was fantastic for that kind of thing, because I actually wrote some Python, basically remembered what the tool should be set to do,

27:16 fires the tool up, makes those settings, runs it, and grabs the resulting file.

27:20 Yeah, that's super neat because if you want to automate something on the web,

27:23 you could use something like Selenium.

27:24 But if you want to automate like a custom VV6 app that somebody wrote 20 years ago,

27:28 there's no API for that.

27:29 Well, exactly, yeah.

27:30 And when you open these tools up, there's things like, you know, you need to tick a box 27 and, you know, drop down two.

27:36 It's not, it's not, they haven't been designed to be particularly well-written,

27:40 but the PyWinAuto doesn't care.

27:41 I mean, it's happy enough to use dodgy variable names and so forth.

27:45 Yeah.

27:45 Yeah, for sure.

27:46 I think there's a lot of folks that get their Python start doing little like computer automation

27:53 bits like that.

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

27:59 I mean, I think probably the hardest part is when you show people code you've written and they go,

28:05 that's not Pythonic.

28:05 Well, for stuff like this, it's probably not going to be because you're not working in Python.

28:10 You're just using Python to work in something else.

28:12 And it allows people to make messy code and just figure it out and hack at it.

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

28:23 Exactly.

28:23 Yeah.

28:24 On one hand, you have Pythonic.

28:25 On the other hand, I pressed a button and it happened automatically.

28:27 So I win.

28:29 The toughest parts about getting people to understand how to get into Python is you don't really know

28:34 the little tasks that you can do that you can solve with it until you get in and you can do a few things.

28:38 So little things like that open the door for you.

28:40 Yeah.

28:41 Yeah.

28:41 It's like a comment on LiveShane Brian says, Never heard of PyWinAuto.

28:44 This has just opened a lot of quasi-RPA doors for me.

28:48 Indeed.

28:48 Fantastic.

28:49 All right.

28:49 So I wanted to talk about one as well.

28:52 So I'm going to throw out this one that I have to do.

28:54 So over on the course website, we have literally thousands of videos.

28:58 And these are MP4s.

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

29:05 of stuff that I wrote during a break at my hotel at PyCon one year when I got hired.

29:10 I needed just a break from humanity.

29:12 But the thing I wanted to highlight is I end up with a folder full of folders full of hundreds of MP4s.

29:20 And I need to come up with some way to import those into the database.

29:23 And I was going through figuring out how long is this video.

29:27 I'd go in my Mac finder.

29:29 I said, all right, it's three minutes and 20 seconds.

29:30 So what is that?

29:31 That's 200 seconds.

29:33 And I would put that into the database.

29:34 And the file name is this.

29:35 And then I would do it again and again.

29:37 And after a couple of those and a couple of mistakes and similar stuff with the podcast,

29:41 I would just go crazy.

29:42 I'm like, I can't take this.

29:43 Maybe I have to hire somebody because I make too many mistakes.

29:46 And it's not useful for me to spend so much time converting minutes and seconds to seconds

29:51 and trying to do this.

29:52 So what I ended up doing is writing a little script that I just go to a directory.

29:55 I JSONify the videos.

29:57 I get a giant JSON document that I can just import into MongoDB.

29:59 And boom.

30:00 And it goes through and it finds.

30:01 It does two things that are really fun.

30:04 One is it goes through and it uses a little bit like what Rivers was talking about.

30:08 It uses FF probe.

30:09 Not the same thing.

30:10 But it goes in and figures out information about the audio stream or the video stream.

30:16 And it'll give me back the time and information.

30:18 And the way it works is I'm not using some API for this.

30:21 I'm actually using subprocess.

30:22 And then there's an output format for JSON.

30:25 And I just capture the standard out and then read it into a Python dictionary.

30:29 And then boom.

30:30 I have all that information.

30:31 It's as if FFmpeg had an API for Python.

30:33 So that's really fun.

30:35 And then I want to not bother to scroll back and copy it.

30:37 So I use hyperclip.

30:39 I was wondering how you're going to say that.

30:41 I've used a lot and I've never known quite how to pronounce it.

30:44 And so then I just I generate this huge thing, this composition of all these video files.

30:49 And then I just use hyperclip to copy it to the clipboard.

30:52 And then I just paste it in to the tool that is editing the JSON and like does all the importing

30:57 stuff.

30:58 And boom.

30:58 Off it goes.

30:59 So real simple.

31:01 But this thing was like it's no big deal to say.

31:03 I just want to sort of get the right file name relative to each another and get the time

31:07 and convert it.

31:08 But boy, did it save me a lot of frustration.

31:10 So I want to recommend those two things, especially hyperclip.

31:13 That's a cool one.

31:14 Yeah.

31:14 Hyperclip is very nifty.

31:15 The other thing I would just pick up from what you said there, Michael, is the point that

31:19 you don't have to use Python to solve all the problems.

31:22 If Fprobe exists, it's perfectly good at getting you the data you want.

31:25 Subprocess is a perfectly reasonable way.

31:27 Let the expert tool get you to do the difficult thing.

31:30 If Fprobe is already on your system, it knows how to get you the data you want.

31:33 It can get you the data in a format you can use.

31:35 Just use it to do it.

31:36 You don't have to write Python to do everything.

31:38 It's perfectly.

31:39 There's lots of very useful tools out there that are literally using Python to glue three

31:43 other tools together.

31:44 And that's fine.

31:45 And that works perfectly.

31:46 It works great.

31:47 I'm sure you see this a lot in your world where there's a lot of sort of stuff that is

31:51 more like desktop apps or CLI apps meant to automate things.

31:55 But maybe there's not a programming API for Python to it.

31:59 It's often that kind of thing.

31:59 Yeah.

32:00 Yeah.

32:00 Yeah.

32:00 Fantastic.

32:01 All right.

32:02 I think we've looped around our group here.

32:04 So Rusty.

32:05 Want to pick it up on the next thing you wanted to share?

32:07 Yeah.

32:07 So the next thing I needed to do at work was that I was going to automate was we have to

32:11 do state reporting.

32:12 And it's this big year long thing.

32:15 And it's basically what's caused my position to pop up all over the state.

32:18 So it's to keep giving the state information about our students and what's going on all the

32:22 time.

32:22 And it was a horrible process that they decided to automate.

32:24 It used to be people filling out papers and sending it in.

32:27 And then all of a sudden it just became this computer thing.

32:30 And then computer people had to do it, but it really wasn't their area of expertise before.

32:35 So we have to send our files in, CSV files in, and then they get checked and we get errors

32:40 back.

32:41 Then we have to fix that and do whatever.

32:42 So we're given an automated way to do it.

32:44 So if we can get the files there overnight, we get a time slot and then we get everything

32:48 back.

32:48 But eventually these errors creep in.

32:50 It's a flawed system and they know it's flawed, but since it's a government agency, there's

32:54 like nothing that could be done about it for multiple years or whatever.

32:57 So we're looking something different to kind of combat that.

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

33:04 They wouldn't actually be errors.

33:06 It'd be false errors.

33:06 Oh man.

33:07 So what you have to do is upload three sets of blanks and then boom, then you can start over

33:12 and now your files are clean and it can work.

33:14 So what I just did was, I was like, well, we only have the one automated spot.

33:18 So I whipped up a little program in Selenium that goes in and submits my blanks every night

33:24 at nine o'clock at night.

33:25 So I'm always working off of the clean files.

33:28 And it's something I would never think of to do, but I could do.

33:31 It's a bit like Kim's project.

33:32 You know, I could have done that, take five minutes at the end of every night and submitted

33:36 my blanks and then let everything else happen afterwards.

33:39 But it just seemed really easy for me to go ahead.

33:41 It was a, it was a great puzzle to find out, you know, how to navigate around inside Selenium,

33:45 inside this older looking website.

33:48 But it was a, it was a great solution for me and I don't really get the errors anymore.

33:51 And because we can address things, you know, that day, it's really improved my job tremendously.

33:57 So I'd say it takes, I would say it saves me hours a week just being able to have this

34:02 little tool automated.

34:03 That's fantastic to just like reset the errors.

34:06 Yep.

34:08 Talk Python to me is partially supported by our training courses.

34:11 Do you want to learn Python, but you can't bear to subscribe to yet another service?

34:16 At Talk Python training, we hate subscriptions too.

34:19 That's why our course bundle gives you full access to the entire library of courses for one

34:24 fair price.

34:25 That's right.

34:26 With the course bundle, you save 70% off the full price of our courses and you own them

34:30 all forever.

34:32 That includes courses published at the time of the purchase, as well as courses released

34:36 within about a year of the bundle.

34:38 So stop subscribing and start learning at talkpython.fm/everything.

34:44 So I would say Selenium is the PyWin auto, but for the web, right?

34:49 The equivalent of that is such an amazing tool for that kind of automation.

34:53 Yeah.

34:53 Because we've got things like Beautiful Soup and we've got requests and Scrapey and stuff,

34:58 but they don't so easily just go, let me go over here, log in, you know, enter my username

35:04 and password here, click the button called login, then go to this page and then do that thing.

35:08 It's amazing, right?

35:09 I think that's definitely one of the secrets.

35:11 Select these 10 files and yeah, it's really good.

35:14 That was one of the reasons why, you know, with my previous one, the dashboards, I had

35:19 to create that web app, that simple web app to like upload stuff.

35:22 Because at first, my first thought was like, well, I'll just go to the website and scrape

35:27 it with like Beautiful Soup.

35:28 But then when you start getting like JavaScript frameworks and things like that, that come into

35:32 play, you're just, you can't get that.

35:34 You're scraping little curly braces that are just where the data would go.

35:38 Yeah.

35:38 I cycle in my spare time.

35:39 So they came out of these Velo Sambos from Adidas, which were like cycling shoes, but

35:43 they look like soccer shoes, which I was like instantly in love with.

35:46 They sold out within seconds every time they put a new batch up.

35:50 So I actually used Selenium and I kind of automated a check every three hours to kind of go in and

35:54 scrape it and send me an email if my size was in.

35:56 And I eventually got them.

35:58 But yeah, so it was a really cool little fun project that I just kind of used everything

36:01 I learned in this to go ahead and make that happen.

36:04 That's awesome.

36:05 You should do that for a PlayStation.

36:06 They build everything out of JavaScript.

36:10 So it's really hard to get.

36:11 So you couldn't do it with Beautiful Soup.

36:12 I had to go in and grab it this way.

36:15 Yeah.

36:15 Yeah.

36:16 Very cool.

36:16 Rivers, did you use Selenium when you were getting that schedule for your, when you were

36:21 scoring?

36:21 I definitely use Selenium a lot.

36:23 I think I use it in the app I'm going to mention next, I think.

36:28 So maybe I'll talk about it then.

36:29 Yeah.

36:30 Yeah.

36:30 Yeah.

36:30 That's awesome.

36:31 Yeah.

36:31 When I was trying to scrape from our agent's web service, I was trying to use Selenium.

36:36 Yeah.

36:37 Yeah.

36:37 Very cool.

36:37 I kind of wanted to just mention one other thing, Michael.

36:40 I had the mic here.

36:41 Just the way that I've been automating things.

36:44 I used a lot of Raspberry Pis in the early days to use Cron jobs to kind of fire these off.

36:49 Because I know that's something that I had trouble figuring out when I wanted to start automating

36:53 things was how to make it happen when you wanted.

36:54 And I had a guy that was a heavy Linux guy who was able to help me figure out, you know,

36:59 kind of how to do that with Cron jobs and things.

37:01 And then I moved on to an app on my Mac called Launch Control that helps create demons and things

37:06 like that, which is really, I found really helpful.

37:08 So those are some great tools to help make these things happen on the time that you want it.

37:13 Yeah.

37:13 That's really neat.

37:14 On my Mac, I install stuff with Homebrew.

37:16 And a lot of times you can install it as a service as well.

37:19 And it behind the scenes will basically run the launch control stuff, install something like

37:23 MongoDB or something on your Mac, which gives you slightly simpler commands to do it.

37:27 But it's got to be like lined up just like that.

37:29 That's cool.

37:29 Yeah, that is actually quite handy.

37:31 The other thing that is maybe worth looking at if you wanted to do that kind of automation

37:35 for stuff that's not just on your own machine, the GitHub Actions, which I'm not particularly

37:39 familiar with, or GitLab itself has got some very powerful, effectively free to use until

37:45 you get quite heavily involved CI.

37:47 And I've forgotten what CI stands for right now.

37:49 Continuous integration, that's the word.

37:51 But really, it's just automation.

37:52 At a particular time, do this thing.

37:54 That can be quite powerful.

37:55 I really want to try and figure this out because what I want to do is I put everything on GitHub

37:59 and then I just, you know, get up, pull it on the remote computer that's actually, that's

38:04 on all the time.

38:04 But I want to be able to figure out how to make it update when I, you know, when I push,

38:08 just make it auto updates.

38:09 That should be fairly doable.

38:11 That's what everybody says.

38:12 Again, my GitHub Action experience is not great, but certainly if you can do it on GitLab,

38:17 I'm sure you can do it.

38:18 Yeah, I've heard.

38:18 The CI tools are all geared around this kind of thing.

38:20 I've heard whispers, but I'm looking for it.

38:22 Something's changed in the code chat.

38:23 Do something.

38:24 Let's chat, Rusty, because my topic is actually designed for GitHub Action.

38:29 Wow, fantastic.

38:29 I'm glad I shaved today.

38:33 Yeah, yeah.

38:34 Yeah, I mean, if I can put my DevOps hat on, that CI kind of stuff is bread and butter for

38:40 us.

38:40 It makes a heck of a difference because it means when the developers make changes to their

38:45 code, they don't have to know how to go about and deploy things or build things and so forth.

38:48 It just happens.

38:49 It basically happens for them.

38:51 That's fantastic.

38:51 I also set up an automation, so if I get pushed to a certain branch, I'll just automatically

38:56 do a zero downtime redeploy of the Talk Python training infrastructure and stuff like that,

39:01 which is so fantastic.

39:02 Rivers, you mentioned Source Control before.

39:05 You guys are using GitHub for your kind of stuff.

39:08 Is there Source Control plus music going on here?

39:11 That's one of my many weaknesses because I'm usually just working on my own.

39:15 I haven't had much use for that sort of collaboration tool.

39:18 I do have my own website, so it does go through GitHub.

39:22 I've recently started volunteering.

39:24 I'm like a volunteer coder with this other group of people.

39:28 And I'm going to have to learn a lot more of this, of these Git tools, push, pull, all

39:35 that.

39:35 Once you have a need for it, I think it's easier to learn.

39:38 You know, until then, it's all just something you hear about.

39:41 But then it's like, oh, now I need this.

39:42 Now I can dig in and figure it out.

39:44 Yeah, if I could basically make one suggestion, if you are currently making changes to your

39:49 software by making final final.version.2 kind of files on your hard drive, look into version

39:54 control.

39:54 It doesn't have to be Git, but Git is effectively one in this argument.

39:57 It really is by far the most well-used one.

40:00 Even if you never collaborate with it, just the ability to use a version control system to

40:04 basically see what your code looked like yesterday or when you made the last, the change you made

40:09 three changes ago, compare them to each other, those kinds of things.

40:12 Until you have that capacity, you don't really kind of think about how you thought it would

40:16 be.

40:16 Once you're able to do it, you cannot really imagine not being able to do it.

40:21 You're saying even if I'm not collaborating with anyone, it's still very useful to involve

40:27 Git.

40:28 Yeah.

40:28 I think I've probably collaborated in my personal projects once with someone, but I wouldn't dream

40:33 of not using something like Git for anything I've ever written just because I know I'm not

40:37 going to remember, I'll have this vague memory that a week ago I made some change that actually

40:42 would be useful to have back now.

40:44 And Git's got that kind of history.

40:45 It'll show me that a week ago I made a push that said, you know, tweaks the Prognob Decator

40:49 knob or something like that.

40:50 And I'll go and look at that and do a comparison against what I've got now.

40:54 Yeah.

40:54 That sounds great.

40:55 I've been using the poor man's version control, which is my Dropbox history.

41:00 I just refer to like the state of the folder three months ago.

41:04 Yeah.

41:05 Yeah.

41:05 That is super handy.

41:06 But like just the ability to see, like, I want to see how it was two weeks ago when

41:10 it worked like I expected.

41:11 And now it doesn't anymore.

41:12 Tell me, why did I break it?

41:14 What did I do?

41:14 Right.

41:15 And then you don't make it public, right?

41:18 No, no, definitely not.

41:19 No, no, definitely not.

41:21 Yeah.

41:21 Yeah.

41:22 I feel like we all have been there with Zach the hacker.

41:24 Like once you've accidentally lost eight hours worth of work because of misunderstanding

41:28 of Git, you probably, that's when you.

41:30 Yes.

41:30 I've given talks on the data I've lost from bad Git commands.

41:35 Or because you didn't commit something and you really, really wish you did.

41:38 Yeah.

41:39 Yeah.

41:39 If we had more time and some beers, I would definitely be able to tell some good horror

41:43 stories to that.

41:44 But I think it's, Kim, you're up next on the sharing, right?

41:48 I just wanted to just finish off that Git discussion.

41:50 Just another, just to comment on what you were saying there, Rivers.

41:54 In terms of making it public, Git itself never necessarily needs to leave your hard drive.

41:58 You could run Git entirely locally if you wanted to.

42:00 And it's still useful as a version control system.

42:03 GitHub is just a publicly accessible Git tool.

42:07 And it's not the only one.

42:08 GitLab exists as well.

42:09 But even there, you don't have to share anything.

42:11 You can do it all privately as long as you're the only person ever seeing it.

42:14 But it's still useful.

42:15 Right.

42:16 Interesting.

42:17 Yeah.

42:17 I'd never do it that way.

42:18 But you're right.

42:18 You could just do Git and just save it there, right?

42:20 It is something you could do if you wanted to.

42:22 Yeah.

42:22 Yeah.

42:23 If it were in Dropbox, it'd be backed up even.

42:25 Yeah.

42:25 Exactly.

42:26 Lots of us are using GitLab and GitHub as offsite backups of our files, not necessarily to

42:31 collaborate with anyone on them.

42:33 Oh, yeah.

42:33 That's absolutely true.

42:34 In my case, we're back to PDFs, actually.

42:39 And manipulating the data in them, although not CSVs this time.

42:42 The second little tool I wanted to talk about was, again, doesn't have a name.

42:46 And in fact, this ties into a previous example.

42:49 This is in my GitLab, but it's one of my private GitLab repos because it involves some kind of

42:54 data that the world doesn't need to see.

42:55 That has basically my wife and several of her colleagues regularly receive large PDF documents.

43:02 She's in the financial services industry.

43:04 That's got 60 to 70 people's account details in them.

43:08 So it's three pages per person.

43:10 So you can get a 200-page document.

43:11 And they then basically need to split those up and send them to each of the individual recipients.

43:16 And similarly to what you were saying earlier, Rusty, you get your CSV data in a PDF.

43:20 It'd be much more convenient if you could get that CSV directly.

43:23 In this case, it'd be much more convenient if you could get 70 people's separate files.

43:27 But that's just not how they come.

43:28 You can't go to the provider generally and say, do something else.

43:32 What you get is what you get.

43:34 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,

43:40 selecting the first three pages and saying, save these three as this person's name.

43:44 Then the next three and save these three as this person's name and that kind of thing.

43:48 It was actually surprisingly easy to use some Python to write them a tool to make life a lot easier on their side,

43:52 which effectively opened the PDF.

43:55 And I had a comment on the name of it.

43:57 What did I use?

43:58 PyMoo PDF, which I had never heard of before.

44:01 I see you've got that one.

44:02 I've never heard of that either.

44:03 I don't know.

44:04 In fact, I haven't looked at it since I wrote this thing.

44:07 I'd forgotten what it was called.

44:08 It used to be called FITZ.

44:09 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.

44:18 And this is actually, it's a remarkable project.

44:20 You split up everything in your PDF.

44:23 You can basically access all the text fields.

44:25 And once I'd done that, it was a lot of kind of trial and error.

44:29 I split up each page and printed out all the fields until it looked like the one I wanted.

44:33 And when I had that, now it's just a simple loop that goes through each page.

44:36 And if the page happens to have the details of an account holder on it, then that's a new document.

44:40 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.

44:48 And within seconds, it's spitting out 70 PDF files with automated names.

44:53 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.

45:00 It's trying to be smart about it.

45:01 But ultimately, it's easy enough to identify who the file belongs to.

45:05 And that was saving hours and hours of time.

45:08 Yeah.

45:08 And that's really rough error-prone work that you go to this big PDF and break it up.

45:13 PDF's a bad format.

45:14 That's not right.

45:15 Yeah.

45:16 Once you use a tool like PyMoodie, if you break the PDF up, I mean, it's all, it's little bits of text.

45:21 There's a full stock here and there's two commas in separate text fields.

45:24 They look perfectly fine when rendered, but when broken up, they're terrible data format.

45:28 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.

45:40 Yeah.

45:40 Yeah.

45:41 That's super neat.

45:41 Another thing you mentioned in the notes is GUI.

45:44 GUI, yes.

45:46 GUI is a beautiful thing.

45:47 I think GUI is really interesting.

45:49 I vaguely recall every now and then on Python Bytes, you brought them up briefly.

45:52 You don't discuss GUIs much, but every now and then you vaguely discuss that.

45:56 Oh, wow.

45:56 Yeah.

45:57 Yes, actually.

45:59 GUI is magnificent.

46:01 They come in waves.

46:02 GUI.

46:03 G-O-O-E-Y.

46:04 As in UiGUI, but it creates a GUI GUI for applications.

46:09 What I really like about GUI is that when I develop things, I'm very much a Linux-based developer these days.

46:14 So I don't really want to be developing a GUI app at all if I can avoid it.

46:19 A command line is perfectly fine for what I want.

46:20 So I wrote this tool as a command line tool and then just basically attached GUI to it.

46:25 And then I think two or three lines of code.

46:26 I think it's really just a GUI decorator on one of my functions.

46:30 It produces on this.

46:32 If you guys are watching it, people on the live stream, you can have this look at GUI.

46:36 It just makes really basic looking GUIs in form layout that pretty much taking every option you could give in the command line.

46:43 Yeah.

46:43 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.

46:51 Exactly.

46:51 It would be the command line arguments.

46:52 Like this is it.

46:53 And then you package it up with I2 installers.

46:56 Is that right?

46:56 That's what I did.

46:57 Yeah.

46:57 Or PI installer, I think.

46:58 PI installer.

46:59 Yeah.

46:59 Yeah.

46:59 Sorry.

46:59 You're thinking PI2.exe perhaps.

47:02 I'm thinking PI2.app.

47:04 You're thinking PI2.app.

47:04 Sure.

47:04 So PI installer is beautiful.

47:08 So with a bit of, I wrote the code.

47:09 I got it working in the command line.

47:11 I was happy with it.

47:12 Attached GUI to it.

47:13 And suddenly I have a GUI, which isn't a Windows only thing.

47:15 It works just fine on a Linux box too.

47:17 And then PI installer to make an exe.

47:19 And I can hand a tool over to somebody else.

47:22 And they need no Python.

47:23 They need no installation expertise.

47:25 I'm certainly not going to be able to explain to people who aren't in the technical industry

47:28 how to open a command prompt on your Windows machine, find where you put this file, and

47:32 then give it command line arguments.

47:33 That's not reasonable.

47:34 Right.

47:34 Oh, yeah.

47:35 And also set up a virtual environment.

47:37 Make sure you have the right version of Python.

47:38 Install the requirements.

47:39 Like, this is not going to fly.

47:41 No.

47:41 Exactly.

47:42 Like, why did you not build me an app?

47:43 Even at the exe distribution level, I mean, you can make an exe that's command line only,

47:47 but no one's going to want to use that.

47:48 Unless, like me, you prefer not to ever use the mouse.

47:51 But most people aren't like me.

47:52 They want a tool that they understand on the screen.

47:55 So GUI is beautiful for that.

47:56 Yeah.

47:56 Yeah, absolutely.

47:58 That's awesome.

47:58 Thanks for sharing that.

47:59 All right.

47:59 A couple of live stream comments I'll throw out here.

48:02 Got one.

48:02 I once worked for almost like three weeks on a project in a company that had commissioned

48:06 me.

48:07 Then the server crashed.

48:08 My backup got fried and I lost everything.

48:10 Yeah.

48:10 So good reason to put stuff.

48:12 Ouch, indeed.

48:13 Yeah, I've been there.

48:13 Good reason to put stuff up on maybe like GitHub private repos or something like that.

48:18 And then also Reginald.

48:19 Davis came here to show love to my guy, Jay.

48:22 Hey, Reginald.

48:23 Thanks for being here with all of us.

48:24 Let's see.

48:25 So now we're on.

48:27 You're up next, Jay.

48:28 Awesome.

48:29 So like most of us have and at some point in our lives, I built my own website.

48:35 I would say I don't think the show isn't going to be sponsored by like Squarespace or anything,

48:39 is it Mike?

48:39 Because I'm going to I'm going to give you the perfect reason.

48:42 I'm perfectly acceptable to let the sponsor.

48:45 So I built my site.

48:49 I made a static site generator.

48:51 And one of the things that my brain is kind of buzzing right now because I actually just launched

48:57 a new podcast on Relay FM called Conduit.

48:59 And like the first episode went live the same time this live stream did.

49:03 So there's like a bunch of stuff happening in my head.

49:06 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.

49:21 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.

49:36 If I'm a guest, like if I'm just a regular guest, it'll just check to see if I'm a guest.

49:39 If it's there, then it'll it'll create the blog post for me using the summary for the show.

49:45 So now I do a show every Tuesday I do, you know, conduits going to be biweekly.

49:50 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.

50:00 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.

50:09 And it's perfectly free, perfectly within the realm of it.

50:13 And I don't know, it's just one of those things.

50:15 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.

50:28 And I mean, I love data and I love data that's well defined.

50:31 So that's kind of my tool.

50:33 And feed parser is kind of the thing that that really makes that happen in conjunction with GitHub Action.

50:38 Yeah, feed parser is super neat.

50:39 If you're working with some kind of RSS feed, you could approach it from a like ground up thing.

50:46 I'm going to use requests and I'm going to use elementary and do my XPath queries.

50:51 And you're like, whoa, but it has just this format, right?

50:53 So you could use feed parser and it just turns this into like a dictionary of dictionaries, which is so much nicer.

50:59 Yeah.

50:59 So you don't have to worry about the RSS format.

51:01 Yeah, it's a quick and easy one.

51:02 So it's a nice example of taking a higher level Python library, you know,

51:07 maybe a good place to look would be awesome Python or something like that to go.

51:11 Instead of just saying, I'm going to start from scratch.

51:13 You're like, OK, well, I'm going to go over here and find the audio section.

51:15 And then over here, I want to do like Liberosa for the audio and music analysis.

51:20 And so we're going to go with that and then like see if that's going to solve my problem.

51:24 Right.

51:24 So I'm trying to start with something higher level.

51:26 You know, something I forgot.

51:28 Now, this reminds me that I was going to ask you about.

51:31 Have you done anything with FoxDot?

51:33 No.

51:33 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.

51:45 It's like the sort of interactive and not quite IDE, like a REPL for music.

51:51 It's something pretty interesting.

51:52 For making music?

51:53 Yeah.

51:53 For making for like live performance.

51:55 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.

52:05 And the performances of it are really, really interesting.

52:07 I'll check it out.

52:08 I think GitHub Universe used this for like their intro this year.

52:13 Like they had a live DJ that was like writing code to make the actual music live.

52:19 It's like so now DJ sets are being controlled via Python.

52:22 I love that.

52:23 It's fantastic.

52:24 Yeah.

52:24 Yeah.

52:25 I love it.

52:25 Just remembering at the end of the 2020 Python ZA conference, which I was attending, was purely online.

52:31 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.

52:40 It's actually quite an interesting idea.

52:42 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.

52:48 But the fact that the way they do it is really impressive.

52:50 Yeah.

52:51 Cool.

52:51 Rivers got a quick shout out in the live stream there.

52:53 I love Rivers.

52:54 You're pretty epic.

52:55 The Sarah DM says awesome.

52:57 Definitely.

52:57 We all agree.

52:58 Speaking of Rivers, I think you're next.

53:00 And before we move on, just Jake, congrats on the new podcast.

53:03 That's cool.

53:03 I'm already subscribed.

53:04 All right, Rivers, you're next.

53:05 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.

53:19 Oh, yeah.

53:19 Which makes use of FF Probe and Labrosa.

53:24 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.

53:33 I'll access spreadsheets of my managers and see what comments they've left on these demos or ratings.

53:42 That's awesome.

53:42 And you have automation back over to Google Sheets as well, right?

53:46 I mean, that's how I got into coding in the first place was from spreadsheets, especially Google Sheets.

53:51 Just getting tired of like trying to work those formulas in those little cells.

53:56 I went on, was it Fiverr?

53:59 And had some people code me some scripts to help with the spreadsheets.

54:05 And then I just started looking at the code.

54:07 I was like, well, this is pretty interesting.

54:09 And from there, I just got into it on my own.

54:11 Yeah.

54:12 So, what's the last one you want to share?

54:13 Is that there or you got another one?

54:15 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.

54:21 And so, I'm just constantly listening to music.

54:24 I feel like I don't need to hear a song more than once or twice and then I kind of get it.

54:28 And then I just want to hear more new music.

54:30 And by new, I mean new to me.

54:32 So, there's tons of old records, classic records I still haven't heard yet.

54:36 So, it's very tedious to go through the Spotify app every day and try to find stuff for myself.

54:41 So, I have an app called New Music that assembles a playlist for me.

54:47 First of all, using Beautiful Soup, it goes to all the online charts so I can get like the,

54:54 whatever the hot songs in the different formats are, gets a few of those.

54:58 And using a package called Spotify.

55:01 Spotify, okay.

55:02 Yeah.

55:03 It accesses the Spotify API and I can access any playlists from there.

55:09 So, I go on to all the editorial playlists like Today's Top Hits or Wrap Caviar, whatever it is.

55:16 But then I can also access any user playlists, playlists my manager shared with me or playlists I've created.

55:22 And I grab a random sample from each of those.

55:25 Some of the parameters are hard-coded in that script.

55:28 But then I also came up with the idea of creating a front end with a Google sheet.

55:34 So, in the Google sheet, I can see one column is all the different playlists I'm drawing from.

55:40 And then another column is how many songs I want to pull from there each day.

55:43 Another column would be like, how long do I have to wait before a song is allowed to come in again?

55:48 That's super cool.

55:49 I love how you've automated this to go basically scrape through that.

55:53 Because, you know, these streaming services, they're great.

55:56 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.

56:03 Yeah.

56:03 I can also control what songs, what artists, and what genres are banned.

56:08 And, you know, with Python, I can create more complex algorithms.

56:12 So, like, I only want to hear hip-hop from before 1996.

56:16 Except for Kanye and Cardi B.

56:18 I'll let those ones through.

56:20 Yeah, yeah.

56:21 Very cool.

56:21 Whatever you want.

56:22 I only go to that same playlist every day.

56:24 It makes my life a little simpler.

56:25 Wow.

56:26 That is so neat.

56:26 And I, you know, I did not plan this.

56:28 I don't know.

56:29 This is just sort of some awesome inception thing.

56:32 So, I pull up the PyPI listing for Spotify.

56:35 And their documentation shows how to get the show list from you, Rivers.

56:42 This feels like a setup.

56:43 This does feel like a setup.

56:45 I have not seen that before.

56:49 I think that's a recent change.

56:51 Yeah, yeah.

56:52 Brian out in the live stream also.

56:53 I noticed that.

56:55 That's awesome.

56:55 And then Zachary the hacker says, Rivers, please tell me this app.

56:59 It's available.

57:00 This sounds amazing.

57:01 I need it.

57:02 Yeah, it was one of the very first apps I tried to publish online.

57:06 And so, it was super janky.

57:08 And I don't think it works at all anymore.

57:10 But yeah, maybe.

57:11 I found that people didn't use it in the way I expected them to.

57:16 Most people, they would say they would just put in the name of an artist or the name of

57:21 an album.

57:21 And really, it's more useful for sampling from playlists.

57:24 Because then you have a much greater variety.

57:27 People would just go and put in their favorite three bands.

57:29 And the results weren't all that impressive.

57:31 Yeah, yeah.

57:32 Guess what?

57:32 You know, with music from your three favorite bands.

57:34 There was a talk last year by Gotham by Angeline Protasio called The Album Discoverer, which

57:41 was like an album recommendation system that uses something similar to this.

57:45 But it was like going into a deep dive of Spotify's API.

57:49 And I mean, I will give Spotify all the props because there's just so much information and

57:56 stuff that is like similar to like your previous example, Rivers, where you had these variables

58:03 that most people who don't think about music wouldn't think about originally.

58:08 Like they're like, is it somber?

58:10 Does it have good gut feel?

58:11 Like stuff like that.

58:12 And you're just like, I don't know how you quantify that.

58:15 But at the same time, like the talk was really interesting because it showed like a comparison

58:20 of tracks that were in different genres, but had similar feelings.

58:25 And it was a really cool example.

58:27 And I've been trying to find it online while you when you mentioned it, but I can't find it.

58:31 So I'll have to reach out to the PyGotham team and see if I can get, you know, find out where

58:35 that link is.

58:35 Yeah, I know just what you're talking about.

58:37 And Spotify gives you access to all that data.

58:40 That being said, I'm skeptical of a lot of it because I've seen the data on my own songs.

58:47 And like we covered Take On Me by AHA, which is a very danceable song, especially compared

58:55 to a regular one.

58:56 Yeah, especially compared to normal Weezer song.

58:59 You'd think that would be rated very high on the parameter of danceability, but it's

59:04 they rated as one of our least danceable songs.

59:07 Oh, interesting.

59:08 Very cool.

59:09 I love this look at how you're interacting with music because it's really different than

59:14 I think a lot of people out there just looking for something in the background.

59:17 Cool.

59:18 I must admit, I think you're onto something here.

59:20 You were saying there, Michael, if you just let Spotify do its own thing, it'll say to you,

59:24 here's the things you've listened to again and again and again, including the things

59:27 you've always skipped, which we are convinced you'll listen to if you play enough.

59:29 But I should be doing this.

59:31 I should craft it more deeply to kind of get exactly what I want to listen to or at least

59:35 things that sound like stuff I like to listen to.

59:38 This is brilliant.

59:38 Yeah, absolutely.

59:39 And Jesus out there in the live stream.

59:42 Welcome, welcome.

59:43 There's an awesome app reverse.

59:45 Please share so I can get an automated Chimba Wamba playlist.

59:48 Fantastic.

59:50 Yeah, I agree.

59:51 That's a really, really cool one.

59:52 All right.

59:52 I want to share one.

59:53 I'll be really quick since we're at the end.

59:54 This is my second one as well.

59:55 This brings together a lot of pieces.

59:57 It is ridiculously simple.

59:59 Like you're almost like, why would you ever do this?

01:00:02 So I built this app and it has a screenshot because it's an app that runs in the Mac toolbar

01:00:07 in the notification area by the clock.

01:00:09 And this is primarily why I even wanted to bother bringing this up because if you've got

01:00:13 these little scripts, like Kim talked about GUI, which is a cool thing you package up as

01:00:17 an EXE you can share.

01:00:18 But sometimes you just want like a little notification thing or something that might listen to a hot

01:00:22 key that can just like live up there.

01:00:24 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 podcast.

01:00:28 I will take the title of a course video and thousands of them.

01:00:31 And I want to turn that into a file name that will work well.

01:00:36 So I have this little app I called URLify, which is probably poorly named, but it does like

01:00:40 simple little text transform.

01:00:41 So it uses Piperclip again, and I can just click a thing and it'll turn it into something that

01:00:46 would look as like a slug for URL.

01:00:47 So like if it was the playlist with spaces and a capital T, it'll be all lowercase with dashes

01:00:52 and it'll strip out symbols that wouldn't work.

01:00:54 Right.

01:00:55 So that actually turned out to be incredibly helpful because I can always reliably name

01:00:59 stuff the same.

01:01:00 And anytime I put something in, I just copy like the title of a presentation and then I

01:01:05 hit that button and it turns it into the, just the right file name.

01:01:08 And then that app I talked about before, it'll actually read that in the reverse engineer

01:01:11 it back into like, like a title, like with case, the right casing and stuff again.

01:01:17 So it actually sort of comes all around about, but the thing to build this is there's this

01:01:21 app called rumps and I'm just be careful when you search for this, I'll link to it rumps.

01:01:25 And it's an acronym for ridiculously uncomplicated macOS Python status bar apps.

01:01:31 So glad it has a shorter name, but just like GUI, like there is a full on application on the

01:01:37 screen here that you can find on the, the PyPI listing, which I don't know, what's that?

01:01:41 12, 15 lines of code.

01:01:43 And you've got a notification app that pops up little macOS toast runs as a .exe, not

01:01:48 a .app in your Mac bar there, which I built the .app with, Py2 app.

01:01:54 So yeah, that's two really cool things to put together to just like, I want something that's

01:01:58 always up in my Mac bar.

01:01:59 There's probably something like this for the taskbar and windows, but I haven't found it.

01:02:03 So, That sounds like a great little free course.

01:02:06 Yeah, it does.

01:02:08 It does.

01:02:09 Maybe I should just take a week and fill it down.

01:02:11 I've actually been thinking about building like little notification app, like a simple,

01:02:15 simple GUI, like GUI, GUI at G O O E Y.

01:02:19 And like this, and maybe that taskbar one.

01:02:20 You can fork archive project that I have then.

01:02:23 Cause I actually used rumps to make like a, like we've all seen those little timer apps

01:02:28 where you can put a bunch of dates in and it'll tell you like how soon until that thing was

01:02:32 happening.

01:02:33 Yes.

01:02:33 I made an app called wins at that.

01:02:34 I just like put on GitHub and it was just like, I'm not going to develop this anymore.

01:02:38 So I'll send you the link for it, Michael.

01:02:40 But the thing I like about this is there are so many tools that just do the thing and do

01:02:45 it like really simple, really quick.

01:02:47 And when you think of stuff like, what is it?

01:02:49 PipX, where you can just call a command directly from your command line and it just runs and

01:02:54 does the thing.

01:02:55 Like that's always nice.

01:02:57 And then doing things like rumps where it's like, okay, I want to do this thing normally,

01:03:01 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 I think it's super awesome to, you know, we've talked about these big programs or these things

01:03:10 that change our lives, but sometimes it's even just like the little things that you can

01:03:14 look to see when, how, you know, how soon before your anniversary is coming up so you

01:03:19 don't forget it or like, Hey, when is that big meeting that I'm supposed to be preparing

01:03:24 for?

01:03:24 When is that big conference presentation or when a CFP deadline is due?

01:03:27 And you can, you can just make a little applet that you just run every now and then and get

01:03:32 results like that.

01:03:33 Yeah.

01:03:33 You're making me think that the next one that I want to build is one for when I go live

01:03:38 stream on a recording.

01:03:39 I want to send out a tweet.

01:03:40 I want to update the website.

01:03:41 So as a little banner, we're live streaming right now, all those kinds of things.

01:03:44 That just seems like another one up there.

01:03:45 I just click.

01:03:46 I like a little button that opens up my Jupyter notebooks, you know, like I always have to clear

01:03:51 my desktop all over.

01:03:52 So I would, I would take the time to make something like that would be cool.

01:03:55 Yeah.

01:03:55 That'd be super neat.

01:03:56 All right, guys.

01:03:56 It looks like we're a little bit over time, but so many interesting things.

01:04:00 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 we've all just, this has basically been the entire show, like these little libraries.

01:04:08 I normally ask, you know, what's your favorite PyPI package you want to recommend?

01:04:11 But like, we've got 30 of them.

01:04:13 So that was a show.

01:04:14 It was awesome.

01:04:14 But just really quick, I'll go around for the final question.

01:04:17 Favorite editor.

01:04:18 Start VS Code again.

01:04:19 Rusty.

01:04:20 Right on.

01:04:20 Kim?

01:04:21 Emacs still.

01:04:22 I'm probably always.

01:04:23 Emacs.

01:04:23 Right on.

01:04:24 Yeah.

01:04:24 You like to type on an operating system that is itself artificial intelligence.

01:04:28 Pretty much, yeah.

01:04:29 Yeah.

01:04:29 Reverse.

01:04:30 VS Code.

01:04:31 Okay.

01:04:31 Right on.

01:04:32 That's a good one.

01:04:33 Jay?

01:04:33 The war begins, Kim.

01:04:34 Vim.

01:04:35 Well, Vim you said at least.

01:04:37 At least you're using the M version.

01:04:39 Neo Vim.

01:04:39 Yeah.

01:04:39 Yeah.

01:04:40 Neo Vim, I should say.

01:04:41 Awesome.

01:04:42 I can tolerate Vim.

01:04:44 Basically, yeah, I can tolerate it, but if I have to very, very slowly get things done.

01:04:48 Because basically the problem, and I'm sure you've, this probably happens less to Vim guys.

01:04:52 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 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 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 Yeah.

01:05:09 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 And I'm just like, oh, no, it's just typing.

01:05:18 Yeah.

01:05:18 I'm reminded of the joke.

01:05:20 Like, how do you generate a random string?

01:05:22 You give a first year computer science student Vim and you tell them to exit it.

01:05:26 Yes.

01:05:30 All right, you guys.

01:05:31 Thank you so much for being here.

01:05:32 It's been really great.

01:05:33 Everyone is doing such neat stuff.

01:05:35 And I'm sure we're going to inspire a lot of people, even ourselves.

01:05:38 Like Rusty's like, I need a button to launch on my Jupyter Notebooks, right?

01:05:40 I'm going to do one for live streaming.

01:05:42 So thank you.

01:05:43 Thank you all for being here.

01:05:44 It's been great.

01:05:45 Thank you.

01:05:45 Thanks, Michael.

01:05:46 That was fantastic.

01:05:46 Thank you, everyone.

01:05:47 Yeah.

01:05:47 Yeah.

01:05:47 You bet.

01:05:48 Bye.

01:05:48 Bye.

01:05:49 Bye.

01:05:49 Bye.

01:05:50 This has been another episode of Talk Python to Me.

01:05:53 Our guests on this episode have been Rivers Cuomo, Jay Miller, Kim VanWaik, and Rusty Gregory.

01:05:59 And it's been brought to you by Linode, us over at Talk Python Training, and the transcripts

01:06:03 are provided by Assembly AI.

01:06:05 Simplify your infrastructure and cut your cloud bills in half with Linode's Linux virtual machines.

01:06:10 Develop, deploy, and scale your modern applications faster and easier.

01:06:13 Visit talkpython.fm/Linode and click the create free account button to get started.

01:06:19 Transcripts for this and all of our episodes are brought to you by Assembly AI.

01:06:23 Do you need a great automatic speech-to-text API?

01:06:25 Get human-level accuracy in just a few lines of code.

01:06:28 Visit talkpython.fm/assembly AI.

01:06:31 Want to level up your Python?

01:06:32 We have one of the largest catalogs of Python video courses over at Talk Python.

01:06:36 Our content ranges from true beginners to deeply advanced topics like memory and async.

01:06:42 And best of all, there's not a subscription in sight.

01:06:44 Check it out for yourself at training.talkpython.fm.

01:06:47 Be sure to subscribe to the show.

01:06:49 Open your favorite podcast app and search for Python.

01:06:52 We should be right at the top.

01:06:53 You can also find the iTunes feed at /itunes, the Google Play feed at /play,

01:06:58 and the direct RSS feed at /rss on talkpython.fm.

01:07:04 We're live streaming most of our recordings these days.

01:07:06 If you want to be part of the show and have your comments featured on the air,

01:07:09 be sure to subscribe to our YouTube channel at talkpython.fm/youtube.

01:07:14 This is your host, Michael Kennedy.

01:07:16 Thanks so much for listening.

01:07:17 I really appreciate it.

01:07:18 Now get out there and write some Python code.

01:07:20 Now get out there and write some Python code.

01:07:20 I'll see you next time.

Back to show page
Talk Python's Mastodon Michael Kennedy's Mastodon