Dave 00:16 Hi, and welcome to another episode of That Podcast. I am Dave-
Beau 00:19 And I am Beau.
Dave 00:20 ... and it's just the two of us this week. I said this week, this time. It feels like we've had a flurry of interview episodes without really getting ... I say flurry, I don't know if our frequency could quite be described as a flurry.
Dave 00:35 It's nice to just have me and you here. We don't have anything particularly planned to discuss. So, we're just going to do a bit of catch up.
Beau 00:40 Yeah, I think that makes sense. Bec's been listening to some of our old episodes on some of her drives to go see family this summer so far. She's like, "I miss you guys." Like, I miss you two.
Beau 00:54 So, I think it is good for us to get back to our roots. I enjoy the guests a lot, but it is going to be good just to have you and I catch up.
Dave 01:05 Yeah, yeah, definitely. So, what have you been up to?
Beau 01:09 So, I recently got a new contract, so that's been keeping me pretty busy. I've been kind of thrown into the lion's den, if you will, with Laravel and Vue. I've used both of these in the past to varying, I guess, depth, but I'm definitely deep in it now.
Beau 01:32 Starting to find some fun edge cases, and stuff that just makes me shake my head. I'm not a Laravel hater, that's not what this is about, because you know there's a lot of people who will just jump on that, but there are warts, and bumps, and bruises in different places.
Beau 01:50 Or, just things that for as much as I hear about Laravel being all about user experience, or developer experience if you will, there have been a lot of things that I have run into that just do not make sense out of the box, that do not click with me. How much have you used Laravel recently?
Dave 02:13 Very little really, and I'm familiar with quite a lot of it. I use it for inspiration, because I'm still on the no framework type of thing.
Dave 02:22 Quite often, I have to implement things, and it's hard to say that usually I feel more comfortable implementing the tiny fraction of some other component, or some other open-source library that's out there myself.
Dave 02:35 So, I'll go and look to see what other people are doing, and then build the same thing myself. So, I've looked around the Laravel code base a fair bit, but never actually really used it as ... of any kind of rigor.
Beau 02:52 Yeah. I know we've talked about in the past that sometimes, like the difference. It's good to be framework-agnostic, if that's what you want to be. It's good to be in a framework if you want to be.
Beau 03:04 I like trying to walk that line between following conventions, following things that aren't going to make my life a pain using a framework, but also trying to do what I can to make it mine.
Beau 03:16 And so, in the past, I feel like I've fought Eloquent a little too much, to try and make it be what it's not. This time, I'm trying to go all in on Eloquent, in terms of-
Dave 03:31 Embrace it?
Beau 03:32 Yeah, embrace it. Just, sort of use it, how it's meant to be used. In that, I'm finding all sorts of assumptions that I have made are wrong.
Beau 03:42 One of the biggest of which, is that if you end up doing certain types of joins with Eloquent, you have to explicitly say that you want to only get the fields for the model that you're looking for.
Beau 03:59 So, you have to explicitly put a select method call with model name plural, dot star. And from the feedback I've seen on Twitter, I feel people think I'm just cookidooks for thinking anything else.
Beau 04:16 It's like, "Why would you imagine you could do all these joints and not get these other fields? It's just like SQL!" Except, it's not just like SQL if you don't do joins. You don't have to do that.
Beau 04:28 You don't have to worry about that, and there's just this implied understanding that behind the scenes, if you do model name colon, colon, where that it gives you back an Eloquent object ... or, a model object, an instance with everything filled in correctly.
Beau 04:46 And in fact, if you do model name colon, colon with, and then the relationship, if you do that and you don't do the join yourself, actually gives you your model instance with the relationship filled in.
Beau 04:59 So, to me, it just seems natural that if I join against another table and I've told Eloquent with the query builder that I'm joining this other table, that it would resolve that, but it doesn't and that really put me in a weird place for a little while.
Beau 05:16 I understand what's going on, and when I looked at the actual SQL queries that are being generated, if you do the with() ... I thought that it was actually doing one big SQL query, when it's not.
Beau 05:31 If you do with(), it's still doing one SQL query per relationship. So, you're not doing N+1, but you're doing number of models ... Or, well, your model plus the number of relationships, not for each row.
Beau 05:47 So, little things like that, that until I understood what was actually going on behind the scenes, it was not working for me as intended. So, that was a little weird to see, the amount of feedback I got, that was essentially, "Why would you even think that?"
Beau 06:05 The other problem that I'm continuing to have, is the camel-case ... or, the camel-caps versus snake case, and when to use it. Especially with Eloquent objects. If you're accessing the object directly, or if you're accessing the fields directly, you do the underscore.
Beau 06:27 It's the same as the column name, which is great, but if you do relationships, if you actually want the relationship object, you have to do camel-case.
Dave 06:37 Right, okay.
Beau 06:38 But you don't know that, because all of the examples that you see are relationships to things like posts, or users, or comments, where there's no indication at all that dollar model ... arrow post, is because that should've been ...
Beau 06:57 If it was actually related post, it should've been related with a capital P post, versus related underscore post.
Beau 07:04 So, I went probably two weeks without running into that, and then all of a sudden, one of my relationships just wasn't working, and I'm like, "What's going on? This thing is empty. I'm getting all this weird errors that don't make any sense."
Beau 07:19 So, there's this magic all around, but then when you can't get the magic working or you don't understand how the magic works, you're told, "Well, there's no magic there."
Beau 07:29 It's just like SQL, and it's been an interesting experience having actually been on the ground, and working in it full-time, four weeks at a time now. You've seen some of my questions, or my got yous, and yeah.
Beau 07:48 It's been a fun thing to run into problems again to try to solve, which is odd, because Symfony generally, because I've been doing a lot of Symfony in the last year again. I feel like there's some DX stuff there that's almost better than Laravel, at this point.
Beau 08:07 Even at the scaffolding, the maker bundle with Symfony 4, with Flex, it either does the right thing, it matches my expectation out of the box, or it gives me an error that tells me what was wrong, whereas Laravel, same sort of thing.
Beau 08:28 I don't know when I say make a controller, am I supposed to put the controller suffix in it? If I make a model, am I supposed to specify the database name?
Beau 08:38 So, we put underscores in, or am I supposed to specify the class name of the model, and that it's going to reverse engineer that, and figure out what the ... it should be underscores, and all of that.
Beau 08:50 I've actually used the Laravel scaffolding to generate class names with dashes in them, just because I wasn't sure what was going on, and then I type it in, and I look. I'm like, "Why is does that class name have a dash?"
Beau 09:03 Because, I had done ... Maybe, I probably shouldn't have done that anyway, because if it was going to be a table name ... I don't remember what I was trying to generate.
Beau 09:09 All I know, is I ended up with a class name that had dashes in it, and I'm like, "Something weird is going on here."
Dave 09:16 No, I know that feeling. Again, I've been in my little framework. I have my own generators. I call them generators, modern makers, or whatever. And at some point, I added the ability to, say for a command, I had the ability to have ...
Dave 09:33 You add the class name, and then you were going to be further arguments on the command line were going to be the constructor properties, and at some point, added the ability to type those.
Dave 09:45 And no matter what I do, I always do it the wrong way around. So, if it's supposed to be variable, name, colon, type. I'll do type, colon, variable, name.
Beau 09:55 Yeah.
Dave 09:55 And there's no checking, because this my own stuff that I just threw together, and then I end up with class names. And I have a watchman running in the background to make things like Doctrine proxies, to generate those when any PHP class is relevant, PHP classes change.
Dave 10:16 So, I know I've done it wrong, because as soon as that class, that file hits the file system, something watching powers in, spits out errors in notification style, I think, pop up things. But yeah, and I know what you mean.
Dave 10:36 I was speaking to someone about this sometime ago. They were trying to get to grips with Doctrine, coming from a Laravel background, and they did something that I knew was a bit of a gotcha, and it's something to do with adding ...
Dave 10:50 I think, it was adding something to a Doctrine collection, so it's adding something to a relationship. Once I've explained ... I actually think they discovered themselves what they needed to do.
Dave 11:04 They were just complaining to me about it, and then I had to counter that. I had literally the week before done something with Eloquent, and just because I was fairly removed from the active record at that time, sort of way of working.
Dave 11:18 And I was trying to create an object, and as part of that creation project, I was trying to create several sub-objects, and I've done as one too many. And I'm in the loop fighting the sub-objects. I was trying to save the sub-objects, but I hadn't saved the-
Beau 11:37 The parent?
Dave 11:38 ... parent, and Laravel at the time, whenever this was, did not surface that very clearly to me at all. But it was so hard for it, I just couldn't get my head around what the problem was.
Dave 11:53 It was obvious in the end, but because I was that far removed from working like that, it was very different.
Dave 12:01 Maybe, it's just a little bit of a bumpy ride now, and you might find that the number of these sort of things dries up, and then you'll be the one who's saying, "Why would you even expect that to happen?" And all of this.
Beau 12:15 Yeah, yeah. No, no. I definitely don't want to give anyone the impression that I think Laravel is bad, its communities are not paying attention, or whatever. To actually be in it has been an experience for me that I hadn't really expected.
Beau 12:33 There's a lot of assumptions. Like you were saying, you haven't done a lot with Eloquent. Just seeing what I've seen in the past, with the little bits I've done with it, I thought it worked a certain way, now I've been shown that's not it at all.
Beau 12:49 It also means that there's going to be some things down the line that are going to be more flexible than I thought they would've been, but at the same time, I'm looking at it thinking, "I wish that I had a little bit more smartness when it comes to the relationships."
Beau 13:03 Like, you can specify any relationships you want in DQL, a Doctrine query language, for example. And it just works it out, and it makes one nice big SQL query for you, and that's just not the case.
Beau 13:17 So, I've had to relearn relational database management, everything, because working with active record is just way different than thinking about things, in terms of just the data. You have to actually think about relationships in different ways.
Beau 13:39 Yeah, it's been fun. I have some things similar to what you just talked about with not saving the parent. I ran into that in a way, that I had forgotten about, because I wasn't doing it that way, and it took me forever to figure out what the problem was.
Beau 13:58 I was actually dispatching commands inside a command handler, so I was creating say, it was a handler for create user, and so I was creating the user object, and then I was parsing through the roles that the user had.
Beau 14:23 And then, I was dispatching the grant role to the user I just created. Actually, it was import, so I was importing users.
Beau 14:34 So, the first thing I did was dispatch the user, create a user command, and then I was dispatching for each of the roles, to grant those roles. And I was getting these weird errors, because the second set of commands were coming back with foreign key failures.
Beau 14:54 And it wasn't until I had dug really deep for a really long time, that I realized I had this Tactician's locking command little aware.
Beau 15:06 So, I wasn't actually dispatching the commands real time. It was dispatching them ... If you dispatch a command in the process of handling a command, it doesn't-
Dave 15:17 Does it until after?
Beau 15:19 Yeah.
Dave 15:19 Yeah.
Beau 15:19 It doesn't actually do it right then and there. So, I was actually referring to things that hadn't actually been persisted, when I thought they had been, which was really difficult to figure out.
Beau 15:31 And so, that wasn't Laravel's problem at all, so I had to refactor things a little bit to get that to work. But, yeah. Those sorts of gotchas, especially in the new system, where you're not sure, "Is it Eloquent that's the problem here? Did I do something wrong with Eloquent?"
Beau 15:47 "Am I using Tactician wrong? Is that something completely unrelated?" Anytime that I've jumped into something new, there's always been little gotchas like this, that make you wonder, "Am I not a good developer? Why am I not getting this stuff right away?"
Dave 16:06 So, going off the topic of programming for a minute. I've taken a bit of an interest in woodworking.
Beau 16:14 Yeah?
Dave 16:15 Yeah. So, you know obviously, I moved house in February, and I might've mentioned on the podcast before, for a long time I've needed a new desk in my ...
Dave 16:23 I need new a lot of stuff in my office, to be honest, but I've kind of been putting it off because I wanted to get the new place, get a feel for it, see what I want to do.
Dave 16:30 So, I started looking at sit-stand desks, and I found that quite a lot of them will sell the mechanism, the legs and the mechanism independently of the desktop. I thought, "That's cool."
Dave 16:45 I thought, "What I might do is get the legs to start with, and butcher my existing desk to get going, and then decide what I want to do." And in the process of looking, I put a tweet out actually, and a few people responded.
Dave 16:59 Jonty Behr, who organizes Laravel UK, he got me some good feedback. And I was looking at the reviews, I think, for the one I want. One of the ones he recommended, so the mechanism this is, and one of them said they made their own butcher's block, desktop for it.
Dave 17:14 I said, "Well, that sounds cool." And I thought I'd be nice to make my own desktop. So, I started watching videos on how to make butcher's block, most of them are kitchen units, so they make it for the kitchen, and I actually found it quite interesting just from that point of view.
Dave 17:32 And I kind of quickly, very quickly forgot about my desk, and I just started thinking about making an actual butcher's block, like a chopping board sized one. And I watched a few videos, and watched people doing that, and I was like, "Yeah, I quite fancy it. I'm going to go with that."
Dave 17:46 So originally, the plan was to make one for my brother's birthday, this was back in May. Unfortunately, I went to a timber merchant in the city.
Dave 17:57 So, this timber merchant is at the top of my grandma's street, and my grandad was a joiner and he used to make things, and he used to go there. But they said that they've pretty much stop selling hardwood, and it's better to make a chopping board out of hardwood.
Dave 18:13 He said, "It's just, people just don't want to buy, and it's expensive." So, I ordered some online, and it's quite expensive stuff, the hardwood. So, I shopped around a bit, picked somewhere.
Dave 18:25 They said that they were moving premises and some orders may be delayed, and I expected a few days when I read that. So, I ordered anyway, and eventually it got dispatched about three weeks later.
Dave 18:38 So, I had missed my brother's birthday by quite some time, but I made it anyway. It wasn't brilliant. So, it was an edge grain butcher's block style chopping board, so I glued it. I cut them down to size, glued it all up with ...
Dave 18:57 Now, I bought some tools, but ideally, you need some sort of bigger tools. Like, machinery style tools for this kind of thing, to do it really nicely, or easily at least. But the finish was pretty good, I think.
Dave 19:13 I finished it with some mineral oil, which brought it real nice. I branded it. I paid, I think, about £40 quid on Etsy to get my ... You know, I trade on the ATST Solutions?
Beau 19:24 Yeah.
Dave 19:24 So, I've got a little vectorized picture of an ATST as my logo, so I now have it as a branding iron. So, I can stick that in a fire, or I'll put it under a blowtorch, and I can put my maker's mark on things.
Dave 19:40 So, I made that cutting board for my brother. I've recently finished making a saw horse. Do you know what I mean by saw horse?
Beau 19:46 Yes.
Dave 19:47 I need to make another one to go with it, but even though it was-
Beau 19:50 Yeah, one isn't really useful by itself.
Dave 19:53 Yeah. Well, I have a portable workbench. Sorry, I made it the same height as that, which I was quite pleased with anyway as well, because it's easy to forget the amount of trigonometry and things you need for these kinds of things. You know? Because-
Beau 20:15 Yeah.
Dave 20:15 ... you're cutting the wood at an angle, 22.5 degree angle so it stands right. So, then actually working out how long you want those legs to be, to get the height that you want changes, and things like that, and I'm enjoying it.
Dave 20:31 I'm enjoying, and I'm watching loads of YouTube videos from people. There's one in particular. I'll see if I ... I started to look him up, because I know his sort of channel name, but I forget his name.
Dave 20:42 Steve Ramsey, Woodworking for Mere Mortals. He's quite big on YouTube. He must have probably hundreds of thousands of subscribers. Yeah, 1.1 million subscribers, and his videos are really nice.
Dave 20:56 Quite well explained, and most of the videos come with free plans for the projects, and a decent description of the materials, and the tools, and things like that. So, yeah. I need to finish up making the saw horse.
Dave 21:10 I want to make a mallet, like a woodworker's mallet, and Rowan would like to help me with that. So, that's kind of cool, because he wants to make Thor's hammer, of course. Which, might be a little bit too advanced for me.
Dave 21:25 And I've started looking on Gumtree and eBay for second hand machinery. I'd like a table saw, because it makes things a lot easier. The problem is, I could probably find one fairly cheap, but the other thing is finding somewhere to put it in the garage.
Dave 21:40 I don't have that much room. But, yeah. So, it's kind of cool. So, it's nice to have a little bit of a ... I found it nice, because I'm doing it on my own. I go in the garage as well, so it's just get out of the house a little bit.
Dave 21:55 Especially for someone who works from whole full-time, getting out of the house could be quite nice. I go for walks. I walk the dog, I play sports. I'm playing hockey again, placating, I played golf, things like that.
Dave 22:06 But this is just for me, I do it at my own pace. I'm creating things. So, yeah. It's kind of nice, something different.
Beau 22:14 That's awesome.
Dave 22:15 Yeah.
Beau 22:16 Last year, we started to get more tools. Not necessarily all woodworking, but yeah, being able to start working on some of that stuff is definitely nice. We're needing to create some stands, and some ways to present Bec's art at craft fairs.
Beau 22:39 And we've tried a bunch of different things over the last couple of years, but she has a project for me now to try and rebuild something that we've had before. We just want to do it little bit differently.
Beau 22:53 So, we're going to need to make a trip to Home Depot one of these days, to get some wood, and then I'll still try to do some planning to figure out how to actually transport it. Because, that's the other thing, is how much room do these things take up.
Beau 23:09 We have a Honda Odyssey van, which has plenty of room, but the things that we have now, they're sort of freestanding. So, take like an old wooden door, as an example. She painted it all a certain color, and textured it, so it looked really nice.
Beau 23:29 And then, we actually just screwed like a shelf hanger, an L-shaped shelf hanger on the bottom. So, that ... Yeah, a bracket on both sides, so that it's sturdy enough that it just stands there, great.
Beau 23:49 It's safe, everything works great. The problem is, that there's a foot on either side of this thing, just on the end, that it makes it really hard to put two of them back to back. So, we can't really take more than two or three of these things at time.
Beau 24:07 So, I want to make them removable. I want to have some sort of way to stand them up, so that it's removable. So, that's my next project for Bec, that it sort of deals with DIY woodworking stuff.
Dave 24:21 Yeah, yeah. It's like ... I do a lot of DIY, and I'll have a go at most things, but it's a bit different between using it, I end up fixing things, and fixing things is satisfying. But actually, it's kind of nice to mend thing, and give people things.
Dave 24:42 I don't really get that opportunity to do much. So, yeah. I'm almost making wishlists of tools that I'd like, and then some of the tools can be really expensive. Things like, I didn't realize, like vintage planes and things like that.
Dave 25:00 There are some people who would really like to get their hands on these old planes, and that's kind of nice, and you see the different styles in the videos as well.
Dave 25:07 You see a lot of people who have liked to use more hand tools, and they get a pleasure from using the hand tools. Versus, people who ... They might appreciate the hand tools, but if they've got a lot of pieces to make.
Dave 25:18 And one of the things that I've seen that I've not really seen before, and so I started looking ... I probably have seen it, but not noticed. But it seems, maybe, a bit trendy at the minute to use resin for things.
Dave 25:29 So, they're using wood, and then maybe you might get two good planks to make a table, or get two pieces of waney edged wood, and then to put them to make a table top with a big gap in the middle.
Dave 25:41 And then, they fill in that gap with some sort of resin, colored resins, and some of them look really nice. It's kind of cool. A bit too advance for me, for the time being. But, yeah.
Beau 25:53 That's awesome.
Dave 25:54 Yeah. I'll see if I can ... When I get a bit better, I'll probably post some pictures on my Instagram or something. To be honest, with the chopping board I made for my brother, I was that excited to give it to him. I didn't think to take a proper picture of the finish product.
Beau 26:11 I was going to say, we need to get that up on the episode cover.
Dave 26:15 I've got a picture, but it's not a very good one. It's in my garage, and it's dark, and it's not very well presented for ... An Instagram marketer would not be pleased to have that asset given to them.
Beau 26:29 I had a hope for like a podcast cover photo.
Dave 26:32 Yeah, that's it. No, it's not good enough for that. Well, it might be, we'll see.
Beau 26:35 All right. Well, find some awesome wood, and user your new brand. And that can be ... It'll just ... Just, get us a brand with some nice wood behind it, we'll use that.
Dave 26:47 Yeah, I know. Let me see if I can send it to you now, so you can what I'm talking about. The brand itself, it took me ages to fluff about, with just trying to get it ... Because, I've never used ...
Dave 27:01 I did loads of practices with the brand, because obviously, I've made this chopping board. I'm really pleased with it, and I must've branded scraps of wood, like 20 times, and I swear the one I actually put on the board was the worst one.
Beau 27:16 So, the brand, you got it on Etsy, right?
Dave 27:20 Yes.
Beau 27:20 Did you just get the end, or did it come with the handle and everything?
Dave 27:24 No, I refused to buy the handle.
Beau 27:27 Okay.
Dave 27:28 The Yorkshire men in me kicked in. I was spending £40 on this brand anyway, but he wanted £24 quid for the handle, and all it was is like a ... God, I can't remember what ... It's like a threaded pipe, basically.
Beau 27:45 Yeah.
Dave 27:47 There's a particular name for them. Hang on, I'm trying to remember what it is. Basically, a metal bar with a thread at one end, and a wooden handle at the other end. So, I was like, "I don't really want to pay £24 quid for that."
Dave 28:05 A threaded rod, is what is that. It was called like a steel threaded rod, okay. So, I paid £4 quid a 300 millimeter m8 steel threaded rod, that came with lug nuts and washers for £4.
Dave 28:19 I just chopped the end off a broom handle, and next I made my own handle. I'm being a complete cheapskate.
Beau 28:27 So, did you heat it up with a blowtorch?
Dave 28:34 I tried with a blowtorch, and I've seen people do it with a blow-
Beau 28:37 I have no idea how you would do this.
Dave 28:38 Yeah, I mean-
Beau 28:39 For me-
Dave 28:40 So, you can actually buy a soldering iron style handle for them-
Beau 28:43 Right.
Dave 28:44 ... for more money.
Beau 28:44 That's what I was thinking.
Dave 28:46 Yeah, so you can-
Beau 28:46 But if-
Dave 28:47 ... plug it into the mains, and then it heats it. But I tried with the little blowtorch I have, but it's pathetic. It's really for cooking, so little things like crème brûlée, so it just didn't get up to the temperature.
Dave 29:01 So, I actually stook it on our barbecue, a grill as you call it. So, I just waited until we were cooking some food. So, as I got the grill super hot, and it worked fine then. Well, I say it worked fine.
Dave 29:20 The one time I did it for real, it wasn't as good as most of my practices. I'm just trying to find ... I'm sorry. The one place I looked for it was WhatsApp, because I knew I sent it to my friend, but in WhatsApp image server is down, isn't it?
Beau 29:42 Yeah, it's been a bad week for online services.
Dave 29:49 Yeah, it has. Hasn't it? And CloudFlare have been having some issues, haven't they?
Beau 29:53 Yeah, but I think that WhatsApp, Facebook, and Instagram are all down right now.
Dave 29:59 Right, yeah. Well, I can get on WhatsApp, but I just can't see any images. So-
Beau 30:04 The media microservice is down.
Dave 30:10 Yeah, yeah. So, I'll have to send you that some other-
Beau 30:12 Sounds good.
Dave 30:12 ... time.
Beau 30:14 Cool.
Dave 30:15 So, that's pretty cool. What else was I going to ... There's something else I was going to talk about.
Beau 30:22 You've been busy with some tech stuff, sort of?
Dave 30:25 Yeah, the domain stuff this week.
Beau 30:26 Yeah?
Dave 30:27 Yeah. So, I'm sure I've got some listeners will know, I've been involved in the domaining scene for quite a while.
Dave 30:37 Mostly, in the UK side of things, and this week has been a really interesting week, because about five years ago, nominet who had run the UK domain name space, they decided to release domain names on the .uk top level domain.
Dave 30:55 Previously, we'd only been able to register domains like ATST Solutions, .co.uk, .org.uk, .me.uk, but they decided to release all of these previously unavailable domains.
Dave 31:09 And the way they did it, was to give people who owned the .co.uk, or in some cases the .org.uk, in some cases .me.uk domain names. The right of registration, so the bare TLD of the same name.
Dave 31:25 So, if I owned atstsolutions.co.uk, I would have the right to register atstsolutions.uk, and a lot of people didn't really welcome it. I must admit, I do prefer as a look of top level domain.
Dave 31:40 I think, it looks great, compared to the .co.uk. However, it is confusing for people. It does create instances where it's something else to manage because they're a separate entity.
Dave 31:51 So, once you have taken up your own rights to register the .uk version, you have to renew it. Chances are, it's a renewal date that's different to your .co.uk version, and we've seen plenty of people who took up their right to the .uk, and then they've either forgot about it, or they've changed their mind.
Dave 32:13 And the .uk version expires, and then gets re-released to the public, and someone else picks it up, and things like that. Anyway, five years on, the time allowed for you to exercise your right expired at the end, about a week ago, two weeks ago now, 25th of June.
Dave 32:36 So, what happened was we were left with, I think, two million roughly .uk domains, where the .co.uk, or whatever .org.uk hadn't taken up their rights. There are some valuable domains there, some really good ones.
Dave 32:52 Like, todayhr.uk, as in human resources, HR, was basically released to a certain few people who have opted to be part of this release, and written software to try and get involved. And I've been trying to get involved, but I've had a bit of a horrid time with it this week.
Dave 33:15 My software let me down on Monday and Tuesday, and today, my software worked well, but I just didn't think I had any luck, and I came home with nothing. So, on Monday, I did grab babysitters.uk, which is a nice name for the business.
Dave 33:32 It keeps off, and it keeps out of anybody else's hands, so that's good. I'm just hoping to do a little bit better tomorrow and Friday. So, I've been doing it. Sort of, on Monday it was domains beginning with zero to nine, A to B.
Dave 33:47 Today, it was I think, G through M, and then tomorrow N through S. So, I'll be scouring the lists of domains of some 400,000 domains becoming available tomorrow. Most of them are garbage, but there a few nice ones in there.
Dave 34:02 And yes, I was trying to pick some up, and make a bit of money, protect our business in some ways. For example, on Friday, tutors.uk, and we have people, a few customers of ours are tutors.
Dave 34:18 A nice little adjacent thing to the childcare side. So, if we can pick that up, it's nice for us to keep that out of the people's hands. So, yeah. We'll just have to see though. It's been nice.
Dave 34:32 It's kind of fun, and the way it works, is that every day at 2:00 PM, they release all of the domains in a batch. So, at 2:00 PM, 400,000 domains become available. And there's probably ...
Dave 34:47 I think, realistically, there's probably 100 to 150 organizations or entities trying to get ahold of the best domains. Ranging from the small independents like me, to GoDaddy, web.com, some of the big that want ... 123 [inaudible 00:35:11] part of GoDaddy now?
Dave 35:11 They might be, I can't remember. So, they've got big systems, they've got heavy servers. They've got more money, because the more money you have, the more quota you get from nominet, the more requests you're allowed if you like, but it only takes one to register a domain.
Dave 35:31 So, if you get it in quick enough, we're all trying to get the time on our servers synced with NTP sources as best we can.
Dave 35:43 And then, there's a gamble. If the domains get released at two o'clock and you've got 1.5 milliseconds of network latency between you and the server, we don't know anything about their internals.
Dave 35:59 You could assume they're going to have sort of style message queue, low balances, message queue. Do you send 3 milliseconds before 2:00 PM?
Dave 36:09 Do you assume that because there's low balances involved, and possibly in multiple message queues that you should say, 10 requests for a name that's very popular, and hope that one of yours gets through.
Dave 36:23 Because, the likelihood that the first one that lands is the one that actually makes it, you don't know.
Beau 36:29 Right, and if you do 10 for one, then that means that you get it. That means there's nine requests that could've gone for another domain.
Dave 36:39 That's right. Yeah, because everyone has got a quota for the, "It's permanent." So, for work we have 75 request per minute, which is the second highest. The highest is 150, so people like GoDaddy will have 150, but they will also have 150 on several tags.
Dave 36:56 Because, they've acquired various registrars over year, they'll be able to use that across the board on all of theirs.
Beau 37:05 Right.
Dave 37:06 So, yeah. You've got that thing. Some people are going for a spread and shred, 75 requests on 75 different domains. Some people will be thinking, "Well, these are the top five. I'll put everything in those five." Who knows?
Dave 37:23 It's really weird, because I think we've had three weeks we were available for using the test bed, and I felt like I was running test every day and tweaking, and then it seems as soon as the test bed was unavailable, I thought of a million things I wanted to try.
Dave 37:42 And I have tried a couple of things, but I'm having to try live. I've only got two more days to go, so hopefully I'll get some decent names, but we'll see.
Beau 37:52 Cool. Well, we should get a report from you at some point of what you actually accomplished from this season.
Dave 37:59 Well, in terms of actual money invested, we've only paid for dedicated servers and my time. A lot of the code, the basic code I had available. Generating the correct XML payloads to send.
Dave 38:13 I had all that available. It's just a bit of, sort of a daily tweaking of things, and running things. And the other interesting thing is, while I have 75 requests to make in that first minute, you're only allowed six connections to the server.
Dave 38:31 So, even though you've got ... even with somebody with six still has a good chance, because ... Does that make sense?
Dave 38:40 You don't know, because you'd assume given you only got six connections, that even if you've got 75, you've got to send 12 in one after the other on each connection. So, that 12th one is starting to get a little bit far behind in the queue.
Dave 38:57 So, maybe then you should just be going for the slightly more obscured stuff, the longer tail, things like that. So, yeah. I've got two days to go, and we'll just see how it goes. I'm not getting my hopes up too much.
Dave 39:11 Chances are, because I really want that tutors name on Friday, I'll just go full till all in the tutors, and just hammer it, and we'll see.
Beau 39:20 So, I haven't done anything in nearly like this, but it reminded me of something that I thought was funny. Hold on a second here, I'm trying to find. There was an old movie that did something really silly. Antitrust. Did you watch Antitrust back-
Dave 39:37 No.
Beau 39:37 ... in the '90s? It looks like it was back in the '90s.
Dave 39:40 I don't think so.
Beau 39:42 If you've ever looking for something really funny to watch that has to do with technology, and not quite as bad The Net. This was a couple of years after The Net. I think, we were talking about that recently. Have you seen The Net?
Dave 39:56 No, I-
Beau 39:57 Sandra Bullock?
Dave 39:58 You mentioned it, because you saw the symbol for pi on something.
Beau 40:04 Yeah, I saw the pi symbol on a website I'm working on recently, and that was in The Net, which it just made me laugh that it was actually ... I got that reference, and the fact that somebody else had the reference to actually put it in was just really pretty awesome.
Beau 40:24 Anyway, in the Antitrust, there was a ridiculous scene at the end where they are trying to beat some network thing, where they were closing off IP addresses to satellites, but there were seven satellites.
Beau 40:43 And so, they both were going for satellites in order, and then one of them said, "I should go from the other end."
Beau 40:52 But they both did it at the same time, because they were trying to beat ... And anyway, as you were talking about getting these things at just the right time, and which order do you do them in, and do you do five at once, reminded me of that particular scene.
Beau 41:06 And this is probably the closest thing in the real world I've ever seen to that awesome movie.
Dave 41:14 Yeah? I don't know how awesome cobbled together software is, but it's a make or say, and just getting babysitters on Monday has made it worthwhile. I just feel like it's an opportunity missed, if that makes sense.
Beau 41:29 Yeah, that makes sense. Well, hopefully you have better luck through the rest of the week.
Dave 41:34 Yeah, I hope so. We'll just have to see.
Beau 41:40 So, one of the things I'm doing on the new project is playing a bit with Command Bus. I think, I mentioned to you at one point that I had implemented the Command Bus with Eloquent and Laravel jobs, and I sort of backed out of that a little bit.
Beau 42:04 I had a discussion with Ross Tuck about what he wants to do for Tactician, for the next version of Tactician, and that kind of gave me a little bit of pause.
Beau 42:15 And then, I sort of backed out and realized that I didn't want to do it the way that I had done it before anymore, and decided to just use the current version of tactician instead. But he had ...
Beau 42:27 It's a lengthy blog post on ... I think, it was him, his thoughts on asynchronous commands, and whether a command should be asynchronous. Which, it was interesting because it goes into the difference between CQS, CQRS, and Command Bus in general.
Beau 42:46 And I know that from our discussions in the past, you sort of have a hybrid approach. Some of your commands are fire and forget. Some of them actually have the capability of returning success or not. Where's your infrastructure at, at this point?
Dave 43:03 Well, generally it's the fire and forget, is where I'm at. There are literally one or two cases, where my [inaudible 00:43:23] to offer the opportunity to return values, nothing else. There's no expects to be able to serialize it, I think.
Dave 43:35 But I think, I only use it in three places where I really needed to get something going quickly, but most of the time, I don't really feel like I need it, the return. I must admit, auto increment primary keys do make it more difficult, don't they? I think, that's a classic-
Beau 43:57 Yeah.
Dave 43:57 ... thing when you're using something like Eloquent. I assume you can use UUIDs with Eloquent, just like you can auto increments, but auto increments is so nice sometimes, compared to using the UUID. But, yeah.
Dave 44:14 So, most of the time, I just try to avoid it, but I do have the option to do it if I so desire.
Beau 44:22 Right. How about asynchronous? Are you doing asynchronous commands, or are the commands all synchronous?
Dave 44:29 I do asynchronous commands. Most of them are asynchronous, because I use it as a job queue mostly. I don't do DDD, or anything like that. It's always a choice at call time, or at send time for me.
Dave 44:47 So, my command, I call it command gateway, has a choice of send which goes asynchronously, or send and wait, and send and wait does exactly the same thing. It could go essentially asynchronously.
Dave 45:03 It could go over the wire if you wanted to, and just wait for it to return back over the wire somehow. But it doesn't, and it happens in process. And obviously, returns or responds. Sometimes, I forget that the command plus itself swallows any exceptions.
Dave 45:24 So, when I'm throwing a command synchronous, purposely doing it synchronously because I want it to happen right now. I quite often forget that I might want to check for an exception. Does that make sense?
Beau 45:39 Yeah, yep.
Dave 45:41 But otherwise, it works quite well for me, I think.
Beau 45:45 Yeah, that was the main thing. When I reached out to Ross originally, or initially, to just see what his plans were for it, if he'd recommend anybody still use it. His comments were almost off-handed.
Beau 46:00 It wasn't even like he was trying to direct me or anything. It was just, "Yeah, I have some ideas for it." And just one of the little things he said was, "And I'm thinking probably not allowing for asynchronous commands anymore."
Beau 46:14 And that was enough to get me to start thinking and really dig into that a little bit more, because that was something I hadn't been ... It wasn't until last year, that I really started to even get the time to work on using queues, like proper queues for things anyway.
Beau 46:33 So, in the past, all of my command handling, and all of my event sourcing stuff was all synchronous, and I didn't have the option to do async. And so, I was excited to work with some async commands.
Beau 46:49 Hadn't really considered whether I should or not, at least in the terms of commands. So, it simplified my code base quite a bit, to get rid of the asynchronous stuff, and I'm actually pretty happy with it now.
Beau 47:01 And even with Laravel, I think, [inaudible 00:47:05] version of Laravel shipped with a Command Bus, where Taylor was super excited about the Command Bus. And then, within a version or two, it wasn't Commands anymore, it was Jobs.
Beau 47:16 But I think looking at ... Originally, I was kind of annoyed with that, because I essentially wrote a Command Bus on top of the job queue.
Beau 47:27 And there was one job, and that job was essentially of command, serialized command, and then the consumer version of the Command Bus just took that job, de-serialized it, and figured out which command it was supposed to be.
Beau 47:42 But it just seems really super complicated, and I do like the idea of treating the queue and the job as something separate from the commands, if that makes sense. Where, you can issue the command, and if the command needs to happen, just make it happen.
Beau 48:02 And if the command handler, because of that command, decides that it needs to do something asynchronously, then it can fire off a job specifically, versus it being actually part of the command handler.
Beau 48:14 That simplified the process, at least internally for me quite a bit. So, I've been pretty happy with that, but I know that it was something that you and I had talked about at some point over the last couple of years.
Beau 48:25 And I was curious if I was remembering your setup correctly, and if that had changed any over time?
Dave 48:34 Yeah. No, basically it's either asynchronous or synchronous based on the caller, and what they want. If they want to wait, then it will happen completely synchronously in process. I suppose like you said, that's what's in the Command Bus.
Beau 48:51 Yeah.
Dave 48:53 They could still send it over a queue if they wanted to, and just wait for a response, but at the minute, it happens in process. But the purpose is always there of what the calling code wants.
Dave 49:01 If it wants to send a command and wait for it to finish, it can do. If it wants to just send a command and it doesn't care what happens next, it can do as well. And that, I must admit, that's what I do most of the time.
Dave 49:14 And similar like to a lot of stuff. I guess, similar stuff just takes so long that you're never going to want it, to wait anyway. Generating spreadsheets, generating reports, things like that, and I use it.
Dave 49:28 It just tends to be a neat way of organizing code, it ends up for me. Regardless of all the stuff revolving around DDD, and these little language, and that kind of thing. It's a nice way of organizing code.
Dave 49:40 Quite often, now I find myself ... So, definitely there are some thing. I sometimes do it instead of console commands, because depending on the kind of arguments the command will take. Especially, sometimes if they don't take any arguments at all.
Dave 50:00 In which case, I don't need to write a console command, because I have a console command, a Symfony console command, that sends a command-command, if you like. You give it a class name, and you can give it attributes.
Dave 50:12 Arguments on the command line, and all it does, it shovels it onto the queue to be processed. So, I can quickly ... I don't have to write yet another console command to do the thing that I've already got a command for anyway.
Dave 50:26 So, yeah. It works great for me. Sometimes, it's a bit difficult to see what's going on. I recently wrote some test instrumentation for it, and one of the things that I have in my test, is the ability to tell particularly the HTTP framework, to throw the next exception rather than turn it into a HTTP error response.
Dave 50:49 And I was missing that and the command queue, and so because when I'm running a test, the command queue isn't built to swallow exceptions, it reports them. It logs them in develop environment.
Dave 51:02 Or, in a live environment, it'll send them off to our exception tracker, but in tests, it was difficult.
Dave 51:07 It just happened in the background, and you didn't really know what was going on. But just adding some sort of instrumentation to it, so I can tell it, "Yes, [inaudible 00:51:14]. Shouldn't that happens when a command's handled."
Dave 51:17 Or, just log directly to the terminal, rather than to a log file, and things like that. So, yeah. And I've added a few features, like ... I think, Laravel probably supports it in one of the add ons, the telescope while some, and whatever they are.
Dave 51:33 But basically, a command can itself say, "I'm a monitorable command." And it'll get ... Like, it can tick, so it'll tick to say how complete it is. To pipe some data to it, and that I guess, stashed on Redis, so I can see in real time what's going on with the command.
Dave 51:56 Particularly, we use it in the admin stuff. So, particularly, we generate some bigger reports, just being able to see how far along, that report is useful, and stuff like that. So, yeah. I'm quite happy with it.
Beau 52:07 Nice. Yeah, I've been hoping to be able to do some event sourcing e-things, with the current project. But honestly, I don't think that I can. I don't even know if I can't ... I don't know if I feel comfortable across the board, deploying it in this application.
Beau 52:30 I think, there are a couple of places where I might still do so, but the one place that event sourcing really would help, would be with auditing. And I've tried to take the approach to doing command sourcing. I think, it's called command sourcing.
Beau 52:49 In that, all of the commands are being logged in the same way, and actually a table that looks very similar to how you might implement an event store, to store all of that information that's being done.
Beau 53:03 So, you can see all of the things that are happening. You can do the same sort of middleware to enrich metadata around that command, so that you can see who did it, what time, from what IP address.
Beau 53:16 All of these other things, and I've been pretty happy with it, and just the whole bridge between say, rich domain language and Eloquent flat database models. I've been pretty happy with the way that the command concept has sort of helped organize that.
Beau 53:37 Like you were saying, that it's a great way to organize code. So, what I've done is sort of done my traditional DDD layout, where I have a model directory, then I have a high level model, like say a user, or a client, or whatever. But then, I have the commands.
Beau 53:57 The command handler is under there, but there's no actual model. The actual model is an app user, app client, app whatever. And what I've been trying to do, and if it works out really well, I think I'm going to try to explore this even more.
Beau 54:14 And I might do it on an Astrocasts project, or something, is anything something writes to the model, it has to go through the commands.
Beau 54:26 And it's going to have to be ... There's no actual way, and I'm not trying to go into Eloquent and make it so that you can't actually directly modify the objects. So, I guess, it's by convention.
Beau 54:38 I don't know how to enforce it. I don't think ... I don't have a way to enforce it just yet, but so far, I feel like I've been pretty successful in being able to still create atomic intentional names for things.
Beau 54:54 Because, the commands themselves, I have decided to put the validation on the command itself. It means that for example, import client has different validation rules than create client.
Beau 55:08 They do essentially the same thing, but the rules for importing are much looser, because they have to be. Because, the legacy that's coming in might have a null field, where that shouldn't have been null, or it had garbage data, or whatever.
Beau 55:23 And then, I also have ... Since I am doing the command sourcing, I'm able to do a rich amount of audit logging built in. So, I can see every command that came in. I can see one that came in, and I call all of the metadata.
Beau 55:36 So, I feel like I'm getting a bunch of the benefits that I would normally get from a full CQRS event sourced system, without having to do that.
Beau 55:46 I'm able to do a lot of it by putting this Command Bus in front of the Eloquent-Laravel ecosystem. So, I'm pretty excited to see how that turns out in the end.
Dave 56:02 Sounds good.
Beau 56:03 Yeah. Well, I think we've been chatting for almost an hour now. So, it looks like it's getting pretty dark on your side. It's not dark here yet, but-
Dave 56:14 Yeah, we better finish things up.
Beau 56:16 Yep, cool. Did you have anything else you wanted to mention before we sign off?
Dave 56:21 Probably a few things, but we can leave for the next episode.
Beau 56:24 Awesome, sounds good. Let's call this one a wrap.
Announcer 56:35 You've been listening to That Podcast with Beau and Dave. You can find Beau on Twitter and Google+ @BeauSimensen, and Dave on Twitter @DaveDevelopment. You can subscribe to this podcast and review it on iTunes.
Announcer 56:54 If you'd like to review us but don't feel like we've earned five stars, email us so that we can talk about your issues. You can also subscribe to this podcast with RSS from our website, thatpodcast.io.
Announcer 57:05 From our website, you can also sign up for our newsletter to get super secret extra content from Beau and Dave, sent directly to your inbox.
Announcer 57:11 Like the music? You can thank Grillo for allowing us to sample the Dusk Kingdom for our intro and outro. You can find Dusk Kingdom and other tracks by Grillo at grillo.bandcamp.com, spelled G-R-I-L-L-O.