Become a Creator today!Start creating today - Share your story with the world!
Start for free
00:00:00
00:00:01
#47 - Tommi Reiman image

#47 - Tommi Reiman

defn
Avatar
46 Plays7 years ago
#47 - Tommi Reiman by defn
Transcript

Introduction and Company Background

00:00:00
Speaker
Yeah, thanks. So I'm here in Tampere, Finland, in the Metos in Tampere office. It's really quiet in here. All right, it looks like you want to have a rounder or something. Looks like with the curtains behind you, you're right. Yeah, this is like a meeting room. I can show you around.
00:00:20
Speaker
We should describe this for the people who are listening. It's a very nice room. If they're not watching on YouTube, they don't get all the goodies.
00:00:35
Speaker
So let's get started.

Early Programming Days

00:00:38
Speaker
So, Tommy, can you give us some introduction about what you do and your company and closure and Finland and everything? Yeah, so I'll start talking and end in one hour or so. That's the perfect guest. Yeah, that's good. Right, sit back.
00:00:58
Speaker
So I'm a co-founder in this company called Metosyn. And it's been around for like seven years, I think. But personally, I think I started programming in the 80s. My father bought this Sinclair Spectrum home computer. And I was doing basic with that in the like 83 or something. And I have no idea what to do. But I remember that there was this one friend I really loved. And it was the go-to.
00:01:27
Speaker
And like with the go-to loop I could make this adventure game is that like if you move to the left you go to plus 10 and if you go southward it's go to plus 100 and there's somewhere this one place which has go to like 2000 which is the end so.
00:01:45
Speaker
But I started programming then and like I did some, I had Atari Aste after that, another home computer, but basically in the university, Dunbury University, I think it was 94, there was like real, like
00:02:03
Speaker
Teaching of the programming and the first course was actually lisp it was key So programming one and it was the last time they had that so like but it was like this Mind-opener so before that I did like Pascal and and some C and C++, but then there's just like this beautiful language
00:02:23
Speaker
And first, I did all these global variables and tried to do this game. But the instructor said, no, you cannot have any of that. So you have to do a purely functional way, this application. And it took a lot of time for my mind to
00:02:38
Speaker
go into this position that I could make this but afterwards was like really enlighten experience that I just like had this one function which says that print out who is the winner there was of course like a side effects all around but like just print out who is the winner and then there's the next level and like So that how it started but the next time I did like anything related to lisp it was 2000 and
00:03:05
Speaker
12, 11 maybe, when we were starting Methazine. But in between, I was doing maybe 10 years of Java, professionally. I was working in this local telecom operator, so we started to do these Perl scripts and maintaining servers and then went to this Java side. And actually, I think it was 1997 that I first
00:03:30
Speaker
There was this Netscape Live Wire technology. Have you used that? Heard about that? Yeah. At least I heard about it. Yeah, it was server-side JavaScript. It was horrible. I started to write my thesis about how to migrate from that into Java.

Founding a Consultancy

00:03:52
Speaker
I'm like those with the job that is so they would know like a service specs or jsp specs we just like i did the like roser was online some corba stuff. What like ten years in the like a large enterprise doing all these enterprise projects done.
00:04:10
Speaker
And at some point, we realized that this is not the thing we want to do. So me and Mikko, the other two co-founders, we decided that let's start our own consultancy. So we knew that we were really good.
00:04:25
Speaker
enough opinion, of course, like programming and like, let's do something by ourselves. And Jarp said that, okay, he had been doing closure for some time. And he said that we will be the first like closure shop in Finland. And in those days, I was doing maybe Scala. And I was like horrified. So no, no, no, no, no. Yeah. So closure, are you really sure? But he convinced me that this is the way to do and we were like, doing these small exercises. And then he took me to the first
00:04:54
Speaker
uh euro closure that was in london and it was that was like uh the then i like realized then there was this like uh thing that i remember that that beautiful lisp in the like uh university and now like people are talking about that and they were really like brilliant people and i remember there was uh rich hickey was there i think and and some aaron was there so it was like yeah yeah he was there yeah like this like really like
00:05:20
Speaker
I think he was talking about co-racing at that time, you know, like the apple pie stuff and all that stuff. I'm not sure, but it was my first real closure thing, so I didn't understand half of the thing, but people were so excited, so it just caught

Clojure in Finland

00:05:35
Speaker
up. And when we came back to Finland, like I said, the next project will be closure, so I want to do more of this.
00:05:44
Speaker
But why was there a hesitation or your surprise from where you were doing Scala? And then when somebody said, let's go to closure, so what was the reason you were horrified? It's like when you have people building the Java way, like object-oriented stuff, and then suddenly you found Scala, I think it was 2009 or something. And it's like a better Java, so you can do
00:06:13
Speaker
the old way but you can start to take these functional aspects over there and it's like much prettier language in that sense and it's like familiar.
00:06:23
Speaker
And in big organizations, you have hundreds of developers and suddenly if you take closure and nobody knows that, that's a big thing. But if you just decide that let's start doing Scala, it's familiar and all the maintenance aspects. It's not that big a leap. And closure was just like, okay, this is totally different. But I remember that from the university. So the cross-selling was easier. Yeah, yeah, definitely. Yeah.
00:06:54
Speaker
And so then you started with Closure with Mikko? Yeah, so it was like Mikko and Jarpe, the three co-founders in Metacine. So like first project we did was something, it was Java project, just like to get started. But as soon, right after the first Euro Closure, there was this opportunity that a big project was about to start and we were like me and Jarpe, we were asked to join, so because we have been
00:07:23
Speaker
making noise about like I was making noise of Scala basically and he was like talking about closure and like we met this one business guy and he said that okay you are talking so much so can you show how it works and it was a nice start because he said that like do whatever so do this prototype of this problem so here what we are trying to do and two weeks time and I did this like Scala exercise
00:07:51
Speaker
and the architect did the Java version and after two weeks we compared so where are we and the art that was like blowing us away so I had this some small I think it was a cadet some kind of application that was really cool
00:08:08
Speaker
complex and lots of things and like Jarp has a state is pulled over events and some of these reducers and I've been like, wow, this is the thing. The Java version was like a huge template of Spring with all these configurators. It was a huge thing and it didn't work. That was like, even if it has super configuration, if it doesn't work, then what's the point? Yeah. But so that started as a closure and I think
00:08:39
Speaker
It was just before summer vacations and the whole team we decided that this will be a closure project and we will start after the summer vacation. So these are the books, read the books, try something out and just like a team of five. Actually I talked about this in the first closure trade in 2012.
00:09:01
Speaker
And we did the surveys in the first project so that when it started, so how would you solve this kind of problem? And there was this one guy who said, Scala, it was me and everybody else that like Java, even Yarpa, he said that, okay, the team knows Java, Java is like a good option. After three months, it was like, how would we do this again? And everybody said that it's closure.
00:09:23
Speaker
And we realized, OK, there's something happening. There's these Java developers that are really excited. And we are really excited. And the Arpeva has been excited for so long already. So it's just like within each three months, we did a new survey. So how do you think, how do you feel?

Clojure in Government Projects

00:09:38
Speaker
And posted that on the internet somewhere. So it was like everybody was happy.
00:09:44
Speaker
We wanted to have the first conference in Finland because of this and started to make noise. We knew that we love closure, but if no one knows about that, we are not going to make it happen. So the company of three will not get any gigs with closure unless everybody knows what it's all about.
00:10:02
Speaker
And since I'd like lots of noise. Yep. I was going to ask you a quick question there, going back to your original like challenge from you said it was a business person that asked you to do something, some kind of proof of concept. And you often hear from people these kind of
00:10:18
Speaker
Well, yeah, the business doesn't care what you write it in. They don't care. As long as it does what it's meant to do, the business don't care what it's written in. I really think that's bullshit, but I'm interested in your experience because it was driven by the business person in your story. So did they care or could they perceive a value? I think like in Finland,
00:10:43
Speaker
In those days, something big happened. All the thing is governmental projects. There was this architecture decision that you can host your solutions in the cloud. They don't have to be by these two big vendors in these locked chambers.
00:11:00
Speaker
and that was one of the projects of the customer was like one ministry in Finland and they just like said that okay this is a big project and we need this kind of thing to happen and you will maintain it and you will make sure that the timetable will be met and that's about it.
00:11:17
Speaker
It was first sold as a pure Java project and we were given this list of 12 architecture principles and we looked at, no, there's all the things that are buzzwordy in Java. We went to the project because we were given the choice that if you can make something else happen, you can go forward with that.
00:11:38
Speaker
And in the end, we did this new presentation about, I think there are six principles, like the architecture was a bit different, the tools were different, the language was different, and we just said it runs on the JVM. And like, it was a JavaScript component in those days, there wasn't closer scripts. So it was like, the architects
00:11:59
Speaker
made the backend so much smaller. We said that it doesn't matter. There are so many components, so it's just one part of the puzzle. So what is the language of the backend? But after that, we got this approval that Clojure is a valid language for doing these government projects, and it was printed in the government wiki, and then everybody can do that then.
00:12:22
Speaker
And actually, I'm not sure. I heard later that there was some approval process of making these new languages in, but we didn't know about it. And we just like put it there. But Scala was there already. It's so similar. So like, let's approve that then. They approved it.
00:12:41
Speaker
I think with the big bureaucratic organizations, I'm not sure how it is in Finland though. I mean, usually in the bigger organizations, they do have this approved list of tools and languages and architecture and all that stuff. And I'm actually, you know, surprised it was so quick. I mean, you took like a couple of weeks and then you were able to show them, you know, closure is a viable alternative to Scala, for example.
00:13:05
Speaker
Exactly. But it was like because in the end the requirements were like these kind of things have to be available and the technology doesn't matter. So the end customer, they don't care about what is the tech. And because like who is building the thing, they have to maintain it themselves. So it's not like handed over to anybody. But and one other thing about the Finnish like government thing is it's like most of the code is open source.
00:13:31
Speaker
And if you go to, like, GitHub and, like, check all the ministries and there's, like, these repositories, so there's, like, lots of Scala, there's lots of Clojure, lots of Java, some, like, Node.js backends, and at some point they were, like, more Clojure-like repositories than any of the other individually. So it's, like, it's just, like, got big.
00:13:58
Speaker
When you're given an option that like there's this one thing that you will be building for two years and you can choose the tools and people know that you can take something else than the Java which was the norm before that. So they're like good people, brilliant people like going and doing those projects and they were successful.
00:14:20
Speaker
So what is the community like before closure? I mean, is it primarily Java projects everywhere? Because now I think Finland is prime example of closure country. I think there are so many closure developers from Finland. Not transition, but how did the community or the people working in Java switch to closure? Or how

Training Developers in Clojure

00:14:48
Speaker
is it growing? Or how did it start?
00:14:50
Speaker
I talked with Mika some time ago and we were trying to figure out what happened there and one thing was that Helsinki University had this online course about closure and it was in the same time as we had the first closure conference and we started to talk about these successful projects with that.
00:15:12
Speaker
And suddenly the young people were taking the course and like, wow, this is really cool, but can you really use that? And then the big consultancy companies say that, ah, we are doing these governmental projects. And we can use Closure. And suddenly there's new people who want to do that. And then there's approval. You can do that. And suddenly many big companies started doing that. And for example, now in Closure, all the
00:15:37
Speaker
like major consultancy companies are sponsoring and they're hiring closer developers. So it's like, we don't have to talk about it anymore. So it's still a niche. There are maybe like a hundred times more Java developers, but still it's approved everywhere. So wherever you go, if you want to do closer, it's just like apply for a closer job. There are lots of jobs and lots of like demand at the moment.
00:16:04
Speaker
Nice. So you grew into, what is the size of your company now? How many people are doing closure at Metosyn right now? I think it's around 20 people at the moment. So it's in Tampere and in Helsinki. We had two sides at the moment.
00:16:21
Speaker
At the moment, I think everybody is doing closure, but it depends. We do want to do interesting projects, and sometimes there's really good opportunity, but then the technology is set.
00:16:36
Speaker
And like, for example, I just checked that every second project I've been doing is non closure, just because there have been this like, either some like a good version, I knew I want to work with him for the next one, one year, or then just some some interesting problem. And like, if it's Scala, then it's Scala, I've been doing that for many years, and that's totally okay.
00:17:01
Speaker
And actually, that's the time when I'm doing those open source things because when you are doing Scala on the day work, you want to do something like refreshing afterwards and you develop some libraries or do something into stuff. A palette cleans us. So the technique to, you know, put really quality, close your open source projects is to get a Scala day job. Exactly. Isn't that what you're saying?
00:17:26
Speaker
Yeah, pretty much. I think that's what I did. And I was doing most of the time Scala as well, Navitaka Scala. But also I think slowly I transitioned into big data related things and then their closure is not really that popular. And in the machine learning side, there is Python. And on data side, it's basically Spark or Flink. Those things are much more Scala friendly compared to closure. So I started doing in the night closure and then
00:17:55
Speaker
Yeah, now I'm doing pretty much, I think 40% of the time, closure. Anyway, so what was the, is it still challenging? Because as Ray was pointing out before we started the show, the challenge behind hiring closure people, what is the demand and supply like? And how do you bring them up to speed? Or do you capture Java developers? What is your target?
00:18:25
Speaker
So as a company, we haven't been actively recruiting people. But people want to join us. And that's totally excellent. But we're trying to help our customers also. Because, for example, now I'm in the project. And it's like one and a half years, approximately. We will finish that probably before summer vacation. And the idea is that we started to do that.
00:18:53
Speaker
Soon their developers came along and now we are doing knowledge transfer and training for them. That's the different side. Ex-Java developers and just showing them how we haven't been doing that.
00:19:10
Speaker
biweekly, small trainings, and we have given lots of courses to different companies in Finland. But it seems to be that it doesn't take long for a Java developer to catch up. It's like maybe a few months, and then they're really productive. And maybe two weeks or something that you can start doing some real work. So I don't see that. It's not hard.
00:19:39
Speaker
And one thing I noticed that I remember in one project, there was a guy who never had done Java before. He had done all these different kind of things, but not Java. And he asked, is it a problem? We said, no, it's not a problem. And he picked up the closure really fast, because he didn't know the object.
00:19:58
Speaker
oriented that much. So it was just like natural to just be a new tool. Yeah. But isn't the platform is a bit of JVM is like our closure has some this leaky abstraction because you're thrown into JVM pretty quickly. So don't you think that it's a bit of difficult for non-JVM people to pick up closure? Or maybe you have this guy who's picking up pretty easily. So maybe that's not the case anymore.
00:20:27
Speaker
Yeah, but I think the same for Closerscript, but not all Closerscript developers are really good at JavaScript. So if you know JavaScript, if you want to be really good at anything, you have to know the host languages. It's a shame for JVM and the JavaScript side, but if you don't know that much and you are part of the team, there's usually someone who knows the dirty details, how some JVM threading model works.
00:20:54
Speaker
and what are the libraries or how something like should be configured. So not everybody has to know that. But of course, like if you have done like Java and JavaScript and you start doing closure, you know like the host languages and you are like, it's much easier.
00:21:12
Speaker
I think sometimes, though, with JavaScript especially, there are certain aspects of JavaScript that are kind of a headache. Even for JavaScript developers, the prototype inheritance is a bit weird and also the whole this and some of the equals and some of the things which are around the way the language hangs together is a bit, let's say,
00:21:37
Speaker
Depending on which JavaScript developer you talk to, they have different idioms around how they use JavaScript, especially with the evolution of the language from quite rapidly in the last couple of years with ES4, ES5, ES6. A lot of changes in the language that a lot of people haven't caught up with. Whereas if you're using ClosureScript, you're kind of like,
00:22:02
Speaker
You don't care about that, you know? You've already advanced beyond where they're going to be anyway. That's true. I don't think they're really apart from the only thing that I find a bit weird is the way that promises interact with closure script. That's a bit unusual.

Challenges with Immutability

00:22:22
Speaker
I mean, I'm trying to think of where things are, like you say, Vijay, where the host language is kind of like getting away a little bit or where they're bleeding, you know? With the JVM, it's not so bad because the only thing really the JVM to me is like the stack traces and of course you have to use the libraries, but then you're not using the language then, you're just, you know,
00:22:44
Speaker
Yeah, that's true. I think mostly it's the, yeah, I mean, the stack traces, obviously, then you see some, that is still kind of okay because you can say, okay, this is the way, closure's way of showing errors, you know, so we can work around it. But I think as Tommy was pointing out in understanding the threading model and all that stuff and what kind of libraries are available, especially you're doing Java Interop and library is not available for you. Now you're doing JDBC, for example, you know, that's a direct link to Java.
00:23:14
Speaker
The other thing maybe we can just hit on is that the thing that really probably I feel the most still is this notion of statefulness. Because I was using this last week, I was doing something with Twilio and they have a Java SDK. And when you start using it, you have to call this init Twilio thing, Twilio init. And it's like, what the fuck is that? And it's obviously doing some side effecting bullshit to set up some global state.
00:23:41
Speaker
And that feels very weird. And same on JavaScript, you have these like stateful components like Google Maps and these other things which are having all these weird side effects that you can't control. Those are things which I think are like they're definitely a pinpoint between the two languages. Yeah.
00:24:00
Speaker
I was just like a few weeks ago, I was trying to, one of our libraries, the rated, and I wanted to port the thing which needed most of the performance into Java.
00:24:17
Speaker
I had forgotten how to do that because there was this data structure and it was mutable and it was leaking and I was like, wow, how did I manage this? Because you get used to this immutability and it just works. And suddenly I have these hash maps and like, okay, if I put something there, it's there and when I return the original instance, it's still there because I have mutated that.
00:24:42
Speaker
And it took me some time to figure out. And I was thinking, how did I manage this? It was like big systems with these mutable things, and they just worked. And you have this mindset of how to build that enclosure. It's really simple, just as fast things and it's data.
00:25:00
Speaker
Yeah, that's true. I think one of the, I remember some time ago, long time ago, when I was working in a Java project, one of the team decided that, okay, we should follow the, what is that, better Java or something? Everything is final and then you basically refactor all the code to use final classes everywhere and final arguments and all that shit.
00:25:23
Speaker
And I think that's the first thing you do when you get somebody else's Java code. And then you start putting finals everywhere, first of all. And then see, figure out, OK, now how can I handle this shit now? I think most of the time later, because you depend on the frameworks, and then frameworks are trying to abstract away some of the stuff for you. But still with lots of configuration, lots of crap with Spring and Hibernate and all the junk that you need to handle, there are so many layers. It was fun, though.
00:25:51
Speaker
So, I think I need to ask the question of the hour. So, Emacs or some other shit? Some other shit.
00:26:01
Speaker
Ha! Is it 20 times some other shit in medicine? I'm using Kerosive with IntelliJ, so it's really good because I want the Java interop and it just works. I was an Emacs user for maybe 10 years when I started and that was the thing.
00:26:22
Speaker
At some point Java IDEs came and they had these much better features for refactoring and it was Eclipse and then IDEA and I'm still there.
00:26:32
Speaker
I tried to go back to Space Max with my colleagues and show me how it works, and no, I don't want to go there again. I could go there, but there's this hurdle. I don't have time for that. There is enough population at Metosyn that uses CMAX then.
00:26:54
Speaker
I think half of the people use EMAS. Oh wow, okay. That's not bad. They use VIN, of course. More beer. The wizards just bought me a beer.
00:27:11
Speaker
But tooling was I can totally understand because I was using Eclipse a lot before IntelliJ. I think it was five or something IntelliJ or whatever. And then in 2008, 2009, I switched to IntelliJ and then doing some Scala as well. And for Scala and Java, there is no other way.
00:27:30
Speaker
It's so easy to navigate because the code is so fucking complicated. You need an ID for it. It's impossible. Every time you need to bring up some sort of class diagram to see, OK, where the fuck is this being used? All the dependencies. So that's pen in the answer. I think the big thing to me with cursive, and it's something which colonists done a great job of, is the debugger. Because when you need a debugger,
00:27:56
Speaker
You've got a great one there. You don't need it as much with Closure as you do with other languages, but having a really, really good debugger is just sweet. So very nice. Yeah. Yeah, I didn't feel the need to use cursive yet. I only use space max most of the time.
00:28:16
Speaker
And I think these days I'm using IntelliJ for writing Rust because static typing with IDEs is a bit nicer, I think. You just get all the fancy stuff pretty quickly there. And also, at least for the Rust code,
00:28:36
Speaker
because the types are inference most of the time, and IntelliJ will actually show the types without you typing them. So that's super cool. And parameter names and stuff like that. Yeah, exactly. So that's super useful. So coming to Closure, or we're not talking about Closure.
00:28:53
Speaker
You built a lot of libraries for closure. A long time ago, I think you were using schema a lot as well. Or you have schema questions in your routing library. Yeah, so I think when the schema appeared, I can't recall when was that.
00:29:13
Speaker
But it was like, it was really beautiful because it's like old data and it was suddenly like the missing thing. So, and I had this, uh, bureau closure talk about the schema, of course, I mean, like a crackle. I can't recall how five years ago or something.
00:29:28
Speaker
But like it was the missing piece basically because we were like i was coming from this huge large enterprise and we were helping customers to build similar apps there's lots of data all around and like you just don't want any kind of like functional validation of things you want to declare this is my date and it looks like this.
00:29:47
Speaker
And like all the like swagger things so because all the other languages had those already and that was actually reason for one of my Scala like projects because like there wasn't any kind of tooling for closure so everybody was happy like we have this data and functions and it's cool but like everybody else had spring and Scala Tran and
00:30:07
Speaker
Play and whatever and they had all these like batteries. So just realized so We went to the project but we couldn't use closure because it was a requirement and during the project I realized that we have to do the tooling because no one is doing that the community so small and Started doing the composure API and I it's so many years ago. Yeah
00:30:29
Speaker
Yeah. How was the transition from schema to spec? Do you spec a lot in your code bases already?

Spec and Schema in Clojure

00:30:40
Speaker
I would say that we use, but I haven't used that because the project I'm currently in, so when it started spec was quite new.
00:30:50
Speaker
And there were two things that the customer wanted. One is that idea was that we will make the initial architects and help them build and then do the acknowledge transfer. And there were no guarantees of spec. We started with spec, but suddenly like, okay, is it coming ever? It was like, after one year, it's
00:31:12
Speaker
who knows where it is deep in the hammock. It might never like finish, it was alpha. So in, okay, we are like, there's only one year left and like still no guarantees. So we just like ported everything back to schema and it works. It's good for this like project. It's much mature and for the maintenance thing, it's like funny that some people say that schema is dead, but I think it's like finished. It's like done.
00:31:37
Speaker
And if you check the like, it's the problematic schema repository. So Jason is still active. He doesn't, I think he doesn't even use closure at the moment, but whenever there's a bug, he like responds happily like within hours. So sorry about the bug. I will fix that. And in a few hours it's fixed. So it's like really well maintained and it's like nothing is missing basically from there.
00:32:01
Speaker
Yeah, but like speak I hope that it will be big and I think that now that start of this year that Alex like there's this like visibility is what is happening there and it's Alex who is doing that. I think that's a really good news for spec. So it might finalize someday but
00:32:22
Speaker
I think it's taken two years at the moment. But the spec tools we did, it was when the projects were starting and it seems to be that there's lots of stuff missing from the spec. And I thought they're just like a cognitive didn't have time to like figure this out, but later it seems that like they are not in even the scope.
00:32:42
Speaker
And I've been trying to keep noise of that. So things like coercion, for example, it's something that we build web apps and these apps with lots of data models. So if you are building an enterprise app, it might have five different domains and it is integrating them.
00:33:01
Speaker
And manually writing these coercion things, it doesn't scale. It doesn't work. So it has to be some kind of tooling. And spec tools is this. What is missing from spec, in my opinion, we have just added there. And some of them are bad, and some of them are good. But it works. And there are lots of projects in Metos in which are using spec. But I'm a spec newbie, basically. That's doing the tools.
00:33:30
Speaker
I was going to say, I think the thing about saying it's dead, I think, is obviously over kind of pessimistic. I think what people are referring to is probably the ecosystem isn't going to grow much more around it, whereas the ecosystem on spec is still a bit embryonic, but it looks like that's where the ecosystem is going to grow.
00:33:54
Speaker
Probably it's that kind of feeling that people have is not necessarily the project is dead per se, but that they don't want to invest too much effort in making more and more tooling for it. Do you see what I mean? Because I think that's what people are nervous about now. Yeah, I wouldn't say that that is dead. But just like I have met people who have said that I was still using schema. So like, that's the old thing, spec is the new thing. And I've asked like, do you really use that? Do you have the like thing you want to be there?
00:34:23
Speaker
But like I think like to like expound is like really awesome for spec and just like integrated that into like a rated library. So to do the like nice validations, but it's like there are so many people working with that. So I hope that they will be like good developer toolings for that. But this, um,
00:34:47
Speaker
It's not there yet, that's for sure.

Tool Ecosystem for Clojure's Spec

00:34:49
Speaker
Yeah, exactly. But what is missing from spec, I think it's like it won't be in the core, but someone needs to do some kind of fast linter or checker, because we have the information about the map, so what kind of keys they should have, and we can validate that and say that, okay, you passed in like a
00:35:13
Speaker
You didn't pass this value as like different what was specced, but like you can have extra keys because specs are open. There's no like a typo correction and they should be like integrated into editors. So when you have a function and you say that what is the, what data can I destructor from here? The ideas would say that, okay, it has a spec, it has these four like,
00:35:38
Speaker
keys and you can work with them. And if you're trying to use keys which are not there, so it would complain that it might not be there, it could be, but like warning. There is potential, but I think it's not even out of alpha ads, right? So that means the tools that need to be built around that one.
00:35:56
Speaker
They need some sort of a solid base, or at least version one, that the tools can build upon, I think. In terms of analysis, in a test suite, they have this instrument thing. With instrument, you can see from the calls at runtime what things are being passed. That seems like there's a good basis for understanding.
00:36:21
Speaker
you know, what data is being passed in to the functions and to the map. That's runtime, right? I mean, I think you can't use it during the development, so to speak. If I'm typing a function and it doesn't tell me, hey, you're using a key, that's not in the spec, you know, that kind of helper. Well, but I mean, if you have a spec, you can read that and you can see that from the spec itself. As soon as you say,
00:36:48
Speaker
this thing conforms to the spec, well, it's quite easy for the tools to infer what the keys are. It needs to be stabilized, right? The code exists for making it runtime and the specs themselves make it quite easy in the editor actually. But it isn't well integrated into everything yet because like you said, people are nervous about the changes that are going to happen.
00:37:15
Speaker
You know, on the one hand, people are think like, fuck it, there's such a lot of value that I'm going to keep, I'm going to start using it because it's better than anything I've got right now, you know. But at the same time, it's not finished. So yeah, the tools aren't really there. I mean, you know, I agree with that.
00:37:35
Speaker
Yeah, but I think that like Spec2, which is like now in the making, so I've checked the repo, it looks, and I think the transparency that Alex has been providing with his blog and everything, so it's like much better, but I'm still not sure if there's any way to like influence what the spec will do in the end, because these things, I have this one
00:37:58
Speaker
uh patch in the uh like uh closure year and it's been there for maybe two years and it has this first notion that uh maybe we're not taking this and rich has to asset that i'm totally okay that it might be a bad patch but like no one has like rich hasn't checked that so and you know um so i don't know like it seems to be that there's this reason
00:38:23
Speaker
that it will be looking like and just like I'm hoping that there will be enough like extension points for like tools like spec tools that we can do stuff outside of that.

Community and Evolution of Clojure

00:38:33
Speaker
The first version of spec was less close. There was one place to extend and when I tried to do that, it was like you are doing it wrong. So that's not the place to extend anything. So don't try to extend the spec. It might change and like, let's see what happens.
00:38:48
Speaker
I hope so because it seems like with 1.10, with error messages and stuff like that, they kind of got their own dog food a little bit in terms of saying it needs to be available programmatically as data. It needs to be kind of...
00:39:05
Speaker
available with functions like this xinfo and xcause and xtriage, things that can convert the data. And Alex and Stu have all said that they want it to be accessed programmatically. So I think the willingness is there and that the design goals are there. So, I mean, I hope you're right that they will follow up on that in the code. And Alex is doing a great job of transparency. I think you're absolutely right there.
00:39:32
Speaker
Thanks, Alex. Yeah, thank you, Alex. Yeah, it's really good. If you are listening. Thank you, Alex, for all the Inside Closure blog, obviously. But I'm just wondering, because over the period, I think it's almost like seven to eight years that you're fully into closure with medicine. Because this has been a topic a bit with other guests as well.
00:39:58
Speaker
Like, you know, how do you see the... Because you made a significant investment in enclosure now. And you're also pitching it to your clients. So, how do you see the community? How do you see the stewardship around the language apart from the Jira issues that we talked about?
00:40:18
Speaker
So what is your opinion on that one? That's a really good question and like There's been so much discussion about this in all the possible medias and like yeah, I've just read them I don't want to like be part of that. There's like the both ends it seems to be that like there are two like really the ends are so far away and there's like people get like
00:40:44
Speaker
like fears really, really fast. But I appreciate the language in the sense that like it's still the best language like I've used like ever. So of all the languages. So I love the language. I would hope that it would be more community driven because there's like so many like brilliant people in the community who would like to like make things better. And now it seems to be that it's like Cognitec is making
00:41:12
Speaker
the shots how it evolves and it's good thing in the stability side but then again like if the community is not listen so and even space to do things like that's not good either so.
00:41:26
Speaker
But it's stable. And then error messages are much better. And I think the error messages nailed that. So in 1.10, the thing that the core does is just it seems to extract the data. So what is happening? When it happened and what happened?
00:41:43
Speaker
And then it doesn't format the errors as nicely as other languages, but the formatter should be, I think, community-driven. There should be this nice formatter just like you can plug it in and it will do the things because it will have totally different time span than the core development. So you can daily put new formatting rules there to get these nice formats.
00:42:08
Speaker
I agree with that. Yeah. Yeah. And actually, just like there's this closure comments, Slack channel. Yeah. Yeah. See all your comments. Yeah. And we were discussing there.
00:42:19
Speaker
We've been about like because he did the expound and which is really awesome tool so like could that formatting be used somehow with like core errors and I just like today actually really is the rated version which has the like it has the expound formatter and it has at least fit-based formatter
00:42:41
Speaker
because all the interesting errors happen in that library. It's a routing library in the router creation time. So it's just like having this one place which catches all the exceptions and reformats them. You can say that use this formatter, reformats those and they look really nice.
00:43:02
Speaker
And now that Elm has nice errors, Ita has nice errors. Many languages have really nice errors. And I think there's nothing stopping. Someone needs to be doing this. And I was trying to pop in that you did expound. Maybe you should do this too. But I'm happy. What we did was just an experiment. So can we do nice error messages? You should check them out. Today's release. But happy to contribute to any kind of common thing.
00:43:32
Speaker
Maybe you should set this one a bit. Explain a bit what rate it is and where does it fit in the Closure Stack.

Introducing Radiate

00:43:46
Speaker
We did a routing library. How interesting is that? We had only like 20 of those already. Hello world. Hello world, exactly. Let's make 10 of everything. I think we've used all the routing libraries in Closure, I think at least because there have been so many. Everyone has been somehow opinionated.
00:44:11
Speaker
and like a composure API was just like it is old nowadays and like started because composure was like good those days and started to build on top of that but it's macros basically and like I think that like data driven way of designing closer libraries that's the way to do it and there were a few examples but like somehow there was something missing from those and like
00:44:36
Speaker
Just wanted to see that could we make something like beautiful out of this? And so we did this small spike about this radit. It's a routing library. It's like a stack of... It's a library for creating routing frameworks, basically. So in the core, it's just like, for example, BD.
00:44:55
Speaker
So there's this small protocol which allows you to create routers and after that you can match by path or match by name. And then because it's data you can extract the original routes and options and whatever. And that's the small thing.
00:45:14
Speaker
Within that layer, the rated core, there are several different implementations for the router. The one goal we had in this library is the performance.
00:45:27
Speaker
Most of the Clojure libraries which were existing, they said that in the readme, we are not trying to do fast, we just want to make this good routing which has this nice API. If you use regapps, you already have lost the performance. Being in the Java side and in Scala, I had been doing some perf stuff.
00:45:49
Speaker
or earlier so I thought that okay we can probably make this really fast and like it was interesting to check all the tries. Is it three or try? Try I think yeah t-r-i-e yeah exactly I don't know don't ask me I'm not the native guy. We have a queen's english dude.
00:46:10
Speaker
It's a made up word that it wasn't an environment in the 17th century. Probably tree, I don't know. The tree kind of thingy, which is like a data structure for fast lookups. So like checking those and like all the goods.
00:46:27
Speaker
optimization so if you have like a routing table with only static routes you can do a hash lookup and it still like always works if you have wildcard parameters you use destroy and optimize it in many ways there are tens of ways to optimize that and if you have conflicting routes you have to have these partial linear routers and stuff but in the core it's like try to be a really fast router but in top of that there's this
00:46:53
Speaker
Routing frameworks, one is for ring, one is for pedestal, one is for frontend, and one is for like the async HTTP or like the CPU interceptor model. And it's just like using the core and using its cores like extension hooks to make these like higher level like routers.
00:47:19
Speaker
And with that bit there, there's nice properties like how the data gets accumulated. There's this lovely library called MetaMerge. So you can say that you can have flat routes or you can have these tree of routes and say that every route under API has this interceptor and they just accumulate to the leaves.
00:47:41
Speaker
So and once you have the router created, it's like really fast and performant and like optimized for all use cases. And for example, that's the one place we have the error miss printer. So there's the clear separation of like
00:47:57
Speaker
When you do things, you create things. And then we don't have to be fast. We have to be correct. And then if you fail, you get these nice developer-friendly errors. And in runtime, there's as little as possible. And there's these extensions like compiling interceptors and middleware. So you can change your workload from request processing time to this creation time.
00:48:26
Speaker
And it works, and now it's today, Dimitri just tweeted about the luminous, like, swap to Composer API to raid it. And that's really nice. So it was an option already there, but with the defaults, it would go to Composer API. So now it's raided, and it's like,
00:48:47
Speaker
I think much easier. And because it's data, you don't have to have this like any kind of macros or dependencies. It's like the right data as a route and it just works.
00:48:58
Speaker
So, this is also can be used in this library is also going to help with routing on the front-end side on JavaScript. Yeah. So, there's this one module. So, it's like a big monorepo. There's like maybe 10 modules, the core, then there's the schema cores and spec cores and
00:49:20
Speaker
There's the front-end pedestal development tools, and you can just take the core routing and it's really small, a few kilos. But one module is the front-end router, and it's basically, Yuho has been doing that, so he could talk about more what he's doing. But we used Silk and PD in the front-end.
00:49:45
Speaker
Yeah, accountants, yeah. Secretary or accountant? I don't know.
00:49:55
Speaker
It was called secretary or something or? I think the secretary and accountant and there's a whole bunch of these tasks, you know. The lisp cars. Exactly. But in front of like, it has this, it has a history router. It has the like fragment router. It has the like Kismetile style controllers that we have been using all the project. It's like really good.
00:50:19
Speaker
And it just works. And because you can use the same stuff in the back end and the front end, you can have shared routes and all these things. You can use literal data, you can reference all the interceptors as keywords, and it can be extended in many ways.
00:50:40
Speaker
But it's, anyway, like routing library, full stack routing, so front and back end. And it's not tied to HTTP anyway, so you can have this message queue routing, whatever. So does it work with, like, so it works with aleph and ring and the HTTP kit and those kind of things? Or is it specific to your HTTP server? No, no.
00:51:03
Speaker
No, it's not, it's just like generic. So like, I think there's examples with Immutant and ALF at the moment, and Jetty, I think, but it doesn't like, it doesn't matter what is the like server. If you use ALF, like then you have to use this in ALF, this one bridge component, which you have to use that the diverge flow nicely through that.
00:51:29
Speaker
What is your choice stack at Metosyn in terms of libraries? Because you've been doing this for, I mean, there are a lot of projects running in Clojure, so front-end, on the server side, which libraries? Did you standardize on something or is it per project basis?
00:51:52
Speaker
Um, it depends what we are doing. So, um, there's like, uh, first of all, like, uh, uh, who are our customers? So there's like three kinds of things we are doing. One is the, like, uh, the big thing is that, uh, large corporates and, and like, uh, enterprise customers. And usually they have these requirements that, uh, what you are using is it has to be like Postgres or Oracle and that's it.
00:52:17
Speaker
and like they dictate what they should look like. And for example, this one requirement, I remember that whatever you use, you have to be able to say that it's available in 10 years. And it was like my last like, okay, we are taking Datomic out 10 years. Maybe not, I have no idea what happens to Datomic in 10 years. So we cannot just like say that we vote for it. But like for those, I would say that like,
00:52:44
Speaker
If you're using a relational database, it's Postgres, then there's the rated end-to-end, so front-end and back-end, and the controllers, and most likely reframe on the front-end. And then this big hoard of extra libraries which are useful for integrant, for the component stuff. I think
00:53:07
Speaker
We used mount in few projects, but I think the integrant seems to be the cleanest like of the three component and mount and integrant. So, but that's the like, when you are like giving a choice of relational database, that's the stack basically.
00:53:26
Speaker
On top of that, we have these few other libraries. One is for like this web socket communications. Name will change because it's now AENES. Is it a Finnish word for AENES or what is it actually? Yeah, exactly. So it was funny before Jรคrfe went to this closure Finland and said, then you stuck your data into the AENES.
00:53:56
Speaker
Okay. The name has to change. Yes. Yeah. So name upgrade Uranus upgrade Uranus. Yeah. But it's like, uh, we have a building this, uh, this is new level of shit. Yeah. Oh God. Okay. I think, I think we're not, we're not even, not even R rated. We'd probably, I don't know, S P U E W. This is more than a Patreon money, guys. Keep it going. Yeah.
00:54:28
Speaker
But what does the library do actually? One thing that it seems to be that in many projects we have been needing some kind of like state machine and I mean we have been doing like the same thing in all the projects all over again and now there's this
00:54:47
Speaker
It's a Finnish word for state machine. It's in GitHub. I have a different version of that in the project I'm doing, but it's basically web circuits and real-time and state machines.
00:55:03
Speaker
Data-driven like rule engine and stuff and then this Postgres for example But but then we're doing also like a lots of stuff for startups and for startups for example Datomic is in many cases. That's the thing because like we if you have closure that's a good fit and the like Characterists it gives a good fit for like many places you need like history and audit lock and stuff like that and
00:55:29
Speaker
So that's another like stack but like we kind of put it everywhere and we don't want to do that for all the projects. And then the third thing we're doing is like we're not doing consultancy but we are like we have been partnering with these small startups and now we have like few of these ongoing so one is for like healthcare and one is for like healthcare.
00:55:53
Speaker
But we have invested money into these companies and being their technical provider, and they're like product leads and waiting for this one big investment decision for the other one. So let's see what happens. So it might shift the focus from consulting to building products. For product development. Yeah, exactly. So going back to your...
00:56:16
Speaker
We're diving in with all the questions here. Go back to your state machine thing.
00:56:24
Speaker
I mean, I get what a state machine is, but can you just spin out a little bit more information about the kind of things you're using the state machine for? I'm guessing you're saying there's a starting point and then there's some options you can go from here, this state to that state, and that state to that state, and that state to that state, the valid states, and then some terminal state that you can go to. So what kind of thing are you using that state machine for?
00:56:50
Speaker
So for example, the project I'm now in, when we started, we saw this small part of the application. It's like a big web app for people who use it like seven and a half hours a day. So they use the whole day.
00:57:11
Speaker
a platform of these processes. There's assets going in and out and there's approvals and things. And when we started, we thought that, okay, this seems to be that this CQRS command query responsibility segregation kind of thing. So we just model the GraphQL. So we just model the queries and the commands differently. And that's it.
00:57:33
Speaker
But after doing that for a while, we realized that actually these are processes. We cannot have these 100 different mutations over there. We have to somehow belong to something bigger. There is a life cycle of these things.
00:57:48
Speaker
It's a life cycle, exactly. So someone starts something and then it has like this long running step. So like you initialize a process and then maybe fill some things and put it to the next guy and then it spans out and then like returns and there's this, it can end happily or you can go back. And suddenly like start discussing with the business and you realize that we don't have an abstraction for this.
00:58:15
Speaker
And then you remember that we have been doing these kind of final state machines in many projects. So let's do it again and some small data abstraction and print out graphies.
00:58:30
Speaker
pictures of that and that's suddenly you can discuss with the business. So is this the project you are looking at? No, no, no. This person can return to this state from here and if this guy does this and these are simultaneous and suddenly you have like this new kind of tool to discuss what is the thing all about and suddenly then you realize that the whole project is about this. So you have like tens of these like processes.
00:58:56
Speaker
And you just model everything as a process and then you have a state machine basically. But like human interactions which have some kind of like flow and tooling for that. But the tools are small and they're like from project to project, they are like copied basically and now probably we'll flush them out. Me and Jarpa will probably check what he did and what I did and can we somehow like emerge them into this, a new open source too.
00:59:24
Speaker
Well, it's pretty great. I mean, the amount of code that you're putting out into the community, it's amazing. So thanks a lot for that. I think I was there at your talk as well. That's how I remember schema and coercion. And this is from your talk some time ago, probably from Euroclosure Berlin or maybe one of those places. Anyway.
00:59:44
Speaker
So I think the, so you talked about write it, you talked about Tilakone. Tilakone, yes, yes. Talked about Uranus.
01:00:13
Speaker
Another interesting thing you folks are doing in Finland is you have this conference closure train. So how did it come about?

Closure Tray Conference

01:00:23
Speaker
And this is a fifth year or fourth year?
01:00:26
Speaker
I think the eighth year. I'm talking about Dutch closure day, I think. Sorry. I'm a bit biased a bit. Yeah, I'm happy to talk about that. The first one was like, as I said, we had this first big closure project and we were so excited and we had this first team result. Everybody was happy, so we have to say it a lot. We had this ad hoc, so two weeks in advance, so let's have this conference.
01:00:53
Speaker
It was basically a meet up, but there was 25 people. It was sold out. There was some Aaron like over there and we were like really happy. So this like a friendly guy and he has this really inspirational talk and music and like everybody and so on. Of course, that's the like thing we have.
01:01:12
Speaker
we say anything. But we realized that this was called Closure Drey, so maybe this would happen next year too. And the next year we had like took one month or something, so let's make this real conference. And it was also sold out, maybe 70 people, and they were real invited speakers and maybe called for speakers even.
01:01:35
Speaker
But then it was 150 people, maybe 200 and now it's like 350 for the last two years or something. Wow. And single track. Yeah. So it was in Tampere for the last first six years. Last year it was in Helsinki and this year it's also in Helsinki.
01:01:55
Speaker
And like when we started out, it was just like us buying like pizza and beer for everybody. So it was fun to spend a few thousand euros over there. But after that, like having like catering for 300 plus people and like it costs. So like we have had like these bigger sponsors and it's been like really nice to see that all the like major players, the good reputation or like consultancy companies, they are on board.
01:02:22
Speaker
Because we are small, we are not competing with any of those. So it's like having these really good sponsors, we can make this possible. And we are, of course, the biggest sponsor. So it's not nonprofit. It's like a loss of profit. So whatever needs to be paid. So we do that. So it is? Yeah, but it is nonprofit, as in you don't make any profit at all. No, no, no, no. We are probably the biggest sponsor in all the years.
01:02:52
Speaker
And we don't calculate the hours we have been spending, but it's something that we are an open source company and the community is really important for us. And as I said, if no one knows about Clojure, we don't have any work in Clojure. If everybody knows Clojure and they say that it was the best conference ever, so they will come again and they will talk to their boss and lots of people have joined Metosyn because of the conference. They see that, okay, you are doing good stuff, I want to join you.
01:03:22
Speaker
and many customers have said that, okay, I appreciate what you are doing and you seem to be knowing what you are doing. So like, work for us, make some big approach for us. So it's like, it's good. And this year, it's in the same spot as usual on end of September. Yep. Yep. Are you coming? CFP is open, right? To the deaf and guys get an invite.
01:03:48
Speaker
Definitely. So the CFP is open, I think it opened like two days ago or something. It's open until the end of May. And for the last two years, there have been ticket prices. Before that, it was totally free. But now, because it's so big that we have to get the money somewhere.
01:04:08
Speaker
Yeah, 75 euros for one day and 100 euros for two days and the diversity and student tickets are always free. So this is a chart that I can't pay and you have to say why and then you have a free ticket. It's a pretty decent price. I think the biggest cost for most people who are not in Finland is getting there.
01:04:35
Speaker
I'm going to try and be that issue. I couldn't make it this year, last year, but I'd like to make it this year. Cool. Yeah, I think so. I think I'll try and do it. Yeah, I'll try to be there as well. But it's really amazing. In 80 years, you've been running this and you also have a small FP conference the day before, right? Yeah.
01:04:54
Speaker
I'm this year not part of the community so they don't have the two names. Last year it was like small FP in the first day and the closure tray in the second day and now it's a closure tray two days but the first day is functional and another day is closure so there's like at least one of the Elixir core developers, core committers is speaking in the small FP.
01:05:17
Speaker
Like, and then there's Alex Miller in the like Closure Tree. Yeah, yeah, yeah, yeah. Yeah. Very nice. Yeah, there might be some announcements still for the speakers, but the call of call of speakers is open now and for next two months.
01:05:32
Speaker
So we could do something. Yeah, you could make a Deafened talk. We could make a podcast on stage. Yeah, yeah. That's going to be a disaster. Come on, a Deafened panel. We haven't had that before. A panel show, you know? Yeah, that's true. I think we can do that. Yeah. Maybe live from Helsinki. Yeah, that could be quite good fun.
01:05:54
Speaker
So this is our finish line, essentially, right? Ouch, ouch, ouch. We weren't going to do those puns on air. But coming back to the conferences thing, and of course, as you know, I'm part of the team that is organizing Dutch closure days. And thanks a lot for your support, actually. I think it's been a third year or something, you've been sponsoring us.
01:06:23
Speaker
I can totally understand you know like it's a very difficult to pull off a free conference without sponsors and you know everything and for us it's also fairly challenging and this year actually we have a I think a nice finished delegation coming to yeah exactly I heard about so three of our guys are coming at least and there's people from Sealy at least
01:06:44
Speaker
Yeah. And there are two talks, one lightning talk and one full talk by two Finnish people. That's amazing. And congratulations on your conference. It's going to be fun, we hope, again this year. So any other topics to touch upon? I think we are pretty good on time. Yeah. I don't know. Ray?
01:07:13
Speaker
I don't know I mean I think I think obviously it's great stuff that these guys are doing and that they give the conference and they make the libraries and they do the consulting you know I'm pretty sure that we could dive into a bit more deep depth into any one of those libraries again but
01:07:30
Speaker
We're like over an hour now, so maybe we get Tommy back or we talk a bit, do a bit more kind of interviewing stuff if we get up to closure tray in the autumn. I think that would be really good. That would be awesome. Yeah.
01:07:45
Speaker
That's true. You're going to close your north, right? Yeah, I'm going there to talk about trade, actually. So I'm going there. I wanted to come to close your days too, but there's my kids swimming contest in the same day. First, like in the international, it's like, no way.
01:08:08
Speaker
It's amazing. There are so many conferences this year. It's amazing. So there's Closure D, Closure Days. Then there's Heart of Closure. Heart of Closure. And there's Closure X. Yeah, Closure X. Yeah, yeah. And it was nice to share the stage with Mikko. Mikko. Mikko. In Closure D, you mean?
01:08:35
Speaker
Yeah, in ClosureD, of course. So we are trying to, of course, try to enforce each other, help each other in terms of running these conferences. It is really nice to see the openness from you guys and from ClosureD and Heart of Closure, Arna and everybody.
01:08:51
Speaker
As you said, we are working in closure and without the community, there won't be work and without the work, there won't be community. The stuff that you're doing is really awesome, the conferences. Of course, you have commercial interest with your company, but you're doing it because you like the language and also sponsoring and releasing the open source stuff. Thanks a lot.
01:09:16
Speaker
I think that's pretty much it. Just give a little shout out to a few of the Patreons.
01:09:26
Speaker
Yeah, we got a few more, you know, keep on coming in. It's very nice, actually. So thanks very much to... Now, I'm not sure if I've said this guy before or not, so I think we'll just take a risk that I haven't. And if it's a double, who cares? It's a guy called... I don't know what...
01:09:48
Speaker
his or her name is actually, but it's G-N-E-Yong. I don't know if it's a real name or, anyway, that's the name they're giving. So thank you.
01:10:03
Speaker
G. Yin. And then there's Lukas Kureki. Thank you very much, Lukas. And then the next one is Jayinda Reddy. Oh, Jai Hind Reddy. Maybe as you know. Jay Hind Reddy. Yeah, Jay Hind Reddy. Jay Hind Reddy. Okay. Okay. Ta-da. You're guaranteed no support for that one. Why am I reading these things?
01:10:33
Speaker
So they could complain loudly. Yeah, I know. Finally for this one is the guy who is on the show a few, about a month ago, Mo Abulke. He's throwing in a bit of cash, which is really kind of him. So that's really nice. So thank you very much to all the Patreons, all the people that we've talked about in the past. It helps us to cover our costs and
01:10:59
Speaker
and do good stuff. So thank you very much. We really appreciate it. And I'll hand the mic back over to you, Vicha, to finally wrap it up. Thank you. Bring it home. Yes. So wrapping up. Thanks a lot, Tommy. And as you heard, not not Tommy, but the people who are listening to the podcast, the CFP is still open for closure tray. Is there going to be sauna again? Yeah, definitely. Tommy will be okay. So so there is going to be a nice
01:11:28
Speaker
It's going to be hot. In beautiful Helsinki in September, so check the website out closuretray.org. And Dutch closure day is upon us in a few weeks, I think, April 6th.
01:11:44
Speaker
We have the schedule published, everything is up and running, and I think I'll see some of you there, and Ray will be there as well, Ray and Wouter, the Deaf and Gang, so we'd love to have a chat and listen to your complaints in person. And thanks a lot for the veterans, and Tommy, thanks again for taking time on Sunday evening for us. Thanks for having me.
01:12:10
Speaker
Absolute pleasure. Cheers Tommy. Cheers. Thank you. Bye bye. Bye.
01:12:49
Speaker
Oh, fuck. What does it say? Off air. I can't make it on air again. Oh. Let me see. Refresh. Oh, fuck. Fuck. Fucking fuck. I think that's 47 episodes of fucks in one first five minutes.