Django Chat

Python Tooling - Hynek Schlawack

Episode Summary

Hynek is a core Python contributor, author of the popular attrs library, and an engineer at Variomedia, a Germany-based web hosting company. We discuss Python performance, tooling (especially uv), and more.

Episode Notes

Sponsor

Episode Transcription

Carlton Gibson 0:05
Hi. Welcome to another episode of Django Chat, a podcast on the Django web framework. I'm Carton Gibson joined us ever by Will. Vincent, Hello, Will.

Will Vincent 0:12
Hi, Carlton.

Carlton Gibson 0:13
Hello, Will. And this week we've got with us Hynek Schlawack who's Python core contributor and all rounds. Well, you know, big I'm a big fan. So hello henick. Thank you for joining us.

Hynek Schlawack 0:23
Thank you for having me. And I love how everybody has problems to peg me anywhere, because I'm so replaced that it's just this dude in Python, and we love him. Yeah, yeah, no,

Carlton Gibson 0:35
that's exactly it. Because I was gonna tell you a Python core team, but you are, you are on the Python core team, but that's not where you hang out mostly these days, right? Yeah,

Hynek Schlawack 0:42
I'm not, sadly, like, my time is finite.

Will Vincent 0:45
Are you more on the go side of things? Are you're still equally in the Python world? Or how? How would you divide that time? No,

Hynek Schlawack 0:52
no, no, I'm on the Python side. Okay, but a vast majority, like, we use go only when we need something that is faster than Python, which is very rare, like Python defined for us most of the time, or when we need a single binary, which happens more often, we need a set UID or something like that. But otherwise it's all Python.

Carlton Gibson 1:11
Okay? And so I'm just going to get jumped straight into that, because you talk about being past faster than Python. Now there's this whole python 3.13 and free threading and things like that coming along. Is that going to make a lot of difference? Because I'm quite excited about it. I'm like, this means I can stick with Python. I can do my threading, my template rendering in a thread, and it won't slow down. But what's your view? Because you're a bit more closer to the metal, I

Hynek Schlawack 1:38
think, I think I'll give you the most senior software engineer answer that there can be. It depends, yeah, because, let's be honest, we've been doing pretty fine for like 30 years without free threading, right? So I am absolutely pro free threading. I love it. I'm very excited. I was one of the people advocating for this experiment to start. But you need a parallelizable problem to take advantage advantage of parallelization, right? And people also are not great at writing parallel code, which will probably change because in Python, we do not have good APIs for parallelism with threads, because it doesn't make a lot of sense. They are just not great at some point you just run into the GIL so nobody ever took the time to, like, build really good abstractions for free threading, and this is something I'm really excited about. When we will build that, but I don't, I don't expect any world changing things happening right now, or for most people, but I believe for many people, it will be life changing, like when they have computational things right, like the data science people, I think they will be much happier in us, although their stuff is already usually enforced right on C and that's nothing good. So we will see. But

Carlton Gibson 3:16
it is okay. And so to be clear,

Hynek Schlawack 3:17
it is necessary to future proof Python. I think that is true, but I don't expect that our code is suddenly gonna be super fast or something. It's just, we will see it will be evolution. I think it will be more boring than most people think.

Carlton Gibson 3:31
Okay, so no, no instant New World. Well, I was gonna ask them, What about the sub interpreters thing? Because it was all sub interpreters, sub interpreter, SubTerra. Then suddenly free threading came out of the blue. And then I've hardly heard about sub interpreters for a while.

Hynek Schlawack 3:46
Yeah. I mean, Eric snow still working on them and talking about them. And I think they are also exciting, and I think they are orthogonal to free threading. And I think if they ever reach a certain stage and don't get, like, the whole oxygen pull out of the room. They can also be very interesting in the future, but they have some limitations, right? Like can only exchange certain types of data between sub sub interpreters. While you can change you can share anything using threads, which is both good and bad, so

Carlton Gibson 4:19
which which is, of course, the problem with, yeah,

Hynek Schlawack 4:22
so there's been this, this presentation by Yuri salivanov At last PyCon, where he talked about this amazing, I don't even remember how the proper name for that is, but it's these are the structures that are that don't change, but you can change them in a way that they remember the changes. So you're basically applying patches to dictionaries and to lists, and there that makes them frozen, and you can share them across barriers, like sub integrators. I think the correct name is STMS or something like that, but didn't go any anywhere yet. It's still not public. I think it's in there a. Think PG or in their HDB report somewhere, but you would have to copy it out.

Carlton Gibson 5:05
So I guess my one more question in this sort of say, then we should cut back to the beginning, so we didn't even ask you to ask anything, we just jumped straight into performance, is, do you think then that these, these over the medium term, these techniques will keep Python competitive with, you know, the goals and the rest of the world. I mean,

Hynek Schlawack 5:23
I mean, two questions, right? What is medium term for you? And Python, right now, it's the most used programming language in the world, right? And the most popular one. So, yeah, like asking if it competitive is, is kind of weird.

Carlton Gibson 5:42
I mean, there is this. The moment where it's like, if you don't write, rewrite everything in Rust, the world will end. And I know that we have that every time there's a new technology or a new option, but, yeah, you know,

Hynek Schlawack 5:53
yeah. Again, I think it's, it's important it will enable new things. But it is, and I said it before, when we were like advocating for these changes. We do not have the fantasy right now, or the imagination what we could get out of this, because we don't have it right we cannot imagine from the primitives that we have now what could be we will have to do. We have to try it. We have to play with that. And then probably someday, out of some company, will come some amazing framework that will make everything easier, and everything will just fly, and everybody will be happy. But I don't think you can expect, like, there's gonna be something in a year, or something, there's gonna be some nice things. I think, I think IO works a little bit better when you have free threading and things like that, but it will take something big that will add an abstraction that people love to use to be an actual change. But again, it's great for the future.

Will Vincent 6:53
All right, I'll ask a question. So there we have a lot. We have a big Google doc of things we want to discuss, but I wanted to make sure we ask about your day job, which is that, am I Vario media? I'm probably saying that wrong. It's

Hynek Schlawack 7:05
not a real word, right? Okay, but we are German companies. We call it Vario media, okay? Nobody's got offended if you pronounce this English. Yeah. We are web hosting company. We do email hosting. We are domain registrar, and we run a kind of tight ship with not a very big technical team, which informs a lot of the things that I do and say, like, I cannot afford having janky systems that page someone every night or something like that, because that's someone, it's always me. So I cannot just, uh, push something to production and hope someone else will have to deal with that. Yeah, we always serving the German speaking market, so that's why probably not a lot of your listeners have heard of us, and our hosting is mostly lamp. So for the web hosting part, yeah? So, yeah, exciting times right now with WordPress.

Will Vincent 8:01
Wow. You I can't, I could

Carlton Gibson 8:02
go, have you got a hot take on that?

Will Vincent 8:04
You can't, you can't leave us there. Yeah, how's, is that a model for, you know, the Python and Django worlds, you think have a dictator who goes crazy? Yeah?

Hynek Schlawack 8:16
I mean, Guido was apparently smart enough to just abdicate before he can get crazy, right, right? It

Will Vincent 8:22
seems like it just maybe it's almost, I mean, that's the thing, is that Matt had a reputation, deserved or not, for being relatively sane and a, you know, good in quotes, person. And so it's, yeah,

Hynek Schlawack 8:35
I remember early master Don. He was like this. He was kind of celebrated, right? Like he took over Tumblr and integrating things into the fediverse, right?

Will Vincent 8:44
I mean, given enough time and enough money and power, and I guess this is the lab experiment playing out, yeah,

Hynek Schlawack 8:52
hell hath no fury like a billionaire scorned or something like that,

Will Vincent 8:56
I know. Well, I mean, it's interesting in the Django space for you know, wagtail, right? Which is, has been a big thing for a long time, but especially as people are starting finally to think maybe WordPress isn't, isn't all it's, you know, maybe we should look beyond WordPress. I'm curious to see if that brings more, more momentum to things like wagtail. What do you, Carlton, you're making with

Hynek Schlawack 9:19
WordPress? Is, the thing with WordPress is that it's PHP, and it's dramatically easier to deploy than anything that will ever be with Python. So you can just drop a bunch of files on a server and it works. And this is why it's successful. Like you cannot win the war against this one on technical merits, like with feature lists or something. That's just not going to work. I think, I think it's more likely that there's going to be our open source, a new open source fork of WordPress.

Carlton Gibson 9:50
My sort of experience with it, of trying to sell alternatives, was always it was about plugins and themes. People didn't care whether it was PHP or Python or Ruby or whatever, but what. Cared about was plugins and themes and because

Hynek Schlawack 10:02
they didn't know how much pain it is to run right,

Carlton Gibson 10:08
really slow. Because, well, I'm

Will Vincent 10:10
curious, your so your your day job. I mean, clearly it's interesting and challenging to you. Like, what are kind of the things that keep you engaged with it, right? Because you could be doing, we're going to talk about all these open source things that you're doing, but of all the challenges you could take, like this, seems to be one that you seem to, you know, enjoy and stick with. I'm just curious if you could talk about running a web hosting kind of company, because that's something a little different than most of our guests are working on.

Hynek Schlawack 10:41
I mean, my open source projects are results of my work at the web hosting company, because I don't do open source just for fun, like these projects that I needed I use myself because I don't have time to maintain software that I'm not using. So this is all our stuff that we use. So you can see by that alone of my challenges are quite wide. Yeah? Okay, fair enough. This is probably the reason why, yeah, this is probably the reason why I stayed there for over 20 years. Is because, thanks to the fact that we are small team, I have a lot of different jobs in a way like I, I don't think I could work in a company where I just work on one, one Django application eight hours a day. So this is not my life. I I'm I have a wide variety. I mean, there's some go. I read web services. I i read asyncio code, like all our domain registry thing is done in asyncio, and works pretty well, actually. So yeah, I wear a lot of hats, and I can kind of sort of decide myself when I change them. So there's a lot of freedom. I mean, there's a lot of pressure and responsibility, because again, if something breaks, it's my fault, and I have to fix it myself. But I have a lot of challenges to choose from. And of course, there's this thing that the thing that I do, I am the best at the company. There's nobody over me. I cannot get promoted or anything like that. So I've hit the ceiling here. So which is why I have this understanding with the company that they let me work on open source projects and engage in this community? That was like, literally, what I told them to either you give me opportunity to learn from others there by serving a community, by having exchange with the community, or I will have to go somewhere where I can grow professionally. Well, yeah, here we are.

Carlton Gibson 12:41
Yeah, that kind of auto, that kind of autonomy, is deeply rewarding, right? That's

Hynek Schlawack 12:45
it, is it, is it is. I'm a big fan for like, these slow productivity books from Colin Newport and those things, and just like this career capital that you can build up. And it is not that I'm working less, it is just that I work more things that interest me right in the moment, right? Like, I could take like, two or three weeks off and transfer our projects to UV and just do this deep research of UV I don't like, if I don't have a deadline, I have time for R D. Basically, yeah, another had, nobody else is doing the R and D, so this is the other side, right? Like, what I don't do doesn't happen. Well,

Will Vincent 13:24
that's sort of the dream, right? I mean, Carlton for you, Carlton, right? Like, coming off of being a Fellow for five years, speaking of autonomy, you know, look at what you and Marius are doing. Like you're not going and being engineer 1000 at Fang, right? Because it just doesn't translate. No,

Carlton Gibson 13:41
so, yeah, I'm just working on a single Django app eight hours a day. But it's just you though, yeah, but it's just it, but it's me, and I get to choose it, and I get to set the thing. And, you know, it's not a 10 year old project, yet. It's so I'm, you know, it's still very much fleshing out, very much enjoying it, is me driving the direction, and that's the rewarding bit. It's, yeah, fantastic. You mentioned Cal Newport. I've heard you talk about hustle culture. And, yeah,

Hynek Schlawack 14:14
yeah. I mean, not a fan, right? Like, neither him nor myself. Like,

Carlton Gibson 14:21
I mean, treading that balance between doing your thing and promoting it and just being out there, sort of slimy selling it. Yeah.

Hynek Schlawack 14:28
I mean, that's another hustle thing, right? Like, hustle culture can mean different things. Like the thing I usually talk about is just do more, do it now, do it as fast as possible. And then there's, of course, this constant hustling and shilling, and I just don't feel good about that, so I don't do that. And, yeah, well, it might be that's just

Will Vincent 14:49
performance not great for my coding. Or it's just like, performance, coding and art, right? If you're spending all your time talking about how hard you're working, how hard are you actually working? Is like, right? It's like, can you go. When you go up to meetups. When I lived in San Francisco for a while, I tried to go to meetups, and they're great at first, but then you realize it's like the same people saying, having the same conversations, and everyone who's actually doing something is like hunkered down doing the work rather than,

Hynek Schlawack 15:14
bro, I don't even sleep anymore.

Will Vincent 15:17
You know? I'll say one of the things I found a little disappointing about the Bay Area was realizing that even though everyone was, you know, a lot of people were, you know, nerds in quotes, they were still super all the negative male stereotypes. So it wasn't just like a you don't have to be a jock to fulfill some of those. Anyways,

Hynek Schlawack 15:36
I think we have a name for that.

Will Vincent 15:40
Yeah. Okay, I want to ask one more question. Then I know Carlton has a bunch, but so I have to bring up you have a 2011 blog post where you talk about quote Django is Rm is still a joke and reference that you preferred flask and pyramid. So I have to ask, I know it's 13 years ago, do you still feel that way? And maybe provide more context around that.

Hynek Schlawack 16:00
Okay, the quote is very much informed by a bug in Django that, by the way, is still open. And can you did link to it? Can legally drink soon. It's not the one that is linked in a post, but we'll put it in. It's yeah. I have a fun Yeah, 6614, fun story for you. So as part of r, d, I was trying out Django to use in our systems, and it ended very, very poorly, mostly like the key reason is that Django is a great framework for greenfield projects, but we do very few of those. We have this existing architecture. The company exists for like, 2526 years now. We run a weird database, and I had to fight Django a lot more than it was helping me to make it fit our infrastructure. And what happened there is that we have a we have a database table that has a composite primary key

Carlton Gibson 17:12
that's nearly coming in. And I'm

Hynek Schlawack 17:16
just make, I make the long story short, I changed the password of everybody in our company, because the table was the primary key was username and domain, and the ORM never told me that it's only gonna have the last primary queue defined. So when I set the password hash for certain user, I changed it for everybody in the company and all of our bots and whatever. So that was a lot of work to fix. Again, yeah, yes,

Carlton Gibson 17:49
I can imagine. I can imagine when one once upon a time, I forgot to wear claws on a delete glory clause, that when a delete query that went very wrong for similar

Hynek Schlawack 17:59
Well, I didn't forget anything. I just didn't know. Django didn't tell me. So,

Carlton Gibson 18:03
you know, so that little negative story about Django from time to eight multi, by the way, but the Google Summer of Code project from this year is going to finally get the composite primary keys. Moving forward that's going in and after, I don't know, 20 years, almost it's 2019,

Hynek Schlawack 18:19
the Bucha for nine years, I checked today

Carlton Gibson 18:24
exactly, exactly so. But that ties into, you know, a lot of what we're going to go on and talk about is that Django does things a particular way, and it's not necessarily the way you might do it from a kind of pure perspective. So let's just put that out there and then go and talk about your open source work, because you've done so much, and I do want to get onto it and cover it and cover it with the with the listeners. I think the thing you're probably most famous was the attas package. Is that fair?

Hynek Schlawack 18:49
Yeah, that's definitely the one with the most downloads and with the biggest impact on Python itself. Yes.

Carlton Gibson 18:55
So I mean at us, for people who don't know, neighbors, YouTube define a kind of very, very succinct class, and it was the direct inspiration for data classes, which I think most people would have,

Hynek Schlawack 19:06
yes, yes, that's correct. Like, I mean, adders predates type hints, so that's a thing. There's this funny syntax most people have forgotten about, but people back then really loved the package name is just attr, and the decorator is add editor dot s. So adders, and you define attributes by assigning them to editor.ib like a trip. Hilariously, not everybody got it, and people just imported those symbols, and there was like, add s class, and then x equal IP. But yeah. So anyway, this was like the first good class building toolkit for Python, and it was really popular, too. At some point, people started asking to get something like this in the standard library. And I still remember I got the email from Guido when I was at Amsterdam airport, which is a good coincidence. Traveling to Python us, and we met up there with Eric Smith, and, yeah, did the first planning stage of data classes. Okay? I

Carlton Gibson 20:09
mean, it's difficult to get something into Python, right? I mean, like, something big, like that. It's because normally, the talk is always about trimming it down and having less. Yeah,

Hynek Schlawack 20:19
it's usually not a good idea to put an existing package into the standard library, like we have this money curve saying that packages go to the standard library to die, and it's just little

Carlton Gibson 20:31
that's a good one. So we have this same debate in Django, right? Joe, so Python was its batteries included. And I remember when I first picked up Python, I came from PHP, what I picked up Python, it was just amazing. Because, you know, the standard library providers, I don't know most of the things I wanted, and Django is very much a batteries included web framework. But we have this same tension between keeping things maintainable, keeping them fresh, and being batteries included. Because if you trim everything away, then where do you go? You know, the example I always have is a is a production website. I'd love it if there was a production grade web server in the standard library, so I could just sort of import it and create, you know, but I understand why it's not there. But in the same time I want it because I want, I like that battery's included philosophy, yeah, I just kind of miss it in a way

Hynek Schlawack 21:18
so many people don't quite understand. And that includes also when we talk about packaging. Like, I made a few videos on packaging, and I get like these comments, like, I wish this would be in Python. That would be done by Python, but there is no such thing as the Python. There's just a bunch of core developers who are developing C Python, myself included, albeit not very active, and they are not necessarily equipped to write a production ready web server. Web server. They have no interest in solving packaging problems. I mean, just because your Python core developer doesn't mean that you capable or interested in these kind of problems, right? Like we cannot just tell them to do that, because nobody's paying them to do that. So this is just like a discussion where people just quite understand what they're asking for, because it's not an abstract concept, right? It's not like Mr. Python can reallocate developers to do something different. It's just a bunch of people with own interests.

Carlton Gibson 22:25
Yeah, no, no, no, entirely. I mean, I guess do you have any thoughts then on because this is the other solutions. Let's just put everything on PIP and then ask people to install it. But the problem then is there's an awful lot of things on Pypi, and how do you how is it? How's a newcomer to the community. Do you find the right packages, the right reasons? How am I ever going to go and find assets short of being in the Python community and reading the blogs and hearing it come up, how am I going to discover it

Hynek Schlawack 22:52
so many branches that we could take right now? Obviously they should just listen to your podcast to learn about important things like that. Yes. So we've had this in basically this the same discussion at a course, core, not sprint, but core. What's the name? Core Summit, of course,

Carlton Gibson 23:13
summit language Summit.

Hynek Schlawack 23:14
Language Summit, yes, sorry, sorry again. So we've had this topic at a language summit a few years ago when I was there too, and that was the question, what kind of things should we put into the standard library, and why? And my answer back then was already that we should put things there that make people write better Python, that leads them to a better design, for example, data classes as much as I'm interested in using adders instead, I understand that data classes are a game changer in making people write classes into just screwing around with dictionaries or, God forbid, name tuples. And this is the things that should be in a standard library, things that lead people to good, to writing good Python, and something, I don't want a web server in Python proper, because I want there be competing ones. I mean, there's this no new one called gradient, which is written in rust. So there's no way that that could be in C Python. And now we're talking about it, if we put a production ready web server into CPython, as the name says, it would be written in C, which is illegal, as we all know now, and that's not great, right? I don't want a freshly written web server written in C in my standard library. So yeah,

Carlton Gibson 24:40
it was, yeah. I mean, the example came back to me this week I saw Julia Evans, who does the web comics the web team, and she listed, had a list of points about go that she liked, and one of those points was that it's got a production ready web server in it. And it came back to me. I was like, Ah, yes, that was that was something over but

Hynek Schlawack 24:59
this is. Perfect example, because there is no Mr. Python, but there is absolutely a Google, and Google needs a production ready web server, so they can, just as well put it into a ghost standard library and write it in whatever they want to write it, right? So that's the big difference, right? That's,

Carlton Gibson 25:18
yeah, that's lovely. Okay, brilliant. So swing back to it at us. Can you? So I use at us all the time. I really like it. I think it's, it's, you know, as you say, it lets you define these little classes and they so then when you're using them, you're not indexing into dictionaries and you're not missing keys. You get tight, you know, auto complete, and you get all the other things. There's one thing that you don't include, and you deliberately don't include it. And I wanted to talk to you about that. And that's validation, like data validation, and you've got this line in the docs about how data validation should happen outside you. Could you just explain that tape? Because, you know, it's not there is our other opinions. And I'd love to hear you talk on that.

Hynek Schlawack 25:57
Yeah, so this, this harks back to ORMs man, like we didn't. We never finished the topic. So this is great. We get into it. We get into it. This is perfect. So how do I start this? So, yes, address does not do validation by stuff. I mean, it does have validators and these kind of things, but it is not primary meant to do validation, because I want my my my data that I've worked, that I've read my business code with. I don't want that to do validation. I don't want to have any information about how the code is coming from, or whatever, like my core domain model. I want to have pure such that I can touch it, such it is in a perfect shape for me to write that business code. And there's been an amazing talk at the last pica skates called the rising sea, where the speaker shows how a problem is radically easier to solve if you have proper data model around that. If you take the first if you first take the step to transform the data that is coming in, and he's using, I think, some something from code Advent, and transform it into something you can work with and then solve the problem, and that makes it the code that solves the problem radically, radically simpler and easier to understand, and shorter and nicer and everything. And this is where this comes in. Like, I don't mind the existence of tight ending or whatever, like, it's popular right now, but I think it is a problem when we use the same classes we use for validation, also for our business logic. And this is the same thing with ORMs, because these are two kinds of design pressure from two sides. Like the ORM is basically your data model. It's the tables. So your models in your code are going to reflect that fact. I mean, you can probably rename fields and do some joints and whatever. But in the end, this is called table driven design, because, because the models that come out of your tables are defined by the table. And in my experience, I mean, maybe I'm weird, but in my experience, you maybe have a say on how these tables look at the beginning, but over time, you lose control over the tables one way or another. Maybe another team is working on that, or someone else is relying on it. This all should not happen. This is all bad, but it happens all the time. I mean, talk to anybody who's running production code, if they can just change them. They data model. They probably can't. So that's from this is what's coming from database and validation is the same thing, just from the other side. Like you probably cannot just change your API the JSON structures that are coming in once you've defined them, right? So now you have this really, you have these two types of design pressure coming from two sides, and in the middle is your business code. And your business code is supposed to be the pure one, the important one. It makes decisions if someone goes to jail or if someone gets married or whatever, right? And this code, in my opinion, should not be affected by how the JSON is looking from the outside, because someone decided five years ago it should be so this doesn't mean that, for example, pydantic is bad, absolutely not. I mean, people can use it and then transform into the data that they need for their business code. But nobody does that like I've been literally asked some from someone like, usually people ask me, Why should I use address if there's data classes? So this time, someone asked me, Why should I use data classes if there's pedantic and, yeah, right, this, to me, is an attractive nuisance, because you do. These two things, like you have this data coming from the outside and from the database, and it's extra work to shape them, so you probably are not going to transform it, and you end up with this weird code that is affected by how someone decided five years ago, how to make the tables and how to make the API. So this is the thought behind that, and this is why I prefer other ways to do validation. And I also I feel like you need normal classes too at some point, so it's

Carlton Gibson 30:30
just more layer. And the analogy with the Django projects is exactly right. Is that you start off you've got these nice models. They're really clean, they're tidy, they're expressive, they're quick. And then over time, you've got, oh, I've got an extra method here. I've got an extra field here. It does get more complex. And then what people end up doing is creating a kind of a mapping layer to move from the table gateway, which is the Django model, into some more business logic type, cleaner models, or service layer, or, you know, a layer that's decoupled from that narrow RM. But,

Hynek Schlawack 31:07
I mean, that's just the right way, right? I just don't, I'm not sure if it's the most common way, but

Carlton Gibson 31:13
I think a lot of people there's that tension right between, yeah, carrying on and struggling with or, you know, it's, it's, what's interesting is, when do you make this, this change, or when, at what point is it worth?

Hynek Schlawack 31:26
Because that extra step right? It's friction, like you have this these classes, and they almost work. So you either you can make this nice transformation that you just described, or you just make it somehow do right? If statement here, if statement there, you end up with terrible business code.

Carlton Gibson 31:45
But that's the that's the same with any growing software project, right? It's not dependent on our ends or data mapping classes, or, you know,

Hynek Schlawack 31:56
everything, because you can control your the fringes of your code. So So I think, like my job is to deal with whatever is coming from the outside, and I consider the database also the the outside, and I can transform it into something I want to use. And the same, same goes the other way I this is in my power. I can write some code, and if I don't do that, that's on me, then I'm just being lazy, and I deserve what I get. But there is no tension. If I do it from the beginning, if from the beginning I say, Okay, I'm using a validation library that just transforms into normal classes on the one side and on the other side I use repositories or something like SQL C that spits out normal classes, and then just control those, because then there's no friction to add it right. In the other case, you already have something that's almost working. And adding a little bit of clutches and a little bit of Dirty Works here and there is the easier way than add a whole layer of transformations. It's also slower. It's like, it's another indirection. Yeah,

Carlton Gibson 33:05
no, yeah. It's that, that, that notion of an attractive nuisance, which I think is quite is the nice metaphor. It's like, it's it pulls you into doing the wrong thing, in a way.

Will Vincent 33:15
I want to ask you about UV and your YouTube channel, but before we switch, you have a number of open source packages. Are there any in particular you want to talk about or call out? I mean, there's too many for us to go through all of them. But are there any that you're particularly interested in or are working on at the moment, beyond adders,

Hynek Schlawack 33:34
if I have, like, my most underappreciated project, I think, is services, for many reasons, for many reasons, and I understand those reasons.

Will Vincent 33:45
Okay, well, one react, tell us,

Carlton Gibson 33:49
give us the pitch. Give us the pitch. That's

Hynek Schlawack 33:52
the beginning. It's so hard to pitch like especially to Django people, because you're just used it. Everything is a global variable

Carlton Gibson 33:59
somewhere, like animals.

Hynek Schlawack 34:02
That was not meant a Django I just have a friend that I have this constant discussion because he does the same thing in other frameworks too, because he's convinced that having singletons in a module is the better way. And actually he says, if it works for if it's good enough for Django, it's good enough for me. So fair enough. So the thing about services, it is kind of hard to explain in a general way, if the person who's listening is not already cognizant of the problem is trying to solve. I mean, everybody heard of dependency injection at some point in their life, and they probably think it's something with Java and XML. And one of my actually, my second YouTube video was about how Dependency injection is actually just passing arguments into callables, and by that way, making things testable, and how you get those things that you pass into those callables do. There's different ways to do that. There's dependency injection frameworks that I personally find complicated. And then there's something that's called service location, which is what services is doing. And the big picture is that you have a registry where you define how to create certain objects as in types, and then you have, let's just use Django as an example. Then you, per Django request, you would have a container which you can use to create those resources, which can be database connections, it can be API clients, it can be anything. And of course, the boon is that at the end, first the container cleans it up behind you, so you don't have to make sure that your API clients are being closed or whatever resource I use you're using, and you can easily replace those objects for testing it's you don't have to monkey patch to replace your database, which with with Django. It's a bit more complicated, but there is no an official Django services plug in, where also James Bennett is part of so I'm sure it's pretty good. Okay,

Carlton Gibson 36:10
yeah. I mean, so the two things you mentioned there, one was your video where you introduced this to talk mainly about dependency injection, but then you mentioned services at the end, and you had a lovely line in there, which just when you sweat said it. I was like, Oh, yes, is that all, all side effects, anything that can happen that you write to a file, make a network request, make a database thing, all side effects happen through an object that passed into the function. And you say, this is the key bit, right? Is that, instead of having the database connection card coded in there, and you do it, you take a take that as the reference, and then if you want to pass in a mock, or a test, a test fake, or whatever, you can do that very easily and test that logic separate to, did it actually make the request, or did it actually, you know, without having to do at mock, you know, patch? Yeah,

Hynek Schlawack 36:56
I just wanted to quote Brendan Rhodes again, where monkey patching is software bankruptcy. And he's right. I want to say just one settings under appreciated, yeah. And it is like when I talk to people about services and describe what it does, there's two reactions. One reaction is complete blank stare, no idea what I'm talking about, and the other is like this look of pain and recognition and and like my ex my at this point, my estimation is that the average company has like 3.5 implementations of something like services in their company, just half assed, because that's literally what they say. Yeah, we've did the same thing, but it's half assed. You don't say. And the problem with spreading is that this is very much a project that or a package that you use when you start a project. It's a decision that you do when you start something new. It is not trivial to apply to an existing project. Like even I don't, I don't use services in all my work projects like I I just keep adding it when I get to work on my project or two or so every now and then. But it is hard to sell, because people only need it maybe once per year or something. And yeah, the growth is very slow. And again, you have to have this intellectual curiosity to just deal with these kind of things which most people don't have because they don't care, or I don't know,

Carlton Gibson 38:20
okay, James, yes. James Bennet, who you mentioned there, he wrote an essay A long time ago against about, you know, the Django patterns. And he talks about he was arguing against using a service layers, about no lean into the active record notion. And one of his arguments that he gave there was that people talk about needing a service layer in case you need to change the DB. That's just never going to happen in real life. And, you know, I'd be interested to get him on again and talk about, you know, how he feels, and his development of the Django services component.

Hynek Schlawack 38:58
I mean, I'm not going to tell Django people what to do. And I think James is on the money when he says that if you are working within a framework like Django, you should, you should do, as the Django notes, right? Like it doesn't make a lot of sense to use a fully featured, fully featured framework like Django and then start using it like flask. That's not gonna go great. I mean, I had to do that. Basically, it was what I had to do due to my constraints, and it was absolutely no fun. I have replaced, at this point, zero databases in my applications over the past 20 years. So I don't think that is a good, good argument at all, but like a service layer. Can you use an ORM too? I think like it really depends how you exactly define it. For me, a service layer is more defined by the fact that it doesn't do any view things in that sense. And what I'm personally leaning into nowadays is that. I'm trying to do something kind of called, like, a functional DDD, like, it is a lot of inspiration from functional programming, where you do a lot of things with immutable data, and it's basically data in, data out, and then you apply the changes, which is even more, even more testable than everything else, because it's just data, right? I would not know how to use something like that with a heavy framework like Django. So,

Carlton Gibson 40:35
yeah, it's difficult to bring in these ideas. You bring them in sort of slowly, and, you know, think about them. You know, piece by piece, rather than bolt. You know, you can't. There is no one step. Oh, yeah, let's just switch to doing it in a totally different manner that doesn't exist. But to

Hynek Schlawack 40:50
me, like a service layer, is mostly about controlling transactions and not doing anything with views, which already makes it more testable, because you don't have to do view stuff, to test things, right? And it's like the separation of layers, it's, yeah. And I understand that repositories, for example, are also not very popular in Django, for good reasons. But I could just drop words like CQRS or something like that, but that's we would be here all day.

Carlton Gibson 41:21
Yeah. Okay, so look, one more thing I want to talk to you about in this kind of software engineering world, I guess it's just you've got this fantastic talk and essay combination on subclassing and subclassing in Python. And perhaps you could give us your talk, and then perhaps we could talk, give us your overview of that. And then perhaps we could talk about, you know, a couple of examples from the Django world, because Django uses subclassing very heavily, right? You subclass models to create a model. You subclass the admins to make an atom. You subclass the forms and make forms. So, you know, you probably have views on that be interesting to

Hynek Schlawack 41:53
Django is a child of its time, right? So what are you going to do? Yeah, I've been very involved with the twisted project, which is from a similar time. I think it's slightly older, but it had the same problems, like everything is template subclassing, everything is subclass and but at some point they realized that, or we I just have this memory of us sitting Bristol at a sprint and eating Thai food and watching this seminal talk by Augie feikler and Nathaniel manister. And the name was like the end of object inheritance and the beginning of a new modularity. And it was kind of the talk that in a Python community kicked off the change of thought that maybe we don't have to subclass everything. And I'm not sure where I'm going with that. I'm just, what I wanted to say is that Django just started at a certain time, once it has certain patterns ingrained, and nobody's gonna rewrite the whole thing, right? And it probably also be weird to just change the paradigm suddenly. I mean, probably would be the right thing. But this is hard. I think this is really, really hard.

Carlton Gibson 43:04
Okay, so let me, let me phrase it, let me give you something, guys, because I quite like the subclassing. I think, you know, you subclass the model, it's fine. And I read your essay and I agree with all, you know, I kind of go through and I agree all the points, I think. But you know, also, you know, if I just take the model and subclass to, if I just take Django model based class and then subclass it for my model, and I'm not doing crazy inheritance structures. I don't, it seems kind of okay. You know, it's it's like I get all this behavior. I get all the things defined. It's not like I'm losing myself in a million different call chains. And what's so bad? I mean, you know, that's a rhetorical question.

Hynek Schlawack 43:44
Yes. I mean, obviously, again, it's all trade offs, right? Like in a case of models, the sub class thing is mostly a mechanical thing to just decided to do it. It could just as well be a class decorator. And the difference between a class decorator and subclassed approach like this, which I demonstrate in the talk, is you just get everything inherited into your model. So your models are very heavy, and it depends from when that's a problem and when it's not a problem, but you're on a slippery slope either way and but I don't find that kind of subclassing as bad. And again, we are in Python, so some things only work when you do subclassing. So, but the point I was that I was making in the talk is that we have now two languages, rust and go, that have proven that you don't need subclassing as a concept. To write great software, you might need subclassing in Python to achieve certain effects, like you have to subclass exception or something like that, like for ontological reasons. And there's different types of subclassing which I also talk about, for example, specialization for. It's fine, like, Go has specialization. They are just cheating. They call it embedding. It's specialization something else. It's it just works in a very narrow way. And I use subclassing in the same narrow way in my code. But it is something you have to know, like, it is an active decision. It's active design decision, how you deal with those sharp edges, while when you use composition, you have to take effort to break it. You know what I mean? Like, subclass is basically broken by design. You get everything in all the borders are destroyed. You get a lot of things happening by accident and a lot of surprising behaviors. And if you go crazy, like, like, you say, like, if you're like, this whole hierarchy diamond shaped, what? What do I know? Right? Then it gets extra hard. So there's many points that you have to take into account. But of course, like, just subclassing to affect to achieve a certain effect is not bad. Nobody's going to jail for that. But you have to be cognizant of the rules, and you have to be cognizant on how to deal with the complexity. And you don't have to do that with with with Jesus Christ,

Carlton Gibson 46:21
with composition, yes, oh, God, sorry, that's okay. No, so, so it's probably, I guess, the sort of take home is, it's like a cold hygiene thing again, like it's another one of these method, methods of making sure you don't fall into, you know, unmente or making your code harder to maintain in the future as you as you move forward. And this is

Hynek Schlawack 46:42
the thing, when someone asks me for advice, I'm going to tell them, if you don't know, don't do subclassing, because it means that you cannot make this decision in an informed way. So yeah, and you give a good framework, yeah, once you have the knowledge, once you know what madam Liskov is telling you to do and these kind of things, sure, wielder tool, but, but it's a much sharper tool than composition. Okay,

Carlton Gibson 47:09
there's one. It's just one bit on the essay I agree with the essays I read through it. There's just one bit of the essay that I do disagree with. It's right at the end you you talk about, or you give this example, template method as being at the sort of a pattern you really hate, but it's something that because writing Django web views all the time, they're all nine, they're all the same. You know, all crud views. 90% of them are crud views. And 90% of the operations of the crud views that are identical, and Django is class based, views are very much template method, right? You override the one little bit you need out of the template in order to make it, make your the particular view that you're working on in that time.

Hynek Schlawack 47:46
Yeah, sure.

Carlton Gibson 47:47
Why me hate template method so much? Yeah, I

Hynek Schlawack 47:50
hate them so much because there's create this cyclical, uh, dependency and and this in direction through two classes, and you're jumping up and down the hierarchies, which, is, like the worst part about making things unreadable, I've just recently written an internal project where I also use templates of classing, because the development experience of using the resulting object is much better. So again, it's all a trade off, right? But I wouldn't build a whole blood framework based on templates not passing

Carlton Gibson 48:23
that I would. But it's a it's the view. It's the views, right, where you've got an algorithm which has got some known steps, and those known steps, sometimes you need to plug out a little well, that's template method, you know, yeah, but it's,

Hynek Schlawack 48:34
it probably, it probably could have been solved with a strategy, pattern or something like that, you know, like, just depends where you're putting in the code. But it's hard to talk about this from thin air.

Carlton Gibson 48:45
No, okay, so we've got here in the Google. Do you get 300 million monthly downloads across all of your your software? Yeah,

Hynek Schlawack 48:52
but it's more a function of Python getting incredibly, uh, incredible popular suddenly, like, I mean, to get into the top 20 of Pypi Donalds, you need, like, more than 300 million Donalds like this. It's insane.

Carlton Gibson 49:07
Yeah, it's insane. Okay, gone. Well, okay,

Will Vincent 49:11
so two things I want to talk about UV and and I want to ask about your YouTube channel. So maybe I'll start with that. So your videos are fantastic. I mean, I've look at them, and I see you're doing a lot of production, and you've got quite a few of them. How? How did you actually get started? I guess would be the question, because lots of people think, oh, yeah, YouTube channel, but it's quite a lot of work, and quite a lot of work to do it well, which I would say you're doing. So what was that journey on, you know, starting your channel and then doing real production, because, again, you're not just one straight take. You've got graphics and cuts and you're doing a really nice job with it,

Hynek Schlawack 49:50
yeah. Well, thanks for saying that. I mean, I disagree. I think my views are still terrible, but my viewers,

Will Vincent 49:58
the ones I would do. Are would be way worse, right? I mean, you know, but I think until you've tried to make a video, just seeing even what you've done, I see hours of time in simple things that someone wouldn't if they hadn't done it themselves.

Hynek Schlawack 50:12
Yeah, you see absolutely correctly. It is so much. I mean, starting the channel was the usual program as hubris, just thinking that's how hard can it be. And I'm gonna have to tell you the reasons too. I started like, reason number one, and that did not work at all, is that I hope to just get better at speaking English, because I just get to talk more through the camera. But that doesn't help if you're recording, like one video per month, because, because I'm so slow at the production, because, as you said, production is really hard. Sorry, I

Will Vincent 50:43
have to stop you. I mean, your English is almost flawless. I don't really know how much more you would improve.

Hynek Schlawack 50:51
Thank you for saying that. I mean, it's true, but the main reason was, was really the implosion of conference invitations, like giving conference talks was my main creative outlet in my life, because I cannot draw, I cannot clap on a beat or something like that, but I can give conference talks, and I've been told pretty good ones, and I derived meaning from that too, like I told you before, small companies. So if I want to have an impact to more than 20 people, I have to do something public, and the interaction with the community and the invitations conferences around the world. I mean, I've been to Japan. I've been to through us. I've been to Russia when it still wasn't that bad. It just stopped in 2019 and whenever I talk to conference organizers, everybody's just complaining how they are just out of money. So basically this whole bubble just burst for me and my other creative outlet, just writing, has also kind of tanked, because whatever Twitter and Google are doing there right now, like everybody who has the blog will tell you, unless you are not on Hacker News, New front page, nobody reads this stuff anymore. So I decided to go where the people are. And YouTube is apparently the second biggest search engine in the world nowadays, probably after tick tock, I'm guessing, yeah, but yeah, there's some logical synergies with conference speaking, right? Because I'm doing like this talking head video stuff, which is basically giving a talk. I had a photography side business many years ago, until I realized that having a photography side business means looking into Photoshop after work, which I did not enjoy at all after a while. But I kind of understand how lighting works so, and it still took me way too long to figure out how to record in my tiny room here. But yeah, I'm getting somewhere now,

Will Vincent 52:50
right? Well, it's all about the key lamp and then the overhead and then the side one you've got the shadows working like, I mean, I can tell, because I've like, yeah, it's not so easy to do,

Hynek Schlawack 53:02
yeah, basically have one, one big light on the right, top right, a small light to the left, which is basically just like a lamp. I mean, it's that is for webcams, but I just rotated into me talking to it. I have a silver fill this under my chin, because I have deep set eyes. And yeah, I record using my iPhone to an SSD, Oh, do you sound microphone cameo?

Will Vincent 53:30
Or what's it called? Is it cameo? Or they're the software for using your iPhone. It's with a C

Hynek Schlawack 53:36
No, no, no, I I record directly on the phone. The new iPhones they have, they have like this raw and log recording, so very high quality. Oh, but it's very big files, so I'm recording directly to SSDs on that. So I connected SSD to it. There's like, this crazy contraption that I connect to my phone, which is also like leading out an HDMI to my iPad. So I see what I'm doing, because it's right next to a wall, because this room was tiny, but I record the audio directly to my to my computer. And this shouldn't have taken more than one afternoon, but it took me a week of experimentation, and Luca Schlanger was helping me a lot, especially with with the audio and everything. And, yeah, it's a process, yeah, but learning about it,

Will Vincent 54:23
I'm sorry to interrupt. I was going to ask, what video editing software are you using?

Hynek Schlawack 54:28
So I started using Da Vinci resolve, which is free, but I did not quite warm up to it. So I switched to Final Cut Pro, which is like this Apple software, and I'm really good with keynote, which, by the way, I'm using for the slidey stuff in my my videos. So I felt more at home, because DaVinci Resolve really feels like a Linux application, which it is, and like in the best and worst possible way, it's like, super powerful. Full but I just couldn't get really happy with that, like, so I switched to Final Cut Pro after I think up with my third video or something like that. So yeah, this is also very expensive, by the way. So like, Final Cut Pro, then you spend even more money on the on the plugins and everything, right? So, yeah, I couldn't be doing this without my GitHub sponsors, so, and since I'm talking to one right now. So thanks for your support.

Will Vincent 55:28
Well, I think you know you're

Carlton Gibson 55:29
right about that. Thank you for turning out all the great stuff.

Will Vincent 55:32
Yeah, the conference talks. I mean, our friend Jeff Triplett has just launched Django TV to try to put more light on conference talks. But conference talks, even though they're available on YouTube, you look at the viewing numbers, it's, you know, a couple 100, maybe a couple 1000, Max, whereas, I mean, your video classing

Hynek Schlawack 55:52
talk has 5000 like the I think this is my best, best talk I've ever given, like in every way, the subclassing one, and there's 5000 views, and so it's just like nothing, right? Yeah, I know, like the UV one had had 20,000

Will Vincent 56:06
right? Yeah, well, okay, well, I know we're coming up on time. I have, we have to ask about UV. I separately, I would ask you a million questions about about YouTube. But so UV, right? So you have, I think, two main videos, right? Like one asking, is it the answer? And then a second one saying, it is the answer. But what I would, I was really impressed by is you really go in depth. I think they're both about 20 minutes and, you know, give us the pitch, right? But I, I was really impressed. You could easily have done just a quick click bait, you know, short thing, but you really dove into why it's so great, but also how it could be improved going forward. So you stand by, I guess, as a question, you stand by the most recent video, you're still on the UV train, and you think this is the packaging answer we've been looking for in Python.

Hynek Schlawack 56:58
Yeah, definitely. It is not like nothing before. So, yeah, I don't so for the foreseeable future, I think it is the future of Python packaging. So you want to give me pitch for my videos. For you, I wasn't quite sure what you

Will Vincent 57:15
were. Oh, yeah, I guess I would, I do this. Sometimes I just Carlton, you know, knows, I just talk. I guess I was just saying people should watch the videos, but I was giving you a compliment that they're really in depth, you know? So people should go watch them. You can't sum them up neatly, but I was, yeah, far more in depth than you the usual videos, right? If I see something on a topic I'm interested on, usually it's someone just saying, this is interesting, but you Yeah, I guess we don't have time to dive into all the nuance that you cover, but you do a good job with it. It's

Hynek Schlawack 57:47
mostly a result of lived experience. You know, I'm not talking about things that I've read up somewhere, but I've been part of all this shenanigans around Python packaging, and I've been around for a long time. So I remember when setup tools finally got freed and was taken over by the community, and when it was a big deal. I remember when wheels came to life and it stopped being a big deal to install a binary extension. So of course, that's a gift of age, I guess. So like, I have the perspective and the context to talk about these things in this way, and just knowing so many of those problems that they are actually solving, and I have the humility to say that those they are not really solving my problems, like I was reasonably happy before, like PDM worked great for Me. UV is much faster, but I can see how, how important uv is for the Python community, because, again, at a community wide scope, I don't care about the speed at all. So which also, like there's been this NPM blog post about why NPM should not be rewritten in faster languages. And I think this is a red herring, like, if UV would be just as slow as PDM or PIP, it still would be a huge deal, because people complained about patent packaging being unclear and janky people, things were broken, and it was unclear what tool to use when there was a bunch of 90% solutions like and you have to know which 90 where your 100% are in that spectrum. So to use the right tool, these are the things that people are complaining about, not that PIP is too slow. That was never an issue, at least not on a serious thing, right? And I don't think this is possible to achieve in Python, like we've tried and hatch came close, but only by using rust helpers again, like, of like, wrote this pi app thing, so some rust or Zig or C is in every. Double, but don't you. CC is illegal now, at least in the US. We all know that. But now, like making, like modularizing, it would make things more complicated, again, right? And you cannot ship like a packaging tool that has a binary extension that would just make it that doesn't make things worse, not better. So,

Carlton Gibson 1:00:19
so you think it's the one tool thing that's the real is

Hynek Schlawack 1:00:22
the one tool that doesn't break. That is my main point. I think that also resonated most with the audience of my video when I make, making this, this point, and I, of course, I don't want UV to be the only tool, right? I want PDM to exist and and do well. I I'm happy to keep PIP the default installer, and so people can use it if they want to. I don't, and I don't want to convince anyone to use UV. It's fine. Just use whatever you want, right? But I'm really glad that we've just solved the biggest Python problem we've had, rivaled only by the Gil. But I think this is a bigger deal than the Gil, because people run only months later to using Python into threading problems. But the initial impression of installing Python, of using Python, of installing an application, of starting an application, that is something that you have on day one, and that's a huge that's a big, huge difference. And people are looking for hair in the soup, which as a check. Living in Germany to very complaint heavy countries, I fully understand. And we also totally need to do risk management, like we need to plan for when Astros VC overlords will pull the rug under us. But I wish the conversation were more solution oriented, and not unless, like, per clutch, like, yeah, there are bad aspects to this. Like, this is absolutely true, but also this is something wonderful that we've been waiting for. We've been begging people to use money to solve this problem, and now someone did. So now it's our job, basically, to make the best out of that.

Carlton Gibson 1:02:02
I just have one question on it, which I saw a post this week from Nolan Lawson. But he was talking about the he was saying why he's skeptical of rewriting JavaScript tools in master languages, same post you're referring to, yes, but the point I took from that, I thought was quite good, was that the thing with when a tool is written in Python, or in his case, JavaScript, users can sort of debug it themselves. When they hit a problem, they can get in, they can understand what's going on. But if it's written in another language, a compiled language, suddenly that ability to dig into it is gone. And I wonder if, I wonder if that's a loss.

Hynek Schlawack 1:02:39
So I'm gonna say the word again. It's a trade off. It absolutely is a loss. There was this really interesting Mastodon threat started by Jacobian, like you're very Jacobian, where he kind of shit posted, kind of lamented the fact that you used to have to learn C to contribute to Python, then you stopped having to learn to C to contribute to Python, and now you need to learn rust. And that absolutely is a loss. But the question is, what are we getting for that? And I have to say, I have not debugged PDM or PIP many times. So for me, this has not been a loss in a practical sense. And if it helps all those people that have been so frustrated by Python in the past, and by the way, many of those are in the comments of my video. It's not even funny, like, how many people are just airing their grievances with Python packaging. So there's so much pain that still needs to get out. So those people are there, and this is helping them like they are the ones where we say, this is the one tool, use it, and at some point you can still look at other tools. But for now, with this one, you don't even know. You don't even need to go to python.org, you just don't know this one thing.

Will Vincent 1:03:56
Well, I think we're so out of time. We could still talk about so many things, but I

Hynek Schlawack 1:04:02
feel like this is a half of my notes. Man, I know.

Will Vincent 1:04:05
Well, we'll have to have you on again, if you'll, if you'll come again.

Carlton Gibson 1:04:08
Absolutely. Thanks so much for indulging all you know, silly little questions about this and the other but it's good to be able to pick your brain and get your responses. Yeah,

Hynek Schlawack 1:04:17
thanks for listening. For my my rambling. I'm used to script everything out because, of course, English is my third language, so it's very hard for me to just have coherent thoughts. Uh, live, yeah. So which

Will Vincent 1:04:30
is, well, we have links so nice to

Hynek Schlawack 1:04:33
lie to me all the time. No, no, it's,

Carlton Gibson 1:04:39
I'm not sure I could have so I speak Spanish and catalinks, I live in Spain. I'm not sure I could have an in depth technical conversation about ad hoc, about software engineering in Spanish or in Catalan. I'd struggle. So I think you do phenomenally.

Hynek Schlawack 1:04:52
Thank you. And the funny thing is, I have much harder time to speak about technical stuff in German or Czech, because it's just not because

Carlton Gibson 1:04:59
it's not the. Language of Yeah, yeah, yeah,

Will Vincent 1:05:03
okay. Well, we have links to all these things. Definitely check out YouTube channel, personal site, and again. Thank you so much for coming on. We are at Django chat.com, and we'll see everyone next time

Hynek Schlawack 1:05:15
Bye bye.

Carlton Gibson 1:05:15
Bye, bye.