Pivot to Gaming Theme
00:00:15
Speaker
Welcome to Deaf in episode number 66. So we just pivoted as a gaming podcast to, you know, to attract the younger audience. And we'll probably be on twitching. We are twitching severely now. Is it twitch? Whatever the thing that the young people are into.
00:00:36
Speaker
our only fans. We're on only fans. Twitch. By the way, we should replace Defone with just a TikTok, like 55 TikToks. Yeah. Then we do the dance thingy. What's that? TikTok dance or whatever, I think. Yeah. Yeah.
00:01:00
Speaker
Whatever. I can't do it. We can't subtitle what Ray is doing, so I think we're going to refrain from it. We'll save you, the people who are listening now.
Introducing Episode 666
00:01:14
Speaker
So this is episode number 66, and welcome to Devil. It's one shot of the devil, isn't it? Yeah, it is. It actually works, because I was born on Friday the 13th.
00:01:27
Speaker
Oh, wow. Perfect. And this is a total horror show. Maybe we'll just skip Java, just skip a bunch of versions like Windows and then just say, this is 666, episode number 3. And then the internet will be frantically looking for all the missing episodes, like, what are those things? Create some mystery around it.
00:01:52
Speaker
Maybe. That'll be
Guest Introduction: Dominic
00:01:54
Speaker
a good, good thing. So welcome to DEFIN episode number 666 with Dominic.
00:01:59
Speaker
Welcome. So let's get started. Yeah. Yeah. There was a pause there and I was like, wait, I should probably say, oh, thanks for having me. Okay. That's all for today from episode number 666. So maybe we should name you Damien for the episode, you know? It's pretty close. Damienic. Damienic, yeah. So maybe introduce yourself.
00:02:28
Speaker
I'm Dominic. We're
Sober Lifestyle Choices
00:02:38
Speaker
at the bottom of the list.
00:02:47
Speaker
Some bloke we randomly pulled off the street, didn't I tell you that? I met him at Closure Tree last year and I was drunk, he was drunk. Well, despite my behaviour, I was not drunk. I don't drink. I was on medication when I was a teenager which prevented me from drinking, so I never started.
00:03:11
Speaker
Um, so then I like never felt the reason to, so now I don't have it as like a vice that I reach on when I'm stressed or, you know, or an excuse for your idiocy.
00:03:25
Speaker
Very healthy, very good. I've stopped drinking myself, actually. I had Oxorba, and now I'm doing Nohr, Lember. We'll have to see how December works out, but it's pretty good to be off the source, to be honest. What is December, then? Decreased Ember? Oh, I like that one, yeah. Decreased Ember, yeah. Def Ember, yeah. Just enough January, and then fuck it, February, back online.
00:03:53
Speaker
Fuck it, February. Yeah, exactly. I'm back. And you catch up with all the pending booze. I worked with someone once who had drinking days scheduled on his calendar. But what became very clear was that those were days that he had to drink and the other days were optional.
00:04:19
Speaker
I remember some joke like that that there is a guy who used to come to the pub or a bar and then every day he has like two glasses of beer and then one like one in front of him and one the other side of the table and then he drinks every day and then the bartender asks why do you do this like oh because you know I used to have a good friend and then he used to drink with me so in memory of him I'm drinking and then after some days like
00:04:41
Speaker
Um, he only has like one glass of beer and then asked what happened to your friend. He said, Oh, my friend, this is my friend. I actually stopped drinking. So I think it sounds like that. Like, you know, optional days.
00:04:59
Speaker
Anyway, so that's the beer and then games. So how is the weather like? So you're from the UK.
Weather and Currency Chat
00:05:06
Speaker
Yeah. Oh my God. We're getting desperate now. We're getting desperate. Avoiding any closure related topics.
00:05:18
Speaker
I mean, you know what the weather's doing here. It's grey and miserable and keeps spitting down on me. Yeah. That's a high note. To be honest, Brexit is going a little bit too well, actually. It's a bit annoying. So I get paid in dollars. So when Britain does poorly, I get paid more.
00:05:45
Speaker
Because I strategically convert to pounds when the pound isn't worth as much. And because we're so close to a deal, people are feeling like it's going to happen so that they've got a bit more confidence in the pound. I mean, it doesn't help that people are very worried about the US right now.
00:06:00
Speaker
So the dollar is plummeting and we're not quite managing to kill ourselves as quickly. So right now I'm a bit out of pocket. It's a bit of a knack for me actually, because I get paid in dollars as well. And the euro versus the dollar is really fucked. So I've had a big haircut recently. Donald Trump's rated my performance and decided it's not good enough.
00:06:26
Speaker
Then why don't you switch to getting paid in cryptocurrencies, like Dogecoin or something? So much less volatile. Exactly. They're going to be like flat lane exchange rates, so that's going to be amazing. Always paid in like, I don't know, two bags of salt or whatever.
Dominic's Clojure Journey
00:06:49
Speaker
Anyway, so speaking of money and work, so how did you get into closure, Dominic?
00:06:55
Speaker
There's this great little group down in Exeter, which is in the southwest of England. And I moved there. My partner's family is from Exeter. So we moved there for the summer. And I was like, OK, there's this closure group. I lived in Wales prior to that. And there is no tech groups. People look at you funny if you say that you touch computers. So.
00:07:20
Speaker
I lived in the southwest for a little while, and there's a closure group. It's a chance to hang out with technical people, so I'm going to rock up. And they were just really welcoming and just very, I don't know, they sold me on closure. So I went away for the month between the two meetups and played around with this. I hooked up Minecraft to closure. I set up a REPL inside of Minecraft.
00:07:47
Speaker
And I went back the next month and I was like, look how much cool stuff I've been doing. And at the time I was a freelancer. So the next job I got, I did enclosure. That was how I started playing around. I started building out this full web application. And I was sort of enthralled by the dream of lists because they had all this
00:08:06
Speaker
complex template, like they wanted to integrate with other systems, but they wanted a uniform UI for out. And I was like, I'm going to just like build up this DSL and enclosure, and it's going to be all lispy and hiccupy. And I'm just going to output the different template formats automatically. It's going to be so awesome.
00:08:23
Speaker
Was it? Well, I didn't get to that point in the project, unfortunately. They had an internal change of mind and decided to do the project internally in Java instead.
00:08:43
Speaker
They were a Minecraft company, so they already had plenty of Java people on hand. I don't know if they had any Spring Boot people. I don't know how they were planning on doing the web part of that Java stuff.
00:08:55
Speaker
doing Minecraft plugins where you're essentially designing games and doing processing of events as they fly in. It is quite different to web programming. So I don't think I ever checked in on how they managed to get on. I was busy. So after that, I met Malcolm at, what's the name of the Skills Matter Conference in London? ClosureX. Yes, that's it. I met Malcolm at ClosureX. That was in 2016.
00:09:23
Speaker
Malcolm Sparks. Yeah, Malcolm Sparks. Malcolm X.
00:09:32
Speaker
And with parentheses, like throwing them like, what are those? They're like shuriken things. Yeah. I met him and we talked a bit about Biddy because I'd used Biddy on that project prior to that. And I made some open source contributions to Biddy and not much later I got an email in my inbox saying, hey, would you like to come work at Juxt?
00:10:01
Speaker
So yeah, I suggest. Nice. But before coming to closure, what were you working on?
00:10:13
Speaker
So I started programming in C. That was what I started learning. I was really interested in security. So C was the natural language to play around with. I mean, I'm from a background where we shun C++. C++ is too complicated. You can't go low level enough. You just don't understand the assembly code anymore. And Java, Java is the devil, like that is.
00:10:38
Speaker
so heavyweight and just like so bloated and such a, you know, why would you even bother? So that was sort of, I got my start in C, but then to pay the bills, I started web programming. So I picked up Python and did quite a bit with Django and Pyramid and Flask and all that sort of stuff. And then I was doing web programming at the birth of React. I remember the early days of React and it was quite odd coming to ClosureScript actually, because it's like,
00:11:06
Speaker
Wait, but how do I, like, where's my component did mount? Like, it's gone. Like, I've lost it. What is this reagent thing? And how does it actually manage to pull this off? But yeah, so a bit of Python, bit of JavaScript, bit of C, and probably a bunch of other little miscellaneous things. So what was the demand for C where you were so hardcore? Was it like embedded programming?
00:11:30
Speaker
No, it was security. So when you're writing exploits and stuff like that, it's a lot easier to do it and see when you can bits it all and just like, oh, just jump into this other part of the program intentionally, because I want to. Well, you were trying to attack C programs then, because you could do buffer overruns or things like that. Yeah, some of that. And some of it was just learning. Some of it was just I wanted to understand how buffer overflows worked in the first place. I didn't understand the model that led you to them.
00:11:59
Speaker
which I now do very clearly in my mind. Learning security first was actually a really impactful thing. I have often been, wherever I'm working, the voice of security. I have a little radar in my head now, which is like, that looks fishy. Something's off in that area. You need to validate that or something.
00:12:23
Speaker
The thing that's most annoying to me about security in our company is everyone's always like, do this, do that. You could be DDoS, you could be DDoS, you could be DDoS, you could be DDoS. Fuck DDoS, Jesus Christ. Don't use Clojure, you could be DDoS. No, shut up. The scary one for Clojure is actually DOS rather than DDoS. My favorite example of this is spec.
00:12:49
Speaker
To this day, I have discouraged everyone I have met from hooking up spec to a web endpoint. So I'm possibly about to sort of reveal an exploit in your application if you're listening. So there's two things that factor into this exploit. One is the open world assumption of spec.
00:13:07
Speaker
So any key that you send to the server will be validated. I know there's things like SPECT tools by Bentosyn and they do all sorts of funky stuff by, you know, illegally using the protocols and whatever. But officially, I mean, Alex Miller told them off.
00:13:23
Speaker
Alex was like, that doesn't get any worse than that. It's like Bob Ross saying your painting is wrong. That's a bit of a low standard, right? It's not like Bob Ross is known like Michelangelo or something. He's just a dude who paints mountains and trees. I think we offended Bob Ross fans of the internet. Who's next?
00:13:54
Speaker
So there's this open world assumption that every key that comes in will be validated. So if there's a library, let's say, for example, it validates a string and it takes 500 milliseconds per character because it's doing some kind of cryptographic verification. I can send you that key and string of like 4,000 characters that it was never intended to be used with.
00:14:17
Speaker
and it will validate it. And that will make your server very, very busy. So now instead of needing like a botnet army of 5 billion computers to take down your server, I need one server, one client, like one bot, and I can take down your whole service because I'll just completely destroy the CPU cycles. Yeah.
00:14:36
Speaker
So please use spec. That's what you mean. Well, it's an alpha. So you shouldn't be on the software. Hey, this is episode 666. So we need to bring down people. It's like the Emperor's New Groove. I think he got a point, you know, like crunk from Emperor's New Groove. Wait a minute. I think he got a point.
00:15:01
Speaker
But I don't think many people will use spec in the so-called production code, right? I mean, usually disable those validations in production anyway. You'd be surprised. I haven't seen, but yeah. People hook it up to WebM points, so they use it as the validation to confirm that what's coming in is valid. I think it's a very common use case, yeah. Yeah.
00:15:26
Speaker
And even if you're calling keyword on it, if you have the slash in it, so I could modify a form to submit my.slow.namespace spec slash foo. And if you call keyword on that, it'll get processed, and then spec will pick it up. Well, I guess that think, as you said, don't use alpha software, I guess. Or alpha 2 software. Well, the other thing is spec 1 intentionally wasn't covering this use case.
00:15:54
Speaker
I evaluated it when it first came out and I got told off for being a very negative Nelly, which is a very common thing. I'm often told that I'm just too much of a downer on everything. I'll quickly pick out the flaws in anything, but I evaluated it early on. Why didn't we invite him on here?
00:16:16
Speaker
because it's the final episode close close is terrible rubbish i mean i mean rich hickey is not saying yes so we gotta settle for this guy yeah that's right it's either him or dominic so
00:16:39
Speaker
Anyway, yeah, but I think you make a very good point, Dominic, that security is definitely an issue. And like you say, you have to be careful out there. Because I think you can probably combine these things with multiple variations so that it's not your only line of defense. And often these things are not necessarily like latency critical.
00:17:03
Speaker
And maybe as you know the clients, for example, so you can be a bit more if they're signing things and stuff like this. So you can put other kind of restrictions in place that make it a bit more tricky to form those. I was having some argument, not argument, but kind of a discussion at one of the work projects.
Frameworks and Security in Clojure
00:17:29
Speaker
Again, the whole discussion of whether
00:17:31
Speaker
Closure requires a framework like Django or Phoenix or something like that. But isn't it, then, in that case, security point of view better to have a coherent framework where you can essentially make sure that all the libraries that you're using are wetted, validated,
00:17:56
Speaker
makes it, don't you think it makes it easier compared to people picking random libraries and then plugging them together and then hoping it's gonna work? And security-wise.
00:18:05
Speaker
The biggest surface area you really have, in most applications, is usually database injection. And to be honest, Closure's story here is the best non-ORM story I've really seen. The pattern of parameterized queries is very strongly encouraged by the libraries, even by the underlying Java system. It's just so strongly pushed. And you can do almost everything that you would want to do with that.
00:18:29
Speaker
So I haven't seen a lot of evidence that it's been a problem on that sort of aspect, like, you know, from an execution buffer overflow, that sort of, you know, the serious exploits. I haven't seen too much evidence that that's actually a problem enclosure. Yeah, I can't think because Ring does a good job of all the parsing. So between Ring and Java JDBC, or obviously, if you're not using SQL, then you're using Mongo, and then you've got to follow whatever their rules are around injection and parameterization. I don't know what they are.
00:18:59
Speaker
To be fair, where I've actually seen this fall down a little bit was with Datomic queries, where people didn't realize it was parameterizable, because they'd already put the backtick around it. So they couldn't figure out how to put symbols in. So they started doing manipulation of it and injecting stuff in. And I was like, hmm, OK, I'm going to send you some random Eden, and let's see what happens. You can execute stuff in Datomic queries. You can say, run Fred's sleep 10,000, and just lock it up.
00:19:29
Speaker
But yeah, I think this is something that I've been thinking about it because I remember I think a few years ago at Closure Conch, there was a talk by one of the folks, I don't know who, I mean, I don't remember the names, specifically talking about web security. I remember, yeah. And like a weird situation that Closure is in for the web security because of this, we had this buddy and then friend and a lot of other libraries and
00:19:55
Speaker
not having a consistent view on the security side, at least for the web development in Closure. Actually, I'm going to use this as an opportunity to talk about something that's been on my mind recently, which is I think that Closure doesn't need a framework. I think frameworks just don't fit what people use Closure for. If we were going to be another Rails or another... I've got to say this properly because I'm on the air now. Laravel.
00:20:22
Speaker
I always say it like Lara Bell or something like that. I always get it wrong. Anyway, like if we were going to be another one of those. Lara Bell. I think it's named after some person, so you have to pronounce it how the person's last name sounds or something. I don't know.
00:20:38
Speaker
Anyway, if we're going to be enough for one of them, like there's no point competing in that market. It's already completely dominated, right? People come to closure because they want to like, they want to piece stuff together, right? They want to use MongoDB and do a web application. You know, good luck doing that with Rails because you're tied into the ORM and people like the ORM. It's great. And you know, whatever.
00:20:55
Speaker
But so I actually don't think a web framework is the right way to go for closure. But what I do think would be useful is for more companies to come out and say, this is our stack. This is a set of libraries that you should use. You don't have to. We've tried this out on 20 projects or whatever. And just use it. No arguing. Unless you run into a problem which you can't overcome, just use these libraries. We're happy with them. Like the full cross style.
00:21:21
Speaker
Um, I'm maybe not full crowd. I always struggle to figure out, but that kind of concept. I guess it's still, it's still a framework, right? I mean, it's, it's still the, the whole, I don't know. I mean, they said that, but I mean, you know, his argument is when he was on here, mostly it's just, mostly it's just like a curated selection of libraries. You know, there is, there is some framework he parts of it, but it's mostly just a sort of collection of libraries.
00:21:51
Speaker
Yeah, I've always struggled to place for crow because it seems like some moments it seems like a it's just a client library. That's like deeply integrated with reagent or something like that. I've already forgotten whether they provide a react front end or not. And then sometimes people refer to it as like a full stack competitor with, you know, like talking about database stuff with it. I struggled to figure out what it actually is.
00:22:29
Speaker
Yes, I look forward to your tweets and muting them. As you can see, I'm super active on Twitter. So please, please send us your letters or defrets to Vijay. Please write to the editors. I think in terms of like framework or like let's say a list of libraries, I think people like Matossian and Juxt do that.
00:22:39
Speaker
I think it's full. That's why it says full crow. I always think of Velcro for some reason.
00:22:53
Speaker
which is quite good. But what do you think? Because I think one of the issues, I guess, is that they might say that, but what are they doing in terms of supporting it or standing behind it or certifying it? You don't want to be on the hook for that to some extent. You want to say this sort of stuff works, it's effective for us, but we're not necessarily going to look after you for the long term.
00:23:21
Speaker
What is the goal, I guess? What's in it for everyone? Both sides of that. That's a really interesting question, actually. I mean, I can talk to it about it from the consultant's perspective, being an ex-jux to myself. So I can actually talk about it. I worked a lot on Edge. That was a big project for me. It became a passion project that I worked on on the weekends. So for Edge, the motivation was really that consultants start more projects than anyone else. This was a really, like,
00:23:51
Speaker
The moment for me when I was working, when I was trying to sell Juxed, not Juxed, when I was trying to sell Edge, I was trying to convince people, like, hey, why aren't you using Edge? Let's talk about it. So I'm not starting any projects. And I started this one two years ago, and I just don't care. I was like, oh, yeah. I work at a
Consultancies and Standardized Tools
00:24:08
Speaker
consultancy. We start a new project every couple months. So having something I can update, having a dev system that's all nice and refined that I can keep pulling in, that's actually really valuable.
00:24:18
Speaker
Um, it's not as valuable when you're working on like a single project for five years It doesn't matter as much Um, so that that's why a consultancy like puts this together Um, it just seems so immensely valuable to them and they keep hearing this. Oh, we need a framework So it kind of like fits with what the community is asking for uh, vaguely along it runs along the lines of what they're doing. Um, junks were a bit more supportive of edge. Well
00:24:43
Speaker
I don't mean to compare it to Talvy, which is Matosyn's thing that's a little bit vaporware at the moment. It's a read me with a list. I actually think Talvy is really good, just to be clear. I'm working on a thing that's based on Talvy, actually.
00:25:03
Speaker
Juxt wanted to support this because they offer training courses based on Edge as well. So there's a plethora of documentation. I spent up so many Windows VMs trying to get Edge, like making sure Edge worked on Windows so that training courses would work and making sure it's very beginner-friendly because of that and writing documentation. You've suffered for your art.
00:25:28
Speaker
So how maybe it's because you keep talking about edge and then maybe it's better to give a quick intro of what that is and where is it in the in the forest or quadrants of closure frameworks and compared to luminous and all the stuff that we have like bazillion libraries and everything. So I think that
00:25:53
Speaker
It is pretty close to ducked in terms of its goals. So ducked, did you have James Roos on Duffin to talk about? Long time ago. Yeah. I remember you on the first guest. Yeah. This is when we were playing Minecraft. So that was a very long time ago. So something he mentioned on that episode was that the way ducked was designed was to make it easy to update.
00:26:21
Speaker
And I think what the way the compromise he made was that he would generate any of the what I would refer to as framework II part so the part that reads in the config Slurps up your system and then starts it right like that that tends to be what people make a framework out of right and you declaratively put it in your config Eden and type go somewhere and it magically pulls it in and starts it up and it's just magic
00:26:45
Speaker
So Edge, but most of duct is libraries. So you can update them, you can just bump the version and it's all fine.
00:26:53
Speaker
Edge sort of tried to solve the same sort of problem where it wanted to be updatable. But the way we tackled the framework part was that instead of generating it as part of the template, we wanted it to be able to evolve it and improve it over time. But if people wanted to go modify it, we wanted that to be OK too. So the way we solved that was by having you git clone Edge.
00:27:13
Speaker
So you could modify it and then merge in origin again. And the frameworky part would update unless you've made a conflicting change. So it was sort of on you then to then merge the two changes together. But you would essentially still be able to benefit from upstream improvements to the framework part of the code, but also be able to modify it yourself. So you had flexibility and updatability, whereas
00:27:37
Speaker
I'm going to get a meow again, aren't I? That generated the framework part so that you were on your own at that point. And that was a design goal for Edge was that we don't leave you on your own. Partially because... The marketing is meow-ish. These are the guys, they leave you on your own.
00:28:03
Speaker
Ooh, I think it's also fine, right? Because there's downsides to the Edge approach too, which is that you end up with this git history that you perhaps don't want, right? My name ends up as a contributor to your private repo. That's the most annoying part when using source code. Yeah. Seeing your name. Yeah.
00:28:21
Speaker
Like I always have more lines of code contribute to the repo than you because I've been hacking on your repo five years longer than you. So my name is there. I think it's going to be amazing because, you know, the more people use Edge in the corporate environment and then they give the bonuses based on number of lines. Where's this Dominic guy? We need to shovel money to him, you know, send the bonus for the Christmas.
00:28:45
Speaker
He's the biggest contributor to our project. Yeah, I mean, there was like a point where my name overtook Malcolm's and I was very proud. Finally, not mine. I did sort of have to move around a bit of his code to take responsibility for it, but it worked out in the end.
00:29:06
Speaker
It's basically indent and a comment. The other part of Edge, though, is the stack. So it's using yard or it's using bidi. But that's just generated as part of the template. It's not really a thing. So you can use Edge and rip out the jux libraries, and it still is useful, I think. But it was definitely there to promote jux libraries. Yep.
00:29:32
Speaker
So it's more like a source code framework, if that is a thing. So the migration and upgrade path for non-source code frameworks are going to be a bit different, I think. Just before we go into that for a second, now that you have, because I've just caught up with what you were talking about in terms of git cloning, et cetera. So you basically go to a company and you fork the repo.
00:30:01
Speaker
into a private repo of the company, and then you're off and running. Okay, I got it now. So now now we've got like better tech with depth star Eden, we can avoid that completely, I guess, because you can just put a dependency on the edge repo, and then you don't take any of that bullshit because, you know, so is that what you would do now?
00:30:23
Speaker
Well, I can tell you what I would do now because I'm working on it. I can't do it. Tell me, tell me. It's so exciting. Well, I actually, so I don't think you quite, unless you do the monorepo approach or something like that, you can't, you would have to sort of like subtree the frameworky part into your repo and then you could manage using subtree or submodules or some kind of git mechanism for like having a folder that is another repo managing updates that way.
00:30:51
Speaker
So it's not quite as sort of you can't just use local root because you might not want to make these contributions upstream. One of the things as a consultant, the joke was often, what are you going to do? Tell the client that you can't go to production because the framework won't let you. No, you're going to go modify the framework and you're going to get it to do what you want it to do. And on several occasions, I went and like fiddled with the system code to let it like
00:31:13
Speaker
Oh, just read the config in and do some modifications to the config before we pass it along so that it looks different to what it does. And it's fine. It's not my preference to have it there, but it's there and I could ship. I could go to production and the client was happy.
00:31:33
Speaker
Yeah, I mean, we built it around depth.eden at the time, even knowing that the local root stuff worked. Edge heavily relies on the local root stuff to use its internal libraries. So I think to have the upgradeability, you just somehow need to have the library as part of your repo, whether you local root that yourself or not.
00:31:52
Speaker
I think one of the mistakes we made in Edge was that we made too much be part of the repo. We made too much be local root. We should have moved the examples out. And many of the libraries I've since realized since, and it was literally, I was on holiday for three weeks and sort of towards the end of it, I was like, I had the hankering to do some
Evolution of Edge and Wedge
00:32:09
Speaker
open source. So I started like rewriting Edge using depth.Eden. So it was like literally like late night hacking was what pulled the whole thing together. So on review, it wasn't perfect first time, but we ran with it.
00:32:21
Speaker
It suited us. It was our commit, so we didn't really care as a consultancy that we had more of our commits. In fact, our clients quite loved it. I've been so busy. I've been preparing for their project my whole life, apparently.
00:32:37
Speaker
So what I would do now, what I've actually started to do, even today, I published one of these libraries today would be to pull out more of the libraries into their own thing. So I did this morning publish Juxt IG, which is just integrant wrappers for a couple of the Juxt libraries. It's only a hundred lines of code, maybe across three files, probably not even that, but it just means that it's on a separate release cycle. It's not part of your Git pull. And I would have made just the framework part be what you update somehow.
00:33:04
Speaker
Right. So what do you get when you when you clone edge then? So you get what components that you get.
00:33:12
Speaker
you get a couple of libraries, which is sort of like juxtap stuff. And well, even little things like developer logging is a little library inside the lib folder. That one I'm a bit more like, maybe it's useful to have it there because it's another one of those things where it's like, there's a logback.xml in there that is fine for 99% of the time. But sometimes you might have a very chatty library that you want to adjust from warn to info so that it shuts up.
00:33:37
Speaker
during development. And it's useful to be able to just say, hey, I'm just going to modify this lockback to XML. And when you get poor, if there's been changes, it will probably merge fine. Why do you have it like that rather than as a sort of project template, for example?
00:33:55
Speaker
The reason is entirely for that updateability, because let's say we're consulting on, say, five projects at the same time. I mean, this particularly affected me. So at Juxt, I had the role of sweeper. So I would be on multiple projects at a time, and I was there to sort of fix things and just deal with stuff. So I would jump on a project and say, wait, why am I getting all these logs from this library? We solved this problem, and I would git pull one
00:34:22
Speaker
I'd merge in the latest Edge and all the problems would go away and I'd be very happy. So any bugs that I found recurring across multiple projects, I would then put into Edge so I didn't have to see them anymore. Because I got very frustrated before Edge having to fix the same bug in several places. Especially when after the fourth project, you're like, you think you fixed it. So you're like, this must be the same bug again in a different way and you don't go look for the obvious thing.
00:34:45
Speaker
And it just became very frustrating. But I think that's useful to the community as well. Why not be collecting all of these light?
00:34:53
Speaker
TNS 45 has driven me absolutely nuts throughout my closure career. So TNS 45 is a bug that was raised against tools namespace where if you've compiled a closure script and put it on the class path and then do a reset, it will reload the closure script source files, which is fine unless you have protocols in there, which will then reload the protocols, completely break your reset. And it's just like this annoying thing. And it makes it look like some particular library is broken, like Biddy, because Biddy uses protocols and it broke everything.
00:35:22
Speaker
Um, so it was absolutely infuriating. And, and so then I've like, I've come up with a general purpose fix, stuck it in edge. And I never saw that problem again. And it was wonderful. Yeah. I mean, I like that you remember the Jira issue number. So, um, it's burned in my head, like the number of times I was like, you have a t-shirt that says, you know, I have a work around for TNS 45. Talk to me about TNS 45.
00:35:52
Speaker
It was quite funny, actually, because when people would join projects where we were on a customer that had their own tech team that were doing closure and they weren't using Edge, I would get messages from people, like from jucsters on the team saying, hey, I've run into this. Do you know what it is? And I'd be like, fucking, 40 fucking five. Again. I told you to use Edge. This wouldn't have been a problem.
00:36:22
Speaker
But so why edge though? Because it sounds like you're constantly on the edge. It's not like a stable project.
00:36:30
Speaker
Well, the original name was, I think, leading edge or bleeding edge. Yeah. That's much worse, I think. I think it's because it was a demonstration project to start with. So it would show you the latest in thinking. But after a while, it seemed more useful for it to be stable, actually, and for there to be an upgrade path and for it to be incremental and say, oh, OK, we're on this project. We would like to update it because we're now doing more work on it.
00:36:58
Speaker
Funnily enough, I always think of Edge as just a demo project. So I was trained in a previous meaning. It's like dog training. It's not what it is. It's what I was trained to be. I was trained to think of Edge as some sort of demo. They've been reinforced. Yeah, exactly. It took me a long time to get admin privileges to actually change the description so it no longer said, example application. It was head battle.
00:37:27
Speaker
So when you wear your security hat, how do you see Edge compared to other frameworks then? I actually don't think... So that's the thing. Edge, the frameworks in Clojure don't have anything to say about the web really.
00:37:42
Speaker
Right, like like edge, duct, luminous, other than using a library, they don't actually, they're not a web framework. They're more of a, they're a template, they're a starting point. They're a, I am putting my seal of approval on this. And if you trust me as a company, or like you, you place some value in what I'm saying, then you'll use it. Or if you think you're a maverick, or if you're, you know what you're doing, then you'll probably go off and do your own thing anyway. Yeah. That's what I was saying before, that I didn't really expound on, which is,
00:38:12
Speaker
Companies should publish a stack. And I would like to see more companies publish a stack and say, hey, this is what we use. This works really well for us. This is why it works. And this is how we use them together.
00:38:24
Speaker
Yeah, I think it makes more sense for companies like Jexxed because you have several projects, at least, you know, like 10, at least 20, 30 projects. And you've been in the closure ecosystem long enough to see the evolution of different libraries. And you came up with nice libraries by yourselves. And based on your experience, I think it makes more sense to
00:38:48
Speaker
quote unquote, certify something to say, okay, this is gonna be, this is our stack and it served as well. So use something similar. And the enclosure consultancies want to see closure adopted because that means more work for them. So consultancies actually have a pretty good alignment here for publishing their stacks. Yeah, yeah.
00:39:08
Speaker
So, when you're not working on Edge, what else are you working on? Wedge. Yes. So, John Piver has his thing. That's your new cryptocurrency, is it? Exactly.
00:39:20
Speaker
Well, now that I don't work at Jackson anymore, I'm no longer constrained by the four letters. So I now have five. Freedom. To be honest, it's now got to the point where I've written documentation for it and stuff like that. So now I've decided I'm stuck with the name. I would like to do something from my myth or a legend or history or something, something like subtly Anglo-Saxon.
00:39:48
Speaker
I've picked Wedge now. I joked for a while, John Piver describes things as wanky versions of something else a lot, who was someone I worked with at Juxt. So for a while it was wanky Edge, while I was sort of like hacking it together. And then Joanna Antonelli, who's a friend of mine, suggested maybe we should call it was Edge instead.
00:40:08
Speaker
So Wedge is really just a distillation of the ideas from Edge, pulling out things like juxed IG into a library. And then I'm publishing. One of the points was to try and separate the frameworky part from the stack selection. The idea being that I would like to see a wedge Telvi, a wedge juxed, a wedge whatever company.
00:40:34
Speaker
Maybe I should try and think of a consultancy and encourage them to publish a stack by name dropping them on there. I would love to see a wedge new bank, a wedge Cognitect, a wedge Walmart.
00:40:52
Speaker
Well, I actually think New Bank would have a really good use case for something like this, where they do lots of microservices internally. I'm sure they do have some kind of documented standard. It's like, this is how you start a Closure Web Service. This is what library we use for all our RPC integrations or whatever the internal stack looks like. Just vaguely standardized on it. And you can always rip out parts that don't work for you. But it's a good starting point that it works.
00:41:19
Speaker
So yeah, Wedge is, well, I sort of pulled apart, I sort of had to think about Edge and what were the three main, well, not what were the three main, I didn't start with the three constraint. I started with that, like, what were the main problems that it was solving? How do I tease these apart?
00:41:34
Speaker
because once you there's this wonderful quote in Rich Hickey that's always stuck with me which is that like when you when you pull something apart you can put it together in novel and interesting ways so you can change how it goes together if I just think it's sort of fascinated me with it you know that's that's what simplicity is really about so I was trying to sort of pull apart Edge and I've spent many months and lots of writing trying to figure out like what is Edge
00:41:58
Speaker
and I sort of decided that it was basically three things. It was a beginner setup, so it pulled in dev niceties for beginners who have never used Clojure before and probably want dev niceties on hand because they haven't picked out their own yet. It was a
00:42:16
Speaker
sort of a collection of bug fixes and hacks around things like TNS45 and stuff like that. That was my next question. Is it fixed TNS45? It might be in the read me.
00:42:31
Speaker
It's a great way to describe that you don't care. You don't want to care about TNS45. I care because it's driven me fucking nuts. You don't want to have to care. You want to live your life not knowing what TNS45 is. So just like, let me take care of it for you. I really wish we had you on episode 45. This would have been so good. I think this entire read me like, what is which? You know TNS45?
00:43:18
Speaker
That's what it is.
00:43:20
Speaker
There's other bugs in there as well. It's beginner-friendly and it's not GNS45. There's other bugs in there as well. Is it repl-friendly, Dominic? It's very repl-friendly. I have a lovely hack in there that makes it so beautifully repl-friendly. So there's other bugs it fixes though. For example, if you jack in from CIDR,
00:43:40
Speaker
and you jack in and connect to ClosureScript and Closure at the same time, and both of those commands start your system in order to start the ClosureScript. What size are you in? Vijay will tell you. I don't know, but Vijay will tell you.
00:43:56
Speaker
We have skipped the most important question of the podcast, but I'm sure we'll get to it. Of course. We'll get there. We'll get there. Do we have to? Go ahead. So, EMX or some other shit? Some other shit. Ah, fuck it. Well, I mean, it's not TFS45, so, you know. Ah, you were condemned there, mate. You played the long game.
00:44:20
Speaker
But I am a contributor to CIDR, so I think I get a few brownie points for that. Of course. So you're jacking in. It always sounds very sort of rude to me, but sort of like a drug thing. I guess it sounds a bit like, yeah, like jacking into the cyber matrix or something like that. The matrix, that's it. Yeah. Yeah.
00:44:44
Speaker
So tell me we've got a new Jack-in to the REPL in various places. And it will run these init scripts simultaneously, which means there's actually a race condition there. So one of the little things that Wedge has accumulated is locks in strategic places to stop you from getting these spurious Jack-in error messages.
00:45:02
Speaker
that people occasionally encounter. And when they do in a beginner training course, it's very embarrassing to say, oh, kill it and start again. Or even just frustrating because you've waited 10 seconds for your REPL to start, and it's just blown up randomly. So it was just one of the many hacks that we've collected. And that's made its way into Wedge as well.
00:45:21
Speaker
Yeah. But there's even little nice things in there. Like, for example, I came up with this neat way where I will run crj-condo in the background to build up the cache. If you have a condo installed, which means that when you're linting files, if you've already linted the class path, then a condo will give you warnings about like, oh, there's an arity error in this library usage.
00:45:41
Speaker
which I think is really cool and it's wonderful, but it can only do it if you've run it against class ref and you've kept it up to date. So what I do, whenever you start a JVM with wedge on it, I would just fork out to Condo in the background and populate that cache.
00:45:57
Speaker
nudge Mikael a little bit and get him to add proper caching to Condo that's jar-based so that it doesn't take as long in the background. But just little things like that where I can improve a lot of people's lives by just putting this fix in one place. I just think that's a very valuable thing for the community to start doing, which is that's valuable to anyone using Condo. It's valuable to everyone, essentially. Not just because I assume everyone's using Condo, but because it doesn't degrade from building microservices or anything. It's just useful.
00:46:25
Speaker
Yeah. So the usage of wedge is pretty much similar to edge then. So you clone the repo and then you start it? Or do you have a template or? So as part of the teasing out, I separated out all of the framework stuff into its own little bubble so that as much as possible could be in a library form, which means you can update it and more like duct in that sense.
00:46:49
Speaker
OK. The framework aspect is still there. And I haven't figured out, like, I'm thinking what we talked about earlier, essentially, Ray, which is that if you want to fork the system, you do a local root, and you set up a Git subtree, and it's your, you know, you keep it updated that way. Yeah. Or the other aspect is maybe I can keep it simple enough, or I can build an abstraction for building abstractions. Because you can solve any problem by adding another layer of indirection, of course. That's true. Oh, yeah. It's a level of abstraction. It's a level of abstraction. You can have a high order abstraction.
00:47:22
Speaker
So I'm still gonna evolve what the framework aspect looks like right now. Right now it's a lot of like loading common code from ugly places. And maybe you shouldn't copy that as an example, but it works for me. It works on my machine.
00:47:40
Speaker
So you're going to ship it as a Docker image now, is that your hint? Yeah, you have to use my Docker image and you have to load code into it over the network. You have to use a socket record and send your code. Hey, that's what cloud is, right? I mean, we just picked it up and it gets on your laptop. And this is the security guy speaking now. It must be fine.
00:48:02
Speaker
Yeah. The hosted service is coming later this year. It'll be $10 a month for... No, it's just completely free, but it's using your machines and your AWS account. My cryptocurrency is not popular. So it's going to be a wedger service, waz. Well, at least you wouldn't go for wedgie, you know.
00:48:27
Speaker
I think that that'll be the next version of the framework. The sarcastic version of the library there. Exactly. This doesn't fix TNS45 in the case you've mentioned. We've detected that TNS45 would be triggered, but we've decided to show you this warning instead. Exactly.
00:48:48
Speaker
You're about to get bitten by TNS45. Let's keep flashing. I'm getting a friendly. It's not TNS45. Raffle friendly. Do tell me more. One lovely thing about it, and this is something I spent a little bit of time on.
00:49:10
Speaker
I have a tendency, I'm very active in Slack, which means I nudge people to do stuff. I'm very lazy. I get other people to do the work so I can do the minimal amount of work that I have to do. So I nudged Alex Miller and got adlib free. So we're on to version three of the adlib branch of tool steps alpha, which allows you to dynamically load dependencies into your running JVM. If you're using depth start, you done. That is good, by the way, because I actually, I talked about this on a while ago and he was like, yeah, maybe, maybe it's one of these days. So you've nudged him. Good man. Yes. Kudos.
00:49:39
Speaker
We're on to Adlib 3. He still hasn't committed, but it's evolving. There was some pretty neat code in Adlib 3, actually. For example, you can actually search your repos and it will use, have you heard of the Grap.app service?
00:49:53
Speaker
No, it will search for closure repos with a similar name on Grepa app. If it can't find it on Maven or enclosures, and it will suggest a get dependency to you based on an existing closure. Yes. If you search Cheshire or find the GitHub Cheshire, I thought that was pretty cool, but I'm not using that. All I'm using is the dynamically add to class path stuff. So the beginner, one of the constraints, one of the problems with the beginner friendly stuff is that it tends to bloat the class path.
00:50:19
Speaker
So you don't want it to be part of the main dependency. Because you want to take that to production, or actually, if you've got your own set of what I would call a mise en place. So like, scope capture might be part of your mise en place, or spy scope, or hash P, or like a rebel, or one of the, you know, bajillion libraries that you've built up for your personal workflow.
00:50:42
Speaker
So I call this the wedge-mise, which is a beginner-friendly mise, and you can use it, and it prints out lots of messages and tells you how to use it as you go along. And what it does is it actually dynamically loads the dependencies it needs. So it will fetch hash p, spy scope, and a couple of other things on the fly. So you don't bloat your class path out. You just have to have this adlib free during development. I even have rebel in there, conditionally loaded. So you can start the rebel main without having a dependency on rebel in your project.
00:51:11
Speaker
Nice. Yeah. I can even then do closing. These are nice innovations, actually, I think. I mean, this is, I mean, to me, these kind of things are the heart of what closure should be becoming, you know? This whole Git dependency thing is epic. And now having this kind of stuff where you can dynamically load libraries, this is where we can get away from this Java shit, basically, with all this kind of like fixed class path stuff, you know? So it's really, really fantastic innovation. Yeah.
00:51:38
Speaker
You know how everything is a monkey patch in Ruby. I worked with a Ruby guy once who, this has been burned into my score and I wish I could forget it. So I'm going to share it with you all and burn it into your scores forever. He showed me this wonderful library for Ruby that would hook into the require system.
00:52:02
Speaker
And if you required something and it couldn't find it, it would go onto Stack Overflow and find a matching function and evaluate it. So that you could just dynamically load stuff into your app. You just call the function and it would try and find it and make it exist. Did it at least go for accepted answers? Because that would be at least some quality there.
00:52:34
Speaker
I mean, eventually it is going to be like that, right? Because I think most of the coding is just copy-pasting from Stack Overflow anyway. Yeah, exactly. I think that was the point, right? Exactly. It's just going to get it from the entire program will be built around Stack Overflow. You just keep typing questions like, how do I do this? And then one patch comes in from Stack Overflow. And then, oh, how do I do this now? And then the patch shows up.
00:52:58
Speaker
I think it's a program writing program. So then we don't need to do anything. You just will the function into existence. But generally, this is really nice. I'm impressed by that. That's something which I think if we can democratize those kind of things all the better, this kind of stuff. Because I was doing something very similar. I do do something similar for this multi-repl thing that I use on the upper post.
00:53:25
Speaker
You know, and it's very nice to be able to just, uh, just say, okay, I haven't got this library now, so I want to add it to the raffle, but you know, this machine is remote to me. So I can't even, well, of course I could log into it, but you know, that's not what you want. So, you know, but of course it's a dangerous thing as well. You can load anything you want, I guess, to some extent. Well, but you know.
00:53:47
Speaker
You have to trust people and everything has to be, you know, the whole idea of a lot of these things is, you know, if they're player things, then they should be disposable and burnable and no one should worry about them. But obviously, you know, for development, like, what should we say, development affordances, these kind of things are great. You know, I mean, eventually, yeah, you probably do want to get rid of that in production, you know, you probably want to turn it off.
00:54:11
Speaker
Yeah, and it does come in in wedge just to be clear in case anyone panics. It is a dev only dependency is the tools namespace stuff. Not tools namespace, it's burning up. I'm just going to turn it up now. Tool steps alpha.
00:54:23
Speaker
But the other thing that we're interested in doing, and this is not really, it's a similar concept, is that you can put Clojure into databases and say, you know, come on, hear me out. There you go. No, I was actually going to say, have you talked to Malcolm about this? You should bring him back on because... Oh, right, okay. No, that's the thing. So you put Clojure into a database and then what you want to do is you want to
00:54:49
Speaker
Very much like the blockchain type of thing, you want to say, okay, particular contracts execute at particular times, so you want to be able to version these bits of information, but keep it in your database because that's a nice way of versioning things, whereas it's got immutable data. Get as a pen as to deal with in the closure world.
00:55:07
Speaker
Things like Crocs and Datomic are very nice for that, you know? It's all very, you know, you have the same set of rules, but in fact, you want the particular version of it. It's really easy to make that kind of facility available for yourself. And then you can just load it in, evaluate it, and off you go, you know? Yeah, yeah. And then add specs to it. So again, Vijay? And then add specs to it.
00:55:34
Speaker
Well, you do want that, yeah, for sure. So keep the database busy, you know? Why is it not doing anything? Let's give it some specs and I'll just let it validate some shit. I'm paying for this. So anyway, spoiler alert that the crux is people are working on that.
00:55:55
Speaker
Well, I don't know if it's going to be part of Crux, but I think Malcolm gave a talk about the Holy Trinity, like data, something data code or something like that, which was based on this idea of putting code into your database because code is data and blah, blah, blah.
00:56:12
Speaker
It's really funny. I mean, we go back to like another cycle of PL-SQL store procs, back to square
Clojure in Databases
00:56:22
Speaker
one. But this time it's going to be different. Yes, that's true. Because it's closure, you know? Yeah. Well, you can already run closure inside Postgres.
00:56:31
Speaker
Yeah, using the Java stuff. So it's already possible. The novelty of things like crux or even Kafka Streams is that they allow the data processing to happen inside your application rather than outside it.
00:56:45
Speaker
Yeah. So I don't know if that actually jives very well with your vision, Ray, because the whole like, you know, with library, yeah, with crux, I can already deploy code into it, right? Like my code and the database lives together. So I don't know if I need to put it in the database necessarily. Obviously, there's versioning concerns there. So there's other aspects to that.
00:57:04
Speaker
But who breaks functions anyway? I just add two to the end and start a new one. Isn't it the same in coach DB as well? It's quite nice to have these bits of code that have been signed and all these kind of things. And you can do that. To some extent, you've got more control over how you like...
00:57:26
Speaker
The provenance of code on GitHub is kind of tricky to really program yourself, whereas if you want to control the provenance of your own code, if you have your own mechanisms for doing that, it's nice to put in a database, actually, I think.
00:57:42
Speaker
I think the prerequisite to making this stuff work will be shimming out Git. So building a Git remote, which is your database. Because until you have that, I think that you've got to build out Git again and teach people to use it and decide whether you want to make a nicer interface over Git.
00:57:59
Speaker
or you want to mimic the old one that people already know. There's a whole marketing thing there that you have to worry about. I mean, to me, I don't want to use Git and I don't want to have anything to do with Git because Git is about distributed development. It's not about storing source code somewhere. I think those two things are orthogonal. What do you mean by distributed development, sharing Word documents?
00:58:22
Speaker
That would be a form of distributed development. I don't think anyone's suggesting that, but yeah, it's a form of distributed development. You could try, yeah. I think people, that didn't work very well.
00:58:40
Speaker
But without the code, I don't see, like, I mean, Git is still at its core is just like a database, right? It's a data storage engine, and that's it. And then the whole... Well, the way I think of Git is it's just a sort of... Well, yes, it's a database, but really it's a kind of data structure. It's a sort of...
00:59:00
Speaker
hierarchical hashing system based on top of a file system. And then all you're really doing is just putting diffs at each level of that. Wherever you find a non-matching point in the hierarchy, you're just putting diffs on it. It's pretty trivial, actually. Really, the basis of it is pretty trivial. I really do believe that. And I really think that it's a total fuck up get.
00:59:27
Speaker
I really do. I think it's overblown. It's mental. And it doesn't solve half the problems it pretends to solve as well. It can't do what are merging and it can't do half these things it can't do that aren't obviously trivial. There aren't just well understood bits of math.
00:59:43
Speaker
And it's user interface is unbelievably shit as well, as we all know. I get the point of it, and I know why it's popular, et cetera, blah, blah, blah. But I don't think that's the end of the world.
00:59:59
Speaker
I think that is something that we're
Git Usability Challenges
01:00:00
Speaker
talking about. Like, you know, Jack's saying, you know, this is our blessed framework and then people using it. And then Linus is like, this is what I built for myself. Go fuck yourself. And then everybody's like, hey, we're going to use this thing. OK. Well, I mean, you know, this is my problem and I'm solving it for myself. That's what he said. He never intended that this is going to be like a everybody will switch to Git and then complain to him.
01:00:22
Speaker
GitHub played a big role in Git's adoption. It got commoditized. It became a commercial thing. Well, the thing about GitHub is that it changed the user experience. It was unusable and GitHub made it usable.
01:00:40
Speaker
I'm not joking about that. That's a fact. That's the source of complaint these days with the people from Sourcehood and the people from Microsoft who want to get rid of email and stuff like this. Let's go into a little. We talk about Sourcehood now. We can talk about it. We've all paid our money.
01:01:07
Speaker
We're not getting paid, but we paid our money. So let's talk to other people and then make them use this service. Me and Vijay went to a Birds of a Feather session with Drew. At Fosdam in Belgium. At the Fosdam, yeah, a couple of years ago. Yeah, and I got sourced stickers.
01:01:27
Speaker
I mean, their logo is a circle, but... Yeah. I mean, it was a totally shit meetup, to be honest. He was dominated by this absolute asshole. He just wanted to ask them, you know, trolling questions, but he was very nice, Drew, and actually very affable.
01:01:44
Speaker
you know, manage it very well. And his vision is pretty awesome, I think. He's obviously, Salsa is a piece of crap at the moment in that way. He looks horrible. But you know, it's, it's, what does he call it a brutal interface, you know, minimalist or brutal? Yeah, I think he calls it brutalist. Yeah.
01:02:01
Speaker
Yeah, I think there's a tendency to conflate like shiny buttons with a nice user and any Yeah, exactly. So it's I think it's there are usability problems on source I'm not going to pretend there aren't but yeah, there's actually less than on github I have so many frustrations with the github pull request review UI like I press a button and then it takes 10 seconds and then bumps me back to the last page I was on it just
01:02:24
Speaker
Like, no, I wanted to leave more comments. Why are you doing this to me? Yeah, I don't know how to start reviews and make reviews. All these review things are horrible in GitHub. And also just, I mean, well, we can go on forever about reviews in GitHub. Let's not do that.
01:02:41
Speaker
It's one of those interesting things, though, where if I was to take like a Justin Jackson approach to it, which is this rich rapper guy, and he always says, Well, what are people doing about it? Right? Is there if there's a market there? What are people doing about it? Nothing. People are seemingly very happy about GitHub, right? They're not trying to work around the review system. So that tells us something about either the like how often reviews are happening or how deep reviews are. And it tells us something about like, how much people actually care about this problem. They've obviously got bigger problems that are bothering them.
01:03:10
Speaker
Yeah. I mean, if you see that most of the software is like that, right? I mean, if it's solving like 20, 25% of the problems that are bothering you at that moment, people just jump onto that thing. And it's not like nobody thinks I had like, you know,
01:03:24
Speaker
and forget about all the fluffy stuff like freedom and open source and this shit. Nobody cares about that stuff. It's all just lip service. So I think if it is solving 20% of the current problems, I'll just switch to that one. And that's how Jira became like a big deal. Fucking everywhere.
01:03:41
Speaker
Well, Jira solves everyone's problem, so it solves nobody's problem. That's the problem with Jira, right? Exactly. It solves marketing's problem. It solves sales' problem. Before you can fill out a fucking ticket, you have to fill out 20 fields in your Jira, and you don't know what half of them mean. It's like, what impact will this have on the marketing side? I don't know. It's just a feature.
01:04:03
Speaker
I think every, what impact does it have? Every dropdown should have, it will burn it down and then it's electric. It will burn shit down, like everything. I worked for a bank once as part of Jux and whenever we made a release out, we had to say what the impact would be and one of the options was it will cause downtime.
01:04:25
Speaker
Nobody's going to tick that box. Who would say, yeah, my application is going to break everything. It's going to be fine. Yes, I am. It's like almost they're going to like, oh shit. Should I click yes here?
01:04:48
Speaker
I felt this in for you. Anyway, but yeah, I mean, that's the shitty part with different types of, you know, software these days anyway. But yeah, I mean, Sorsat is really, I think it's simple. It has all the modules that we need.
01:05:05
Speaker
I've been using it for all my private shit and I keep using these bills and playing with that stuff. And I like that you can also use Mercurial which has a bit more better UI. I used to use Mercurial a lot when I was using still Joel Spolsky's company. They started some fog bugs. Yeah, I had fog bugs account.
01:05:27
Speaker
And that and kiln was the thing. Yeah, they were mercurial. Yeah. Yeah, mercurial by default. So I was using that one. But then I think it became slower and slower because Python. So then I think Git got the less is worse sort of shit.
01:05:45
Speaker
It was also faster by default. Mercuro has gone through a lot of performance improvements over the years, especially with Facebook adopting it. They contribute a lot of patches in that area. And Git is starting to improve its UI as well. We've got things like the switch command now and stuff like that. So they are paying attention. It's just that all the Git commands right now are basically commands that control the internal data structure. You have to understand the internals of Git to know exactly what they do. That's what they are.
01:06:15
Speaker
there isn't really an abstraction there. So now they're starting to build up an abstraction on top of that. Yeah, I think that's the biggest thing that bothers me every time I try to explain something for a couple of folks who are new to Git. I need to tell them, oh, can you please squash it? Like, OK, what the fuck is this? Oh, so I can type Git squash? No, you need to type Git rebase interactive, and then take the head, and then four commits, and holy shit.
01:06:44
Speaker
And all this junk that I'm carrying in my brain, now I need to fill that into their brains. That's a really good way to describe wedge and edge, right? It's like they just, that's the junk, right? Like it's this kind of junk, right? It's like we're collecting it as a community, right? And like, I haven't done this yet, but I want to go raid. I shouldn't describe it as raiding. That sounds a bit aggressive, but I want to go look through the luminous code and like find these hacks and like collect them. I want to put them in jars and line them up and my hacks now.
01:07:15
Speaker
Yeah, I think all your hacks belong to us now. Nice. So what stays is a wet gin right now. Is it like production ready enterprise class, you know, adopt thought works, fully certified, fully certified. Yeah. ISO level. ISO 9001.
01:07:43
Speaker
It's been IETF standard actually. There's an RFC in place. Exactly. There is going to be WED certified consultants and then there is going to be WED certifications. It's been draft since 1943.
01:08:03
Speaker
Pre-alpha is probably the best way to describe it. This morning, I made a change to the API that, well, as a user, you probably won't notice API changes too much. I think the user interface is fairly stable at this point. But it's for building tooling on top of web. This morning, one of the changes I made was that part of the API contract, sort of like a protocol, but
01:08:26
Speaker
Protocols don't quite do what I want them to do. So I actually just load a file. And you can load whatever functions you want as long as three of them are there and the rest is like total free for all. But instead of requiring system config as a function, I now require config. I'm sure James Reeves has something to say to you about that. Yeah.
01:08:45
Speaker
Hey under the hood require users loads. So like, you know, it's it's all kosher, right? Like it's all fine. All right, it's just don't worry about it Here's something I use it so that because to allow for the differences in different system libraries to emphasize themselves so When you're like developing with integrant you want to use integrant terms like halt or go or stop or whatever
01:09:09
Speaker
When you work with clip, there's no suspend function. So I did start this by making a protocol, and then every system library added two or three functions to that protocol. I was like, this is silly. There is no concept of suspending clip. There is no concept of suspending mount. Why am I adding it? Just because integrant has it. So I used the load capabilities to allow it to, you say, I want integrant.
01:09:31
Speaker
And then it just loads a file, which brings in all the integrant stuff. And to make it transparent so that you can just refer it indirectly rather than having to go to some other namespace and refer it, I use load. Transparency is better. Yeah. Yeah, exactly. So it makes the experience better for the user. And as long as it's reliable, that's all that matters. So just so I understand then, I mean, it's a web thing. But one of the things that the problem with the web is it's everything.
01:10:01
Speaker
It's like a building. Wedge is nothing to do with the web. It has even less stuff in it than Edge. I've actually outsourced the responsibility of stacks to templates, which means that I am going to build the first version of Juxed Wedge, but I am trying to get some Juxed to take it over and say, this is your responsibility now. I have nothing to do with this anymore. It's yours.
01:10:30
Speaker
Okay, just so i understand then so if it's not a web framework and it's not what is it like what project what what what sort of like where where do you know like. Why would i go to it what what problem i trying to solve that i'm gonna say yes i need which for this.
01:10:51
Speaker
Anywhere that you would probably start a system like using component or integrant or your own hand rolled system, Ray? I wouldn't bother then. No, no, no. Anywhere you choose those things, you would use wedge. I would not bother then. It's not for me. Fair enough.
01:11:15
Speaker
Well, you know, I think you would benefit from hooking up your thing to Wedge because you get all the, you know, you get the TNS fixes. And the CIDR rate. Oh no, you don't use CIDR. That's not sales pitch.
01:11:28
Speaker
We have no Emacs. We have no reloading. It's fine. Well, I also generate dev files for VS code as well and things like that. I've been trying to generate them for the other tools, but surprisingly, Atom doesn't have a way to have per directory config files, which surprised me. So I tried to get chlorine generated as well, but I couldn't. And Vim is just a total free-for-all, so there's no chance of getting any standardized config there. So you just need to switch to,
01:11:58
Speaker
We escort to use Ridge. No, no, I'm a user with them. OK, so the idea is that it's some sort of, let's say, lubricant around the component type systems where you want to be able to choose something freely around those areas.
01:12:20
Speaker
Or I mean, here's the sort of elevator pitch. You specify, I want to have an integrant system loaded from an error config. And Wedge will give you a main that can start that automatically, so you don't have to write and maintain your own main anymore. It will give you a full dev system with all the latest and greatest of the dev system. It will give you a way to load stuff up for beginners. And it will fix any common bugs that happen in a centralized place. That is the sales pitch, basically.
01:12:48
Speaker
Um, but then I intend to like encourage companies to build stacks on, right? So one friction to starting your own template is that you would have to collect up these hacks and you know that people are going to report things from esoteric environments that you don't want to support, right? Juxtapster only use Linux, right? They don't support officially internally anything else. They pull edge. We did support Mac and windows. That was because we wanted to do training on it, but you know, like there's stuff, you know, I'm not going to get it running on sun or maybe not on BSD, right? You just don't want to support that stuff.
01:13:18
Speaker
But the idea is that if there's something like weird that you have to do, that would end up in wedge, right? So that's the idea, is to sort of collect up anything that would, well, one of the things that would be a friction to maintaining your own stack, why don't we just put those in wedge, not edge? So my characterization of a lubricant is quite good then? Yeah, yeah, it is. It's sort of, it's just like a small like exchange, like you say you want this and you get these things in exchange.
01:13:47
Speaker
Malcolm and Co can have it as WD-40, so it's four letters.
01:13:54
Speaker
Well, I think what will happen, because I no longer maintain edge, right? So that's Jack's responsibility now. If they want to break it or turn it into a template, whatever. But at the least, they can build it on top of wedge. So I know that I won't have to get messages from that. It's always Lucio. I'm going to name him out, right? Lucio, he always ends up on these projects with these sucky situations where he's like, how do I fix this bug again? I don't have this problem in edge. I'm like, I'll do this. And you just copy this code from edge here and copy that bit there and fiddle with it a bit.
01:14:22
Speaker
I can stop getting messages from Lucio. So any other projects that you're working on? Just before we go on to other projects, right? So are you saying that in terms of if I want to add things on top of this library, this wedge, so how do I do it in terms of upgradeability?
01:14:45
Speaker
Well, for the most part, so it depends what you want to tweak. So for the most part, you won't be fiddling with stuff. The only sort of real fiddle point is the system code. So if you want to develop a code, which is something you would want to do, right? You don't like integrant or component. You have your own thing. I don't know what you do, like death stuff in a namespace or something, like a madman.
01:15:07
Speaker
But whatever your process is, so you would want to define your own system. So to do that, you implement FreeFunk for functions. A function called config, which let's say you're doing a defs in a namespace. Maybe you would read from an environment, or maybe you would just return nil. Maybe there's no way to configure your system. You return a start function.
01:15:30
Speaker
which starts your system based on the config and any options that were passed in, a stop function, which stops the starting system, and a load dev function. So you implement these four things, and then Wedge is able to provide you the dev system, the main, and stuff like that.
01:15:47
Speaker
I might actually be able to use it. Oh, yeah, definitely. I haven't tested it out yet and figured out how unergonomic it is. But hypothetically, yes, it should be like something you could feasibly do. So far, I've only done arrow and clip and arrow and integrant as combined pairs. Because we're thinking about using Mali for our configuration.
01:16:13
Speaker
Mali, I, oh, I would call it Mali. That's the problem of being on the internet, right? It's sort of like, I say it how it sounds. I would call it Mali. Do they actually have a, like I say in my news? Because that's the word for Jasmine in my language, in my native language. So it sounds similar to Mali. Sounds okay. I don't know how Tommy pronounces it, to be honest. No.
01:16:43
Speaker
I think every project should have like, remember when the Linux audio configuration, like this is Linux Torwalls and I announced Linux as Linux or something. Like everybody used to use that to test Linux. I think every project should have like a audio file that says how to pronounce this shit.
01:17:01
Speaker
Like, and I still can't pronounce his name, but you know how Peter Potemasosaurus has that on his read mees, doesn't he? Yes. Yeah. Peter Tso. I actually met him at the closure trail last year. And he's one of the most handsome men in person. And, you know, in person, he's a very handsome man. Very dashing, as well.
01:17:30
Speaker
Okay. Yeah. You know, it's very sort of well-dressed and well-groomed and yeah, very nice.
Configuration Systems: Molly and Mallee
01:17:38
Speaker
And obviously a lovely block. So yeah. Anyway, carry on. I can't even remember what I was talking about now. We're talking about, uh, Molly, Molly. How do you use Molly as a config system? Because it's just for validating stuff, right? You got to like give it something in the first place.
01:17:57
Speaker
Yeah, but you just you just make up some stuff, you know, like coordinates, you know, like where things live, you know. I see. So it's validating your config. So do you read like an item five or something? Yeah, yeah. So you have some config and you know, but the thing about it is that
01:18:13
Speaker
The thing that we want is something which is like very optional and programmable and something that works in dev and CI and all these other things. And it wanted to be kind of like flexible. And everything we've tried so far is like fits one case, but not the other case, you know.
01:18:30
Speaker
People have forever been trying to find the one true way to model their domain and they keep failing. Right? Like, we have to keep trying and that's where we get the, uh, that don't give up. You know, that's, uh, now I'm a negative Nelly. It's just not possible. Just give up. Just keep on trying. You shouldn't fucking bother. Well, we've had so many attempts at this point. Really clever people have tried, you know, why are you bothering?
01:19:07
Speaker
No, I think Mallee is really cool. And they've come at it from a very pragmatic standpoint. So I've watched all of their complaints against spec 1, and all the things they've tried to make spec 2 that it doesn't do. And they've made those work under Mallee. So they've been very pragmatic about a common set of use cases. So I think that while it probably won't allow you to model the whole world, it will allow you to model perhaps 90% of it that's sufficiently good. Yeah, I think a decent portion will do us.
01:19:27
Speaker
That's the most common criticism against me.
01:19:35
Speaker
Yeah. I mean, there is the other approach. Val Wiesenk has a wonderful blog post where he talks about how he put his domain model into a data script database.
Versatility of Postgres
01:19:45
Speaker
And then whenever he needed it in a new format like SQL or for a schema or whatever, he would actually query it out of the database and query like transitively and use rules to infer things automatically, which I thought was really a fascinating way of doing it.
01:20:00
Speaker
Yeah, no, it's good. Now he's got some awesome stuff like that. So the solution to everything is put shit in the database. Yeah, exactly. And make sure that all of your names have underscores as well, which is a vowels of this sort of counter-cultural, you know, is a real iconoclast in the naming space.
01:20:20
Speaker
I've been saying the same thing for years, though. The grepability is so valuable. I think there's perhaps a bit of a clash that I saw in the comments on that article, which was people who clearly work on micro-servicey, servicey-oriented architectures where this is not a reality for them anyway. It's just not possible. They can't grep for anything. They have to grep source.
01:20:42
Speaker
in their home directory and people who have, I was about to paint them in a more flattering light than I should because I'm one of them, but people who work on an application that they have coerced to live in. Or smart people.
01:20:58
Speaker
No, I think what it is is when you don't work in a big corporate environment, and you realize at some point in your life that, hey, Postgres is really fast. Like, you don't need to build out like a full like, and you can use Postgres for a lot of stuff, you can use it as actually a very fast job queue, you can use it as a pub subsystem, you know, it's got plenty of uses.
01:21:15
Speaker
Why would I set up five databases, you know, Redis, Memcached, Dynamo, you know, to do 10 different jobs and I could just use Postgres for 90% of it and put it all in one repo. So you can scale very, very far. So the people who do that, they like being able to get the same repo. They like this sort of by having it locally, they get all these shortcuts and they start to rely on them. The fact they can grep for it. Yeah. I think that that's the,
01:21:44
Speaker
It's a shortcut, right? I mean, I want a key value system, so let's use that instead of paying any attention to design or deployment. I think the argument of Val, which I think is probably the killer argument, is that
01:22:00
Speaker
If you use these kind of kebab style things, then you're kind of on an island because that's what closure likes, but it's what no one else likes. So if you are on an island, and we pretty much ought to be honest, we're pretty much on an island.
01:22:20
Speaker
We can live the island life. But he's got a killer point, which is that most people are not on an island. If you're not on an island, you're actually paying a high price for that small luxury of having kebab names when, in fact, having everything as underscore, you would gain a lot of the margins when you're externalizing your systems. Then having it everywhere makes it more idiomatic for you and then you can win everywhere.
01:22:50
Speaker
Yeah, you delete, but it just definitely is. It's definitely a kind of like a gulp moment, you know, swallow hard, you know, it's like, Oh, shit. Okay, fuck it. I'll do it. I think part of the problem is, is the phrasing, right? People don't see they see it like kebab cases, the closure way. No, because like symbols and keywords, they can have underscores in them.
01:23:11
Speaker
Like as part of the spec, it was always, I actually see it as the feature that you can represent, you know, camel, kebab and snake case, all of them enclosure symbols. It's the feature. No, no one has time to press shift.
01:23:28
Speaker
I remember asking a question. I think it was on Stack Overflow Slack actually. I think it might have been Stack Overflow. I asked a question and I was coming from a Java background. I ended up having camel casing something in Clojure. Some bloke said on the Slack, I'm pretty sure it was on Stack Overflow. Yeah, this is the answer. But by the way, don't do that because they'll laugh at you.
01:23:52
Speaker
It's kind of right, you know. It's a kind of cultural thing, you know.
01:23:58
Speaker
Well, I guess it depends on the circles you hang out with, right? You obviously hang out with very rude people. But in other languages, I think it's also the other languages, there is a syntactical restriction, right? You cannot do this kind of shit. So in Closure, we have the freedom to, I don't know, kebab case, snake case, camel case, I don't know, hot shit case, whatever that we want to use.
01:24:25
Speaker
Well, I think that's not that's not be wrong. I mean, I think the default is kebab case everywhere. So there's no point in arguing that that is the culture is what the culture is. Yeah. Yeah. But you know, but I like the fact that someone can pipe up and get some, you know, some kind of like support for saying, yeah, maybe the culture is wrong, you know. Yeah. It's got some defects. It's got some defects even. Yeah.
01:24:53
Speaker
Anyway, so let's get back to the other libraries that are projects that you're working on. Anything that you want to highlight? Well, I was actually going to ask you, what do you want to talk about? I don't know what's interesting. It's all interesting to me. I think we've had enough. We're an hour and a half being messed up. I think Vijay wants to ask you a very important question now.
01:25:22
Speaker
Well, we did already. Oh, we did. Oh, we covered it. OK. Oh, yeah. It wasn't the answer you were looking for. Yeah. But what type of some other shit, by the way? So what are you using in your day-to-day thing? I use BIM, hooked up to CIDR.
01:25:36
Speaker
OK. So not a lot of people know this, but CIDR is split into a closure part as well. And Calvary, VimFireplace, Vim's Conjure plugin as well. And obviously CIDR itself, CIDR.L, all use the same common backend. So I'm a contributor to that. I have actually, for my sins, I did make a contribution to CIDR.L in Vim.
01:26:04
Speaker
Well, doing it in Emacs was harder because I don't have, like, predate setup in Emacs. Like, I don't know how to predate in Emacs, but I know how to do the equivalent in Vim. So it was actually, like, safer for me to make the change. Because I'm not going to run it. You know, I just made the changes. I just need to delete a flag so it wasn't marked as safe anymore. Or unsafe. I marked it as safe. So, you know, like, I'm part of the ecosystem. I'm supportive of Emacs. My stance is strongly that you should use what you're comfortable with.
01:26:30
Speaker
Yeah. I think the nice part CIDR is doing is becoming LSP sort of where, right? So you get all the features in all the editors, not just one specific thing. Exactly. Yeah. So I think that's the beauty of it. I think the orchard aspect is really good as well, because then you can just take the libraries as a tool builder. So it's pretty epic. Yeah. Yeah. Yeah. No, Vujadore has done great work there, stewarding that one. Yeah. Yeah. Yeah. That's true. The thing maybe is the last thing that we should talk about, Dom, actually,
JARs vs Dynamic Code Execution
01:27:00
Speaker
is something that me and you started to talk about at the event in Leleven, actually, in Belgium, which was about JARs. Because, you know, I'm a JAR hater. And, you know, just like I'm a sort of, you know, component system hater.
01:27:19
Speaker
No, but I'm joking about all these things, by the way, you know, I'm just sort of, you know, not a great fan, but I'm not, I don't, I don't really judge harshly people who use them, but I'm not a fan of the jar only in the sense that, you know, like I see above, I'm a big fan of running things dynamically and in the spirit of like closure and lisp. So jars to me always seem like they're snapping things off and like,
01:27:42
Speaker
You know, yeah, it's handy for certain distribution cases, but really just run the damn thing from the source code. What's the point now? So, you know.
01:27:55
Speaker
You have something, I think, which does distributions, which is sort of just enough of a jar, I think you said. That was your pitch to me. Yeah. What's that thing again? Pack. So Pack tries to be a little bit unique in that it doesn't actually compile an Uber jar in the same way that Leiningen does. So what Leiningen does is it sort of tries to find all the files. So there's this thing called the class path, which is a list of places to check for things.
01:28:20
Speaker
So when you actually set up a source folder, you're actually adding the source folder to your class path. So what Liningan does is it connects everything up on the class path and just smushes it together into one jar. Now this results in some very horrible code internally and like actually broken behavior in a couple of cases. So for example, if you have multiple data readers on the class path,
01:28:43
Speaker
Closure's behavior, when it finds duplicate keys in them, right? So if you've got, I don't know, db slash id defined twice, it's actually to throw an error and stop the REPL from starting at all. Line again will just silently merge them together. And that's before I even point at line agains, I'm very good at being downers on it. I start every project by crucifying someone else's. That's just the...
01:29:09
Speaker
um the other thing like line again has a horrible thing that's just a plug-in though in fairness you know line again is uh yeah yeah not crucified completely no no no um well there's there's two other things it does it drives me nuts one is that it has code in it for merging xml files like arbitrary xml files it finds it's like we'll try and merge these things like they might look vaguely the same at the end we'll just smush them together
01:29:36
Speaker
Hey, if you don't have a schema, it doesn't matter. As long as you have one root element, so fuck it, you can merge everything in XML. It's horrible. It's surprisingly. I just sort of looked at it. I was like, I need to build a JAR solution for depth study, but I'm not copying that. That's just it.
01:29:54
Speaker
And bless Sean Caulfield's soul for doing that with DeppStar.
Handling Dependencies and Namespaces
01:29:57
Speaker
He has taken on that sort of uber jar solution. Well, I think there's still a few things that are like, yeah, don't know what to do with this, don't know what to do with this, don't know what to do with this.
01:30:09
Speaker
Well, licenses is a really good example. Legally, under the Apache license, you have to retain the license. But Linergan just has a regex in it that says, oh, if it matches license, then just ignore it. So if you build your job with Linergan, you're actually violating the Apache license. So hypothetically, you could get in trouble for that.
01:30:30
Speaker
Once I knew this, I felt responsible. I find bugs in everything. I love Carl Kingsbury's thing, where he's like, I seem to attract bugs in computers, so I've made a career out of it. Counting up to 10 is a problem for computers.
01:30:50
Speaker
So where are you at? At the PAC? So is there an RFC? What I did with PAC is I went on a research adventure into Java land and I found that actually people have solved the Uber jar problem in different ways. So they actually they've built special class loaders that can load jars from inside another jar.
01:31:09
Speaker
But the result of that is that pack is really fast, because Linerkin has to unzip a bunch of jars and then recompress them back into one. I just have to put compressed stuff already into a compressed container. There's no compression happening, so it's super fast. So what I do is pack is a wrapper. Well, pack does a couple of things. So if you're using Docker, for example,
01:31:32
Speaker
We don't need to bother with all this Uber jar stuff. I just take all of the libraries that you're using, stick them inside the Docker container. So pack can actually generate directly a Docker container or a tar.gz for import into Docker. It can even, I think, even upload it to Google automatically for you. If you have a Docker registry, it can actually just push it straight to the registry. So we don't even need to bother with that Uber jar stuff. So I will preserve the class bath in earnest. So we don't have to merge any files together.
01:31:58
Speaker
If you're uploading to AWS Lambda, then they actually take a zip file containing a lib file, a lib folder with jars in. So I just, if you have any Git dependencies, I turn them into jars and then I put them in a zip folder and upload it. So there's no problem. When you want to make a bit more uber jar like, I use one of these funky class loaders.
01:32:17
Speaker
which will pull out jars from inside jars. So you don't have to worry about how do I merge together these things, because the responsibility of merging things together is actually on the library that wants to consume those things. So Closure has defined behavior for what happens if you have multiple copies of a namespace on the classpath. It uses the first one.
01:32:39
Speaker
period. If you have multiple data readers.CLGI on the class path, it merges them together in a particular way. It's not just merge, it's like merge with if there's a conflict blow up. And it's the same for... But I think, didn't Alex do a talk about this recently, about what it does with versions, like the Maven type versions as well, that are slightly different? It does. Close tray and the keynote.
01:33:02
Speaker
Yeah, he also gave a talk at, was it in Bratislava, one of the closure Europe thing before it was finished, where he talked about the algorithm. Yeah, so that's really about which jar you pick. So that's about picking the latest and making sure you don't have conflicting versions of the same artifact.
01:33:19
Speaker
But hypothetically, I mean, I've seen this in the wild because I've contributed to CLJ doc a little bit. There was, I don't know if Oz still does this, but there were versions of Oz that included Cheshire. He just bundled the Cheshire source code as part of Oz, which meant that if you then depended on Oz,
01:33:35
Speaker
you would get not necessarily the version of Cheshire you thought you were getting. And Cheshire's built on top of Jackson, which is like infamously sensitive to this sort of thing. So you would have all sorts of like weird shit going on and head-scratching it because Oz was bringing in its own copies of Cheshire and Jackson. So yeah, so that's that's what depth start Eden takes care of. What Pac's really doing is well, Pac's handling like, oh, Oz, well,
01:34:05
Speaker
Pack is not having a decision about what happens when you have two copies of Cheshire on the class path. Closure is responsible for that, right? Rather than Linergan being responsible or Depstar or Boot or whatever. This is really good. I think I never got to this point of the conversation with you because now I'm interested.
01:34:26
Speaker
I think we were just discussing problems and then we end up going our separate ways. But yeah, this is good. Yeah. So like you said, going out there and finding out who solved the problem and just bringing it in. It's really good.
Value of New Ideas in Programming
01:34:39
Speaker
Yeah, I try and if there's anything I could impart into it, I guess this is the wrong podcast for imparting some wisdom towards the end. But anyway, look at prior art. There's so much prior art and good stuff to copy out there. Like just just go and investigate before you sort of jump on a solution.
01:34:56
Speaker
So often there's just like a very easy solution that someone else has already done the hard thinking for. Or nudge Alex Miller and Mikhail and other people on Slack to get them to do the hard work for you. It is wonderful too. Always delegate. Yeah, exactly. Is it to the past or to the future?
01:35:16
Speaker
Never do anything in the present. A wonderful career in management ahead of you. Nice. So I think on that bombshell, go and check out a wedge and pack your wedges, I think. I think that's it from us for, wow, that's a one hour, 40 minutes.
01:35:40
Speaker
Hopefully, we'll remove racetrack and miterack, so it will be much thinner.
01:35:47
Speaker
by eliminating the redundant shit from the podcast. It will factory title. Exactly. To load it faster, you know, and makes it better. So that's it from us for today. Thank you, Dominic, for joining us and imparting your little bit of wisdom and mostly complaining about other shit.
01:36:15
Speaker
Funnily enough, we've all got dogs, but you know, we ended up being quite a catty program. That's true. Well, barking down a microphone cause it's clipping. It's just horrible. So, you know, meow. So cats are more podcast friendly. Yeah, they're more microphone friendly. Yeah. Just a final word there, Dominic. I mean, it's really nice to, you know, to
01:36:37
Speaker
to talk to you and to hear from you because you are someone that's fresh in the community and it's nice to have people like yourself. I think your age group, people like Val and people like that. 10 to 15. 10 to 15. Barely legal, let's call you. Who's playing your mongers.
01:36:59
Speaker
It's nice to hear from people of a younger age group who's got good ideas, bringing something new to the programming culture and to the closure community. So yeah, keep going. And obviously we are here to tell you that don't do that because you'll be laughed at, just like what Ray heard when he said not to use the kebab case.
01:37:21
Speaker
Oh, shit. You look like you just knocked your laptop over or something. Yes. He's gone nuts. Anyway, yeah, I mean, I think in all seriousness, I agree with Ray. I think that the newer ideas coming into the community is the most important thing, like fresh look at the things. Yeah. I mean, you didn't even get to my plans for world domination yet.
01:37:50
Speaker
That's true. Like Wedge is just the beginning. I actually have a full roadmap for like, I am going to tackle the web framework problem at some point. Like I have a plan, I have notes in place, but it's like Wedge, you know, Wedge is at the bottom and then I need a database in place. I think I'm going to make Redis my primary database and then I'm going to have a web framework that does stuff. It's like yada. Let's talk about Redis offline then because you shouldn't do that.
01:38:19
Speaker
Cool. On that bombshell, we end episode number 666 with Dominic. The silent six. Yes. The six is silent. Thanks for coming on the show. 666 with Dominic.
01:38:46
Speaker
OK, we should stop demonizing Dominic. Thanks for having me. Yeah, and go check out Wedge on SourceHut. We'll post the links to the stuff in the show notes and follow him on Twitter. Yeah, we're really good at posting links.
01:39:06
Speaker
If we can't figure the shit out, then please write to us in writing. P.O. Box number 666 somewhere in Europe. Deafen. I mean, everybody knows me in Europe, so it's pretty easy. Anyway, thank you. And I hope the people who are listening, you guys are staying safe.
01:39:35
Speaker
We wish to bring you a couple of more episodes before this year finishes, which seems to be running forever. And then good luck out there with the stuff. Bye. Bye. Bye. Bye.
01:39:49
Speaker
Thank you for listening to this episode of DeafN and the awesome vegetarian music on the track is Melon Hamburger by Pizzeri and the show's audio is mixed by Wouter Dullert. I'm pretty sure I butchered his name. Um, maybe you should insert your own name here, Dullert.
01:40:07
Speaker
If you'd like to support us, please do check out our Patreon page and you can show your appreciation to all the hard work or the lack of hard work that we're doing. And you can also catch up with either Ray with me for some unexplainable reason you want to interact with us, then do check us out on Slack, Clojarian Slack or Closureverse or on Zulep or just at us at Deafened Podcast on Twitter. Enjoy your day.
01:40:37
Speaker
and see you in the next episode.
01:41:14
Speaker
I think this will resonate with the younger generation, right? Oh, these guys are talking about Among Us. So finally, that demographic is covered, you know, 10 to 15 age range, people who are trying to closure for the first time.
01:41:31
Speaker
Well now I know what the age range is and Ray said I was in that age range. I feel a bit uncomfortable and tend to be clean. You've misjudged that slightly, Ray.