 Alright. Who's ready for a highly chaotic talk? And if anybody knows me, it's going to be about my most chaotic talk yet, and that's a high barrier. So hi, I'm Chris Weber. So I'm here to talk about network programming and etc. live at the REPL. And there's been a lot of stuff happening in Gile as in terms of asynchronous programming over the last year. One project is 8Sync, which I work on myself, which is a GNU project about asynchronous programming. You can see here, if you go to the 8Sync homepage, it's got a very short example that if you just put in this code, you've written your own IRC bot that you can customize what it does right here. So it's pretty easy to get up and running. So 8Sync uses the actor model as its idea of how to do asynchronous communication. This example that I have here just starts up one IRC bot. But what's a more fun example where we can have, since actors are supposed to involve lots of things running around, where we can have many, many crazy things going on? By the way, very soon people will be able to connect to the game. I'm going to be running. So if you want to pull out your laptops now, it'll be a good time. Because in about 10 minutes, we're going to be able to all go crazy. So yeah. So I wrote a multiplayer game for the list game jam called Mudsync. Who here has ever played a MUD or at least a text adventure? Okay, wow, actually a good number of people in the room. Not everybody, but enough people. So here is Mudsync. I'm actually connected to this. This is in the browser. So this is using 8Sync comes with HTTP and WebSocket support. So this is using WebSockets. So out of the box, you already get a Web server and WebSocket support. And I'm inside of this room. Let's see here. It's a hotel lobby. So this is going to be the most wall of text conversation ever since I'm literally playing a game with a wall of text in it. So I'm just going to explain what's going on because I don't expect people to be able to read that fast. So I'm in this hotel. I'm in this lobby. There's a bunch of miscellaneous things around. What do I see here? I see a shiny brass bell. So why don't I try Ring Bell? Okay, it summons this clerk who she's like welcome to hotel Bricka Brack. You know, and let's see what information does she give me? Ask clerk about changing name. Okay, why don't we try that? Ask clerk about changing name. Okay, so I can sign form as my name. So sign form as Cweber. And now if I opened up a new tab and also connected, whoops, and as I put in a colon at the end of it, I would see that, you know, Cweber is here. And hi, Cweber. And if I switch back, I will see that guest two said hi, Cweber to me, right? So and I saw guest two materialize out of thin air. Oh yeah, the clerk kind of does some things in the background. She's clicking around and stuff like that. So what else is in this room? So I look, there is this, there's a career cabinet. So look at cabinet. Oh, there's a pickled head of Elvis in there. Oh, great. So it's a, and you know, I can, if I look in here, there's some sort of frumpy fellow. So look at the fellow. It's apparently the hotel proprietor. They're completely disorganized. It's actually me after the game jam. I can chat with them from the fellow. I told them to paint the more walls purple. Why didn't they listen? Chat fellow, you know, just a bunch of BS. But anyway, so I'm gonna go north. And what's here? Okay, so I'm in this hallway now. It's got statues around everywhere. I've got in the middles at one particularly large statue of this woman. And there's also a hotel map and then the statue of Hackathina, which is the woman. So I'm gonna look, I'm gonna read the map. And there's an Asciiart printout of the environment. Okay, so we can see that we went from the lobby to here. Okay, excellent. So, you know, there's no mud unless if there's lots of fun puzzles in it, right? So let's look at the statue at statue. So the statue is of Hackathina, guardian of the hacker spirit, the protector of all good hacks. She's got horns and a, and instead of a sword and a shield, she's got a keyboard and some sort of, I don't know what that is. So let's look at the shield at the keyboard. Oh, it's a night keyboard. Oh, man, those are for old list machines. That's pretty nice. So she's got to be an Emacs user. So look at shield. Oh, the shield's unusual. It's kind of a, it looks like a hard disk platter actually. And it looks loose. So can we take shield from Hackathina? And I pull at it and a completely separate copy of it comes off. And I hear a voice whisper, share the software and you'll be free. Okay. So if I look at my inventory, I see I'm carrying a glowing disk. That's great. Look at disk, you know, it's just like the one that I have before. That's interesting. Okay. I've seen enough stuff here. Let's go west. What's in this room? Now I'm in a play room. There's a Rube Goldberg machine, a toy chest and stuff. What's inside the, the, so there's like a cuddles plushie. Look at plushie. Oh, it's a cuddle fish and it's warm and fuzzy. I can take it. Oh, take plushie. Right. So I pick up a cuddles plushie. So, but what else is in here? There's a Rube Goldberg machine. Okay. This is interesting. Look at machine. It's one of those hilarious group Goldberg machines. What would happen if I started it? Okay. So start machine. You start through of Goldberg machine. Dominos toppled on the line. Last domino lens at a switch. Switch lights a match. Match lights a candle. The candle burns. And it just stops. What happened? What happened? So one of the difficult things about doing asynchronous programming stuff is that when things go wrong, like it's difficult to figure out what happened. It's difficult to kind of evolve the system. And it's, you have to close the whole damn thing down when you've got all these useful things running around. I don't want to do that. I want to find out what's happening and I want to fix it live. So we're going to do it live. All right. So if I look at the output, it will print out an exception of what happened. And it caught the exception. Unknown step type. Don't know how to process Rube Goldberg machine step type. And it's got this step divided by two and three. Huh? What's going on here? So let's look at the code. Okay. Well, this is my code for the Rube Goldberg item tricker. And you can see that it's got this match here. It knows how to handle strings. It knows how to handle numbers. It knows how to handle symbols. So the strings, it'll spit stuff out. Numbers, it'll sleep for that many seconds. And it just happens all asynchronously. So via delimited continuations, it'll suspend the function and wake it up back again when it needs to. And that is doing that with the sleep function, the eight sleep. And then, and if it sees a symbol, it actually sends a message to the next object in the Rube Goldberg machine saying you do the, you like perform your action. So now let's take a look at the candle, which is what broke. So I've got my description of the Rube Goldberg machine here. And I've got the candle right here. So here's the code for the candle. Now you can see it says the candle burns as the steps. And then, you know, and then, ooh, I've got made a mistake. So you can see it's a quasi quote mistake, classic mistake. People who use quasi quote are always forgetting to unquote things. And that's me right now, right? So, so what happened here is if I go to, oops, but I should have done is I want to connect to the REPL live of this. So Geyser connect local TMP eight sync socket. So there's a REPL running so I can edit the program while it's running. So I'm going to take a look. And so here's a code that it was evaluating for the steps. It sees this is what's happened is instead of actually doing the divided by two and three, it actually just spit out that as a list expression. So I want to fix that. What I want to do is I want to unquote it here. Okay. I fixed that. And now I want to, I'm going to inject since now normally you can just redefine things in eight sync. And if it's just like a function or something like that, it'll call the new version of the function after you defined it. But in this case, we actually want to replace the object in the game world. This is a mudspink, a sync specific thing, but it's easy to build something like this in your eight sync game or your eight sync, whatever it might not be a game, right? So I'm going to inject the game object, which is from this specification I have, which is a new version of the candle. All right. That's done. So now let's reset the machine. Okay. A hand comes out of the wall and puts everything back into place. Shoo, shoo, shoo, shoo. Okay. Retreats back into the wall. Let's run the machine again. Okay. Start through Goldberg machine. Domino's top down the line. Last domino lens on the switch. Light master candle. Candle burns. Candle is burning away a rope. We fixed that. The rope snaps. Unleashes a catapult. The rock flies through a water. Demons startling it. The water starts leaking water into the kettle below. The rock hits the heaters on button. The quick heater heats up the kettle below it. The kettle is filled. The kettle heats up. And oh, it's boiled some water. And it spits out a cup of hot tea. And there's a cup of hot tea. I'm going to take that. Sip tea. I can also drink the tea. Oh, that drinks it all at once. Now I don't have any more tea. Anyway, okay. So all right. So that's fun. That's fun. So, you know, okay. Well, let's go east again and look at the map. So read map. Okay. So the play room's to the left. Ooh, a computer room. Well, we got that hard disk. I wonder, go west. Go west. Of course, there's a large computer cabinet here. And a hard drive. Go figure. What's let's take a look at the computer at computer. It's a PDP 11.5. And it looks like it's ready to run a program on it. If I also look at the groom, it says that there's a direction down, but there's a metal panel in the floor and I can't get through the metal panel. But that's a problem because that's where my main talk is. All the actually good stuff about my talk. We're just playing a video game now. We haven't even gotten in the talk. It's downstairs. So I have to solve a puzzle before I can do this. Okay. So let's look at computer. It says I can run a program on it. So run program on computer. It errors out because of a disk error. So what's wrong with the disk? Look at disk. Okay. It's, oh, wait, wait, no. Look at drive. Disk and drive. So confusing. So it's a hard drive labeled rl0.2.5. Oh, that's the same thing that our disk that we're holding is. And it's under a meter tall. There's a slot where a disk platter could be inserted. So what should we do? What do we do? Right? Insert disk into drive. A load button begins to glow. Okay. Look at drive. Okay. Road button is glowing and there's a ready indicator that's on lit. So let's press the load button on drive. Hard disk begins to spin up and the ready light turns on. All right. Now we can run that computer program. Run program on computer. And some gears grind and a metal panel opens up and we can go down. Hooray! So we can go down. And I'm in an underground laboratory which has a map. Read map. Oh, we have a whole Asciiart map of the underground area that we can explore. It's roguelike style. But, you know, this is probably the time where I should get you guys to get involved, right? So I'm going to go back to where it all started at the lobby and I'm going to let you all connect. Now, if you're going to connect, don't be an asshole. Like, sometimes you put things up here and people are like, I'm going to say sexist or like super douchebaggy thing. You can say silly things, but don't be a douchebag, okay? I'll just kill the connection for everybody and you'll ruin it for everybody. So don't do that. So I'm opening up an SSH tunnel to my laptop. Uh, uh, oops, SSH add, which I'm going to type wrong. Okay. Now I'm going to open up an SSH tunnel. Suspense. It's connected. Okay. All right. So now everyone can go to dustycloud.org colon 8888 for 8sync four times dustycloud.org colon 8888 and you should appear in a lobby. Let's see who starts appearing. You see guest? Okay. Everybody's appearing. So, um, what? So, okay, I'm going to, I'm going to summon, I'm going to summon the desk clerk again so she can help. So I ring the bell and she's like, and she's complaining about the proprietor, which is me, which is super rude. Yeah. You can keep ringing the bell. She'll get annoyed with you. Um, uh, the, uh, yeah. If I do that shit's like, yeah, I'm already here. You don't need to claim the bell. So, okay. So you can change the name. So you can do, you know, um, so, um, ask clerk about, oh my God, uh, changing name. So she says, you know, sign form as your name. So now you can do a sign form as input, you know, whatever there, you know, um, cool. Great. Great. Now we've got names. Nice. Okay. This is great. So how do you play this game? Well, for one thing, you're not going to be able to see what I'm saying because everybody's shooting stuff so far. So you can do same message or even better quote, um, foo to just start chatting. So you can use it like IRC. So start chatting in the room. So say, what's up peeps? Yes. For reals. Okay. Okay. But I'm going to leave this room so you can talk amongst yourselves. I'm going north. I'm going to read the map. Okay. Leo's here. So I'm going to go back to the computer room. So I'm going to go west. By the way, you can dismiss a clerk and she'll run to this secret location here. And she will do something hilarious if you summon her while she's in the room. But, uh, um, but I'm not going to do that. This is a choose your own adventure talk. I've put in more content than I can possibly cover. So if you want to see something else in the talk that I'm not going to be able to get to, just walk to that area and read all the notes I've left. So, um, so go west. Okay. So I'm going to go downstairs. Um, so I went north, west, west, and then down. And that's where you get to the underground lab. If you have any doubts, read the map up above. So read map. We'll see who gets to be the first person who joins me here. Oh, Momo joins me first. First person in the lab. Okay. So what's here? So what do people want to hear about most? Do you want to go to, should we go to the eight sync hive area, the guile eight sync, async museum, the Federation station, or the mud sink swamp? I didn't have time to program that one. So it just, all the other stuff exists. So, so how about north since it's opposite of south? Okay. So let's go north. And here is where the entrance to the eight sync hive. So it's got this large spherical half dome and there's a bunch of actors like fused to the side of it and like with things attached to their belly buttons and they've got like messages pulsating onto them. And those are actors, right? So this is eight sync. So I'm going to chat with an actor and they'll say stuff like, yeah, we go through a lot of sleep and await cycles around here. If you're not busy processing message. So if you chat with them, they kind of give details about how eight sync works in kind of jokey ways. What a lousy schedule. I hope like somebody upgrades that thing. Yeah, you jerks. So what is this thing about the eight sync hive? I mean, we know what actors are. And by the way, every game object in this game is its own individual actor acting independently. So they all operate separately. If they're doing their own things, they won't interrupt each other. It's all non-blocking. So we're at the entrance to the eight sync hive, but it looks like we can go inside the hive itself. So I'm going to go north into the hive. And so we're inside the eight sync hive. Wow, everything's so goopy around here. Oh, is that sanitary? Yes. So eight sync uses goops. And for those who don't know what goops is, so let's look at the RGB item. Oops. So RGB item, yes. So goops is a, it's basically a object-oriented like class-based structure for scheme. You can use it in a fairly kind of imperative fashion. I did have a patch to the list that allows you to use it in a more functional fashion, kind of like surfy nine canoe. But what's nice about it is that when you redefine things, they will like, if you add new fields or change things about an object, it won't break the existing objects. And that's really good for live hacking. So that's why we use, why all actors are based on goops. So, you know, so that's why there's, you know, sub beeps. So the, so that's why if we look here, there's this character called the hive actor. So we can look at the hive actor. So every actor in eight sync is connected to the hive. What is the hive? Well, let's look at hive actor. It's a, so what the hive actor does in my personified version of it is it's a tentacled monster here that's also itself an actor but is consuming messages that are dropped on its desk and then shooting those messages off to other actors. So that's what the hive does. It's basically the male agent of the entire thing. It's actually the one that's sending messages. So this is an important thing about eight sync is that since it's following the actor model, it's all message passing. And if we look, we can chat with the hive actor too. He yells though, I hear fibers is a nice work stealing system but the proprietor is not convinced that our design won't corrupt actors fate. And that and the actors threaten to strike when it came up last. Okay, so what a jerk. So there's a stray message on the floor. Yeah, stray message. Oh, something strange has happened to the fabric of space and time around the message floating right above the floor and it hasn't been garbage collected. But if we try to read it, it might print itself out. So read message. So this is doing something hilarious through this error in space time. This is actually the message that was sent to the actor asking for us to read it. And so it's actually printing out the message that it got as a hilarious joke in the game. So now we can read exactly what it was. So you can see the message has its own ID. Every message has an individual ID. It gets addressed to something. So every actor has two parts of its components for its address. It has the player ID and it has the hive ID. And you can see that this message is coming from, it's being delivered to this meta message object but it's also coming from the player who is me. But they both share the same hive ID. Now in the program that I'm running here, there's only one hive. But what you could do is you could set up multiple hives. So say you wanted to run things in multiple threads or even multiple processes on completely different servers. You could have a separate hive over there and the actors could send messages to each other and they wouldn't even know unless if they bothered to look at the hive component of the ID that they were communicating on separate places. Because actors don't have a direct access to the object, they only have an address. So when they shoot a message at the other actor, you could just take an eight sync program and you could have it running on one machine or you could just splat it out across a whole data center. So I think that's kind of cool. So it has this action which it says that it wants to read it and the body of the message. So in this case, it was the read thing. So let's take a look at the meta message which has the meta message read thing. So this is how this one actually works. This is the actual handler. You see I set up this command handler for the command read and the first argument is the actor itself. Second argument is the message. And what it does is it sends a message to whoever it got it from which in this case would be the player telling them this message. And I have this kind of terrible scribe-ish sxml-ish type system that I've called Scrubble. And that name is as terrible as the system is. But you can see it's doing message passing right here, right? So that's pretty cool. But what other kind of message passing is there? So when you see this kind of message passing with this arrow pointing in this direction, that's actually borrowed from old message passing systems in Lisp, which is what happened before generic methods became popular is that message passing was really popular. And then a lot of people were like, oh, generic methods don't matter anymore because we have, I'm surprised nobody's causing any shenanigans. But anyway, you can also do me to do stuff like me dances. Anyway, so you can, what was I saying? So you can send messages like this. And what happens is every time you do one of these, it actually suspends the function and kind of shares work with every other actor. So it kind of has some built-in cooperation. But what's really interesting is when you have these things to have this with the arrow and then wait. So what that does is it shoots off. So this is an example of what I'm taking from something and actually this is something that proxy is taking from another object. But I want to be able to get what the actors, like what type of things that it went by, right? So normally, so this actually has a built-in like automatic but also hidden behind the scenes version of promises. So what happens is I'm sending a message and I'm going to wait for its result to ask, what sort of names do you go by? But instead of having to split this into a whole bunch of functions, I actually just have this one procedure that suspends when it gets a message back, it wakes back up again. And then it's able to extract the value from it. No need for callback health. There's no need to split things up into a bunch of things. Your programs look as if you're writing just completely straightforward scheme programs. No need to split it up into like, if you've done no JS, you know what callback hell is. It's not fun. So that's one nice thing about it. So yeah, so I think I've seen enough here. You are welcome to hang around or whatever, but I'm going south. Oh, we never read the eight sync design goals. I should probably read that. Read eight sync design goals. Okay, yeah, it's still connected. Just making sure. Oops, read sign. Yeah, okay, that'll work. So it's an actor based shared nothing environment. And what that means is actor model is one way of being able to handle concurrency so that things don't basically, if you've done any asynchronous programming, you know how much of a pain in the ass threads are, right? And locking is a nightmare, right? And so there's not, what the actor model takes as an approach is that each actor manages its own state and they don't share state between them. So when I sip the tea that decrements how many sips I have left to the tea. So if I go up, go east, run machine, this is, I don't know why I did one all the way up here just to show this, a simple example of suffice. But right, when I'm sipping the tea, nothing's actually accessing that tea number or interfering with it. I'm sending a message to request that it decremented or something like that. But the actor itself is handling that itself. So you won't have those kind of collisions. So, oh yeah, I forgot to reset the machine anyway. Whatever, I'm out of here. Down. Okay, so read sign. So that's one thing. Another thing is that it's live hackable. So I believe that concurrent systems are really hard to write. And the ideal concurrent system development is where you're able to evolve the system as it runs. This entire game, I almost wrote the entire thing while the program was running. So the whole parsing system and everything like that, it just kind of flowed out as the program developed. And it's really hard to plan concurrent systems so I think that this is really important. And also debugging concurrent systems is really hard. When I fixed that issue, I didn't have to disconnect from the game. I could fix the game while it was running, even though there's a bunch of things acting in it. And for the most part, the actors don't, like if one actor breaks, it might not be helping the other actors that it's supposed to be doing, but it won't probably take down the whole system at once. There are other components that still can't operate without that actor can still operate, which I think is pretty nice. No callback hell. I already talked about that. That's, you know, delimited continuations, blah, blah, blah. So those are the goals of 8sync. And I think that they've been carried off pretty well. So read map. What should we do now? Should we go to the 8sync Museum or the Federation Station? Pinyons? 8sync Museum, okay, go west. So I go into the 8sync Museum. A security guard allows me to pass through into the room then stands in front of the door. Well, wait, why is the security guard in front of the door? I'm going to go east again. Oh, security guard tells me the only exit is through the get shop. Okay, so I noticed there's a bunch of people in here. Did you guys get stuck? There is a way out. If you see to the bottom, there's a classic net hack style store down here. But anyway, so there's a list of exhibits. This is kind of overwhelming, all the list of exhibits that are right there. So read list. 2016 progress. That's probably a good place to start, right? So let's look at 2016 progress. I told you guys this was a wall of text. And this is like the worst wall of text of all, right? So you can read this on your own time if you want. But oh, man, I can't believe like I was like this, this game, like the game content is like almost 3000 lines long. And that's not even including the get engine. That's just like the thing that I'm running here. So a little bit too much content. Anyway, so what's happened over 2016? So at the towards the end of 2016, at the beginning of 2016, there was some conversation about, we should have some sort of concurrent programming environment for Gile, right? Mark Weaver, David Thompson, and Andrew. I'm going to totally mispronounce his last name. Pseudoman on IRC all went to Veggie Galaxy after the FSF 30th party, and we were talking about what we could do. And then kind of shortly after that, I sent an email to the list with kind of a brain dump. And then I think right around that time, a number of implementations started. So I started working on 8Sync. It originally didn't include the actor model itself, but eventually it moved to mostly being around the actor model. Chris Vines started Gile async, which is also still an active project. And then Andy Wingo came around and kind of blew everything out of the water by having, as he tends to do, with suspendable ports. So suspendable ports are really cool. So normally when you write, so I'm going to show you some code. Let's see here. I'm going to go to the 8Sync code itself and go to the systems, and let's see the IRC code, right? So let's, where would it be? So this was probably not the smartest idea. I'll just pull up code mid thing. But okay, so right here. Yeah, I should have definitely bookmarked this before I started pulling it up. Okay, so I'm looping here, but this was probably not the smartest choice I've made in this entire talk. But the basic thing behind suspendable ports is that normally when you write code, that requires getting code out from some sort of object. So if you're writing a blocking version of it, you would just say, read from that port until the stuff gets there. And then the whole program would freeze until some code comes through that port. So with the way that you usually do it, and the way that 8Sync did it before I switched to suspendable ports, is that you would actually take a port and then you shove it over to the scheduler and you say, call this callback when you get some information. But the way that we do it since suspendable ports is that you actually start reading from the port and then at the moment that it's going to read from the port and it would block, it suspends to the scheduler and as soon as and the rest of your program keeps running and as soon as there's information there, it just continues. So you can just write a loop that looks exactly as if it would block, but it just magically doesn't. When that's pretty cool. So Andy put out Fibers, which I thought which is a implementation of, well, I've got a whole exhibit here on Fibers. So maybe we should talk about that. But that's basically kind of blew everything out of the wallet there. So look at list. Like I said, wall of text talk, but at least we had the fun things with the machine and the T beforehand. So read 8Sync and Fibers. So this is, oh, look at 8Sync and Fibers exhibit. Okay, so there are some similarities and differences between 8Sync and Fibers. I know a lot of people are like, oh, you know, what should I, like what should I be following the most closely between all of this? So both of them are using Giles' standable ports, which is not surprising. And both of them use message passing. So they actually look super similar. Like they both have some sort of inboxy looking thing that you're pulling stuff out of. And in Fibers, that's called a channel, which is kind of similar to what Go calls and etc. And 8Sync that's called an inbox because each actor has its own inbox. Now one major difference is that in Fibers, each process might actually have two different channels, which actually means you might end up in an accidental situation where you have this information coming on the second channel and you start reading from the first one and it never gets there or something like that. So I actually think I have a slight preference for the actor model because you are only actually reading from one. Each actor is only reading from one thing and it won't run into that problem. But they have both different theoretical basis. One of them is based off of Fibers is based off of the process calculate, specifically CSP, which you can read up on if you want. And 8Sync is based on the actor model. And if you're a mathy person, I might tell you, hey, they're dual and you'll be like, that's cool. And if you're not a mathy person, it doesn't matter. So let's look at the list. What else have we got here? Well, we already talked about Suspendable Force, so why talk about that? I actually think that we've talked about most of it. Oh yeah, it was conceived by Karl Kiewit, shared nothing. Oh yeah, this is kind of interesting. It was originally the research goal scheme. So this actually brings us back to scheme's roots. Scheme was originally created when Gerald Sussman and Gael Steele were trying to explore the actor model. And then they discovered, they also tried to build in this version of the lump, the calculus alongside it. And then they suddenly realized that the way they passed in the arguments and the way that they got things back were actually exactly the same. And they're like, these are the same thing. Now, it turns out they're not exactly the same thing, but it's pretty close. But one of the major differences with the actor model is that you don't actually have direct access to whatever you're calling. It might not be in the same address space, which I think usually in most, even though I'm not sure the lump, the calculus expects that this whole idea that you're sending a possibly serializable message somewhere else and that you might even get back like an error result or it might never end up finishing or stuff like that. It has a different set of expectations than just like vanilla scheme, just calling things and stuff like that. So in pretty much all distributed systems can be viewed as in terms of the actor model. Think about web servers. You've got a web server. You send a request to it that's sending a message and it passes a response back. Pretty much all systems can be viewed in the actor model that are concurrent. So, I'm going to go south into the gift shop, which I never finished and I forgot to even commit the thing that said that it wasn't finished. I'm going to go northeast because that's embarrassing. Okay, so I exited the gift shop. So let's see here. Well, we're getting through this a lot faster than I expected. So we still have the Federation Station. Should we go there? Okay, let's go there. So this is actually the whole basis of me working on all this stuff in the first place is because I wanted to build in, I'm working, some of you know, maybe not everybody, my main thing is I'm working on trying to do decentralized internet things. And I get so frustrated with coding and every other thing that's trying to do concurrent programming that I decided to shave all the yaks and head over to Gaia. Luckily, Wingo and I are shaving some in parallel so we're kind of like building off of each other maybe. But you know, so this, so one of the things I work on is something called Activity Pub, which this guy's not familiar with at least. He works on Pumbio. But Activity Pub is a implementation of, it's a standard from the W3C. In fact, we have a poster here. So read poster. It even has links that you can click. What mud has links? Right? But anyway, so I'm working with a social working group that has that. And it, so it uses a pretty simple JSON-LG. In fact, I might as well pull up the spec. Activity Pub. Why not? So this is, oh, the network went down. Oh, probably none of you are doing anything because the network disconnected, huh? That's why nothing's happening. I was like, man, you guys just all went quiet. No, it was just, it was, see, this is what happens when you have a wireless card that's like ancient, that's connecting to, you know, a conference Wi-Fi and then you're doing everything over an SSH tunnel on your VPN. Probably not everything's gonna hold up, right? So anyway, okay, we're back up and running. You all have to refresh if you actually wanted to rejoin the game, but I don't blame you if you're like, screw that. I lost all my experience points, right? I guess. So there are no experience points. There was originally gonna be a frog man you could punch, but I never got it in. The, that, so anyway, so activities, activity prods are pretty simple. The whole idea is that every user has an inbox and an outbox and you, when you are doing federation, if you, federation happens, so say I post a video to my media goblin instance and you, and Ludovic wants to see this video, right? So Ludovic is subscribed to me, so my server posts that serialization of like the metadata about the video to Ludovic's server. And it's just a simple JSON format, a fairly extensible one, but still a JSON format. So it goes over to Ludovic's server and it might look like this. So this is an example of an object. This person's liking a note called I'm a goat. And so like, so, but Ludovic gets the thing and then whatever social networking application he has, he can see my video, right? And he can comment on it and he comments on my video and it has, you know, kind of email-like addressing with two CC and BCC. And so, and that's, that's how the whole thing works. It's actually, and now wait a minute, this looks, this sounds kind of familiar, doesn't it? Wait a minute. So we've got, we're playing a game where we're using the actor model to send messages between things and we've got this kind of subject-predicate object structure, right? Like take duck from box, right? Well, that's not too different from like post, blah, blah, blah. They're both subject-predicate object systems. And so wait a minute, I've got this chart here. So there's this chart that's in this room that's like conspiracy theorists. It's all related. It shouts over exuberant conspiracy, sorry. Activity pub, federation, the actor model, scheme, text adventures, mods. What are these having coming? Everything, right? So, so, so, and they've got, like this poster has like circles and wines drawn along it and like red pen and stuff like that. So scheme was originally started to explore the actor model, as I said. And there's a really interesting paper by Susman and Steele that's exploring the first report on scheme that I really recommend that you check out. The activity for protocol is using federation via the activity streams format and text adventures and mods follow similar, you know, structure to break down commands of players. Federation and the actor model, they're both based on a highly concurrent systems that use message passing. Zork, the first adventure, text adventure, used muddle, which is actually a ancestor of scheme. So it actually uses a very scheme-like language to program the like the first major text adventure because Zork came out of MIT during that same era. And so in the 1990s before the web became big, this is a hilarious link. Let's look at all these frames. Here is a document because muds actually were a big research subject like, like there was a famous mud called Lambdimu that ran out of the, ran out of, it was either Xerox Park or Palo Alto Research Center or the same thing I never remember. But anyway, the, that like, and so they were, they were a big idea in language design and people thought like muds are the future. Like that's how everybody's going to communicate on the internet is this like cyberpunk vision of things where you're like walking around worlds and like interacting with things and stuff like that. Well, instead we just read web pages. But you know, so the, but this, but here's a document that's like, hey, muds are so cool. We're making a lot of progress. Why don't we federate them? Well, gee golly, like people wrote this thing up and then like only way later do we end up trying to do this stuff and like the web, right? Of course they didn't make any more progress than like, well, we're making more progress than them. So whatever. But anyway, but what I find really interesting is that a lot of these ideas are circular and interconnected, right? Like text adventures relating to like the work I do on Federation, who would have thought, right? Super fun. Okay, so we're getting to the point where I should probably either ask questions or could just do Arne's talk and then do questions. I don't know. What do you think is the best version? Yeah, well the Arne's talk is a true book. Yeah, okay. So why don't we do questions first? Who has any questions? Oh, Struge re-entered the room. You can, I give Struge if you want, you can ask a question via the game. It's totally fine. Sub, Struge. Nope, didn't not go through. Oh, stupid connection. I bet I disconnected. I was gonna ask where the tinfoil hat was in the room. Oh, there's no tinfoil hat. But we couldn't program one live. Do you want to see it? Should we add a thing to the game live? Why not? Tinfoil hat. Okay, let's add it to the playroom. And I gotta switch back to Big Bricker Back. So playroom, so let's see here. So here's where I've got all the RGB stuff with the whole machine. And inside it, oh yeah, there's a rubber duck inside of here. Well, why don't we instead of have the rubber duck we'll add, you know, tinfoil hat, right? So we're gonna say it's a tinfoil hat. Goes by tinfoil hat and also just hat. You can take it. You'd have to be a crazy person to wear this thing. And I'm gonna inject it right into the game. Tinfoil hat. Okay, what? Oh yeah, so I can give it a wear command. So actually, why don't we do that first? So that's gonna require that I subclass it, but we'll do it. So I'm gonna take something else that already has been kind of defined and just munch it. Let's see here. Define actor, something with commands. Okay, good enough. This is a hot T one. So I'm gonna abuse the hot T thing and I'm gonna make a tinfoil hat. Tinfoil hat, GameObj command wear, tinfoil hat wear. And we're not gonna sip the hat. Build the commands wear, which is a direct command to command wear. Now this is a mudsink specific thing with this command here. You guys are looking at abstraction piled on abstraction piled on abstraction here. So I don't need those because those are already defined in the other thing. So now I need to define command tinfoil hat wear, tinfoil hat message. We don't really care about anything else. We're just gonna say, and we're just gonna do this super fast. So message from message. We're gonna tell them text. You put on the tinfoil hat and to be perfectly honest with you. Honest with you. I'm gonna do that. It's a lot harder to take you seriously. Okay, so we've got a tinfoil hat unspecified. Yeah, well, I evaluated it now, so it should be fine. So now I'm gonna go down to the tinfoil hat, switch it over to be a tinfoil hat. Let's see. I'm gonna inject it straight into the game. Let's see here. Look, okay, west. So I'm gonna go up, gonna go east. Here's a toy chest. So look in toy chest, a rubber duck and a tinfoil hat. So take tinfoil hat from chest. You take a tinfoil hat from a toy chest. Inventory. Okay, where tinfoil hat? You put on the tinfoil hat and to be perfectly honest with you. It's a lot harder to take you seriously. All right, I don't think we have time for any more. We should switch, but I'm about to do Arne's presentation for him. It'll be super fast.