WEBVTT

00:00:00.001 --> 00:00:03.860
Some of the best songs are cover songs of popular music from earlier eras.

00:00:03.860 --> 00:00:06.840
If you're a musician who wants to create a cover song and actually sell it,

00:00:06.840 --> 00:00:11.160
you'll be diving deep into the complex agreements and legal arrangements with record labels.

00:00:11.160 --> 00:00:12.660
Sounds like no fun to me.

00:00:12.660 --> 00:00:14.960
But this is where Python comes to the rescue.

00:00:14.960 --> 00:00:20.560
The people over at Louder are using Python to run a service for creating, selling, and distributing cover songs.

00:00:20.560 --> 00:00:23.440
This week you will meet one of the co-founders, Josh Welchel.

00:00:23.440 --> 00:00:28.280
He's here to tell us all the cool ways Python makes this possible, including a touch of machine learning.

00:00:28.620 --> 00:00:33.640
This is Talk Python To Me, episode 70, recorded July 29, 2016.

00:00:57.240 --> 00:01:05.320
Welcome to Talk Python To Me, a weekly podcast on Python, the language, the libraries, the ecosystem, and the personalities.

00:01:05.320 --> 00:01:07.440
This is your host, Michael Kennedy.

00:01:07.440 --> 00:01:09.440
Follow me on Twitter where I'm @mkennedy.

00:01:09.440 --> 00:01:13.320
Keep up with the show and listen to past episodes at talkpython.fm.

00:01:13.320 --> 00:01:15.920
And follow the show on Twitter via at Talk Python.

00:01:17.420 --> 00:01:20.460
This episode has been brought to you by Rollbar and SnapCI.

00:01:20.460 --> 00:01:22.680
Hey, everyone.

00:01:22.680 --> 00:01:26.380
Quick follow-up from last week's episode about writing a programming blog with a.

00:01:26.380 --> 00:01:27.320
Jesse Jiru-Davis.

00:01:27.320 --> 00:01:37.140
Several people went to the show page and commented saying that this episode tipped them into deciding to finally create a programming blog and start contributing more to the community.

00:01:37.140 --> 00:01:38.520
I thought that was really awesome.

00:01:38.900 --> 00:01:41.680
So good luck to everyone who created a blog as a result of that episode.

00:01:41.680 --> 00:01:43.720
And I appreciate you adding your comments there.

00:01:43.720 --> 00:01:46.080
And thank you to Jesse for inspiring everyone.

00:01:46.080 --> 00:01:49.660
If you want to add a comment to any of the episodes, just go to the episode page.

00:01:49.660 --> 00:01:54.320
The one for the blog was talkpython.fm/episode slash show slash 69.

00:01:55.020 --> 00:01:56.980
Now let's do a quick update on the Kickstarter.

00:01:56.980 --> 00:02:00.400
The Python for Entrepreneurs Kickstarter is into its second week.

00:02:00.400 --> 00:02:04.620
You're probably not surprised that it's already funded and everyone seems pretty excited about it.

00:02:04.620 --> 00:02:09.260
In fact, I want to say thank you to everyone who backed it or who is still considering backing it.

00:02:09.260 --> 00:02:12.800
The campaign was fully funded in just an hour and 15 minutes.

00:02:12.800 --> 00:02:14.280
That's pretty awesome.

00:02:14.280 --> 00:02:18.360
And it's a good sign that I think Matt Makai and I are on to doing something cool for the community.

00:02:18.360 --> 00:02:23.400
I really, truly appreciate all of you who are contributing to it and helping me bring this course to life.

00:02:23.400 --> 00:02:25.100
So I want to say thank you so much.

00:02:25.100 --> 00:02:30.200
You can learn more about the Kickstarter campaign in the course at talkpython.fm/launch.

00:02:30.200 --> 00:02:33.960
Now let's talk about the intersection of music and Python with Josh.

00:02:33.960 --> 00:02:36.580
Josh, welcome to the show.

00:02:36.580 --> 00:02:37.700
Hi, thanks for having me.

00:02:37.700 --> 00:02:38.400
Oh, yeah.

00:02:38.400 --> 00:02:40.580
It's going to be really cool to talk about music.

00:02:40.580 --> 00:02:43.080
We've talked about all sorts of different things in the show.

00:02:43.080 --> 00:02:43.880
A lot of programming.

00:02:43.880 --> 00:02:45.940
We've talked about particle gliders.

00:02:45.940 --> 00:02:49.080
We've talked about font design, but we've never talked about music.

00:02:49.080 --> 00:02:51.500
So I'm really excited to have you here.

00:02:51.500 --> 00:02:52.080
It's going to be fun.

00:02:52.320 --> 00:02:54.200
Really excited to get into this conversation.

00:02:54.200 --> 00:02:59.600
There are very few opportunities to talk about music and programming together in the same interest group.

00:02:59.600 --> 00:03:00.240
So this is going to be fun.

00:03:00.240 --> 00:03:01.220
Yeah, it's going to be awesome.

00:03:01.220 --> 00:03:08.100
But before we get to the story of Louder and what you guys are up to at the company, let's just talk about you.

00:03:08.100 --> 00:03:09.120
How you got into programming?

00:03:09.120 --> 00:03:09.960
How do you get into Python?

00:03:09.960 --> 00:03:10.820
Like, what's your story?

00:03:11.120 --> 00:03:11.500
Sure thing.

00:03:11.500 --> 00:03:11.500
Sure thing.

00:03:11.500 --> 00:03:11.520
Sure thing.

00:03:11.520 --> 00:03:11.520
Sure thing.

00:03:11.520 --> 00:03:11.520
Sure thing.

00:03:11.520 --> 00:03:11.520
Sure thing.

00:03:11.520 --> 00:03:11.520
Sure thing.

00:03:11.520 --> 00:03:11.520
Sure thing.

00:03:11.520 --> 00:03:16.100
So I was one of these kids who was – I grew up on Doom, right?

00:03:16.100 --> 00:03:17.760
Basically on video games.

00:03:17.760 --> 00:03:24.540
And I think the first big memorable experience I have getting into programming was as a kid.

00:03:24.640 --> 00:03:31.120
I had come across on the internet, the very early internet for that, a little program that let you make random levels for Doom.

00:03:31.120 --> 00:03:32.640
And I have been doing that anyway.

00:03:32.640 --> 00:03:34.160
I think I actually learned most.

00:03:34.200 --> 00:03:36.300
So you were making your own Doom wads.

00:03:36.300 --> 00:03:36.860
Is that right?

00:03:36.860 --> 00:03:38.320
Yeah, Doom wads for sure.

00:03:38.320 --> 00:03:38.760
There you go.

00:03:38.760 --> 00:03:40.360
I think that's how I learned math.

00:03:40.360 --> 00:03:50.180
I was actually tweeting at Graham Devine and Louder had a conversation where I went to like class in the fifth grade and I knew the word vertices and I corrected the teacher when she said vertexes.

00:03:50.180 --> 00:03:55.300
And that was my first moment when I knew I was doomed to be a nerd for the rest of my life.

00:03:55.300 --> 00:03:55.820
That's right.

00:03:55.820 --> 00:04:00.200
But yeah, so there was a random level generator written in C. It was called Slige.

00:04:00.520 --> 00:04:03.200
I might have been actually Lige or something with the D at the time.

00:04:03.200 --> 00:04:07.540
But yeah, so I just wanted to learn what the ins and outs of that was.

00:04:07.540 --> 00:04:09.600
And so I got into programming pretty quick.

00:04:09.600 --> 00:04:12.420
Programming the Doom wads, I never actually did it.

00:04:12.420 --> 00:04:13.500
I just sort of consumed it.

00:04:13.500 --> 00:04:17.120
I think my favorite was like a Simpsons one or something silly like this.

00:04:17.120 --> 00:04:17.300
Oh, yeah.

00:04:17.300 --> 00:04:19.980
But those were not actual.

00:04:19.980 --> 00:04:21.280
They weren't done in Python, were they?

00:04:21.280 --> 00:04:22.460
No, no.

00:04:22.460 --> 00:04:25.400
And I think that might have been before Python's popularity too.

00:04:25.400 --> 00:04:27.040
But yeah, I think you're right.

00:04:27.040 --> 00:04:29.060
I think it was just barely came out at the time, right?

00:04:29.060 --> 00:04:29.340
Okay.

00:04:29.340 --> 00:04:30.340
Yeah, absolutely.

00:04:30.540 --> 00:04:31.340
Yeah, it was very early.

00:04:31.340 --> 00:04:36.340
So Python for me really started, you know, as I got older, I'll say older, but I was still

00:04:36.340 --> 00:04:36.780
very young.

00:04:36.780 --> 00:04:41.380
As I got older, I did some contract work for a company called Click Team, who was making

00:04:41.380 --> 00:04:43.300
a product called Multimedia Fusion.

00:04:43.300 --> 00:04:46.380
And the idea, if anybody really remembers, it'd be called Click and Play in its earliest

00:04:46.380 --> 00:04:46.660
days.

00:04:46.660 --> 00:04:53.520
It was a sort of a grid-based, conditional event, action-based system for programming interactive

00:04:53.520 --> 00:04:54.080
experiences.

00:04:54.080 --> 00:04:55.880
And most of the time, those would be games.

00:04:55.880 --> 00:04:56.560
That's cool.

00:04:56.560 --> 00:04:58.700
A little like Flash type stuff?

00:04:59.160 --> 00:05:02.840
Kind of like Flash, but it would actually make binary executables, right?

00:05:02.840 --> 00:05:06.300
So these are standalone, you know, deliverables, which is really awesome.

00:05:06.300 --> 00:05:07.680
Like Blender, maybe?

00:05:07.680 --> 00:05:09.600
Is that closer or a better guess is Blender?

00:05:09.600 --> 00:05:10.080
Sorry, Blender?

00:05:10.080 --> 00:05:10.780
Yeah.

00:05:11.220 --> 00:05:13.660
No, Blender is definitely more focused.

00:05:13.660 --> 00:05:14.740
It has a bit of scripting.

00:05:14.740 --> 00:05:18.740
Click Team didn't really get into scripting too much, which is what opened the window of

00:05:18.740 --> 00:05:20.060
opportunity for me, actually.

00:05:20.060 --> 00:05:24.940
They had an extension system where you could basically program an extension that would get

00:05:24.940 --> 00:05:27.940
packaged with the game as a dynamic library.

00:05:27.940 --> 00:05:29.200
So that was really cool.

00:05:29.280 --> 00:05:33.460
I learned a lot about programming fundamentals and the low-level stuff from that experience.

00:05:33.460 --> 00:05:38.100
But I basically built the library that you would use if you wanted to play a module or

00:05:38.100 --> 00:05:40.060
like an impulse tracker file.

00:05:40.060 --> 00:05:43.660
So that's like very Amiga, very DOS kind of music.

00:05:43.660 --> 00:05:44.220
You know what I mean?

00:05:44.220 --> 00:05:44.780
Right.

00:05:44.780 --> 00:05:45.300
Of course.

00:05:45.300 --> 00:05:46.240
That's awesome.

00:05:46.240 --> 00:05:50.700
So you basically made it possible to plug in like soundtracks into the games.

00:05:50.700 --> 00:05:51.340
Yeah.

00:05:51.340 --> 00:05:55.020
And the neat thing about these soundtracks is, you know, you had MIDI and MIDI was already

00:05:55.020 --> 00:05:55.520
built in.

00:05:55.520 --> 00:05:59.640
And, you know, MIDI is different on everyone's operating system, basically, especially at the

00:05:59.640 --> 00:06:01.560
time because the sound fonts would be different.

00:06:01.560 --> 00:06:05.600
And there was a real desire to have sample-based music.

00:06:05.600 --> 00:06:11.020
If there are any big video game nerds, I think the one moment in video game music history

00:06:11.020 --> 00:06:15.700
where you could tell the difference between a sample and MIDI was in Final Fantasy VII at the

00:06:15.700 --> 00:06:19.880
end, there's a choir that comes in and it's mixing MIDI data with waveform audio.

00:06:19.880 --> 00:06:23.580
So modules very much can achieve that because it's all sample-based.

00:06:23.580 --> 00:06:27.980
Basically, you would have like, let's say I wanted to have a violin that's plucking a string,

00:06:27.980 --> 00:06:28.540
a pizzicato.

00:06:28.540 --> 00:06:31.280
You would just record like a C4 on that.

00:06:31.280 --> 00:06:37.800
And then the programming would basically stretch the frequency by using just sample playback rates

00:06:37.800 --> 00:06:41.500
and manipulation around that kind of idea to create music.

00:06:41.500 --> 00:06:45.300
And, you know, that's basically how most sample-based synthesizers worked.

00:06:45.640 --> 00:06:46.680
And still work today.

00:06:46.680 --> 00:06:49.120
So it was really cool to get into the low level of that, too.

00:06:49.120 --> 00:06:49.740
That's cool.

00:06:49.740 --> 00:06:53.620
And it sounds like the timing when you got into this was really good.

00:06:53.620 --> 00:07:00.840
Like, there's a real magical, the whole, you know, everything is open and can be invented at this time, right?

00:07:00.840 --> 00:07:01.720
Oh, my gosh.

00:07:01.720 --> 00:07:02.020
Yeah.

00:07:03.380 --> 00:07:05.380
I mean, it was such a magical time.

00:07:05.380 --> 00:07:06.560
There was just so much fruit.

00:07:06.560 --> 00:07:11.900
I remember one of the things that I learned during that time, I was also really interested in how, you know,

00:07:11.900 --> 00:07:14.440
different video game consoles were doing music as well.

00:07:14.600 --> 00:07:20.760
And it came to my attention that there was a format called PSF that was taking PlayStation soundtracks and squishing them.

00:07:20.760 --> 00:07:30.360
And I came to realize that the library code and the sample code for some of the most iconic soundtracks I listened to growing up fit into like a two megabyte window of data.

00:07:30.560 --> 00:07:33.500
And I was like, oh, my gosh, how does this work?

00:07:33.500 --> 00:07:35.220
I still don't know how some of that works.

00:07:35.220 --> 00:07:40.460
And I actually got to do an interview with the Final Fantasy Tactics composers where I pointed that out.

00:07:40.460 --> 00:07:41.880
And they were like, how did you know that?

00:07:41.880 --> 00:07:42.960
Nobody knows that.

00:07:42.960 --> 00:07:44.060
That was a lot of fun.

00:07:44.060 --> 00:07:46.540
That was something we did with Louder in the very early days.

00:07:46.960 --> 00:07:47.280
Oh, wow.

00:07:47.280 --> 00:07:48.020
That's really cool.

00:07:48.020 --> 00:07:56.660
Yeah, I feel like people who programmed back then, I don't know, I wouldn't necessarily say they had a different skill, but they certainly focused on different things.

00:07:56.660 --> 00:07:59.420
And it just, it was so different than today, isn't it?

00:07:59.420 --> 00:07:59.700
So.

00:07:59.700 --> 00:08:00.480
Absolutely.

00:08:00.480 --> 00:08:05.040
I mean, the demo scene basically is kind of the icon of that ideal, right?

00:08:05.040 --> 00:08:08.640
Like there were people that just wanted to make things because they could make things.

00:08:08.640 --> 00:08:12.860
And something that is really ripe in creativity, too, is working within limitations.

00:08:13.300 --> 00:08:19.920
And because we had so many limitations back, you know, in DOS and Windows, early Windows, it was just really fun.

00:08:19.920 --> 00:08:23.560
You had to figure out like, okay, well, we can't just pump bandwidth, right?

00:08:23.560 --> 00:08:27.040
We can't have people download 500 megabytes just for the music.

00:08:27.040 --> 00:08:30.720
So how do you make really good music fit into a much smaller space?

00:08:30.720 --> 00:08:32.940
Well, there's lots of creative ways to do it.

00:08:32.940 --> 00:08:34.440
And that's what I was exploring at the time.

00:08:34.440 --> 00:08:35.540
Okay, that's awesome.

00:08:35.540 --> 00:08:38.960
So let's jump up to today.

00:08:38.960 --> 00:08:40.480
Let's talk about Louder.

00:08:40.480 --> 00:08:42.640
So L-O-U-D-R.

00:08:42.640 --> 00:08:43.080
Louder.

00:08:43.080 --> 00:08:44.540
Yeah, Louder without the E.

00:08:44.540 --> 00:08:45.320
And without the E.

00:08:45.320 --> 00:08:47.700
If you want to check it out, it's at louder.fm.

00:08:47.700 --> 00:08:50.940
So I think this is a pretty cool idea.

00:08:50.940 --> 00:08:53.480
But why don't you tell everyone what Louder is for a start?

00:08:53.480 --> 00:08:54.160
Sure thing.

00:08:54.160 --> 00:09:02.120
So Louder is, well, primarily in the public side, I guess, Louder is a distribution platform where artists can come on.

00:09:02.120 --> 00:09:09.740
And similar to like DistroKid and CD Baby and that sort of thing, this is a tool you'd use if you wanted to get your music on iTunes or Spotify, that sort of place.

00:09:09.920 --> 00:09:14.300
The thing with Louder, though, that's distinctly different is that we do cover song licensing.

00:09:14.300 --> 00:09:18.620
So as an artist, when you want to do a cover song, you have to get a license.

00:09:18.620 --> 00:09:20.040
You have to deliver something in the mail.

00:09:20.040 --> 00:09:26.660
And then even worse, you have to do monthly tracking of your sales and send checks to publishers whom you use their rights with.

00:09:26.660 --> 00:09:26.920
Right.

00:09:27.400 --> 00:09:31.800
So Louder takes all this whole process and built a platform around it.

00:09:31.800 --> 00:09:38.100
This was something that the team was doing prior to, quote unquote, Louder as acapella records or Joypad records.

00:09:38.100 --> 00:09:42.180
We did it specifically for acapella artists on iTunes when nobody else was.

00:09:42.180 --> 00:09:49.580
And we did it specifically for the video game music cover crowd, which is very niche at the time, but it's definitely grown into a very big thing now.

00:09:49.680 --> 00:09:55.740
And we took that model and said, you know what, we need to make this an open platform where people can come on and just put cover songs online.

00:09:55.740 --> 00:09:59.500
And so if I were to cover a song right now, I would do it on Louder.

00:09:59.500 --> 00:10:01.240
I don't have to pay anything up front.

00:10:01.240 --> 00:10:06.560
And all the royalties for the publishers and the rights holders actually come out when the sales come in.

00:10:06.560 --> 00:10:10.440
So I'm not actually paying out of pocket to do any of this process, which was really neat.

00:10:10.900 --> 00:10:14.580
And when we launched Louder, that was that was not a thing that existed at the time.

00:10:14.580 --> 00:10:15.100
Yeah.

00:10:15.100 --> 00:10:26.680
So prior to this, was it pretty hard if you wanted to cover a song like one of the songs I really like that is a cover song is the Boys of Summer, the Don Henley song, but covered by Taurus.

00:10:26.680 --> 00:10:28.440
So it's got like this punk rock theme.

00:10:28.440 --> 00:10:28.800
Oh, yeah.

00:10:28.800 --> 00:10:29.180
To it.

00:10:29.180 --> 00:10:30.040
That's a cool song.

00:10:30.040 --> 00:10:33.260
Those guys, you know, they don't own Boys of Summer.

00:10:33.260 --> 00:10:33.600
Right.

00:10:33.600 --> 00:10:34.320
Don Henley does.

00:10:34.320 --> 00:10:35.140
Correct.

00:10:35.140 --> 00:10:37.060
So that's hard.

00:10:37.060 --> 00:10:37.460
Right.

00:10:37.460 --> 00:10:39.420
That's not so easy for people to do.

00:10:39.420 --> 00:10:39.660
Right.

00:10:39.900 --> 00:10:41.100
No, it's not trivial.

00:10:41.100 --> 00:10:43.520
And it's not trivial because there's a legal aspect.

00:10:43.520 --> 00:10:47.320
There's the actual execution, which, you know, has details and they're not fun details.

00:10:47.320 --> 00:10:52.580
And then there's, you know, you've got to be on top of this process every month, which is a chore.

00:10:52.580 --> 00:10:52.920
Right.

00:10:52.920 --> 00:10:55.580
So, you know, it's something that people would do.

00:10:55.580 --> 00:10:58.580
And you would typically see cover songs when done legally.

00:10:58.580 --> 00:11:04.920
That is, of course, you typically see cover songs be coming out by people who are represented by labels who knew how to execute licenses very well.

00:11:05.120 --> 00:11:10.600
And it would be really common to see labels, you know, do covers within their own catalogs.

00:11:10.600 --> 00:11:10.840
Right.

00:11:10.840 --> 00:11:21.440
There's a bit of a misnomer in that statement in that the labels who do the sound recordings and the publishers who actually write the songs and represent the lyrics and the musical notes, if you will, are actually different entities.

00:11:21.800 --> 00:11:25.560
That's a conversation for another time, I think, because you get really down the rabbit hole there.

00:11:25.560 --> 00:11:30.580
But that just, I think, demonstrates pretty succinctly how difficult this problem can be.

00:11:30.580 --> 00:11:31.680
Yeah, I can imagine.

00:11:31.880 --> 00:11:34.460
So, I don't have any musical skills.

00:11:34.460 --> 00:11:36.360
So, this is not a problem that I suffer from.

00:11:36.360 --> 00:11:41.580
But if I wanted to cover some song, I come and I create an account with you.

00:11:41.580 --> 00:11:43.480
And what do I do?

00:11:43.480 --> 00:11:45.020
I just, like, flat out record it?

00:11:45.020 --> 00:11:49.000
Or do I have to, like, get you guys to work with the original artists?

00:11:49.000 --> 00:11:51.380
Or, you know, maybe it's not even the artists, right?

00:11:51.380 --> 00:11:53.920
Maybe it's the label that actually...

00:11:53.920 --> 00:11:54.560
Yeah, you're close.

00:11:54.560 --> 00:11:56.760
Which makes it way worse, I'm sure.

00:11:56.760 --> 00:11:58.480
Yeah, it's the publisher, right?

00:11:58.480 --> 00:12:02.660
So, you basically come on, you would have already probably recorded your album or your single, right?

00:12:02.660 --> 00:12:08.980
So, you're coming to us to execute the distribution aspect as well as the licensing for a product you hopefully already created before you sign up.

00:12:08.980 --> 00:12:10.260
But it doesn't really matter.

00:12:10.260 --> 00:12:11.680
And you can do originals, too.

00:12:11.680 --> 00:12:12.680
That's also not a big deal.

00:12:12.680 --> 00:12:16.060
But the way you would do it on Louder is you just sign up with your free account.

00:12:16.060 --> 00:12:18.540
You would submit your album once you've gotten cleared.

00:12:18.540 --> 00:12:23.520
Because it's a free platform, we have, like, some upfront tax stuff we've got to figure out just because it's receiving a lot of money.

00:12:23.520 --> 00:12:26.820
And the overhead of doing this for free was a thing that we had to deal with.

00:12:26.820 --> 00:12:27.700
And that was our solution.

00:12:28.240 --> 00:12:29.880
Once you've done that, you just upload your album.

00:12:29.880 --> 00:12:30.920
You send us the metadata.

00:12:30.920 --> 00:12:32.480
You let us know what songs you've covered.

00:12:32.480 --> 00:12:33.760
And we take care of the rest.

00:12:33.760 --> 00:12:40.840
Fortunately, it's not a very long process because in most cases, there's not really a negotiation aspect anymore like there used to be.

00:12:40.840 --> 00:12:46.120
There is a lovely little section of copyright law that allows us to send what's called a compulsory license.

00:12:46.120 --> 00:12:53.880
Meaning that as long as the song you're covering has been released in the United States on either, like, a specific digital phono record or a physical one.

00:12:53.880 --> 00:12:57.580
Meaning, specifically, it has to not be something that's in the background of a video.

00:12:57.740 --> 00:13:00.020
It had to actually come out as its own product, right?

00:13:00.020 --> 00:13:01.360
Then we can cover it.

00:13:01.360 --> 00:13:01.880
Oh, wow.

00:13:01.880 --> 00:13:02.600
I had no idea.

00:13:02.600 --> 00:13:03.820
That's pretty interesting.

00:13:03.820 --> 00:13:04.180
Okay.

00:13:04.180 --> 00:13:09.140
So that definitely takes it, the legal part, the human involved part out of it.

00:13:09.140 --> 00:13:09.540
That's cool.

00:13:09.660 --> 00:13:10.300
Absolutely.

00:13:10.300 --> 00:13:13.140
The rest of it sounds like it involves a lot of software.

00:13:13.140 --> 00:13:15.100
And let's dig into the Python stuff.

00:13:15.100 --> 00:13:26.500
But before we do, you told me right before we hit record on this episode that Lauter has its team sort of scattered about some origins in San Francisco.

00:13:26.500 --> 00:13:32.680
But that recently you guys transitioned to being a fully distributed team, whereas that was not the case before.

00:13:32.680 --> 00:13:33.840
Can you give me a little bit?

00:13:33.840 --> 00:13:35.020
What's the story like that?

00:13:35.020 --> 00:13:35.900
How's that working out for you?

00:13:35.980 --> 00:13:37.380
It's actually worked out really well.

00:13:37.380 --> 00:13:44.260
So in the office, you know, we were a bunch of young guys and some talented, just talented everybody on the team, really.

00:13:44.260 --> 00:13:52.820
The things that we're suffering from in a small space, looking at just when we have focused conversations, do we have a conference room for that or can we do that on the floor?

00:13:52.820 --> 00:13:57.680
And what's the consequence if the operations team is getting into a big conversation while the engineers are focusing?

00:13:57.680 --> 00:14:09.640
These are all problems that are great, but it seemed that we were losing the ability to really hone in on specific problems, you know, just because of all the things happening at once.

00:14:09.700 --> 00:14:12.920
And I think this is something that happens with a lot of startups specifically.

00:14:12.920 --> 00:14:19.980
But for a startup tackling such an immense problem like the one I just described to you, and again, I've really only scratched the tip of this, right?

00:14:19.980 --> 00:14:27.100
You know, it wasn't becoming of us to constantly interrupt one another to try to figure out, you know, how are we going to solve this next problem, which is immediate?

00:14:27.100 --> 00:14:30.060
And, you know, this also has to do with solving legal problems, right?

00:14:30.140 --> 00:14:32.540
You know, every legal problem is an immediate problem.

00:14:32.540 --> 00:14:34.800
It's not necessarily something you can defer.

00:14:34.800 --> 00:14:38.660
And if you can't defer your problems, how can you take the time you need to solve them?

00:14:38.660 --> 00:14:41.700
Well, all that said, we wanted to keep the small space.

00:14:41.700 --> 00:14:42.240
We love it.

00:14:42.240 --> 00:14:48.960
The operations team and the business team is still in San Francisco, and they are thriving, doing so much great work there now.

00:14:48.960 --> 00:14:50.760
And the engineers are really benefiting.

00:14:50.760 --> 00:14:59.660
The funny thing about it, and, you know, since I think Slack came out particularly, a lot of the stuff that engineers typically do today is already really remote compatible, right?

00:14:59.660 --> 00:15:05.880
Like, so I'm not going to get on the whiteboard and copy paste my code onto a physical medium, right?

00:15:05.880 --> 00:15:15.840
I'm going to send it over Slack, or I'm going to get in a code collaboration tool of some sort to actually get in there and collaborate, you know, on a computer screen over the Internet, right?

00:15:15.840 --> 00:15:21.800
So if I'm already doing that big part of it, the next big step was to figure out, okay, well, how do we manage our tasks?

00:15:21.800 --> 00:15:22.980
How do we stay in sync?

00:15:22.980 --> 00:15:24.000
And how do we ideate?

00:15:24.000 --> 00:15:25.940
Well, we were already doing that online, too.

00:15:25.940 --> 00:15:27.640
We use Asana for task management.

00:15:27.640 --> 00:15:31.000
We were doing that when we were in the office, sort of like Trello as well, you know.

00:15:31.000 --> 00:15:36.060
Whiteboarding stuff we were already doing and a few tools that were available online, you know, kind of switching around.

00:15:36.060 --> 00:15:37.940
But my node was really succeeding for us.

00:15:37.940 --> 00:15:43.680
I have crappy handwriting, so I love to do things when I can just type it out and really get things out fast.

00:15:43.840 --> 00:15:51.220
And then I think with tools like Screen Hero, where we can share a screen and actually do cooperative coding, we were already the remote team just in the same rooms.

00:15:51.220 --> 00:15:53.080
So it worked out really nicely.

00:15:53.080 --> 00:15:54.420
It was a super smooth transition.

00:15:54.420 --> 00:15:57.460
The time zone thing, I think, is the biggest challenge.

00:15:57.460 --> 00:16:08.460
So what happened is we were all in San Francisco, and then due to some family things with a few of our employees that kind of happened at the same time a bit synchronistically, we just said, you know what, this is an opportunity.

00:16:08.460 --> 00:16:10.000
Give this a try and see if it works.

00:16:10.180 --> 00:16:11.180
We did a trial period.

00:16:11.180 --> 00:16:16.000
We found that we were super productive as a result of going remote, and we've stuck with it.

00:16:16.000 --> 00:16:17.280
That's a great story.

00:16:17.280 --> 00:16:21.980
And I'll definitely have to get links to those tools that you're talking about because…

00:16:21.980 --> 00:16:22.380
Oh, absolutely.

00:16:22.380 --> 00:16:24.840
Yeah, especially the collaborative, the Screen Hero one.

00:16:24.840 --> 00:16:25.480
That sounds cool.

00:16:25.480 --> 00:16:29.060
I've done a lot of Skype and various other ones, but I haven't tried that one.

00:16:29.060 --> 00:16:29.600
Oh, yeah.

00:16:29.600 --> 00:16:30.460
We love Screen Hero.

00:16:30.840 --> 00:16:37.380
I think Slack actually bought Screen Hero, so it should be integrated any day now, to be honest, because they bought them a while ago.

00:16:37.380 --> 00:16:42.520
If you're in Slack, if you've used it before, the call function was actually built by the…

00:16:42.520 --> 00:16:43.820
It was either Screen Hero or Speak.

00:16:43.820 --> 00:16:45.740
Actually, I could totally be making facts up.

00:16:45.740 --> 00:16:46.620
I should double-check.

00:16:47.120 --> 00:16:51.580
We used a tool called Speak as well before, and we didn't need to use it anymore.

00:16:51.580 --> 00:16:52.420
Okay.

00:16:52.420 --> 00:16:53.400
Yeah, that sounds really cool.

00:16:53.400 --> 00:16:54.480
And I totally agree with you.

00:16:54.480 --> 00:17:05.480
For some reason, I guess it makes a lot of sense, but we do seem to, as developers, already use tools that are extremely compatible with being distributed or asynchronous work.

00:17:05.480 --> 00:17:07.500
You know, GitHub pull requests, for example.

00:17:07.500 --> 00:17:08.140
Absolutely.

00:17:08.460 --> 00:17:08.920
All these things.

00:17:08.920 --> 00:17:10.720
So, I think it makes a lot of sense.

00:17:10.720 --> 00:17:22.220
I've spent the last 10 years, let me do a quick math, yeah, 10 years, working either remotely undistributed teams or, you know, this last year I've been doing my own solo thing.

00:17:22.220 --> 00:17:25.640
But I've lived that life, and it is really nice.

00:17:25.640 --> 00:17:27.120
I definitely feel more productive.

00:17:27.120 --> 00:17:28.860
The time zones are painful.

00:17:28.860 --> 00:17:32.600
Like, I'm spending this year in Germany, so I end up…

00:17:32.600 --> 00:17:33.040
Yeah, it's great.

00:17:33.040 --> 00:17:35.420
But the problem is, like, I've got a lot of meetings in California.

00:17:35.420 --> 00:17:37.680
So, it's like, hey, Michael, can you meet at 11?

00:17:38.360 --> 00:17:39.580
PM on a Friday night?

00:17:39.580 --> 00:17:42.380
It's like, you know, I didn't want to see my wife anyway, right?

00:17:42.380 --> 00:17:43.000
Right.

00:17:43.000 --> 00:17:44.600
So, you know, it depends how far it goes.

00:17:44.600 --> 00:17:47.520
But within the U.S., within a few hours, it's pretty nice.

00:17:47.520 --> 00:17:49.440
The time zones almost work for you, right?

00:17:49.440 --> 00:17:51.660
You get, like, that dead zone where you can actually get stuff done.

00:17:51.660 --> 00:17:52.560
Absolutely.

00:17:52.560 --> 00:17:54.380
And it's funny you say that you're in Germany.

00:17:54.380 --> 00:17:56.900
We've actually got contractors in Berlin right now.

00:17:56.900 --> 00:18:02.580
And I think that's kind of nice about me being in the East Coast is that I'm right there smack in the middle of the West Coast.

00:18:02.580 --> 00:18:08.260
And then our contractors who are in Germany and then the team that we have in the West Coast, it's really easy for me.

00:18:08.260 --> 00:18:11.340
To kind of get the sink from them at the end of their day.

00:18:11.340 --> 00:18:15.440
And at the beginning of the West Coast day, just kind of give them a brain dump on what's going on.

00:18:15.440 --> 00:18:16.900
And that's worked pretty nicely.

00:18:16.900 --> 00:18:19.440
You know, the other thing, too, you mentioned you've been happier.

00:18:19.440 --> 00:18:21.380
I think that's something we've definitely felt.

00:18:21.380 --> 00:18:26.200
You know, when you're able to live where you need to live, you know, there's definite advantages.

00:18:26.200 --> 00:18:36.660
And speaking as somebody who's just recently moved away from the Bay Area, I'll tell you the amount of money that we're saving just on the cost of living is it was like getting a huge raise.

00:18:36.660 --> 00:18:36.960
Right.

00:18:37.040 --> 00:18:45.940
But no actual money needed to be spent by the team to achieve that outside of the I think we've had some frustration just setting up Ohio taxes and stuff.

00:18:45.940 --> 00:18:48.400
But that kind of that kind of HR stuff's got to happen, you know.

00:18:48.400 --> 00:18:49.260
Yeah, sure.

00:18:49.260 --> 00:18:50.200
Yeah, that's really cool.

00:18:50.200 --> 00:19:07.540
This portion of Talk Python To Me has been brought to you by Rollbar.

00:19:07.540 --> 00:19:11.060
One of the frustrating things about being a developer is dealing with errors.

00:19:11.060 --> 00:19:19.240
Ah, relying on users to report errors, digging through log files, trying to debug issues, or a million alerts just flooding your inbox and ruining your day.

00:19:19.660 --> 00:19:26.460
With Rollbar's full stack error monitoring, you'll get the context, insights, and control that you need to find and fix bugs faster.

00:19:26.460 --> 00:19:28.180
It's easy to install.

00:19:28.180 --> 00:19:32.420
You can start tracking production errors and deployments in eight minutes or even less.

00:19:32.420 --> 00:19:41.780
Rollbar works with all the major languages and frameworks, including the Python one, such as Django, Flask, Pyramid, as well as Ruby, JavaScript, Node, iOS, and Android.

00:19:41.780 --> 00:19:49.360
You could integrate Rollbar into your existing workflow, send error alerts to Slack or HipChat, or even automatically create issues in Jira,

00:19:49.360 --> 00:19:50.980
Pivotal Tracker, and a whole bunch more.

00:19:50.980 --> 00:19:54.340
Rollbar has put together a special offer for Talk Python To Me listeners.

00:19:54.340 --> 00:20:00.040
Visit rollbar.com slash Talk Python To Me, sign up, and get the bootstrap plan free for 90 days.

00:20:00.040 --> 00:20:03.100
That's 300,000 errors tracked all for free.

00:20:03.100 --> 00:20:06.820
But hey, just between you and me, I really hope you don't encounter that many errors.

00:20:07.360 --> 00:20:12.820
Love to buy developers at awesome companies like Heroku, Twilio, Kayak, Instacart, Zendesk, Twitch, and more.

00:20:12.820 --> 00:20:14.440
Give Rollbar a try today.

00:20:14.440 --> 00:20:17.040
Go to rollbar.com slash Talk Python To Me.

00:20:17.040 --> 00:20:26.320
Let's talk about Python.

00:20:26.320 --> 00:20:26.700
Right?

00:20:26.700 --> 00:20:29.580
So Python, you said, is pretty central to what you guys are doing.

00:20:29.580 --> 00:20:30.460
How's it involved?

00:20:30.920 --> 00:20:31.120
Yeah.

00:20:31.120 --> 00:20:32.920
Sort of describe your architecture.

00:20:32.920 --> 00:20:36.900
What pieces, what moving parts are in there and how does Python fit into it?

00:20:36.900 --> 00:20:37.500
Oh, absolutely.

00:20:37.500 --> 00:20:38.000
Okay.

00:20:38.000 --> 00:20:40.320
So just I think to set the scene, right?

00:20:40.320 --> 00:20:44.660
So Louder is built on Google App Engine, which is on Google's cloud platform.

00:20:44.660 --> 00:20:48.780
And we've been on App Engine pretty much in one way or another since its inception.

00:20:49.260 --> 00:20:59.680
I started out, actually, the way I met the Louder team before I was working for them or with them, rather, to make Louder, was on a product called the Game Music Bundle, where I needed to build a store really quickly.

00:20:59.680 --> 00:21:04.380
And the way to do that, I found, was to build it on this new thing called App Engine.

00:21:04.380 --> 00:21:12.380
And it was a total, you know, it wasn't really a risk because I don't think that failure would have been that big of a deal for something that was new like this and just something I built in my free time with some friends.

00:21:12.780 --> 00:21:22.480
But to have it succeed in the way it did was really a proof that, like, okay, you can develop fast, you can iterate quickly, you can deploy quickly, and you can scale massively.

00:21:22.480 --> 00:21:25.340
And that was like, holy crap, this is really cool.

00:21:25.340 --> 00:21:28.920
So I became immensely fond with App Engine at that time.

00:21:28.920 --> 00:21:30.940
And I brought that into the Louder experience.

00:21:30.940 --> 00:21:32.020
What year was that?

00:21:32.020 --> 00:21:34.360
I want to say 2012, maybe even 2011.

00:21:34.360 --> 00:21:35.180
Okay, yeah.

00:21:35.180 --> 00:21:36.020
So that's pretty fresh.

00:21:36.020 --> 00:21:39.960
Like, App Engine probably still had that new cloud smell, right?

00:21:39.960 --> 00:21:41.080
Oh, yeah.

00:21:41.080 --> 00:21:42.380
It had the new cloud smell.

00:21:42.500 --> 00:21:43.960
It had the undocumented appeal.

00:21:43.960 --> 00:21:45.420
The whole thing was there, right?

00:21:45.420 --> 00:21:46.180
Exactly.

00:21:46.180 --> 00:21:46.800
Yeah, definitely.

00:21:46.800 --> 00:21:49.220
No, it was diving deep.

00:21:49.220 --> 00:21:50.120
It's cool.

00:21:50.120 --> 00:21:55.220
And Python was one of the two first available languages, or was it the first available language?

00:21:55.220 --> 00:21:58.740
I wouldn't know App Engine's history well enough to know.

00:21:58.740 --> 00:22:06.440
I know that as far as what's on their managed platform, your look, or managed runtimes, I guess you'd call these, you've got Python, Java, and Go.

00:22:06.440 --> 00:22:08.580
Go wasn't even around at the time, for sure.

00:22:08.580 --> 00:22:11.120
Right, and Java came later, so I think it was Python.

00:22:11.120 --> 00:22:11.560
Okay.

00:22:11.740 --> 00:22:15.340
I'd say it's probably Python, because Java, I don't recall being an option.

00:22:15.340 --> 00:22:19.100
I knew Java, and I probably would have started with Java, to be honest.

00:22:19.100 --> 00:22:20.560
Very glad I didn't.

00:22:20.560 --> 00:22:21.900
Yeah, for sure.

00:22:22.440 --> 00:22:25.800
So App Engine is really good at getting you started.

00:22:25.800 --> 00:22:27.040
I haven't done much work on it.

00:22:27.040 --> 00:22:29.580
I did check it out for a few projects.

00:22:29.580 --> 00:22:42.960
It seems like you can run real legitimate stuff there, at least back in the time frame that you're talking about, for almost free, whereas the other hosting options in that time frame were way more expensive, right?

00:22:43.320 --> 00:22:43.640
Yeah.

00:22:43.640 --> 00:22:43.720
Yeah.

00:22:43.720 --> 00:22:48.780
The nice thing, too, about Google is that they've been really aggressive on keeping up with pricing.

00:22:48.780 --> 00:22:55.280
And I think a few years ago, I was at the conference that they had.

00:22:55.340 --> 00:22:57.880
And they were cutting their data storage costs.

00:22:57.880 --> 00:23:04.120
I don't know what happened at one point, but they completely undercut Amazon in a big way, and Amazon responded to it.

00:23:04.240 --> 00:23:07.860
So it was really nice to kind of be on the front edge of those pricing changes.

00:23:07.860 --> 00:23:09.600
And data was really cheap.

00:23:09.600 --> 00:23:19.040
And the nice thing, and just kind of bring it back to Python here, when you're using App Engine, is you can just open up – this is not a good Python practice, by the way – but you could just open up one file, right?

00:23:19.040 --> 00:23:28.420
Stick your basic handlers in there, put your data schema in there in the form of a Python class, and integrate it with one of their API frameworks, which is just really beautifully written.

00:23:28.420 --> 00:23:33.360
I think Guido actually is the guy who wrote the NDB API in Python for them.

00:23:33.900 --> 00:23:41.420
So whenever I work with it, I've always got this tingle of magic, because it's basically doing future management with generators.

00:23:41.420 --> 00:23:44.540
And sorry, I could go on a complete tangent about this.

00:23:44.540 --> 00:23:45.700
That's really cool, yeah.

00:23:45.700 --> 00:23:47.180
Yeah, so I really love it.

00:23:47.180 --> 00:23:50.140
And there's definitely some grace to how it was designed.

00:23:50.140 --> 00:23:54.320
And then all the APIs that they have available, like you've got a built-in data store.

00:23:54.320 --> 00:23:58.820
You've got, obviously, the actual platform itself.

00:23:59.300 --> 00:24:04.960
They've gotten to the point with Cloud Platform now where you've got a container engine via Kubernetes and Docker, right?

00:24:04.960 --> 00:24:09.280
You've got managed VMs, which is the auto-scaling, just computer instance sort of thing.

00:24:09.280 --> 00:24:11.800
So, man, there's a lot of stuff in Google.

00:24:11.800 --> 00:24:15.400
And I think people come and they look at Amazon, and they think that's the de facto.

00:24:15.400 --> 00:24:21.040
But in reality, you've got a really aggressively smart platform with Google.

00:24:21.260 --> 00:24:25.940
And then also when you consider the things that Google's doing with, like, data flow and machine learning.

00:24:25.940 --> 00:24:28.580
And we all know where Google is with machine learning, right?

00:24:28.580 --> 00:24:34.260
So, like, to have them expose those tools as really smart frameworks and APIs is really exciting as well.

00:24:34.420 --> 00:24:37.800
And it's always been really fun to work with that kind of technology.

00:24:37.800 --> 00:24:39.460
Yeah, I'm sure it was.

00:24:39.460 --> 00:24:44.920
So, back then, that sounds like you were probably working with a platform as a service, not infrastructure as a service.

00:24:44.920 --> 00:24:45.580
But...

00:24:45.580 --> 00:24:45.800
Yes.

00:24:45.800 --> 00:24:47.080
Yeah, because that came along later.

00:24:47.080 --> 00:24:48.620
Good buzzwords.

00:24:48.620 --> 00:24:49.560
Yeah, of course.

00:24:49.560 --> 00:24:57.960
So, one of the things that I think is really cool, and you talked about how cool it was, is that there's all these APIs you can use.

00:24:57.960 --> 00:25:04.360
But it also feels like if you write your code for the Google App Engine, it's kind of like it's there, right?

00:25:04.360 --> 00:25:08.960
Because you can't extract it and, like, say, move it to AWS or to a VM, right?

00:25:08.960 --> 00:25:09.500
Sure.

00:25:09.500 --> 00:25:09.940
Yeah.

00:25:09.940 --> 00:25:16.080
And that's one of those things when you're looking at it and you're thinking, okay, well, we need some data liberation.

00:25:16.080 --> 00:25:20.700
How are we going to deal if Google one day is like, this is not a priority.

00:25:20.700 --> 00:25:22.440
This is a waste of our assets.

00:25:22.440 --> 00:25:24.200
We need to just cut App Engine, right?

00:25:24.200 --> 00:25:26.760
Fortunately, and this is really awesome.

00:25:26.880 --> 00:25:38.600
I don't remember when this came about, but there was a complete initiative of a team of people who was dedicated to making sure that all of the core APIs and frameworks for App Engine were available on an open source stack.

00:25:38.600 --> 00:25:43.220
And so I don't actually have the name of it, but I'll definitely try to find it and send it your way.

00:25:43.220 --> 00:25:51.400
But there is a way that I could take the whole code base and pull it off App Engine proper and actually run it on something like AWS if I wanted to.

00:25:51.400 --> 00:25:51.920
Oh, wow.

00:25:51.920 --> 00:25:55.940
Now, I think there's certain APIs that we'd be challenged with changing.

00:25:56.520 --> 00:26:04.020
Fortunately, kind of internally at Loudr, we do – when it doesn't make sense to use one of their crazy cool frameworks, we are, for example, using Elasticsearch.

00:26:04.020 --> 00:26:06.300
We could use BigQuery or something as well.

00:26:06.300 --> 00:26:15.300
But there has been an emphasis on making sure that if the day comes that Google's like, screw you guys, we're going home, that we're not going to be left in the dirt.

00:26:15.300 --> 00:26:17.400
Yeah, we're taking a ball and we're going home.

00:26:17.400 --> 00:26:20.040
Yeah, I don't see that happening.

00:26:20.200 --> 00:26:24.880
I mean, this whole cloud computing thing is really – it seems to have some actual legs.

00:26:24.880 --> 00:26:31.340
Like I just read, I think it was today, that Amazon's profits – not revenue – profits jumped 800%.

00:26:31.340 --> 00:26:32.320
Oh, I'm sure.

00:26:32.320 --> 00:26:35.360
And the majority of that was from AWS, right?

00:26:35.360 --> 00:26:35.760
Oh, yeah, absolutely.

00:26:35.760 --> 00:26:38.500
It wasn't doing better with books or, you know, things like this.

00:26:38.500 --> 00:26:39.600
So very cool.

00:26:39.600 --> 00:26:41.540
I think Google App Engine will definitely stick around.

00:26:41.540 --> 00:26:45.960
So maybe tell us about some of like – what does your architecture look like?

00:26:45.960 --> 00:26:46.980
What are the pieces?

00:26:46.980 --> 00:26:48.920
What kinds of things do you guys need to do in there?

00:26:48.920 --> 00:26:49.500
Sure.

00:26:49.500 --> 00:26:52.520
So we very much have that microservice mentality, right?

00:26:52.520 --> 00:26:56.000
We're building very segmented APIs to solve specific problems.

00:26:56.000 --> 00:27:01.180
I think one of the cornerstones of the Louder framework is built on this concept of a task queue.

00:27:01.180 --> 00:27:04.120
It's literally called Task Queue in Google, but that would be like Cassandra.

00:27:04.120 --> 00:27:07.300
But, you know, you can implement task queues in several ways, of course.

00:27:07.300 --> 00:27:09.920
But Google's got this nice task queue concept.

00:27:09.920 --> 00:27:12.360
And so we're building a lot of things, you know.

00:27:12.360 --> 00:27:18.220
So I guess our problem space we like to divide into three ideas or three core problems.

00:27:18.220 --> 00:27:21.040
And those problems are matching, fulfillment, and administration.

00:27:21.040 --> 00:27:24.340
I kind of talked to you about how you could come to Louder and you could say,

00:27:24.340 --> 00:27:26.060
okay, I'm going to cover Boys of Summer, right?

00:27:26.060 --> 00:27:30.120
It's our job to match your sound recording and the information you provide to us

00:27:30.120 --> 00:27:34.060
with the actual composition and know who the publishers are attached to that.

00:27:34.060 --> 00:27:36.820
So we're getting lots of ingestion from rights holders.

00:27:36.820 --> 00:27:38.300
Lots of data feeds are involved.

00:27:38.300 --> 00:27:39.720
So, you know, there's queues there, right?

00:27:40.000 --> 00:27:43.160
There's indexing problems so that we can search and find things quickly.

00:27:43.160 --> 00:27:44.960
That's good for elastic search, right?

00:27:44.960 --> 00:27:48.980
There's a lot of machine learning involved because we have to do this at scale.

00:27:48.980 --> 00:27:51.780
It's not just, you know, one or two people coming to get licenses.

00:27:51.780 --> 00:27:56.500
We have an enterprise service where we're doing this for big businesses like DistroKid, for example,

00:27:56.500 --> 00:28:00.640
which requires us to be able to, you know, we can't just have humans churn at everything.

00:28:00.840 --> 00:28:02.440
So there's that aspect of it as well.

00:28:02.440 --> 00:28:09.420
And I, you know, and I think the way we look at it, we kind of take those core problems and we segment our code into microservices that represent them.

00:28:09.420 --> 00:28:13.640
Then, of course, you've got the shared microservices for things like the user management.

00:28:13.640 --> 00:28:16.300
And, you know, we can go into complete tangents about this as well.

00:28:16.360 --> 00:28:19.780
But I think it gives you an idea of how we work and what we think about.

00:28:19.780 --> 00:28:23.640
We also have a big emphasis on, you know, not reinventing the wheel.

00:28:23.640 --> 00:28:26.740
So we like to utilize and contribute back to open source projects.

00:28:26.740 --> 00:28:32.060
Google's worked on something called a pipeline library for App Engine, specifically in Python,

00:28:32.640 --> 00:28:37.360
that we've given a lot of contributions to just because we so heavily rely on it.

00:28:37.360 --> 00:28:44.520
We've also been working with one of our really talented contractors helped us build an open source framework for an API in Python called Pail.

00:28:44.520 --> 00:28:51.560
And I really, really like the work that we've done there simply because it's the most Pythonic way to do a RESTful API that I've seen yet.

00:28:51.560 --> 00:28:57.680
The built-in documentation built into, like, the way you manage arguments on the API level is just something that's really fluent.

00:28:57.680 --> 00:29:01.960
And I'll share a link to that with you at the end of this call just so you can kind of get that out.

00:29:02.040 --> 00:29:02.580
Yeah, awesome.

00:29:02.580 --> 00:29:03.980
Yeah, I'll definitely put that in the show notes.

00:29:03.980 --> 00:29:04.960
It sounds really cool.

00:29:04.960 --> 00:29:16.500
So if I'm writing a web app on Google App Engine, do they have their own framework or is it like Flask or what's the web actual API?

00:29:16.500 --> 00:29:18.080
Yeah, so you've got a few choices.

00:29:18.080 --> 00:29:20.480
Web App 2 is what we use.

00:29:20.480 --> 00:29:23.860
So you're using that framework and they're kind of just built on top of it.

00:29:23.860 --> 00:29:25.420
You've also got Flask available.

00:29:25.420 --> 00:29:31.900
And then, you know, when you're on App Engine, you do have the choice between the managed platform, the managed runtimes, I think they're formally called.

00:29:31.900 --> 00:29:34.660
And what's called a managed VM, which is just a computer.

00:29:34.660 --> 00:29:37.980
It's just basically like an EC2 instance, a virtual instance, right?

00:29:37.980 --> 00:29:40.620
And you could do whatever you want on a virtual instance.

00:29:40.620 --> 00:29:47.460
On the App Engine runtime that's managed that we use for a lot of our code, you've got a really tight integration with the data store, super low latency.

00:29:47.460 --> 00:29:49.000
You've got access to all those.

00:29:49.140 --> 00:29:53.100
I think I mentioned the NDB API where you could use generators to manage futures.

00:29:53.100 --> 00:29:58.460
That kind of writing is really Pythonic and it's helping us write really efficient code really quickly.

00:29:58.460 --> 00:30:04.660
You know, I think the problem of dealing with lots of data, too, and all the complicated sort of business stuff we have to do,

00:30:05.100 --> 00:30:11.700
it is really behooving to have a situation and a platform already built for us where we can say, OK, go fetch this entity.

00:30:11.700 --> 00:30:14.960
And while you're doing that communication, get this work done.

00:30:14.960 --> 00:30:16.040
And then this work is done.

00:30:16.040 --> 00:30:18.780
OK, now maybe that response is ready and we'll block when we need to.

00:30:18.780 --> 00:30:27.180
And to write in tasklets where you're just yielding futures, the way that the runtime and the loop works in there, it feels a little bit like black magic.

00:30:27.180 --> 00:30:28.840
But you can actually just go look at it.

00:30:28.960 --> 00:30:33.380
I'm fairly confident that I know this is true because I look at it all the time.

00:30:33.380 --> 00:30:36.240
The NDB framework itself is also just out in the open.

00:30:36.240 --> 00:30:37.580
You can go look at the code for it.

00:30:37.580 --> 00:30:45.400
So it's just nice to be in that kind of space, right, where you've got the Google level engineers who have built a platform, you know, that is highly technical.

00:30:45.400 --> 00:30:49.400
And like I mentioned, Guido being involved, like it's just out of this world.

00:30:49.400 --> 00:30:53.140
Obviously, he's a Dropbox now and another really fun thing to do.

00:30:53.140 --> 00:30:55.600
But I think I think you get the gist here.

00:30:55.780 --> 00:31:07.640
Like it's it's great for as far as I'm concerned, like being on a platform as a service allows me to not worry, especially as a CTO on like the sort of operations problems like, oh, is this instance screwed up for this reason?

00:31:07.640 --> 00:31:11.040
Oh, do I need to hop in a shell to fix this trivial problem?

00:31:11.040 --> 00:31:12.860
Now, that's most of that stuff's already done for us.

00:31:12.860 --> 00:31:21.340
So it's really allowed us to focus on the problems that we need to solve and be really efficient and making sure that we're not spending our time doing work that really probably shouldn't be doing.

00:31:21.340 --> 00:31:21.620
Right.

00:31:21.860 --> 00:31:22.800
Yeah, yeah, that's awesome.

00:31:22.800 --> 00:31:23.540
Yeah.

00:31:23.540 --> 00:31:29.180
I mean, would you ever consider having like a data center in your own at your own company again?

00:31:29.180 --> 00:31:30.220
I don't know.

00:31:30.220 --> 00:31:32.100
Maybe it's pretty hard.

00:31:32.100 --> 00:31:33.240
It's pretty far fetched, though.

00:31:33.240 --> 00:31:34.200
I don't know.

00:31:34.200 --> 00:31:40.260
Well, I think usually what I would say that ever makes an engineer frown is business reasons.

00:31:40.260 --> 00:31:44.980
There would be reasons to have data centers like fortunately, you know, we've got Google's level encryption.

00:31:44.980 --> 00:31:48.240
So we've got confidence that they can't read certain things that we've got on there.

00:31:48.240 --> 00:31:54.920
And, you know, whenever we have anything super sensitive, we're using public key encryption on the server so that that private key is only in the hands of developers.

00:31:54.920 --> 00:32:00.520
Like people even get access to the data couldn't possibly read what's in there for a lot of the really sensitive stuff.

00:32:00.720 --> 00:32:08.400
So with those kind of technologies really blossoming, especially lately in encryption, like I don't feel that there's too many cons on the cloud.

00:32:08.400 --> 00:32:08.660
Right.

00:32:08.660 --> 00:32:12.400
Like I should put a caveat on there saying technical reason.

00:32:12.400 --> 00:32:13.720
Oh, right.

00:32:13.720 --> 00:32:13.940
Yeah.

00:32:13.940 --> 00:32:14.920
No, you probably should have.

00:32:14.920 --> 00:32:16.580
No, I can't see much technical reason.

00:32:16.580 --> 00:32:18.240
Cost might be one.

00:32:18.240 --> 00:32:20.160
But like you've got the pro and the con.

00:32:20.160 --> 00:32:20.920
You've got to balance.

00:32:20.920 --> 00:32:21.140
Right.

00:32:21.140 --> 00:32:29.680
Like what happens if your business blows up overnight and you haven't, you know, taken the time to build up your data center, put the resources in, have those guys build that sort of thing.

00:32:29.680 --> 00:32:30.600
You know, it's like, what's the point?

00:32:30.600 --> 00:32:36.560
I think that nowadays if you're going to start a new project, what you should do, you shouldn't do anything.

00:32:36.560 --> 00:32:46.640
But what might work for you is to build it on the cloud first and then figure out if you have a need to go to a data center unless you've got a very specific reason going and why you don't want to be on the cloud.

00:32:46.640 --> 00:32:46.900
Right.

00:32:47.220 --> 00:32:50.500
And then, you know, thinking about what if Facebook was built today, right?

00:32:50.500 --> 00:32:59.800
Like Facebook is, I've recently seen a lot of advertisement targeted at me because I'm a developer, I guess, about how they've got this awesome data center and the brightest minds are working on the Facebook product at that level.

00:32:59.800 --> 00:33:02.400
And, you know, that's really exciting and really cool.

00:33:02.400 --> 00:33:06.000
But honestly, would they have done that in this environment today?

00:33:06.000 --> 00:33:07.240
I'm not entirely so sure.

00:33:07.240 --> 00:33:08.620
Yeah, I agree.

00:33:08.620 --> 00:33:11.980
Although it is interesting, you mentioned Guido and Dropbox.

00:33:11.980 --> 00:33:16.960
I doubt Guido has anything to do with this, but they're moving out of AWS into their own data center.

00:33:17.080 --> 00:33:17.700
But fascinating.

00:33:17.700 --> 00:33:19.140
It's interesting, right?

00:33:19.140 --> 00:33:23.300
But it's like that's a pretty long ways to grow before you grow in the cloud.

00:33:23.300 --> 00:33:24.080
So, yeah, yeah.

00:33:24.080 --> 00:33:24.460
Very cool.

00:33:24.460 --> 00:33:24.960
Absolutely.

00:33:24.960 --> 00:33:30.380
And, you know, on the flip side, you've got a company like Spotify who just went on to Google Cloud.

00:33:30.380 --> 00:33:30.860
Right.

00:33:30.860 --> 00:33:33.640
So they're moving off their data centers and go in the opposite direction.

00:33:33.640 --> 00:33:34.320
Yeah.

00:33:34.320 --> 00:33:36.620
It's an exciting time to watch all these things happen.

00:33:36.620 --> 00:33:39.340
So you mentioned machine learning.

00:33:39.340 --> 00:33:40.340
What's the story there?

00:33:40.340 --> 00:33:43.000
Is that like scikit-learn and what problems are you actually solving?

00:33:43.000 --> 00:33:43.940
Yeah, totally.

00:33:44.300 --> 00:33:48.220
So like I mentioned, a big aspect of what we do is matching content to content, right?

00:33:48.220 --> 00:33:49.740
So we've got metadata.

00:33:49.740 --> 00:33:54.420
This is kind of one of the funny problems in the music industry that I'll quickly set up the scene for you.

00:33:54.800 --> 00:34:07.180
I did mention earlier how publishers, the entities who represent the rights holders of the music itself, the notes and the lyrics, the guys who are, you know, actually doing the notation, that sort of thing, are separate from the labels who represent the artists, the songwriter.

00:34:07.360 --> 00:34:09.180
Or not the songwriter, but the sound recordings, right?

00:34:09.180 --> 00:34:13.100
The band, the killers might be this group of guys.

00:34:13.100 --> 00:34:18.240
And then the actual people who wrote their songs are represented by a publishing team that have a different set of tasks.

00:34:18.240 --> 00:34:27.320
If you ever go to Hallmark and you buy a card that has like the Beatles lyrics on it, you bet your bum that Hallmark has to pay the publisher that owns the represents the Beatles.

00:34:27.320 --> 00:34:27.640
Right.

00:34:28.000 --> 00:34:31.180
And I'm not sure that that's Apple Records because Apple Records is the label side.

00:34:31.620 --> 00:34:40.820
So when you've got this segregation between the publishing data and the label data, one of the fun things that happens is the publishers don't always know who is using their music.

00:34:40.820 --> 00:34:46.580
And when they send out the song information to their partners, they're not always including like, OK, here's the song.

00:34:46.580 --> 00:34:47.200
Happy birthday.

00:34:47.200 --> 00:34:48.420
It was written by these people.

00:34:48.420 --> 00:34:48.760
Right.

00:34:48.760 --> 00:34:52.120
They know who it was written by, but they don't know who necessarily recorded it.

00:34:52.120 --> 00:34:56.540
And you can imagine, especially in that example, a lot of people have recorded happy birthday to you.

00:34:56.540 --> 00:34:56.740
Right.

00:34:57.280 --> 00:35:04.040
And then, you know, the labels on the other side will send content distributors and they won't include the publishing data because they don't necessarily know it either.

00:35:04.040 --> 00:35:06.060
It's not it's not a connected chain.

00:35:06.060 --> 00:35:18.040
So when you're looking at two sets of metadata and you need to start drawing lines between them, you start thinking, OK, I can either throw rocks at this or I can have a statistical method for solving that problem.

00:35:18.040 --> 00:35:22.500
And I think as everyone who's listening knows, Python really excels at these machine learning problems.

00:35:22.620 --> 00:35:29.260
There's lots of frameworks and lots of libraries and lots of tools that come to mind very quickly when thinking about machine learning in Python.

00:35:29.640 --> 00:35:42.280
What's nice is, you know, we've internally built this really abstract framework for doing machine learning based problems in terms of how it integrates with the ES level and with the platform level.

00:35:42.280 --> 00:35:42.560
Right.

00:35:42.560 --> 00:35:52.700
So we're able to quickly look at two different models of information and do some really cool things on the learning side, you know, with exporting training data, with setting a model, with changing features, that sort of thing.

00:35:52.820 --> 00:35:55.280
So I think Python really paid off there.

00:35:55.280 --> 00:35:55.960
Awesome.

00:35:55.960 --> 00:35:58.260
And that's like it learn or is it different?

00:35:58.260 --> 00:35:59.340
It's your thing.

00:35:59.340 --> 00:36:01.040
It's it's a bit of an internal thing.

00:36:01.040 --> 00:36:07.960
And then honestly, I'm not the guy who does the low level machine learning stuff to know what tools he's really using.

00:36:07.960 --> 00:36:11.820
But I do I do oversee the integration on the platform side.

00:36:11.820 --> 00:36:13.440
And that's where it's been really fun.

00:36:13.540 --> 00:36:17.000
So machine learning has been a very big learning process for me going into this.

00:36:17.000 --> 00:36:19.700
And right now, I think you're going to ask me about hiring later.

00:36:19.700 --> 00:36:22.640
But we've been looking for people who are really talented in that space.

00:36:22.640 --> 00:36:25.480
And we've actually brought on really recently some great engineers in that space.

00:36:25.480 --> 00:36:27.700
And it's like, oh, my gosh, the things you can do.

00:36:27.700 --> 00:36:28.640
It's really quite fascinating.

00:36:28.640 --> 00:36:28.640
Yeah.

00:36:28.640 --> 00:36:54.480
This episode is brought to you by SnapCI, the only hosted cloud based continuous integration and delivery solution that offers multi stage pipelines as a built in feature.

00:36:55.120 --> 00:37:02.960
SnapCI is built to follow best practices like automated builds, testing before integration and provides high visibility into who's doing what.

00:37:02.960 --> 00:37:08.200
Just connect Snap to your GitHub repo and it automatically builds the first pipeline for you.

00:37:08.200 --> 00:37:14.500
It's simple enough for those who are new to continuous integration, yet powerful enough to run dozens of parallel pipelines.

00:37:14.500 --> 00:37:16.820
More reliable and frequent releases.

00:37:16.820 --> 00:37:17.720
That's Snap.

00:37:17.720 --> 00:37:23.660
For a free, no obligation, 30 day trial, just go to snap.ci slash talk python.

00:37:23.660 --> 00:37:33.960
I don't know a ton about machine learning.

00:37:33.960 --> 00:37:36.920
I know a little bit about sort of neural networks and those kinds of things.

00:37:36.920 --> 00:37:44.400
But do you think that we're going to get to a future where we have software that does things and we don't know why?

00:37:44.400 --> 00:37:45.700
We cannot know why?

00:37:45.700 --> 00:37:46.900
Oh, boy.

00:37:46.900 --> 00:37:47.760
Yeah.

00:37:47.760 --> 00:37:48.700
Let's go down the rabbit hole.

00:37:49.440 --> 00:37:52.140
So that is a great question.

00:37:52.140 --> 00:37:55.420
And you think about neural networks and you think about, you know, throwing rocks.

00:37:55.420 --> 00:37:59.860
I think that we've got the limiting factor with Moore's law a little bit on that.

00:37:59.860 --> 00:38:05.100
However, as we get into quantum computing, right, that's when things get pretty interesting.

00:38:05.100 --> 00:38:08.780
And I think machine learning is just kind of inept into that.

00:38:08.860 --> 00:38:19.060
Like, if you're combining machine learning and quantum computing, I think you can start to scratch the surface on questions that are as far fetched as, you know, what is consciousness?

00:38:19.060 --> 00:38:23.100
Can we really even quantify that anymore when you've got a machine making decisions?

00:38:23.100 --> 00:38:26.500
And it might identify the need to change some of its internal programming.

00:38:26.500 --> 00:38:35.720
You know, like if a machine learned quantum computer can train itself to iterate upon itself, what happens next, right?

00:38:36.440 --> 00:38:38.120
Yeah, it gets pretty crazy.

00:38:38.120 --> 00:38:41.220
I mean, even before it like, you know, it goes that far.

00:38:41.220 --> 00:38:50.420
Like, if you're trying to just debug something or you're trying to manage like complex machine learning in like production, right?

00:38:50.420 --> 00:38:56.220
Like, it might start making decisions and you're like, I don't really know why it's doing that, right?

00:38:56.220 --> 00:38:58.260
But maybe it should or maybe it shouldn't.

00:38:58.460 --> 00:38:59.900
Yeah, so I mean, like, we have that.

00:38:59.900 --> 00:39:01.340
We already have that today, right?

00:39:01.340 --> 00:39:03.360
Like, so we have a trained model, right?

00:39:03.360 --> 00:39:08.340
And we might see that it's doing something a little fishy on certain results.

00:39:08.340 --> 00:39:09.560
And we might want to dive into it.

00:39:09.560 --> 00:39:16.900
Well, it's not necessarily just like look at it and go, oh, well, because the code path is this and if this than that, it's really easy to see that.

00:39:17.020 --> 00:39:20.740
Well, actually, it's not anymore because you've got a statistical model you're basing it on.

00:39:20.740 --> 00:39:23.260
You've got to look how different features impact one another.

00:39:23.260 --> 00:39:26.500
You have to look how combinations of features, you know, work together.

00:39:26.500 --> 00:39:33.300
If this feature is scored highly and this other feature starts to go down, does the confidence go up or does it go down?

00:39:33.400 --> 00:39:36.640
Like, none of it is necessarily intuitive anymore and it's all numbers.

00:39:36.640 --> 00:39:42.860
So the next step from that is exactly what you're saying where you're going, well, what about when the machine starts to do things that we can't even debug?

00:39:42.860 --> 00:39:55.320
And I think that's where you're looking at, you know, internal code patching where a program can look and understand its own code base enough that it can change it in such a way that it starts to only work in a statistical way, right?

00:39:55.460 --> 00:40:04.240
So it trains itself based on a conditional pattern and then you feed it correct and incorrect results and it starts to learn, you know, this model makes more sense than that model.

00:40:04.240 --> 00:40:16.140
And then at some point it gets so confident and so well trained and you've defined the features so precisely that it no longer has a conditional code path because everything that it does can be decided on a statistical model, right?

00:40:16.140 --> 00:40:20.920
And that's just talking like the two-dimensional equivalent of machine learning, I think.

00:40:20.920 --> 00:40:28.260
When you get into neural networks and you get into the sort of conditional-based machine learning, that's when it's going to – it's when it goes next level, right?

00:40:28.260 --> 00:40:32.940
Yeah, and then you get like the forest, which are groups of – I mean, it just gets really interesting.

00:40:32.940 --> 00:40:45.380
You know, the part you started to touch on, if people are interested and they want to see a really great movie that like sort of explores that in a science fiction way, Ex Machina is a really good movie that –

00:40:45.380 --> 00:40:47.640
I recently watched that and it really freaked me out.

00:40:47.640 --> 00:40:50.040
Yeah, that's one of those things.

00:40:50.040 --> 00:40:54.320
I think – I mean, just for the people who haven't, I think it's worth talking about a little bit.

00:40:54.320 --> 00:41:02.860
You've got a situation where this machine has learned, you know, basically what it needs to survive and it's learned how to – spoiler alert, I guess.

00:41:02.860 --> 00:41:09.000
It starts to learn how to interpret human emotion based on the output of the human response, right?

00:41:09.040 --> 00:41:17.620
So like if it can look at a face and determine that this emotion is that and then it's got, let's say, the entire history of all the data in Google to train upon.

00:41:17.620 --> 00:41:19.720
Let's just use that as a real-world example.

00:41:19.720 --> 00:41:28.300
If you can actually build a physical medium for this thing to exist in, yeah, it's going to start to do some really interesting things.

00:41:28.460 --> 00:41:33.440
And like you touched on, I think there's this point when it stops being conditional.

00:41:33.440 --> 00:41:35.980
It stops being functionally programmed, right?

00:41:35.980 --> 00:41:40.380
It's getting to the point where it's saying, is this working for me or is this not?

00:41:40.380 --> 00:41:42.800
If not, try something new.

00:41:42.800 --> 00:41:47.680
And I think that's – you've got some really talented people right now who have spoken out against AI.

00:41:47.680 --> 00:41:50.160
And I just – this feels like the natural progression.

00:41:50.160 --> 00:41:53.480
So just throw a rock at me if you want for going down this path.

00:41:53.480 --> 00:42:06.480
But like when you've got the guys coming and saying AI is a bit scary, it's because in my opinion, if a computer is going to do that trial and error and trial can be somewhat random, who knows what that means and who knows how it quantifies success?

00:42:06.480 --> 00:42:20.700
Because the motivations of a machine that doesn't necessarily have features, if you will, that are targeting emotional or human factors and responses, you're definitely getting a situation where that can be kind of scary.

00:42:20.700 --> 00:42:22.740
And that movie is why that's scary.

00:42:22.740 --> 00:42:27.740
That movie is the perfect quantification of the worst-case scenario for an artificial intelligence.

00:42:27.740 --> 00:42:31.020
Yeah, it was – it's definitely worth checking out.

00:42:31.020 --> 00:42:32.380
I recommend it.

00:42:32.380 --> 00:42:33.640
But super interesting.

00:42:33.640 --> 00:42:40.580
You know, of the people who spoke out about AI, a lot of them I was kind of like, well, you know, how much really do they know about software?

00:42:40.580 --> 00:42:42.540
It's kind of like an amorphous concept.

00:42:42.540 --> 00:42:48.180
But Elon Musk, like that's a guy who is actually creating the future.

00:42:48.180 --> 00:42:52.100
So I definitely give his statements more credit.

00:42:52.100 --> 00:42:53.340
Stephen Hawking too.

00:42:53.340 --> 00:42:56.560
I mean you've got a lot of smart guys saying stuff like this.

00:42:56.560 --> 00:42:58.640
I have to find this for you too.

00:42:58.720 --> 00:43:03.740
But I found this talk by the guys who were working on the first quantum computers.

00:43:03.740 --> 00:43:06.280
And for my sci-fi nerds, it's really fascinating.

00:43:06.280 --> 00:43:07.800
They're big black boxes.

00:43:07.800 --> 00:43:10.100
And he refers to them as black monoliths.

00:43:10.100 --> 00:43:11.220
And I just eat that up, right?

00:43:11.220 --> 00:43:11.880
Nice.

00:43:11.880 --> 00:43:14.980
But he's talking and he literally talks about the way qubits work.

00:43:14.980 --> 00:43:21.120
And he gets into this idea that, you know, it is kind of like you're pulling from – and this is going to go totally fringe.

00:43:21.120 --> 00:43:24.420
But it's like pulling from two different universes, right, that are parallel.

00:43:24.420 --> 00:43:27.340
But you've got a point where they converge and that point is the qubit.

00:43:27.340 --> 00:43:31.660
And everything that comes beyond the qubit is sort of like the shadow of what happens.

00:43:31.660 --> 00:43:42.600
And the way that these things work, he goes and talks about how, you know, the biggest challenge is how you keep all the chips at near absolute zero temperatures, which is a scientific feat in and of itself.

00:43:42.960 --> 00:43:58.020
And the stuff that he says in this talk is just like the predictions he's making and his colleagues are making are that in 15 years, computers are going to be able to do anything humans are going to be able to do and much better because they can train and iterate themselves.

00:43:58.020 --> 00:44:01.380
And, you know, we like to talk about it and joke that it's science fiction.

00:44:01.380 --> 00:44:03.300
But science fiction is becoming reality.

00:44:03.300 --> 00:44:05.140
It always has followed that trend.

00:44:05.140 --> 00:44:07.280
We've completely diverged from music.

00:44:07.280 --> 00:44:11.120
But, like, absolutely, it's one of these topics that is really fascinating.

00:44:11.120 --> 00:44:16.140
I think quantum computing is something to keep your eye on, especially in the next five to ten years.

00:44:16.140 --> 00:44:17.780
Yeah, I totally agree.

00:44:17.780 --> 00:44:21.900
To me, honestly, quantum computing is scarier than AI.

00:44:21.900 --> 00:44:25.260
Well, it is in its sense kind of like AI.

00:44:25.260 --> 00:44:26.680
If you put them together, then you're...

00:44:26.680 --> 00:44:26.680
Yeah.

00:44:26.680 --> 00:44:28.780
You put them together, you get all sorts of trouble.

00:44:28.780 --> 00:44:31.600
But even basic things like encryption, right?

00:44:31.600 --> 00:44:36.980
Like, what happened if tomorrow we found out that all encryption was useless?

00:44:36.980 --> 00:44:40.300
You know, what would that do to the economy, to jobs, to businesses?

00:44:40.300 --> 00:44:42.880
Like yours that need privacy?

00:44:42.880 --> 00:44:46.860
I think it would be really an immediate problem, I think.

00:44:46.860 --> 00:44:47.560
It would be...

00:44:47.560 --> 00:44:51.960
I think it would be an upheaval of current paradigms that we have in society.

00:44:51.960 --> 00:44:54.980
But, you know, one thing that humans are really good at is adapting, right?

00:44:54.980 --> 00:44:57.960
So, you know, let's say encryption goes out the window.

00:44:57.960 --> 00:45:02.660
I think humans will very quickly become aware that, okay, there is a real need for transparency in the world, you know?

00:45:02.900 --> 00:45:04.320
And we'll find a way to adapt.

00:45:04.320 --> 00:45:06.860
And you want to look at an example where that's happened.

00:45:06.860 --> 00:45:13.500
Bitcoin was the perfect prototype of, for example, a currency that was trying to solve so many problems by being transparent.

00:45:13.940 --> 00:45:23.120
And I can tie this back to music because one of the things that's really trending in this industry that I'm in right now is the idea of having a blockchain for music royalties.

00:45:23.120 --> 00:45:34.240
So whenever a usage is generating royalties, what they want to do is use a Bitcoin-like technology to attribute the stream or whatever is generating the money and transparently show who it's getting paid to.

00:45:34.240 --> 00:45:40.040
That would attempt to solve this huge, huge problem of why aren't artists actually getting paid for their content?

00:45:40.040 --> 00:45:41.960
Why aren't songwriters getting paid for their content?

00:45:42.360 --> 00:45:49.720
Right now, though, and to go back to transparency, the problem is that a blockchain doesn't work unless the data it's attached to is transparent.

00:45:49.720 --> 00:45:56.280
And right now, rights holders and other interested parties are not always privy to just saying, oh, this is all the music we own.

00:45:56.280 --> 00:46:00.340
And this is how much to pay us because there is value in that data.

00:46:00.340 --> 00:46:07.020
And they're able to make intelligent business investments and make some money by putting value to that information.

00:46:07.020 --> 00:46:11.400
Yeah, that's a really cool idea, but I can definitely see the real-world challenges.

00:46:11.400 --> 00:46:14.220
All right, so let's bring it back to Python just for a little bit.

00:46:14.220 --> 00:46:18.180
So you talked about the machine learning.

00:46:18.180 --> 00:46:20.100
You also talked about some other cool things.

00:46:20.100 --> 00:46:25.220
You said this RESTful API that you guys open source called Pale was really cool.

00:46:25.220 --> 00:46:26.520
Tell us a bit more about that.

00:46:26.520 --> 00:46:29.080
Yeah, so Pale is nice.

00:46:29.080 --> 00:46:35.620
And the reason I like Pale so much is we're writing things in such a way that let's just start from the beginning.

00:46:35.620 --> 00:46:41.380
If I'm going to build a new API, and actually I'm doing this by making a website for my own music where you can come.

00:46:41.380 --> 00:46:46.340
And I just wanted to have like Bandcamp music integrated into it so I could link everything to Spotify.

00:46:46.340 --> 00:46:49.820
So the way that I did this was I just pulled down Pale, right?

00:46:49.820 --> 00:46:52.180
And Pale you can implement with Flask or Web App 2.

00:46:52.760 --> 00:46:57.100
And you just get off the ground writing a RESTful API in a very Pythonic way.

00:46:57.320 --> 00:47:02.960
So you manage information that comes in responses in the form of resources.

00:47:02.960 --> 00:47:04.640
And you define those very succinctly.

00:47:04.640 --> 00:47:06.060
And they can nest really nicely.

00:47:06.060 --> 00:47:12.860
So I can have a user resource that mentions a password resource if that was structured in a smart way.

00:47:12.860 --> 00:47:16.200
And then you've got the concept of arguments that is going to handle casting.

00:47:16.480 --> 00:47:17.760
So you've got a string argument.

00:47:17.760 --> 00:47:18.860
You've got a Boolean argument.

00:47:18.860 --> 00:47:26.380
And the way that – why this is so good is because you kind of remove serialization from how information is handled.

00:47:26.380 --> 00:47:30.820
So you can have a JSON input, which is ideal in my mind.

00:47:30.820 --> 00:47:32.220
But you could also have an XML input.

00:47:32.220 --> 00:47:39.300
And what you're doing is you're doing a really nice kind of object-oriented solution of keeping the problem where it belongs.

00:47:39.300 --> 00:47:45.740
So, like, I'm not going to try to struggle with a string argument problem outside of the string argument class, right?

00:47:45.740 --> 00:47:48.240
And this is a trivial example of strings.

00:47:48.240 --> 00:47:58.420
But when you get into structures, you know, like currency types or other structured types of information where you might have a need to do all sorts of fun stuff, like permissions is a great one.

00:47:58.420 --> 00:48:03.540
So on Louder, for example, on our API, we have, let's just say, like an album resource.

00:48:03.540 --> 00:48:05.100
And it represents an album on the store.

00:48:05.340 --> 00:48:15.200
The thing is, when you are the owner of the album versus the public user looking at this album, you're not going to necessarily need to see the same fields.

00:48:15.200 --> 00:48:24.720
And one of the challenges when building any new framework is how do I actually manage those permissions in an intelligent way where my code and my permissions logic isn't all over the place?

00:48:24.720 --> 00:48:29.780
Pale provides a solution to that in that we've got this ongoing context.

00:48:29.780 --> 00:48:34.180
And the context is passed every time any field or resource is going to be rendered.

00:48:34.180 --> 00:48:43.480
And the context is going to carry all the things about the request, the HTTP request, all the arguments that come in that have already been deserialized to Python dictionaries.

00:48:43.480 --> 00:48:49.880
And it allows you just to look from, let's say I'm coding the album resource and I need to say these are the fields I want to expose.

00:48:49.880 --> 00:48:51.740
And I've already defined the fields at the class level.

00:48:51.740 --> 00:48:55.420
So the album has like a track, number of tracks, which is an integer argument.

00:48:55.620 --> 00:48:58.380
It's got the name, the string, all that stuff.

00:48:58.380 --> 00:49:01.140
And all I have to necessarily do is say context.

00:49:01.140 --> 00:49:03.100
Tell me who's accessing this.

00:49:03.100 --> 00:49:05.040
Let me determine what the permissions model is.

00:49:05.040 --> 00:49:08.240
And that itself can be abstracted, you know, however you want to when you implement.

00:49:08.620 --> 00:49:14.180
And then it's the resource's responsibility to decide how it's going to render arguments.

00:49:14.180 --> 00:49:27.820
So this makes things like expanding nested relationships really a lot more easy to tackle because you don't have to go into some really nasty conditions if you're thinking about just like how would you do this from scratch?

00:49:27.820 --> 00:49:28.540
What would you do?

00:49:28.860 --> 00:49:40.340
I think there's other cool API frameworks out there, but this is the first time that I've used one where I felt and I don't know if it's maybe my App Engine or Web App 2 kind of background to coming in where this context idea is so fruitful.

00:49:40.560 --> 00:49:53.140
But having that context and having all your permissions and all these challenges, whatever you want to do, be passed at that level where the request is kind of contained like that, it just makes programming this whole problem really nice.

00:49:53.140 --> 00:49:57.480
So, you know, I'm going back to my open source like website thing that I'm working on.

00:49:57.480 --> 00:49:59.640
It's really easy for me to quickly build something.

00:49:59.640 --> 00:50:19.160
I think in a day when I was using Pale, I was able to scrape Bandcamp, put all my albums into the API, have a situation where I could write a React front end and actually show the albums, have search for the albums, have album specific pages, have those streams play off Bandcamp and off Spotify literally within a day.

00:50:19.160 --> 00:50:27.580
And that feels ridiculous to me for some reason because I guess when I got started doing this in 2012, 2011, whatever it was, it was not that fast.

00:50:27.960 --> 00:50:28.920
Like, especially to do it.

00:50:28.920 --> 00:50:31.500
It was like a three month project or something, right?

00:50:31.500 --> 00:50:32.040
Right.

00:50:32.040 --> 00:50:39.460
And to do it in a restful way to like that, especially I guess it was just at that time and there wasn't necessarily as large of a push for it.

00:50:39.460 --> 00:50:49.220
But, you know, when Pales got this real big emphasis on being restful, which is the most intelligent way to do an HTTP API at this point, like it's just beautiful.

00:50:49.220 --> 00:50:56.440
Like you get to specify endpoints as classes and you can determine, you know, this endpoint and this endpoint might share the same URL, but they have different methods.

00:50:56.960 --> 00:50:58.520
And it's very, I mean, it's just straightforward.

00:50:58.520 --> 00:50:59.320
That's really cool.

00:50:59.320 --> 00:50:59.880
In addition to that.

00:50:59.880 --> 00:51:00.420
Very nice.

00:51:00.420 --> 00:51:13.040
You get to use, like to go back to this argument concept, I can have a URL argument and take advantage of web app twos like URI4, for example, and just dynamically determine what the URL should be for a canonical resource.

00:51:13.040 --> 00:51:17.080
And that's Pale, like a lot about Pale in a small amount of time.

00:51:17.080 --> 00:51:19.540
But yeah, I mean, that's why I'm excited about it.

00:51:19.540 --> 00:51:20.000
Okay, cool.

00:51:20.000 --> 00:51:20.880
Yeah, I hadn't heard of it.

00:51:20.880 --> 00:51:22.320
So I'm definitely going to check it out.

00:51:22.320 --> 00:51:22.960
That sounds awesome.

00:51:22.960 --> 00:51:23.480
I like it.

00:51:23.580 --> 00:51:23.740
Yeah.

00:51:23.920 --> 00:51:26.980
There's one example app that's like included in the code base.

00:51:26.980 --> 00:51:29.200
And I would like to solve that by having more examples.

00:51:29.200 --> 00:51:31.720
I think I'm talking about this thing that I'm building.

00:51:31.720 --> 00:51:38.020
It's not quite open source just because, you know, like when you start your project, you want to make sure it looks nice before you put it out and that it's usable for others.

00:51:38.100 --> 00:51:43.400
But that'll actually be a good example of an App Engine Pale integration that people can throw up on their website very quickly.

00:51:43.400 --> 00:51:50.920
I think it'll be, if all goes well, I think that the more technically inclined musicians that are trying to do some really interesting things with their websites might transition to.

00:51:50.920 --> 00:51:52.140
That's the goal.

00:51:52.140 --> 00:51:53.680
Yeah, that sounds very cool.

00:51:54.440 --> 00:52:06.100
So one of the sort of hot topics right now, given that we're coming up on the end of life for Python 2 in 2020, is whether people are using Python 2 or are they using Python 3.

00:52:06.100 --> 00:52:07.540
How about you guys?

00:52:07.540 --> 00:52:09.640
Yeah, it's 2.7.

00:52:09.640 --> 00:52:11.820
So these are things that we have to face.

00:52:11.820 --> 00:52:15.760
App Engine's got Python 3 support as of relatively recently, I think.

00:52:16.280 --> 00:52:21.200
Fortunately, in terms of how we've written code so far, I've done some early assessments of it.

00:52:21.200 --> 00:52:23.360
I don't think it's going to be too problematic to port over.

00:52:23.360 --> 00:52:30.160
It's just one of those things whenever you're doing like a big version change that it's like, oh my gosh, how are we going to gracefully transition?

00:52:30.160 --> 00:52:31.720
Are we going to be able to do it in time?

00:52:31.720 --> 00:52:33.920
Oh my gosh, what's the this and that?

00:52:33.920 --> 00:52:40.020
And, you know, I think, you know, while Python says that they're going to stop 2020 is going to be the end of the lifespan,

00:52:40.020 --> 00:52:48.520
I don't think that we're going to functionally see Python 2 die in the same way that Josh Welch will still play Doom on his computer and it's not the new Doom.

00:52:48.520 --> 00:53:02.040
I think Python 2 is going to die like Windows XP is dying, which is to say that I go to plenty of places and they take my credit card and it interacts with a thing that has Windows XP on it.

00:53:02.040 --> 00:53:02.740
It makes me nervous.

00:53:03.360 --> 00:53:12.120
But they do it or, you know, I think the U.S. military, at least for a time, was paying Microsoft extra for support even when it became unsupportable.

00:53:12.120 --> 00:53:12.960
You know, things like this.

00:53:12.960 --> 00:53:13.640
Yeah, absolutely.

00:53:13.640 --> 00:53:15.060
I don't know.

00:53:15.060 --> 00:53:15.580
Am I going to do like...

00:53:15.580 --> 00:53:17.060
I think that's how Python 2 is going to go.

00:53:17.060 --> 00:53:21.500
I think I'm going to like pip install requests and then pip is going to be like, installing Python 3.

00:53:21.500 --> 00:53:22.140
Suck it.

00:53:22.140 --> 00:53:24.980
No, Kenneth, what are you doing?

00:53:24.980 --> 00:53:27.400
Yeah, exactly.

00:53:27.400 --> 00:53:28.200
How awesome.

00:53:28.200 --> 00:53:29.840
All right.

00:53:29.840 --> 00:53:40.940
So you talked a little bit about having a lot of cool opportunities for people and bringing on some new folks that were able to really like make the machine learning zing and how awesome that was.

00:53:40.940 --> 00:53:49.500
Are you, you know, some of my most popular episodes are when I talk about people getting jobs or sort of what you can do with Python and so on.

00:53:49.500 --> 00:53:51.720
And from sort of getting started.

00:53:51.720 --> 00:53:54.640
Do you guys have open positions you're looking for Python people?

00:53:54.860 --> 00:53:58.460
Yeah, so we actually just put out a call for a senior back-end engineer.

00:53:58.460 --> 00:54:02.820
And if you've got machine learning experience, that's going to be absolutely a big plus.

00:54:02.820 --> 00:54:05.640
The same goes for like natural language processing, that sort of thing.

00:54:05.640 --> 00:54:15.600
My expectation is that we're going to see a blossoming of opportunities at Louder in the next, probably after a window of three to six months, somewhere in there.

00:54:16.000 --> 00:54:23.600
Just simply looking at the growth in terms of the clients that are integrating with us at this point and our need to scale to the amount of clients that we'd like to.

00:54:23.600 --> 00:54:27.300
There's definitely going to be some ripe opportunities, especially in machine learning.

00:54:27.700 --> 00:54:33.220
Right now, we have some really talented Python contractors doing some really dedicated machine learning work.

00:54:33.220 --> 00:54:41.300
And actually, if you've got the experience of machine learning and you are a contractor, particularly, and you want to get your hands wet or dirty or whatever,

00:54:41.300 --> 00:54:49.360
in a practical example where Python and machine learning actually come into a business practice, then you should definitely give me a – don't call me.

00:54:49.360 --> 00:54:50.600
Email me for sure.

00:54:51.040 --> 00:54:51.720
That's awesome.

00:54:51.720 --> 00:54:55.700
Yeah, so I'll put some – you can give me some link that we can use for them to –

00:54:55.700 --> 00:54:56.340
Absolutely.

00:54:56.340 --> 00:54:59.200
To get to test you in a proper way that is not waking you in the middle of the night.

00:54:59.200 --> 00:55:00.780
Yeah, right.

00:55:00.780 --> 00:55:01.220
Nice.

00:55:01.220 --> 00:55:02.700
That's going to happen anyway, but –

00:55:02.700 --> 00:55:03.800
Yeah, of course.

00:55:03.800 --> 00:55:07.020
All right, so we're kind of getting near the end of the show.

00:55:07.020 --> 00:55:10.920
And let me ask you a couple of questions I always ask my guests at the end.

00:55:10.920 --> 00:55:15.240
We talked a little bit about some of the PyPI packages that you are using.

00:55:15.240 --> 00:55:17.560
But, you know, there's 80,000 of them.

00:55:18.000 --> 00:55:21.440
And there's always – you know, every – I know it blows my mind.

00:55:21.440 --> 00:55:23.040
It might be quite a bit higher.

00:55:23.040 --> 00:55:23.840
I need to look probably.

00:55:23.840 --> 00:55:30.400
But there's so many that are amazing, like this Pale one that you told me about that people don't necessarily know about.

00:55:30.400 --> 00:55:31.920
So – but you have a lot of exposure.

00:55:31.920 --> 00:55:33.900
So is there one that you really like?

00:55:33.900 --> 00:55:35.640
Is that Pale or is that another one?

00:55:35.640 --> 00:55:39.920
I can't be – I can't say Pale because that would just be biased.

00:55:39.920 --> 00:55:40.920
But –

00:55:40.920 --> 00:55:44.520
Well, I'll nominate Pale for you and you can pick another one.

00:55:44.520 --> 00:55:44.720
Yeah.

00:55:44.720 --> 00:55:46.460
There's just so many Python packages.

00:55:46.460 --> 00:55:47.560
It's like hard to choose.

00:55:47.720 --> 00:55:51.580
Like I think you've probably gotten the answer requests probably a lot, I would think.

00:55:51.580 --> 00:55:52.180
Yeah, yeah.

00:55:52.180 --> 00:55:53.340
I don't want to be lame.

00:55:53.340 --> 00:55:54.240
I'll make it music related.

00:55:54.240 --> 00:55:59.240
There's one called Mutagen, which is great for handling metadata inside of an MP3 or WAV file.

00:55:59.240 --> 00:56:05.420
That saved us a lot of time in terms of just being able to look at what's inside of files.

00:56:05.420 --> 00:56:10.760
The trick that came with it, of course, is – and I think this might be why it's my favorite – is it required me to solve a problem.

00:56:10.760 --> 00:56:12.280
It required me to iterate on it a little.

00:56:12.280 --> 00:56:12.620
It required me to iterate on it a little.

00:56:12.620 --> 00:56:16.240
And I like that kind of interaction with anything I'm working with.

00:56:16.240 --> 00:56:21.040
If I actually have to get my hands dirty to solve a problem it has, I'm going to have a better experience with it.

00:56:21.040 --> 00:56:24.960
And I know that might sound strange considering a lot of people will just say, oh, yeah, put it in and it works.

00:56:25.260 --> 00:56:30.420
But I find that when you get to actually modify and you're going to learn and understand what you're working with a lot better.

00:56:30.420 --> 00:56:31.560
And Mutagen was one of those.

00:56:31.560 --> 00:56:43.160
So one of the things that we had to solve was how to get Mutagen to look at the metadata or the ID3 tags, if you will, inside of a file object rather than inside of something that was just a file name or on the file system.

00:56:43.160 --> 00:56:48.980
And it initially hadn't been written – it was actually written in a way where most of the architecture was working with an open file resource.

00:56:49.180 --> 00:56:54.520
But for whatever reason, the API itself and the opening and all that stuff wasn't right there at the time.

00:56:54.520 --> 00:56:55.740
And that's probably changed.

00:56:55.740 --> 00:56:57.380
It hasn't been a few years since I had to do this.

00:56:57.380 --> 00:57:09.120
But I really do enjoy using Mutagen because it's just like any time you can bring music into Python and solve some problem like that so that I don't have to call a command line or I don't have to get into the bytecode or do any frame decompression, yada, yada.

00:57:09.120 --> 00:57:11.200
I'm going to really appreciate it.

00:57:11.200 --> 00:57:12.800
And I think Mutagen is that for me.

00:57:12.800 --> 00:57:13.780
Yeah, that's awesome.

00:57:13.780 --> 00:57:14.620
Nice recommendation.

00:57:15.860 --> 00:57:19.720
And then the other question is when you're writing Python code, what editor do you open up?

00:57:19.720 --> 00:57:20.840
I am a Sublime guy.

00:57:20.840 --> 00:57:23.240
I've been using a little bit more of Vim these days.

00:57:23.240 --> 00:57:26.700
But for some reason, I still really like Sublime.

00:57:26.700 --> 00:57:27.960
I like the Python packages.

00:57:27.960 --> 00:57:29.640
And I haven't gotten into Atom really.

00:57:29.640 --> 00:57:31.960
It's just Sublime all the way.

00:57:31.960 --> 00:57:32.700
All right.

00:57:32.700 --> 00:57:34.200
Yeah, that's definitely a popular one.

00:57:34.200 --> 00:57:34.700
That's cool.

00:57:34.700 --> 00:57:37.820
All right, Josh, any final call to action?

00:57:37.820 --> 00:57:42.420
What should people do if they've got this music problem?

00:57:42.420 --> 00:57:44.400
How do they get started working with you?

00:57:44.980 --> 00:57:46.960
Yeah, I mean, so this would be fun.

00:57:46.960 --> 00:57:55.560
I mean, if you want to build a website sort of a la SoundCloud or something, you know, and you want to do it and make sure you don't get your butt sued when you do it, you would want to talk to louder.

00:57:55.560 --> 00:58:01.200
So if you're ever like streaming music on the Internet or you're ever distributing content or let's say that you're a small label.

00:58:01.200 --> 00:58:05.500
Actually, I kind of like this example because we work with a few distributors and labels.

00:58:05.500 --> 00:58:22.480
So like if you are looking to solve this problem that you have where you have artists or you are an artist yourself and you need to distribute cover songs or you need to secure mechanical license, you should definitely get a hold of us because we're solving ways that are solving this problem in a way that's very technical and scalable.

00:58:23.220 --> 00:58:30.500
Which means that, you know, by the maturity of the business level of integration, you're going to have access to some really cool APIs to look at your data.

00:58:30.500 --> 00:58:32.520
The stuff we're working on now is really exciting.

00:58:32.520 --> 00:58:38.200
And I think it's going to bring the level of technical understanding in the music industry to the next degree.

00:58:38.200 --> 00:58:42.180
I think the joke about the music industry and technology is it's about 10 years behind.

00:58:42.180 --> 00:58:47.080
And that's because I think technology has typically screwed the music industry in some form or another.

00:58:47.080 --> 00:58:49.320
You can have whatever opinion you want on it.

00:58:49.320 --> 00:58:53.060
But I think I think there is some truth to that statement.

00:58:53.060 --> 00:59:01.560
So I would say if you're if you're getting into being a label or especially if you're doing some cool integrations and you're, you know, maybe automating your distribution or something like that.

00:59:01.940 --> 00:59:09.440
Are you like working with software like talk to us a louder like we'll help you solve this problem in a really cool fun way for you because it can be done in code.

00:59:09.440 --> 00:59:11.440
And who doesn't like to solve all their problems in code?

00:59:11.440 --> 00:59:12.060
I don't know.

00:59:12.060 --> 00:59:12.280
Yeah.

00:59:12.280 --> 00:59:17.000
Well, I think the people listening generally like to solve their problems in code.

00:59:17.000 --> 00:59:19.700
So it definitely will be well received.

00:59:19.700 --> 00:59:20.760
All right.

00:59:20.760 --> 00:59:21.420
I hope so.

00:59:21.420 --> 00:59:21.740
Yeah.

00:59:21.740 --> 00:59:23.120
Josh, thanks for sharing your story.

00:59:23.120 --> 00:59:24.960
This is really interesting what you guys are up to.

00:59:24.960 --> 00:59:25.780
Absolutely.

00:59:25.780 --> 00:59:26.420
Thanks so much.

00:59:26.420 --> 00:59:28.680
I hope that we didn't go on too many crazy tensions.

00:59:28.680 --> 00:59:29.920
It was a lot of fun.

00:59:29.920 --> 00:59:30.780
Yeah, it was definitely fun.

00:59:30.780 --> 00:59:31.280
Talk to you later.

00:59:31.280 --> 00:59:31.700
Yeah.

00:59:31.700 --> 00:59:31.840
Bye.

00:59:31.840 --> 00:59:31.960
Bye.

00:59:31.960 --> 00:59:36.320
This has been another episode of Talk Python To Me.

00:59:36.320 --> 00:59:38.560
Today's guest was Josh Welchel.

00:59:38.560 --> 00:59:41.380
And this episode has been sponsored by Rollbar and SnapCI.

00:59:41.380 --> 00:59:43.420
Thank you both for supporting the show.

00:59:43.420 --> 00:59:46.420
Rollbar takes the pain out of errors.

00:59:46.420 --> 00:59:54.140
They give you the context and insight you need to quickly locate and fix errors that might have gone unnoticed until your users complain, of course.

00:59:54.140 --> 01:00:01.280
As Talk Python To Me listeners, track a ridiculous number of errors for free at rollbar.com slash Talk Python To Me.

01:00:01.600 --> 01:00:14.880
SnapCI is modern.com slash Talk Python.com slash Talk Python.com slash Talk Python.com slash launch.

01:00:14.880 --> 01:00:20.580
I'm so excited to be able to unveil my Python for entrepreneurs course that I told you about at the top of the show.

01:00:20.800 --> 01:00:27.340
If you want to learn Python web development and launch.

01:00:27.340 --> 01:00:28.960
Talk Python.com slash Talk Python.com slash Talk Python.com slash Talk Python.com slash launch.

01:00:28.960 --> 01:00:31.560
I hope we can build something amazing together.

01:00:32.220 --> 01:00:38.080
You can find the links from this episode at Talk Python.com slash Talk Python.com slash episodes slash show slash 70.

01:00:38.080 --> 01:00:40.020
Be sure to subscribe to the show.

01:00:40.020 --> 01:00:42.220
Open your favorite podcatcher and search for Python.

01:00:42.220 --> 01:00:43.460
We should be right at the top.

01:00:43.460 --> 01:00:46.800
You can also find the iTunes feed at /itunes.

01:00:46.800 --> 01:00:48.860
Google Play feed at /play.

01:00:48.860 --> 01:00:52.700
And direct RSS feed at /rss on Talk Python.com.

01:00:52.820 --> 01:00:57.680
Our theme music is Developers, Developers, Developers by Corey Smith, who goes by Smix.

01:00:57.680 --> 01:01:04.380
Corey just recently started selling his tracks on iTunes, so I recommend you check it out at talkpython.fm/music.

01:01:04.380 --> 01:01:09.740
You can browse his tracks he has for sale on iTunes and listen to the full-length version of the theme song.

01:01:09.740 --> 01:01:11.640
This is your host, Michael Kennedy.

01:01:11.640 --> 01:01:12.920
Thanks so much for listening.

01:01:12.920 --> 01:01:14.120
I really appreciate it.

01:01:14.120 --> 01:01:16.260
Smix, let's get out of here.

01:01:16.260 --> 01:01:18.240
Stating with my voice.

01:01:18.240 --> 01:01:20.020
There's no norm that I can feel within.

01:01:20.020 --> 01:01:21.260
Haven't been sleeping.

01:01:21.560 --> 01:01:22.880
I've been using lots of rest.

01:01:22.880 --> 01:01:25.720
I'll pass the mic back to who rocked it best.

01:01:25.720 --> 01:01:29.040
First, developers, developers, developers, developers, developers.

01:01:29.040 --> 01:01:35.060
First, developers, developers, developers, developers, developers, developers, developers.

01:01:35.060 --> 01:01:37.820
developers, developers, developers, developers.

01:01:37.820 --> 01:01:38.020
.

