Transcript #79: 15 Tips to Enhance your Github Flow
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:05 This is episode 79, recorded May 23rd, 2018. I'm Michael Kennedy.
00:09 And I'm Brian Ockin.
00:10 Hey, Brian. How are you doing?
00:10 I'm doing great.
00:11 Nice. I think, as always, we've got a bunch of fun stuff to talk about.
00:15 And we wouldn't be doing it without DigitalOcean.
00:17 A couple of reasons, but DigitalOcean is sponsoring this episode and a bunch of the upcoming ones.
00:21 So thank you to DigitalOcean.
00:23 Get $100 off or $100 credit at pythonbytes.fm/DigitalOcean for new customers.
00:30 Tell them, tell you more about that later.
00:31 I would be totally surprised, Brian, if you wanted to cover something about, say, testing or pytest.
00:38 Yeah, yeah. So pytest 3.6.0 just got announced.
00:43 So 360 for pytest.
00:46 And this is like an inside baseball kind of release because there's not a lot that if I think 80% of the people using pytest won't see a difference.
00:58 But, however, this was a big deal for the team.
01:01 Essentially, it's a revamp of the implementation of the marker system and the data type that was used to hold the markers.
01:09 So there is a couple other things.
01:11 That's the big thing that's going on in the 3.6.0 release is reworking of the markers in it.
01:16 And there's a list on their release notes of all the different defects that they fixed with this.
01:21 The takeaway for a lot of people is if you were using, if you're writing a plug-in or something or using the plug-in features and using getmarker to find out which markers are applied to a particular function,
01:35 the getmarker is deprecated, there's a new API, there's itermarkers and getclosestmarker.
01:41 And, yeah, we'll have a link in the show notes to read more on that.
01:45 So most of it's a plug-in writers change, API change, but it's exciting.
01:51 And I'm excited for the team to get that out because kind of like the Django 2 release, it's about maintenance and going forward.
02:00 And so that's great.
02:01 There is one more feature that we, from a couple other things, a breakpoint.
02:06 The pytest is supporting the breakpoint functionality in 3.7.
02:09 And that is brought to you by our friend Anthony Shaw.
02:12 So he put that in.
02:13 Oh, nice.
02:14 Yeah, he's doing a lot of work on Python 3.7 because rumor is he may be doing a course on Python 3.7.
02:19 So awesome.
02:20 He was able to bring it over here.
02:22 And a couple other smaller things like the, apparently, I had never run into this, but if you have an assertion failure on equality and the only thing different is white space, it's kind of hard to tell.
02:34 So they now escape characters too.
02:38 So you can see what the white space difference is a little bit better, which is kind of cool.
02:42 I've never run into that.
02:43 That's a little hard.
02:44 You print it on.
02:44 You're like, those are the same.
02:46 No, no.
02:47 That's two spaces, not one right there.
02:49 Yeah.
02:49 So for the main port, I wanted to get this out to as many people as possible.
02:53 So if you are depending on reading markers in your internal code, pay attention to this.
02:59 So that's it.
03:01 Yeah, it sounds like a nice cleanup of the internal APIs for extension writers.
03:04 And that's always good because that probably means more extensions.
03:07 Extensions are more likely to be built.
03:09 Yep.
03:09 Sounds good.
03:09 So have we talked about GUIs, Python GUIs on this podcast?
03:13 I'm not sure if we have.
03:15 We probably should.
03:15 Yeah.
03:16 We probably should.
03:17 Yeah, let's do that.
03:17 So there's a lot of stuff going on.
03:21 Part of the reason I went on that rant is because stuff needs to be happening there, but also because some things are happening.
03:27 Like we had the WX Python Phoenix release, which is kind of a rebirth of WX Python, which is really great.
03:33 Well, we also have the same thing going on for QT.
03:36 So for a while, there was a sort of a split.
03:40 There was PyQT.
03:41 There was PySide.
03:43 There was PySide2.
03:44 There are all these ways.
03:45 They defended it on different versions of QT.
03:47 And it was kind of just generally a mess.
03:49 So the QT company is now officially making something called QT for Python,
03:56 which as far as I can tell is more or less like a rebirth of PySide2 for what that's worth.
04:02 So it's really nice that the company that makes QT, the cross-platform GUI framework,
04:09 is like really dedicating itself to Python.
04:11 Yeah.
04:12 One of the things that I think is cool about the QT space is they have the QT designer.
04:18 And I think that's really nice and important for, you know, like I have a visual way to design the UI.
04:23 I know you can write code and say the position is 20, 20 and it stretches this wide.
04:27 But like that is not the same as draggy, droppy, press the button.
04:32 You know what I mean?
04:33 So I got a lot of I'm pretty excited about this, let's say.
04:37 So that's really cool.
04:38 They basically are keeping it super similar to the QT C++ API where that makes sense.
04:44 So like if you read documentation about C++, which is the native language for QT,
04:50 if you replace the pointer dereference, so the arrow, the dash arrow, to replace that with a dot, you know, that may well be the Python API.
04:59 Hmm.
04:59 Okay.
05:00 Which is good.
05:01 But some of the problem, some of the drawbacks, let's say that are like it doesn't necessarily leverage the Pythonic features.
05:06 So like maybe you call a function to do a thing rather than put a decorator on to something else, things like that.
05:13 One thing that is nice is a lot of these UI frameworks are super painful to install, right?
05:18 You can install them on the system and then they don't work so well.
05:22 Maybe there's like some big long compilation step like WX Python takes forever to pip install it onto Ubuntu.
05:30 The last time I tried doing that.
05:32 So they're planning on shipping a wheels version of QT, which before you had to get like some separate installer or something.
05:38 So that'll be pretty sweet that you'll just be able to pip install your thing and it'll come with the foundational stuff you need.
05:44 That's exciting.
05:45 Yeah, that is pretty cool, right?
05:46 So, I mean, I really hope that the company behind QT putting a big effort into this is going to mean like finally a polished version.
05:54 So we'll see.
05:56 I think the licensing might still be GPL and LGPL.
06:00 So as a combination, take your pick.
06:04 I'm not sure what the variations are exactly there, but I don't know.
06:08 I'd like to see something more permissive, but who knows?
06:11 Still nice to see some progress here.
06:13 So do you know, I was trying to find it.
06:15 Do you know the projected release date for the official QT for Python?
06:20 Or is that?
06:21 They're talking about, so the article I'm linking to, it's a blog post calling Hello QT for Python.
06:27 And they say they're working on a technology preview.
06:30 So that's all I've seen.
06:32 But they don't seem to have any further information that I easily found.
06:37 It may be somewhere else.
06:38 Yeah, so it'll be, it does say it'll be available under GPL, LGPL, and commercial licenses.
06:45 It talks about when development started and stuff like that, but it doesn't seem to have like a release date.
06:51 So there it is.
06:52 All right, cool.
06:52 Nice.
06:53 Well, speaking of sneak peeks on things, we've got, we've talked about MongoDB, the 4.0 release that's coming.
07:01 We've talked about that before, but now you can play with it.
07:05 So the 4.0, 4.0, RCA zero is now available.
07:11 It's the very zeroth version of the RCA.
07:13 Yes.
07:13 There's a lot of zeros there.
07:14 Yeah.
07:15 So that is out and ready for testing so people can actually get their hands on it and try working the, again, the big news for this.
07:23 There's a lot of new features, but the big news is ACID transactions and multi-document.
07:29 Multi-document ACID transactions.
07:31 Yes, that's a pretty big deal.
07:33 And I actually don't know if this is a big deal.
07:35 Well, there's a lot of things here, but non-blocking secondary reads, I don't even know if I know what that means.
07:40 So the idea with the non-blocking secondary reads is one of the ways you can set up MongoDB is in a, what's called a replica set.
07:49 So there's like a primary thing that you read and write to.
07:53 And then there are other ones which are constantly just staying in sync with that server.
07:59 Okay.
07:59 There's a couple of benefits to that.
08:00 Like you could put them into, say, different data centers.
08:04 The primary thing is if like for some reason the main server, the primary server fails, it'll automatically switch to one of the secondary ones.
08:12 So it's kind of like a failover redundancy sort of thing as well.
08:17 But you can configure it in a way that you can say, I would like to read from the non-primary database as a way of like adding read scalability.
08:28 So like if I have five servers in the cluster, if I don't do anything, I can only talk to the one, the primary one as a single server.
08:36 And I get no boost of concurrency, let's say.
08:39 But if you say, I want to read from the others, well, then all of a sudden there's like, you're sort of farming that out across six different, you know, servers, primary plus the other five or whatever.
08:47 Right.
08:48 That used to block for consistency reasons.
08:52 And now apparently they found a different way to ensure consistency, maybe because of the transactions.
08:57 Anyway, that's a long, long explanation for what I think that means.
09:01 That does make sense.
09:03 And that's cool.
09:04 At least I knew, I know that there are a lot of people that choose a SQL database over a document database, mostly because of the lack of transactions.
09:13 And so that's one of the reasons why I brought this up, because I'm excited about transactions.
09:17 Yeah, I think that's super exciting as well for the reason you just said.
09:21 What I do think is interesting is as people get to more serious applications, they get to a place where often they give up transactions anyway for sort of concurrency.
09:33 Right. Like, you know, if I go to Amazon, it's not like, and I go to order something, it's not just going to lock all of Amazon while I interact with, you know, my order.
09:45 What it's going to do is like, say, we'll place the order.
09:47 And if it happens to be that actually the thing you ordered sort of sold out just at the moment that you pressed it, you'll get like a message or something.
09:55 Right. Like, hey, sorry, we couldn't fulfill it or whatever.
09:57 Here's your refund.
09:58 So there's a lot of these sort of compensation things that get put into like high scalability stuff.
10:03 I just grabbed Amazon as an example.
10:06 I don't really know how they work.
10:07 But, you know, there's a lot of these large sites that sort of don't use full on transactions in the same sense that other ones do.
10:15 So it's pretty interesting.
10:16 It's interesting in that I don't really think transactions are something I'm going to be using in any of my sites.
10:22 They just don't really seem to be necessary with a few possible exceptions.
10:28 I'll get to what those might be in a little bit.
10:29 But, yeah, I think you're right that people, when people feel they need it, or there are a few situations where you really do need it.
10:36 This is super interesting.
10:37 One other thing that's kind of cool that's not a 4.0 thing, but it's in a 3.6, which is the one right before this, as far as I know, is actually the streaming API.
10:47 So if I've got, like, say, WebSockets or something that I want notification of, like, push of change to the database, you could, like, run a query and say, I want to stream new results that hit this query.
10:59 And then as stuff is inserted to the database that matches, it'll get pushed out to you instead of re-polling the database.
11:07 So suppose I connect to a chat server and I set up WebSockets.
11:10 So you could, like, literally subscribe to, like, these change streams on, like, the conversation record, and you would just get them pushed back down instantly without any polling end-to-end.
11:20 Okay.
11:20 That's pretty cool.
11:21 It's kind of like RethinkDB's feature, primary feature was.
11:24 I guess where I would probably use transactions a lot, and it's not really transactions, but because of transactions you can do this, is I believe 4.0 also includes rollback checkpoints.
11:38 For instance, you can grab a replica of a big database or something, and, like, for instance, like, during testing, you can have a starting point, do a whole bunch of transactions on it, query it, and then roll back to a previous state.
11:54 Yeah, that is pretty cool.
11:55 And I think maybe that secondary non-blocking read stuff has to do with that as well.
11:59 You sort of begin a transaction and you start reading.
12:01 Yeah.
12:02 Anyway.
12:02 Yeah, yeah, very cool.
12:03 So I'm glad to see that that's coming along.
12:05 I feel like the NoSQL document database world and the relational world are kind of, like, merging.
12:12 Like, they're getting closer to each other in a lot of ways, right?
12:16 We have Postgres getting JSON stuff.
12:19 We get MongoDB getting transactions.
12:21 And they're all kind of sort of growing and intersecting in interesting ways.
12:25 Speaking of interesting, DigitalOcean's pretty interesting.
12:27 They're doing a lot of good stuff for us.
12:29 So, like, the files that you're getting when you download the podcast, the website, all that stuff is running on DigitalOcean servers.
12:36 And I'm a super, super happy customer of theirs.
12:39 And they're sponsoring the show as well.
12:42 So one of the things that's cool, maybe I mentioned this a while ago, Brian, is their sort of one-click app server configuration.
12:49 So if I want to create, say, a server with MongoDB all configured, I can go there and say, create me a droplet with this version of Mongo or with this other web framework set up.
13:01 And it'll automatically create all the server configuration and have everything set up and ready to go within, like, 60 seconds.
13:07 So really, really nice.
13:09 And probably the biggest thing, if you are not using DigitalOcean, you can get a $100 credit by going to pythonbytes.fm/DigitalOcean.
13:17 So that's a pretty good deal.
13:18 Yeah, that's great.
13:19 Yeah, awesome.
13:19 So if you're looking for a nice, affordable, fair, and very fast server hosting, check them out, pythonbytes.fm/DigitalOcean.
13:28 So, Michael, have we talked about PipInf in the show before?
13:32 If I recall correctly, I think we were confused about PipInf.
13:35 I was confused about PipInf.
13:37 Basically, you know, or surprised, maybe is the right word, that PipInf became sort of the officially recommended way of the packaging authority in Python to manage packages.
13:50 And I'm like, oh, when did that happen?
13:52 That was pretty interesting.
13:53 So there's been a lot of debate.
13:55 And you said there was kind of a coarse Reddit thread.
13:58 Like, imagine Reddit was unkind to people.
13:59 Could you imagine?
14:01 Right, yeah.
14:02 That's unfortunate.
14:05 But I think it's too bad that that kind of stuff happens.
14:07 And maybe we should all just speak up like, hey, like, that comment is out of bounds, right?
14:11 Anyway, I'm not going to link to it.
14:13 I don't want to encourage it.
14:14 But I do want to link to this thing called PipInf Review after using it in production.
14:19 So there's this team that used PipInf in production since November 2017.
14:24 So what is that?
14:25 A little over half a year?
14:26 Maybe almost exactly half a year.
14:28 And this sort of comes, they talk about, this is what worked for us.
14:32 This is what wasn't working so well for us.
14:34 And in the end, they're like, at no point did anyone in the team ever mention getting read a PipInf, which actually is a pretty strong statement, apparently.
14:44 So if no, we said, no, we've got to get rid of this.
14:46 It's just like, ah, it's not quite working in some way.
14:49 So here, I'll give you the rundown.
14:51 The article starts off pretty accurately.
14:53 It says, the current state of Python's packaging is awful.
14:56 I don't think anyone would disagree with that.
14:58 The problem is recognized, and there are many attempts to solve the mess.
15:01 And PipInf was the first, and it did get a lot of traction.
15:04 But not everyone loved it.
15:06 And he said, one of the areas where PipInf can be a challenge is for libraries.
15:12 So PipInf is more built for managing the dependency of an application.
15:20 But if you're a library author, that doesn't necessarily make a lot of sense.
15:24 Yeah, I'm on the fence on that.
15:25 Sure.
15:26 Sorry, I forgot the guy's name.
15:27 The reason that he said this was basically supporting multiple environments goes against PipInf's philosophy.
15:34 Right?
15:35 So they want a deterministic, reproducible application environment.
15:41 But, you know, if you're going to do that for, say, PyPy and Python 2.7 and Python 3.6 or whatever, well, then it doesn't really work, potentially.
15:54 Right?
15:54 Because it's, you know, once exact hashes of the exact libraries.
15:58 And if those don't match, then you're out of luck.
16:01 Right?
16:01 So that's a challenge.
16:02 I think that's the primary challenge.
16:04 Yeah.
16:04 Yeah.
16:05 And I agree with that.
16:07 And it's just partly I think it's a miscommunication.
16:09 PipInf was never intended to work for every library sort of use.
16:15 Because libraries, by definition, they don't have their dependencies pinned.
16:20 It's at the application level where you pin your dependencies.
16:23 So you say there's this miscommunication.
16:26 And I definitely think you're right.
16:27 Because when I looked at PipInf on GitHub, I really saw that as, you know, the statement.
16:34 PipInf is the officially recommended tool for managing application dependencies from PyPA.
16:40 As PipInf is the officially recommended tool for managing Python dependencies.
16:46 Where really, like, the application should have been bolded, underlined in all caps.
16:51 Something to that effect, right?
16:52 Right.
16:53 So pretty interesting.
16:54 But, yeah, I think, you know, generally their review of it was good.
16:59 So I'll try to give you the quick rundown here.
17:01 So pip file and pip file.lock really are superiority to requirements.txt by a ton.
17:08 And the guy said, hey, I first disliked having FlakeAid and a security checking tool all built into one thing.
17:14 But I think it's actually great.
17:15 Installing from private repositories works really well.
17:18 Creating a new pip file is easy.
17:20 No problems introducing PipInf to new users or installing from a mixture of indexes and Git repos.
17:28 That was all really good.
17:30 Virtual Enf or virtual Envy is much easier to get into and understand now.
17:36 Let's see.
17:37 Dependencies can be easily installed into a system like Docker.
17:40 And finally, like I said, no one proposed getting rid of it.
17:44 They were just a few edge cases, mostly around the library side of things.
17:49 So, yeah, pretty good.
17:51 But if you're thinking about using PipInf in production, you know, check this article out.
17:55 It's kind of got some good discussion and a lot of follow-up as well.
17:59 I want to add that I was, for library development, I am going to start, I haven't been using it, but I'm going to start using it, not from the standpoint of handling all of the dependencies for the library dependencies, but more because the setup.py does that.
18:18 But the transitive dependencies and also mostly the developer dependencies.
18:23 So, PipInf has a developer feature where you can either create the environment for running or create the environment for development, and those can be different.
18:32 And traditionally, we've had a requirements underscore dev or something like that, but it's just you kind of have to know it's there.
18:38 So, for that reason, I'm going to try PipInf.
18:41 The other reason is the --run flag to be able to run in the environment without activating the environment is going to be useful for things like Jenkins runs and things like that.
18:52 I'm going to give it a shot.
18:54 I don't have a report yet, but I'm going to start using this as well.
18:57 Yeah, sounds good.
18:58 You're going to have to give us a report after a while, though.
19:00 Yeah, definitely.
19:02 Nice.
19:03 All right.
19:03 So, you've got some stuff for GitHub Flow, the whole sort of working in GitHub, PRs, submitting issues, open source goodness, yeah?
19:11 I've got a development team that's migrating to both a lot of changes in our development workflow, but one of the things is using Git more.
19:19 And we're using GitLab at work, but this is – so a lot of these – some of these – I didn't use GitHub for open source projects, of course, but here's an article called 15 Tips to Enhance Your GitHub Workflow or GitHub Flow.
19:33 And a lot of these apply to both Git and GitHub and GitLab.
19:37 Some of them are GitHub only.
19:38 But there's some things that you just sort of need to know about the culture around Git and GitHub and GitLab and everything that you don't actually – it isn't obvious from the start.
19:49 So, I like having an article that calls out a lot of these things.
19:52 Like, one of the talks about – I'm not using projects yet, but I'd like to try to use projects to prioritize issues and maybe track progress and plan for what's going in which release and stuff.
20:05 Maybe if that's built in, might as well try it.
20:08 I'm using tags on issues.
20:10 I've started using that.
20:11 I know we have tags on some – a lot of open source projects like, what is it, Help Wanted and things like that.
20:19 There's some standard ones.
20:21 Getting to know those are good.
20:22 Templates are something that really – so a lot of the stuff isn't stuff I know about yet.
20:27 It's stuff I want to start using.
20:28 Templates are something – like if somebody does a pull request against your project, having some predefined stuff filled in for them to know what to fill in.
20:40 And the default template is sometimes kind of lame for certain projects.
20:44 Like, I've got a library that it – the default one asks for, like, operating system.
20:50 Well, I don't really care.
20:52 It's not going to affect the library I'm using.
20:54 If the issue is really hard to reproduce, I'll ask somebody and say, hey, this is – I'm trying to reproduce it here, and I can't reproduce it.
21:01 Anyway, there's a whole bunch of great things.
21:04 I squashed down – one of the things I didn't know about at first was squashing pull requests and squashing commits.
21:10 That's something that is totally foreign to – if you're coming to get from other revision control systems.
21:17 So there's just a good list of a whole bunch of goodies.
21:20 Yeah, that's really cool.
21:21 And I like the automated tests and checks on pull requests.
21:26 Like, that's really nice.
21:27 Like, if I do a PR to someone else's repo and, like, my PR automatically gets tested, like, flakated or whatever they're, you know, wanting to have checked, right?
21:37 That can tell me right away before they get back to me, oh, there's a step I missed.
21:41 Let me fix that.
21:42 And then, you know, resubmit the PR or just update the PR and then have it rerunning.
21:48 Okay, now everything's good.
21:49 And I'm sure that on the other side of things, if someone is running a project and it's already passing all that before they even get to it, they can take it more seriously.
21:57 Yeah, and that helps you with even, you know, you're splitting up branches.
22:01 And so you can have tests running on multiple branches, which is nice if you have a long-running development feature.
22:08 And then one of the things I want to play with here is there's a discussion about pre-commit hooks and hooking things like black up to your pre-commit hook to make sure the styling is correct.
22:18 Oh, nice.
22:19 Yeah, instead of asking, just change it.
22:21 Yeah.
22:21 Your styling is wrong.
22:23 You need to break that line.
22:24 Fine.
22:24 We did that for you.
22:25 Yeah.
22:26 That's pretty cool.
22:27 All right.
22:28 So the last one I got, Brian, is just a feel-good story.
22:31 Python versus legacy Python, that type of thing.
22:34 So Pandas goes Python only.
22:37 No more legacy Python for Pandas.
22:38 Wow.
22:39 That's cool.
22:40 That's a pretty big deal.
22:41 Like, Pandas in the data science space is one of the true foundational items.
22:45 Maybe it's more popular than any of the others.
22:49 I feel like people almost always start with Pandas.
22:51 And then once they get their data processed, they, like, move to another library.
22:55 So Pandas going Python 3 only is really, really awesome.
22:58 I got this off of Twitter from Randy Olson.
23:00 Thank you for that.
23:01 And basically, they're following NumPy's lead.
23:04 Remember, NumPy is going Python 3 only.
23:06 So officially starting January 1st, 2019, which is not that far away.
23:12 Seven months-ish?
23:13 Six months?
23:14 Pandas will drop support for legacy Python.
23:17 And this includes no backports of security or bug fixes.
23:20 The final release will be the day before.
23:23 And that one's going to support Python 2.
23:25 And we're just going to leave it there, apparently.
23:27 Yeah.
23:27 So I feel like data science has got a little bit of an edge on the Python 3 story for everyone.
23:34 And partly because they've come into the ecosystem as a large group more recently than, say, the web developers or the automator folks who have been around for a long time.
23:47 Like, the data science stuff has really exploded 2012 and onward.
23:50 So it was a slightly easier choice, I think.
23:53 Yeah, I think so.
23:54 Yeah.
23:54 Pretty cool.
23:55 All right.
23:56 Well, that's it for our news.
23:57 Anything personal you want to share?
23:58 No.
23:58 I'm just excited to get back to, like, podcasting and stuff.
24:02 It's been good.
24:02 I know.
24:03 It was a lot of fun to do the live one, though, at PyCon, right?
24:06 Like, nobody cheered for us today.
24:08 Not the word anyway, right?
24:10 It was so fun to just be in the eye and get the...
24:12 Yeah.
24:12 And, like, nobody laughed at my jokes.
24:14 Yeah.
24:14 Maybe they did.
24:16 We'll just never know.
24:17 Maybe we need, like, a sound.
24:18 Yeah.
24:18 Like, one of those fake audience tracks.
24:20 No, that'll take away from the real ones.
24:22 We'll do some more live ones.
24:23 We're talking about it, right?
24:24 Yeah, definitely.
24:25 It was so fun.
24:26 We want to do more.
24:27 Yeah.
24:27 Maybe we can do some more.
24:28 We'll figure that out.
24:28 So are you excited?
24:30 It's GDPR Eve.
24:32 Yeah.
24:33 The only one...
24:34 Well, yeah.
24:34 I don't really know how that affects me.
24:36 But I'm telling people that's why I forget their name so quickly is because I'm complying with GDPR.
24:42 Oh, man.
24:42 I have very mixed feelings about GDPR.
24:46 Like, I'm a fan of privacy and respecting data stuff.
24:50 I'm not a fan of some of the ways in which they're going about it.
24:54 I mean, like, it's a tech requirement written by non-technical people, for starters.
25:00 Do you have to change, like, for instance, the courses site of yours?
25:04 We have to.
25:05 I've been doing nothing but 10 hours a day of GDPR programming all week.
25:10 Oh, geez.
25:11 Yeah.
25:11 And I'm not done.
25:12 I got one or two more days.
25:13 And what drives me crazy about this is I'm an American company, 100% in America.
25:19 And, you know, like, that Europe has these rules that apply to us, which it's not about Europe or America.
25:26 Like, what if India decides later that they have other rules that are inconsistent with what I've done for GDPR?
25:31 And then Brazil has other...
25:33 Like, I just think it's kind of crazy to say, like, lawmakers in one country can, like, impose their will on all of the world through these laws.
25:41 So it's kind of funky.
25:42 But I'm going to do it because they pretty much have to.
25:45 So basically, the reason I'm throwing this out there is if you run a site where you've got, like, say, a mailing list or people buy stuff or you collect user data, just be sure to be really careful and look into this.
25:58 And also, we talked about environments, and we talked about pip-emf and various other bits of packaging.
26:04 So I just want to give a quick shout-out to the XKCD Python environment cartoon, which came out a few weeks ago.
26:11 So that would be xkcd.com slash 1987.
26:15 It's just about the sort of madness.
26:19 So my Python environment has become so degraded that my laptop has been declared a super fun site.
26:24 It's got homebrew for Python.
26:27 It's got the OS Python Anaconda.
26:29 It's got pip, another pip, easy install.
26:32 Okay.
26:34 It's pretty good, right?
26:36 Yeah.
26:36 Yeah.
26:36 I think we'll probably try to – I'm going to link to the – Kenneth Reitz's – I should just stop trying to pronounce names.
26:45 His PyCon talk because there was a lot of stuff in there about, like, the history of packaging that I didn't know about.
26:53 So it's a good listen.
26:54 Yeah, you should definitely link to that.
26:56 That's awesome.
26:57 All right.
26:57 Well, thank you, Kenneth, for working on PipEmpf.
27:00 And thank you, Brian, for sharing everything with all of our listeners.
27:03 Thank you.
27:06 Thank you for listening to Python Bytes.
27:08 Follow the show on Twitter via at Python Bytes.
27:10 That's Python Bytes as in B-Y-T-E-S.
27:13 And get the full show notes at pythonbytes.fm.
27:16 If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
27:21 We're always on the lookout for sharing something cool.
27:23 On behalf of myself and Brian Okken, this is Michael Kennedy.
27:27 Thank you for listening and sharing this podcast with your friends and colleagues.