Hello, everyone, and welcome to the 10.30 am to 11.30 am session of the 2023 Open Simulator Community Conference. In this session, we are pleased to introduce the presentation, Game Development in Open Sim, Leveling Up Animated Storytelling with Everything as an NPC. Nara is an award-winning author, poet, and game writer. Darina Brie has been a part of Nara's nook since 2014. This was her first appearance in 3D story building. Siobhan Ruhr is an award-winning romance author, and she has published over 40 books. She worked on Open Simulator for 11 years, meshing written stories with visual and virtual scenes that readers can walk through. She's created hypergrid stories and is bridging the gap between non-gamers and virtual storytelling. And their colleague, Shannon Albright, a romance author, graphic artist, and content creator. Mal Burns is host of In World Review, a weekly news and discussion program which has been running for over 10 years. Please check out the website found at conference.opensimulator.org for speaker bios, details of the sessions, and the full schedule of events. The session is being live-streamed and recorded, so if you have questions or comments during the session, you may send tweets to at opensimcc with the hashtag pound oscc23. We have some special instructions for you, so please look at the chat as well as listen to these instructions. Before we get started, I want to share a few tips on viewer settings that will help you to see what is happening on the stage. The settings OSCC prepares you for when you sit in the audience using the optimal settings for a presentation. However, this project has a larger scene, a larger scope, and more avatars, so you'll need to change a few things to give us a better shot at success and to give you a better shot at enjoying this.  After all, it is possible. Stay in your seats to avoid roving NPCs, some of which will be invisible. Shaban has slides for you visual learners. First please take a look at the settings, the quick settings button. It's in the lower right corner of your display at the bottom of your viewer. Check that lower right button called quick settings. Click to open and find the max avatars slider and set that to at least 22. You have to have it higher if your computer can handle it, but we have a lot of avatars here and setting it wide open to see everyone could make things really lag for you. So adjust it for your comfort. Also, while you are there, turn off the name tags. That would be in preferences on the general setting. We'll have NPCs all over the place and the name tags will create too much visual clutter for you. You can close that menu when you're done making those changes. This next change you won't be able to make until each scene starts. Just follow along now as I explain because it will save you a lot of trouble trying to follow the characters with your camera as the story progresses. We've created a narrator NPC that will be invisible but positioned on stage in a place where most of the action in the scene will happen and she will move as the center of the action moves. Again, Siobhan has slides. Now if you go up to the COM menu, the communications menu, on your menu bar at the top of your viewer, the second button from the left, open that. Click people and then in the list find the narrator NPC. Then right click and zoom in on her.  You'll need to zoom in on her again when the next scene starts. You don't need to stay zoomed in on her, in fact in the second and third scenes there will be things happening in the audience that you might want to see. You can just scroll out and then back again and now and then in this environment with so many avatars and if your cameras scroll back too far well the things happening on stage will appear to move in slow motion as if the characters are stuck in lag. When you scroll in the action it'll be seen at normal speed so make sure you scroll back and forth, check that view from the avatars position and have a great production. Over to our cast now. Hello, this is Norm alone. This project grew out of our continuing research into ways to tell stories in open simulator. In the 11 years we've been doing this most of our efforts have centered around NPCs. This year we decided to level up with a full visual one act play and so given this setting and the season we thought we'd share our retelling of the Holy King and Oak King. A visual representation of creating a world like we do in OpenSim with the same decisions needed for environment, length of day, colors, textures and location. This tale illustrates the king's struggles to make those same sorts of decisions at the beginning of a much bigger simulation some of us call real life. We've entitled it the ULTail because it used to be told over the UL log at the end of the year. We will give the characters voices so let's get started by introducing you to the characters and their voices. Siobhan? So I am will be speaking for the Holy King but first let's introduce the Oak King which will be spoken by Mal Burns. Hello everybody I am the Oak King. And as I said I will be the Holy King. Jareena Brea. We'll voice the Goddess Rianna. Hello. Thanks for coming to see us today. And Shannon Albright is our lovely narrator say hey Shannon. Hi everyone happy holidays. And now we present the ULTail. Everything you will see here animate and inanimate is an NPC. Let's scroll back in time through decades and centuries millennia to the Celtic kingdom were known then and remembered now as the Holy King and the Oak King. The twins shared their space about as harmoniously as most brothers share things that is to say their definition of harmony involved more conflict than the return of the Jedi. The only thing they agreed upon was their love of Rianna. The trees should drop their leaves in winter and sleep as the animals do. No fit shelter for the birds and wild things. Stop you're fighting over tree leaves. Maybe some of the trees could drop their leaves and some should not. Hey a fine answer. Right you are Rianna makes perfect sense. Fly beastie. Of course the holly trees should keep their leaves and bury you around. Hey on the oaks as well. Try to rip tiles. No the oak leaves are too thin and weak they can't shed the snow. The branches will snap under the weight. Are you saying oaks are weak? Use some sense instead of arguing with everything he says. Are you gonna turn him back into a man then? No. Please sweet goddess I'm sure he's learned his lesson. Well then as the spell was done you must give him a kiss to change him back. You mean like blow him a kiss? You may try that. I don't see why the two of you have to mix this so complicated. It makes more sense for the needle and glassy leaf trees to provide the shelter in the winter. The rest like the oaks can drop their leaves and seeds providing food to be stored through the winter sleep. All ends is to choose the length of the seasons. Spring and summer are the fairest and most useful and so we should follow the same patterns we do for waking and sleeping. It's absurd fall and winter are the fairest and most practical.  It is the time of crafting telling tales writing books and making art. These things all need the darkness the solitude to germinate as a seed does in the dark and damp soil. But the spring and summer provide the crops and the livestock to keep your life through the lean months. Surely there'll be no creating without food. For the love of all stop your bickering. Split the year and quarters and give each season its equal share. If either of you say another word you'll both be turned into tadpole men. Hop up and fly already you blasted beast. And a relative peace settled over the land with the coming of spring. Everything was fine until the arrival of summer. When the days grew longer and hotter and the early lessons learned evaporated in the heat and the brothers returned to their old habits. And with the coming of spring everything was fine. To divines grow back as fast as I can cut them.  How's a man to think? How's he to put story to page right when thoughts melt faster than they form? Ah brother now why did you have to go and scare off Maylee? You've nothing better to do than laze about the garden wooing pretty lasses.   You want to spar? You seem to need it. Will you act right? Think you can make me? No doubt. Enough of this. Quitting already? Well if you're gonna act crazy. Oh such your gob. Oh flipped. Watch out! Or stay with me. Someone help. I've killed my brother Rihannan. He is gone from us. Even the trees weep at your passing sweet king. Summer gave way to fall and fall to winter. The darkness and the cold deepened with each passing day. But the hollykeen could take no joy in it. The hollykeen sent the cold deepened with each passing day. But the hollykeen could take no joy in it. This nose came and drifted across the doors of the keep and the people kept to their cottages. The animals to their burrows. Only the hungry wolves roamed the forest. My brother's gone and there's no way to right this wrong beyond joining him in the next life. I don't deserve such an escape. I deserve all the suffering my brother's death has brought. The animals to their burrows. Only the hungry wolves roamed the forest. What is that light? How can this be? What's this? It is the night of the Yule and there are no bonfires, no celebrations to mark the turning of the seasons. Is it you? You live? Well thanks to be our own. And? And thanks to you brother I could not leave you. I am summer and I couldn't become your winter. I couldn't leave you frozen in your grief. I felt your misery and I know you've been feeling mine. Let us join in the celebration of your brothers lived in peace mostly for the remainder of their days. The length of the days and the timing of the seasons in the centuries that followed no one argued over at least not until someone invented daylight savings time. Well thank you for a wonderful wonderful session and we are going to have a panel next so our panelists are going to get set up and talk about this amazing production and their work on game development in open sim leveling up animated storytelling with everything as an NPC. Our panelists from left to right will be Shannon Albright who was our narrator, Nora Nook the inspiration, Darina Brie was a re-anon, Mal Burns was the oak king, and Chavan Muir was the holly king. Welcome everyone let's begin the panel. Okay yeah I'm going to start because I can't see anybody I'm starting it. Okay okay I'm going to just host it now I'm going to give up the voice of the oak, I keep calling him an oak tree but an oak king is what I meant. Yeah so this is a panel we're going to start a little bit discussing how it was all put together from my point of view as to sitting there reading the script several times actually we rehearsed it excuse the noise outside too an engine is revving um right well we didn't crash and burn so I don't need to ask why there's an in-joke there which only the people on stage will understand. We didn't crash and burn because we're awesome at this. We are we finally got it sorted and even the snow even the snow came down on time I think. I thought I saw some floating leaves. And it actually stopped. Yeah so that's what it needed to. Okay I've got a few talking points here but it's a bit actually I'm going to go for the straight one I think I've asked this before on another panel but why choose NPCs and not animation I guess this is a this is Vanara really I guess. Well we talked we did talk about this before um for in particular the thing that we just did that you probably wouldn't have noticed but there were a total of 45 NPCs in this and an NPC has a quarter of the lamping impact of a regular avatar and anti-mesh has the same impact as a regular avatar so so when you think about it if you're going to do a production not large with that many things changing you want to do it with your lowest impact tool. And another thing about NPCs is we can really simply make fast things happen like when you saw the goddess Rien and turn the elk king into a frog man um that happened in like a hundredth of a second and we do that with just an appearance change and so to change that with anti-mesh or something like that would have been you know much harder scripting wise and it would have been not quite as fast you wouldn't have had that instant change. So those are just a couple of the reasons. All right well I um I'm privileged of course in terms of going through rehearsals with you to actually see a screen share from you which obviously your audience here can't see where you actually sort of reveal the various objects and scripts you've got hanging around and um we can't display it but oh thanks you've opened it you've opened a holy king elk king card here for example and it's full of different you know it starts off with what I guess is a time like um 9.01 whatever and then spawning so location and you say it's very easy but I look at this and think I'm going to do that um you basically create a separate script from what we're doing when we're talking for actual actions of the NPCs don't you? So um a script was telling the goddess or whatever to pick my body up and take it away we were talking as if we ourselves were doing it but how much was um because you did a lot more rehearsal than I did which was just voice how how much of a task was this the synchronization between the script where the actors or we're doing our voices and the other script where your actors are all NPCs and doing their actions. It's actually it's actually one script all all of the voices and the actions have an all in the same script and if you look up on the stage I have these these little things that looks like eyes and a nose and a mouth I'm setting up there each one of those is just a little box containing just what I'm showing you now this story script and you could put it all in one object and run it all but we needed to split it up so that if something went wrong we could stop and restart easily and it also made it a lot easier to edit different sections as a scene and not have to go through the whole story every time we wanted to make a little change. So what was remarkable about it is that this this thing this script this is Shavon Muir by the way yeah and I should just point out to the audience in world they can't see what we're talking about we can now see it on our screen show so we basically look at the written script the third to make sure right right so what's great about the script though is it was remarkably easy to understand and follow so even if you didn't have 30 years in OpenSim or you know in years and years of coding it's something that even someone who is not a good as good at coding as I am compared to Nara I could build this script as well and I all she said was okay we need to move it here we need to add seconds here we need to add this this action and it it was surprisingly easy to build yeah yeah and when we did the immersive edge thing it was all artists and authors telling stories and this script was made custom made by some of OpenSim's best scripters to give us the tools to do it where we didn't have to know how to code we could just put down the number of the NPC that we wanted to be able to move and how long we wanted to wait until that action happened and what the action was and there's like a I don't know maybe 15, 12, 15 different actions we can choose from and it's really easy to put together I must admit looking at it with children's can't see of course you know sort of I can see how it'd be easy to deconstruct that and actually you know work your way with new things but there's an example here for example for the Oak King who was that and you know it's it's got some numbers and it says Oak King writing chair now when I was reading the script I had no idea what this was you got you can't read a script and watch the scene at the same time unless you're in it you know so I think the magic is that that action was taking place while I was just reading a script and you know at the time I couldn't see what was happening I was just you know taking my cue at the exact time so to speak and um you know you of course were controlling what was happened now do do the rest of you do you you're so specializing a bit of a different area does one of you specialize in the story another in the props another in the script or whatever um yeah exactly so maybe maybe Shannon can tell you Shannon helped me to to do the character designs we uh like kicked out images you remember that Shannon yeah I do oh I do yeah and then we we opened the fuse app and we built them together in the fuse app and then um handed them off to Darina who's our mesh specialist and Darina you want to tell us what you did with that um I cleaned them up quite a bit as far as just the the geometry of them to to make that to lower them enough to be able to bring them in here um easily and yeah and she rigged them all I gave them the the bones that they needed to be able to move and then brought them in started and she whenever we need a custom animation we say Darina mega is an animation oh yeah so that's her skill and and Siobhan is the one who keeps us all in line and she made the lovely presentation for the year she also did a lot of the scripting for some of the stories like she did all the props that um stayed up on the stage the whole time she did that and uh we all took turns with the scriptings like we said that that scripting part of it is something anybody could do and we we just each took a box and and went through the parts that we needed for that part of this story and for the the screenplay itself I wrote that at the beginning of the year and then Siobhan went through me with it and edited it with me and then all of us as we were practicing made changes to it to kind of suit everybody's style right yeah I've got a quote for you here actually where it's sort of um is you introduced to this uh not on text here anyway uh that your tale is an ancient story that you've charged changed up a bit to suit a modern audience and speak to issues about our time that are dividing families and friends for example um a mild example like saving time for example where we uh which we all hate but we can't agree which end of the day to put the hour to solve the problem and um the argument with the brothers obviously evidenced this and um but but then you talk about when you're making the project itself you say we lived a hero's journey in the making of this project and Siobhan says it was like a fish out of water adventure for her which is a famous prose being literature so if you want to comment on those a water idea is a is a is a trope it's a it's a very famous trope in literature and what it usually means is someone taken from usually our world and then thrown into something that they don't know anything about which for me when I first started working with Nara and Nara's nook she said oh we're just gonna do this with NPCs and I'm like I don't even know what an NPC is it was I was a fish out of water so doing this was kind of like oh okay so we could just make the script work and it was a learning thing for me and Nara did you see the question it's an awesome question that I think that you would really would like to see you answer right maybe Leah can help us I know she's still on with us um in terms of audience questions that are coming in I have to twist my neck to see them so okay well maybe yeah absolutely here I'll take a look yes thank you I found the question actually do you want me to just answer it well okay is this the question from Franz Charming Nara is this a system that you will open source and or can you can educators hire you to create a play for them yes they can and yes it's open source we put all of the the tools that we use to make this presentation in our booth in expo 3 so you can just go there and grab those boxes and there's even a couple of little demo items you'll see the the old king and the holy king sitting there and Siobhan made just a little sample disc of the goddess Rihanna if you click that disc you'll see her come up and rest the little flying dragon and such so um yes and friends is right the script that we're talking about is not your typical open sim script it was written by Fred Bacowson Anya and I can't say her last name but I can spell it C-A-O-I-M-H-E I think oh yeah that's it Kiva and Anya's Anya's no longer with us but she wrote a live this uh Neo Neothar Cortex wrote part of it I think some of it came from Wizardry and Steamworks and some from Jesse Campbell who she is no longer with us either so but all of this was written open source and contributed to us to promote our like hyper grid storytelling projects and to do storytelling in open sim and it's there for anyone to use and we are all you know we love what we do here and we're happy to help people if they're trying to do this okay I've got another question uh necessarily it's got any more from the audience if you've got any more from the audience yet okay um my the question though it is to you know the team there basically um if we had a wish list of what features we'd like to see um added to open save in relation of course to projects like this not generally well generally as well if you want um would it be and what would it be basically the open metaverse initiative web gl implementation implementing features like open source game engines like gogdo I don't think that's how you pronounce it um are there any things you will put to a wish list or technically you know that would help um the team doing this sort of thing I think web gl if we could some way make because we've already done our own experiments just um shivan and dorina and I have done experiments with taking things from other platforms and bringing them into open sim and web gl but what we would really love to be able to do is take things from open sim and put them in web gl to bring because it's such a learning curve but web gl is not so if you could put like a web gl story or a web gl region that people can go into and interact with and and encourage them to then look deeper into open sim and come in here and see what all is going on in here I think it would be just such a powerful tool to bring more and different kinds of uh creators into open sim that's great thank you you know mal there's a question for you um for our panel the question is is the use of ai an option for future storytelling and game development in virtual worlds well I saw that I mean um the answer is you know obviously yes ai has a future in just about everything there are separate issues as to what we shouldn't shouldn't do with it I mean if I was alive after 20 years ago and somebody was hanging a referendum on whether domestic motor cars should be allowed I rather think we'd have voted against it if we could have seen the future and I wonder if ai is something like that if we don't tame it at this point in time we may have you know and that 100 years time we may not even recognize the planet we're on and it may have nothing to do with the environment and everything to do with ai is being the primary life form so you know we've got to watch what we're doing but I think as an age of storytelling I'm sure now I agree with me 100 but I would say it inevitably will be um in terms of the um yeah the actual story chatting and the writing you know oh and very different perspectives um yeah did you see she's also talking about ai driven npcs yeah i've already done that I've already brought and I did not use like I don't use the open ai stuff and I don't use any of the commercial ai's I used uh an open source small large language model and um I brought I uh connected my npcs because when I first came to open sim the the first thing I did was take an npc and connect it to amel which is an older version of ai and so then I took a small language model that's open source you don't have to pay anybody for it because you know as authors and artists we all have issues with the fact that a lot of our work has wound up in these engines without any compensation to us so our consent we yeah so well um there's something it's a fact I've been avoiding the ai things like a browser plugins and stuff like the play but I recently on the map downloaded a couple which run completely locally and you actually have to work getting them online to actually check check their database and stuff but they they learn from you and they only learn from you so you could they learn from the data set something you control exactly so you know I can use that kind of ai to do something for me and it would do it it would give me an answer or produce something but it's all it's all locally it never contacts the um it doesn't work across the network yeah those are they run on your own computer and that's what I used and so it's not something like I can put out there for everybody to play with but you can find that stuff if you look at um local llama and reddit there there's always somebody posting there about the newest open source language models they will point you to places on github where you can get the open source language models and those models are not harvesting your data and feeding it back to these big giant corporations who uh just came through and scraped all the creators work and uh are trying to make billions off of it so chat gpt did that too yeah I like giving the npcs voices but I don't want to give them a chat gpt voice quiet uh just make them all into robots which they're half half they are what is left for humans to do according to web rain what is left we we make the art that ai is based on so ai is saying ai is better than humans is ridiculous because they used our data to become what they are so they can't make better art than us we are still always the original source yeah I mean they get one so trained enough they can do an awful lot but you've got to remember the training I was done somewhere yeah I think we're discussing this later actually but um you know this is right chat gpt is open chat gpt is open ai but open ai is not open source right so they never changed their name you probably read or they're not open source you probably read all the fuss about their CEO recently and I mean a lot came from the fact that they actually have two divisions they have a commercial division and the board of that division is interested in exploiting the technology and obviously making money the other division is uh do good division and I think there was a bit of a conflict between those two divisions as ai is becoming so big you know a lot of people like to say ai is a tool too but it's it it would be a tool if it hadn't scraped the data unethically and um right now there's no way to use it ethically so until there are restrictions and that protect the artist it's not just a tool it's actually harming people but that's a political discussion that I don't want to get into so let's talk about something else we need to trade trade in ethics don't we yes exactly um right well um yeah um oh hang on yeah Leo any with any more coming in I thought I had last the last one uh you know this journey oh so oh yeah I was going to comment on something I've seen already in my many visits to you now I'm investing as of course I'm very familiar with the idea that um you've got a like a cell wall right and I go move up to the wall and the wall dissolves and becomes the interface of a WebGL world and we can walk literally I've done this with you walk from open sim into that wall and thus into a web world and it's fascinating I haven't but what I haven't seen is where I can walk into the web world a few a few yards and then turn around and actually see a scene behind me that mimics where I've just come from but that's more of an artistic gum sort of thing but I love playing with that idea of you know interop even in very simple forms so I can see yeah we we had a region of books where they were all run uh WebGL worlds and you touch the book and then you can play the WebGL game that we created there so that's in the um what do we call that region the um story book islands was that at Chavon do you remember yeah that was the story book island yeah the story book islands VRML that's interesting that's going back away that's uh to a Tony uh Parisi isn't it yeah VRML think yeah years ago 30 years ago it's not like might even have been a well I don't know that it's all technology but it's a shame really it was never really pursued um because um yeah I'm hoping that they will take something like Godot and integrate it with open sim in a way that we can use WebGL here to you know interface with the web instead of all of it being in world we were talking while we were talking to somebody yesterday there was an example there's um the open meta metaverse interact people did uh they were here uh last year um and you they're actually able to go into um a web excel world and they were able to which appears on a tab in a web browser but it looks like a world not too complex of course but basically it and then you um you you explore that world but you come across a teleporter like a hypergate and you go through that hypergate into a completely different web world and it raises the specter of would you open a tab and go and search for hypergates and hypergates to other web worlds or would you simply open a separate tab for each of those web worlds because it's doing both at once if you see what I mean it's active you know if you take the teleport from the tab you're in you're obviously stays in the same tab whereas you know if you do it via the browser you have enough separate tabs and switch between them and it's intriguing you know which one will we choose I don't know is that with the open metaverse initiative it's doing they're they're trying to integrate open it's touchy yes hyper grid well they're looking at interop they owe me I'm talking about and we interviewed them here last year um uh the names that I would say hook the metaverse initiative but it's not it's open metaverse interop you know worse there okay um their concern is interoperability so they're doing a lot of things about file types that can exist in different places at the same time you know worse they're compatible with really exciting and and moving on one web exile instance into another seamlessly because we we complain that you know sort of um various worlds have nothing in common and we can't go from one to another but if you consider the common layer in web exile it's a web so in fact you know the web is behaving where or JavaScript and everything else that runs on it it's behaving like the platform and so different web worlds actually share the same platform you know simplistic way so you think you could just make a portal to move between web worlds right yeah yeah and um yeah I you know I love the way we can walk into your gates here you know unfortunately we can't walk back you know because you know we can of course we press the escape button which closes the you know the gates of the world we've walked into but I mean you know you can't just turn back around and walk back where you came from but in the future who knows you know um all this may be possible so one of my last questions I'm just looking at yeah we got about five minutes left the crucial question what next for the new team um we're going to be spending the next year I promise you we're going to be spending the next year finishing up a big project we're doing in unity we're called the storytellers castle and um we've been working on that for a couple years now and our focus this year is going to be wrapping that project and another one Darina and I were doing um for games for empathy uh we've been working on that project for a couple years and we're going to wrap that one too so we've got a busy year ahead of us and we probably will not be doing a another project for open some next year because this one took us all year we started working on this in January and so you know we just won't have time to do it but uh we'll be back to watch everybody else and what they come up with yeah big news but that's uh we've become the boy over something yeah that's because you mentioned unity I mean um do any of your projects involved actually building in unity which of course is principally mesh and then bring that into open sim or are you thinking much more of building things yeah we do we do that quite a bit in fact some of the things that we used here in today's project were built in unity and brought into open sim as the avatars were built in um an application called fuse and brought into open sim but we can use them in both unity and open sim so we're trying to find ways to to merge our two loves unity and open sim yeah and of course not to put finer points on it if you also in unity it's uh it's missing the real time sharing authoring that we have here which i think it's the key is yeah there's no community for that yeah well you know i i'm as a prayer my hand it to a sculptor who's who mangles it then they hand it to an artist who does the textures and stuff and then somebody else gets it to do the lighting on it and all that can be done in real time in open sim and in second life for that matter no other no no other platform that was the whole new wave that have come along has that facility that one facility of co-creating in real time you can meet in real time you can travel you know you can walk around a mesh finish that's already created in real time but you can't actually have a team create in real time except in open sim and possibly second life of course that's why i like to create here because we can all you know the four of us can get together and come in and build things here so yeah yeah it's time space i believe is also unity i need to look into that i know i've went into their beta before sure no they have um they they have uh they do have they have a second version of um called break room which um what they've done now is they focus break room on the enterprise and all their consumer people are focused on science space and you can get from break room to science space but not the other way around um but their versions are the same thing um but interesting at adam frisbee who many of you know he's one of the founders of open sim here but he of course the principal person who runs science space now uh they recently changed everything uh regular users now get a lot more land a lot more storage you know and i mean a lot like going up from you know 500k to 5 000 gigabytes not no not quite that much but um they've really given the public free users um a lot more value for their non-money hype i guess you could say um but they they put the lay down the law for enterprise users the enterprise users can't play around for free anymore they've got to go to break room but um it's a very good point um son mentioned this but in fact most of the tools in science space you know there's a whole subset of unity tools that you can use and it'd be lovely to have that in open sim but because science space is built on unity anyway it's easy to make a toolbox you know of things you can do that is a subset of unity and that's really not really quite the same as a team mangling in real time i'm afraid you know i can't really just put down a bit and give it to somebody else in real time to use it all the major stuff in science space it's done offline in unity the way you've been talking about now i think anyway i've got a feeling we're going oh yes i know that there's going to be a thing coming up in a minute saying warm in a lift oh two minutes actually but never mind very close our clocks aren't quite seeing yet so any any last thoughts of anything either if you wanted to say here that i missed in a bit of my promise and everything um that's all i've got you got anything chevon that um look for our projects coming in unity it'll be pretty exciting sure anywhere particularly people can go on the web or whatever to find links to unity by the way that to connect with you in that way um we're we're active on miwi and uh where else should i blue sky blue sky miwi uh mastodon facebook mastodon yeah and you can find our our website is narosnook.com that's it yeah so you'll find everything there you might need for it because obviously there's no unity stations oh yeah and our youtube channel oh absolutely yeah let me get you back some tutorials and stuff we've been working on up there right okay so the central thing is narosnook.com actually yeah because there's things there too but everything you're doing on there so yeah you'll find the editing and blue sky that is that is oh i'm i'm gonna have to look you up there i'm it's the twitter response uh replacement invites now no i'm gonna send you one oh you are really in there but i said i'm already in there but i don't know how many people there no uh hamlet's all sent me an invite yonks ago at the very beginning and uh but i don't know too many people there or just any people that hamlet don't use it very much so yeah me either i think chevon is my only friend there so far i've been so busy with this project i haven't really done on social media yeah master then is a very good replacement and i actually use ift to relay from master then to my old twitter accounts which of course now called something else but what the hell okay well thank you thank you really uh for the closing why we did that's it thank you panelists for an informative and wonderful presentation we loved it as a reminder to our audience you will want to check out the conference dot open similar dot org to see what is coming up on the conference schedule you won't want to miss our next session which will begin at 12 30 in this keynote region and it is entitled in conversation mal burns talks with tis chute after an hour for our meal break we'll also have a little shopping trip over the meal break for anyone who wants to go shopping with us or to see cal so uxley's region with his christmas market and go skiing also we enjoy encourage you to visit the oscc 23 poster expo in the oscc expo 3 region to find accompanying information on presentations and to explore the hybrid good resources in oscc expo 2 region along with our sponsor and crowd funder booths located throughout all of the oscc regions thank you again to our panel and to you the audience


Now let's look at the Hangman program we wrote in GoPidgin and let's translate it into real Go. And so here's the contains any function we wrote. And in Go, the things that are changing here is that first off for your function, the parameters are in parentheses, and you separate your parameters by commas. This is a parameter s of type string, parameter called chars, which is a slice of strings. And we're returning the bool, all of the type names in this case, beginning with lowercase loaders. And the equivalent of our force is called for range, you strangely put the range word here, at the end before the thing, which were for ranging over. And another difference is that in the GoPidgin code, we had variables i and j, which we didn't use, but the GoPidgin compiler didn't care about that. It just let us have unused variables, the Go compiler is much more picky. And so we have to use the blank identifier to say that, well, yeah, normally there should be a variable there, but we don't care about it in this case, we're not going to use it. So we use the blank identifier instead to effectively discard those values. And another difference is that in GoPidgin, we can't use for each on strings, we had to use charge slice to get a slice of the individual characters of strings from our from our string. And then we could use for each on that. But in actual go, we can for range over a string. And when we do so, the individual values you get what we're what's being assigned to CH here is what's called a rune. It's actually just a 32 bit integer value, but we call them runes, and it's the it's the number representing that individual Unicode character. But it's not a string, it's an integer. And so what that means is down here in the inner loop, when we range over charge and charge is a slice of strings. So CH two is an actual string. And we want to do an equality comparison between CH and CH two, but they're different types. And the compiler is not going to like it if we try and compare two things of a different type, if you do an equality comparison, they have to be the same kind of thing. And so we can take our rune value though the value CH and turn it into a string by using string like a function, just like we did in go pigeon, we use type names like operators. Well, it looks like a function called go. But anyway, so this is taking rune value CH and getting the string equivalent, and then doing a quality comparison with CH two. So that's our contains any function. Notice the use of curly braces for all of our loops in the body. And then also if has curly braces surrounding its body. Again, indentation doesn't matter, we could like mess all this up and it would still be equivalent, probably wouldn't care. But of course, for good style, you should stick to the normal indentation style. Put everything back. Oops, there we go. Okay, and then looking at the join function here. Here's the version in go pigeon. And then here's the go code. First thing we do is we're checking if the length of strings is equal to zero. And we have and the Len operator in go, they don't call it an operator, they call it a built-in function. But it really is just like an operator. It's just syntactically when you use it, it looks like a function call. And so that's getting the length of the strings slice. And if the length is equal to zero, then we return an empty string. Here we're declaring our variables s and last index. And s is initialized to be an empty string. And last index is initialized to be the length of strings minus one. But as we saw earlier, we can leave the type of these variables inferred because they're being initialized. So we don't have to say this is the string, the compiler can look at this and say, of course, it's a string, because that's what you're signing to s. And we don't have to say the last index is an int because the length of strings minus one, the compiler knows this is an int expression. So it's going to be an int. And then instead of using var here at all, most go programmers would instead just write colon equals. And same thing here. And that's standard style. Okay, and then looking at the forage loop here, the for range equivalent, again, we don't care about the index. So instead of having an index variable I, we just use the blank identifier. All we care about are the values which we store in v. And again, we don't have to specify the types in our forage loops in the go page. And we had to specify that the index variable is always an integer. And we had to specify what kind of thing the value was. But in actual go, we don't. That's why the syntax uses colon equals, because it's implying that the types are left inferred. Anyway, and then over here, for what we're ranging over, well, in the go pigeon code, we used the slice operator to get a slice from our string slice, a smaller slice. So we took everything from strings starting at zero up to but not including last index, we're doing the same thing in go code, except the way that's denoted is with suffix square brackets. And you put the starting index before colon, and the end index after a colon. And in fact, in this case, as a shorthand, if the starting index is zero, we can leave that inferred, we don't have to write the zero there. I'm just going to put it back here though for clarity. And then inside the loop. Oops, I made a sake here, we don't actually need to take v and make it a string because it's already string compiler didn't mind that it was just redundant, it was totally necessary. Anyway, the way you can catenate strings and go is with the plus sign, just like you're adding numbers. But the compiler knows that the things aren't numbers, it knows their strings, so it knows you want to do concatenation. So this is concatenating v and the separator string, and then concatenating that with s and storing the result in s, this is actually just shorthand for s equals s plus v plus separator. So it's taking all these things together and concatenating them and storing them in s. Finally, we have a return statement where we're taking s and concatenating it with from strings, the value at last index for a slice and also for arrays, the equivalent of the get operator is written with square brackets with no colon inside. When you have a colon inside, this is a slice operation like here. But if you have no colon, and there's just one one value, that's in a get operation, but we wouldn't call it that and go and go we would say this is an index operation. Okay, now looking at the get letter function, it's a function which has a parameter found, which is a slice of strings, and the function returns a string. And then we have these two variables letter and alphabet that are both strings. And we don't actually need to declare them like this alphabet, we could just hear when initializing it, use that colon equal syntax. And then same deal for letter down here where it's being assigned to because it's very importantly in this case, letter is only used inside the loop. And the way variable declarations work is if you declare a variable inside a pair of curly braces, it's only visible within that pair of curly braces. So if we tried to use like if we wanted to like use letter down here, the compiler would not like this because as far as the compiler is concerned, this variable declared here only exists within these pair of curly braces. So this would now not be valid. If we wanted the variable to exist throughout the whole function, we would have to put that declaration back up here. And then it could exist throughout the whole function. But in this case, we only use letter inside these curly braces inside the loop. So we can put the declaration inside the loop. And also notice that instead of while we we just write for there's no reserved word while and go, we just use the word for for all of our loops and go, the condition is true, we have a pair of curly braces. And then we're getting the length of the letter, see if it's equal to one. And then our condition here is two parts connected by an and operation, this is the and operator. And it has a lower precedence than the quality operator here. And this function calls done first as well. So these two things are evaluated. And then the and operation is performed. And if the result of the and is true, then we enter the loop. So this is first testing if the length of letter is equal to one. And this is calling the contains any function, passing in the alphabet string, and then also a new slice of strings with just one individual string inside, which is letter letter again is a string. And so this is creating a slice of strings with just one single string in it. Again, we call a function, and you have multiple arguments, you separate the arguments by commas. So contains any here has two arguments, the first alphabet, and the second, this slice of strings, the update found function here has a first parameter found, which is a slice of strings, a second parameter word, which is a string, a third parameter letter, which is a string, and it returns a Boolean. And we start off declaring a variable complete of type Boolean. And again, we could write this as just one statement here to claim a variable complete of type Boolean with the initial value true, but we can leave the type inferred, and we can go even further and just use the colon equals syntax. So this is how most any go programmer would write this. And then we have our for range loop, we're looping over the so called runes of the string word runes, the individual characters of the string represented as integer values. And in this case, we do actually want the index, so we'll have a variable i here rather than the blank identifier. And we're testing if letter is equal to the rune as a string, we have to convert it to a string so we can do in the inequality comparison here. And if so, instead of the set operator to modify values within an array or slice, instead we do an assignment. And the target of our assignment is an indexing operation, we're indexing into found at index i, but we're not retrieving that value instead, we're modifying the value at that location. And we're modifying it to be letter. So it's a little strange because what we did as a set is instead, a kind of assignment as far as goes concerned. And then the next if statement, we are retrieving the value at index i of found. And if it is equal to this string with a single underscore, then we will assign to complete the value false. And then after the loop, we return the value of complete. Okay, so now let's look at our main function. And our main function is making use of two new imported packages, the math rand package and the time package both in the standard go library math rand is a package with a bunch of functions for generating random numbers. And time is a package for reading the system clock and for dealing with time values states and times. And down in the main function, we need those because we have this variable words, which is declared to be a slice of strings with this initial value with all these words inside it. And we want to randomly select a word from this slice. So we need to generate a random index from zero, which would be the first up to eight, up to an including eight, which would be the last word, we need a random number between zero and eight inclusive. And there was no built in rand float operator or anything like that, like there was in go pigeon, instead, we need to use the rand package. And rand package has this function int n, which, given a integer value returns in random number from zero up to that number. So line of words is nine. So if we call rand int n with the value nine, we'll get a random number that's somewhere in the range of zero to eight, which is what we want. And that random number we get back will be stored in index. The problem is that the way the rand package works is that well, the way random number generators work is they're not really random. They start from an initial seed value. And from there, they use complicated math formulas to generate a sequence of numbers that appears from that point to be random. That's that's very chaotic from that point, but it's deterministic. So every time you use these functions, and you start with the same seed, you get the same sequence of numbers. And so we need to set our seed so that every time our program runs, it's going to be different. And so the obvious solution to that is to use the current date and time and use that as our seed, because time advances always. And so as long as our system clock is properly always advancing, then every time we run a program, our seed will be different. To read the system clock, to get the current date and time in the time package, there's the now function, which returns a value representing the current time. It's a time value, as it's defined in that package. That's what's being stored in T here. But the seed function here from Rand is expecting this input and in 64, 64 bit integer value, not time value, we need to take the time and get it expressed as an N64 value. We can do that by using the Unix nano method of the time type, time as a method called Unix nano, which returns an N64 value. And that value is the time represented as the number of nanoseconds that have elapsed since midnight January 1, 1970. So here we're calling the Unix nano method on time and the syntax for that looks like calling a function from a package, but that's not what's happening here. Here time dot now, that's the now function from package time, Rand dot seed, that's the seed function from package Rand, Rand dot intent, that's the intent function from from the Rand package. But to call a method, what we did in GoPigeon is we had a special operator for an MC, they specified the name of the method and then the the type itself, which has the the method that argument is the first argument, and then any other arguments in this case aren't any other arguments just T itself. But the way it's denoted and go is that you have what would be the first argument in GoPigeon, that's actually goes before the dot, and then you have the name of the method, and then you have parentheses, and if there are other arguments, they go inside those parentheses, just like you're calling a function. So it's a little confusing because dot is used in Go to have a few different meanings. The general sense of dot is that if you see x dot y, then you're accessing y from x. And that's the case when you're accessing y, which is something from package x, it's also the case when you're accessing some method y of a value x, or when you're accessing some field y of a struct x. So dot has a few different meanings, but again, the general sense of x dot y is x is something which contains y, and we're accessing y from x. Anyway, moving on. Now we have our random integer index, which we can use to index into words and get back an individual word. And the number of guesses in our program as we established up here is equal to the length of that word. And found here is a variable, which is a slice of strings, and it's initialized with an empty string, because it's just being initialized with the default value for a slice of strings, arguably, some people might write it like this, because that's equivalent. It's just a new variable found, which starts out with the initial value and the size of strings, but let's just keep it this way for consistency. Next, we have a for loop in a special form, which is goes semi equivalent of four ink and four deck that we had in go pigeon. And there are three components here, separate by semicolons, this is the so called precondition. And then we have a semicolon, and then we have the condition semicolon, and then we have the so called post condition. And this is the body of the loop like any other. And what this is semi equivalent to is if we wrote our precondition before the loop, and then a regular loop with just the condition oops, and then we had our body of any number of statements, in this case, just one. And then the post condition is as if it's at the end of the body. So this form here is basically the shorthand for this here, the post condition is executed at the end of the body each time through the loop, the precondition is executed before the loop ever executes. And then the condition, of course, as usual, is just tested each time through the loop. There's only one subtle difference between this form and this form. And the difference is that here in this form, the variable I this counter initializing is in the scope of the loop, meaning it only exists in here. Whereas in this case, we've declared the variable outside the loop and so I is actually existing outside the loop. So in this form, if I try and use the variable I like I'm just say I wanted to print out the variable I, I could do so outside the loop because it still exists out here. It's declared outside the loop, it exists here after the loop. But if I try and do the same thing with this form, like if this were my code, then the compiler gives me an error because I doesn't exist here. So that's a very subtle difference. But it's the only difference. So this is a loop, which we have a counter variable I starts out with a value zero, our condition is I less than the length of the word. And then each time through the loop, we increment I by one. And each time the loop, we're taking our found slice and appending to it, a string with a single character and underscore, and as old as the pen we're signing to found, just like we did up in the original code. The next loop has a condition where we use the greater than operator, this is asking if n guesses is greater than zero. And if so, we enter the loop. And first thing in the function is recalling print line, and we're passing in three arguments. You may recall that earlier when we use print line, we didn't necessarily pass in three arguments, we passed in one or two. So what's going on here, because normally functions have a fixed number of arguments they're expecting, so you can't call them with different number of arguments. Well, print line is a special kind of function called a variadic function, where you can pass in a varying number of inputs. And when we write the prompt function, that'll be a variadic function too. So we'll see how you can create your own variadic functions. Normally, though, functions take a fixed number of arguments. Anyway, so here we're calling get letter passing and found and the result we're signing to this new variable letter, which is local to this loop, because it's declared inside the loop, it doesn't exist outside the loop, but that's okay for our purposes, using this variable letter. And then when we call contains any, the exclamation mark in front, that is the not operator. So contains any returns a Boolean, and this not operation gets us the inverse of whatever contains any returns. And then inside the body, we are documenting and guesses by one, this is again equivalent to if we wrote in guesses equals and guesses minus one, I can't type around my microphone, this is awkward. Or we could also write minus equals one. And this would also be equivalent. But this is the most convenient way to decrement a variable and go. So it's what you'll most commonly see. And then our next if we call update found passing and found word and letter. And if update found returns true, then we will print out this string and then word and return. And lastly, after the loop, we have this called print line with two arguments. So the last piece missing is we need to write our prompt function. But we want a prompt function to be variadic. So let's look just first at variadic functions, by looking at the sum function we wrote and making it very attic. The way we define some is that it's expecting a slice of ints as a parameter nums. And so when we call it, we create a slice events and we pass them in. What we want to be able to do is to find a function sum where instead of passing in a slice of ints, we can just pass in any number of ints zero or more of them, and just have those automatically bundled into a slice, which then is received as a parameter in the function. And the way we can do that is for the last parameter of our function, if it's a slice type, then instead of writing square brackets, we can write ellipses. And now when we call some instead of passing a slice of ints, the compiler is expecting us to pass ints themselves any number of them. And in fact, we can even leave it blank in which case, nums here will be an empty slice. If I just have a single argument three, now it's a slice with one value. If I have another argument, it's now a slice with two values. I had another argument to slice with three values, etc. So just all of these arguments here are bundled into a single slice automatically, it's just a syntax thing, it's just a convenience. And be clear, the the variadic parameter, the special slice parameter can only be the last parameter of your function. So if I had it in other parameters here, like just say s, whatever arbitrary stuff. Now when I call the function, I would, let's say I'd have to pass the string here. So in this case, three would be passed to a high would be passed to s, and four and six would get bundled into a slice of ints, which would be passed to nums. Now the only problem is having made it convenient to pass individual values as a slice without having to explicitly create a slice. Well, what if I have a slice that I want to pass to nums, as I do here, like say I have numbers here, and I want to pass that to nums. Well, I can't just write numbers, the compiler will complain that what it's expecting here is zero or more integers, not a slice of ints. So the way to get around this is you write ellipses after the slice value. So this is my slice events, and I put ellipses after and the and the compiler knows that some is very adequate knows that okay, this is passing the slice itself to nums. So it's a little funny, because we've created this syntactical convenience, but then there are these cases where we have to have a special syntax to fix the convenience, as we do here. Anyway, so that's variadic functions, it's really just a style thing. print line is a variadic function that takes in any number of arguments. So I can pass in any number of things, and all of these values are being bundled into a slice. The question, though, is that you may have noticed print line, we can pass in numbers and actually any sort of value can be passed into print line, because the way print line is defined is this function looks like this. It's one parameter, we don't know what it's good, we don't care what it's called, but it's variadic. And then the type is the so called empty interface type. And the empty interface is equivalent of what and go we called any. It's the special interface type that all values are considered to implement even types that don't normally implement interfaces. And it kind of makes sense that they call it the empty interface, because it's like saying, well, you have this interface, but it has no methods. And so automatically everything would be considered to implement it. Though I do think the way it's written is kind of annoying, I wish they just gave it a proper name instead of writing interface curly braces, but that's how it's written. Anyway, so I'm going to get rid of all this. And we're going to come back here and look at our prompt function. And so looking at the prompt function prompt is defined to be a function that takes in any number of values of type empty interface. So we can pass in whatever we want to this function, and any number of arguments, and they all get bundled into the slice vowels. And first thing we do is we test the vowels is not equal to zero. If so, if there were values passed at the prompt, well, we want to print them out. And we do so by passing the vowels to print line. And remember print line itself is a variadic function, taking any number of empty interface values. And we have this slice of empty interface values, which we want to pass to if we want to pass them as if we're passing them individually, rather than just one big slice. So we use this ellipsis syntax. And then what our prompt function wants to do is read from standard input. And I don't want to get into all the details here, we'll cover the stuff later. But what's happening is first off, most of standard in that is a global variable in the OS package called standard in, which is a handle to the standard input file. Standard input file is the file that you read from when you want to read the text from the console is also standard output, which is what you write to when you want to write out the standard console. And that's what actually print line and the print function do. But we don't have any convenient equivalent of print line in in the Fump package. Unfortunately, there's nothing that conveniently in one function call reads from the standard input. Instead, we have to do so using, well, there's a few ways we can do it. One way to do it is from the Buff IO package is this thing called a scanner, which you pass it in a file, we're passing it in here the standard input file. And it's this thing that when we call it scan method, we get we get back a scanner here, and then we're calling it scan method, and that's going to read from the file up to the first new line, which is what we want in this case, we want the user to type something in the console, then hit enter that enter adds a new line into the text. And that's what we want to get from their text entry. Anyway, so scanner, we call the scan method, notice that it doesn't return anything, it's just internally the scanner is a is a struct that will retain the data that it read from the file. Because we're dealing with a file, we're reading right from a file, there's always potential for something going wrong, there's various things that could go wrong. So we have to check for the error. The scanner has an error method that you should call after calling the scan method. It returns an error value. And that error value is of type error. It's a special built in type called error, which is actually it's an interface type that has a single method called error. So it's something looks like this way to find an interface type in go looks like this. This is defining a type called error, which is an interface, and this interface will have one method called error, which returns a string. And that's it. So this is the whole interface. It's built in the language, you don't actually have to declare this, it's it already exists automatically.  And this is a useful generalization for errors, because when bad things happen, and you want to represent information about what went wrong, you might have very different needs of how to represent that information, the simplest possible solution is just represented as a string. But in other cases, you might need much more elaborate information. So you might create a struct that needs to store a lot more information. But what all errors have in common is that it's useful to have a string representation that we can print out so we can read what the problem was. So that's why the error interface just has a single method called error, which returns a string and a message describing what went wrong. Anyway, so the convention and go is to use this error type to represent all errors. If you have a function that might go wrong, and you need to return an error, instead of using a string, we use this error type. So that's what the scanner type in the standard library does. This error method is returning to the variable err, a value of type error. It's an interface value. And so if it's nil, that means there was no error. If the if error is non nil, then something went wrong. Our function then needs to return the error value. We also have to return a string. But in the case of an error, we don't care what the string is, we'll just return an empty string. Anyway, so that's how we handle errors when we read from the standard input. And then assuming there is no error, then we can get the text that was scanned. Scanners storing the text, having checked for the error as we should do, it's now okay to actually get the text that was read. And that's what we return. And in the event of success, in the event of no error, we return nil for the error value. So that's the convention and go of how to handle errors. And of course, I don't actually really need this variable as I'm just going to do this, get rid of that unnecessary variable. Okay. So having defined prompt to return not just a string, but also an error value, we actually have to go back and make those changes in the code as I already did. So prompt here is now returning two values. The first is assigned a letter, and the second here is assigned to error. And anytime you call a function which returns an error value, you should check if the error is not nil. Because if it's not nil, and there's some kind of error that happened, and then our function should abort. So get letter itself now needs to return not just a string, it also needs to return an error. And the event that prompt returned an error, get letter itself should return that error. And in the event that there is an error, it doesn't matter what get letter returns, it'll just return empty string. And now because get letter returns two values, it returns two things everywhere else where we return, we also have to return two values. And in the event of success, in the event of not an error, we'll just return nil, as we do here, and as we do down here. And now because get letter itself might return an error when it's called, we need to go where it's called down in main, where is it right here. And we store what it returns in letter, and a variable error. And we check if this variable error is not equal to nil. And that means something went wrong, there was some error in reading from the console. And here back up in main is an appropriate place to decide, well, we got this error, and we need to read from console but we can't. So there's nothing really really we can do, we're just going to abort the program. So we're just going to return we we tell the user, hey, something something went wrong reading from the console. And then we abort the program by returning from main. So that's the basic pattern of how we deal with errors and go. And that's the entirety of our hangman program. Let's see if we can get it to run. Hey, something's working. Pick a letter a let's get invalid inputs. It's a spat. No, it's cat. Hey, okay, so our program works cool.


Into the feet of Mark Kondes, edge of the box, turns away, tries to find Sadie, who tries to roll the defender, brilliant again from Sadie. Can he get it shot away? Oh, superb from Sadie! Mark Kondes! That's the equaliser! And then he's all down to Christian Sadie. Absolutely fantastic centre-forward play. Riggled out a shot, and as the ball ran loose, Mark Kondes was there to tap it home. Time to count up how many Academy players are on the pitch now, but here's Sadie, Dom Sadie, down the left side of the box, drives one in across the penalty area, and it's an equaliser! What a moment for Brooklyn Genesini! With the minutes of coming off the bench, made by the two substitutes, Dom Sadie from the left-hand side, crossed it across goal, and Genesini poaching in from close-break. It's the Scotsman, Ryan Christie, scores, and it's all over! After 90 plus one minutes, the Cherries were heading out. After 90 plus two, they were level, and some minutes later, Ryan Christie's penalty sparks a mob of Cherries players in front of those supporters. Stannis last now, 35 yards out for Bournemouth. Positive stuff to the left-hand side, it goes, here's Jamal Lowe now. Low shot, he's deflected, loops over, and loops in! Jamal Lowe will claim it, there was a huge deflection, which took the ball, arcing over Asmir Begovic, and bounced into the right-hand side of the goal. Lowe celebrates on his first start of the season. Noxie back to Asmir Begovic, who's keeping goal in front of North Stannis, a bad slip by Holgate on the far side, and Christie's picks it up, right side of the box, comes in towards Jamal Lowe, swings for goal, deflected, and put in by Junius Stannis last. Or Everson got a warning sign a minute earlier with a terrible pass by Mina. This time it was a slip by Mason Holgate, as the ball worked its way across to the back post. Junius Stannis last scored. Stacey for the Cherries, now back to Dembele again. Looking to get those fast feet moving, little one-two with Antony. Dembele's call back, and this time to Ballo, and Marc-Ondes! Three-one, Bournemouth! It's the Cherries' Cup Specialist again! That's five-cup goals in four appearances for Ami Marc-Ondes. Johnny on the spot after Lowe's effort was saved. There's just a bit of pressure, and Jamal has rather... Dembele has pinched it, as Everson messed around with it. Patterson, Dembele into the box, knocks it square for Jaden Antony, goes past one, really finished! Everson dig themselves a grave in the Carabao Cup for the second time in the game. Some cute interplay to finish it between Dembele and Jaden Antony, who deserves a goal for his efforts, and Bournemouth have scored four!


Welcome to All Hands Update, I'm Petty Officer Mara Timberlake with your headlines from around the fleet. The Navy announced updates to the Navy Working Uniform or NWU Type 1. The updates include expanded options for boots and agulets where prescribed. Both updates are at commanding officers discretion. Sailors can watch a video showing all of the NWU components on Navy.mil or read NAV Admin 084-13 for more information. The aircraft carrier USS Nimitz departed its home port of Everett, Washington, March 30 for a scheduled sustainment training exercise, or SUSDAQS. SUSDAQS evaluates how ships work together in a variety of tactical situations and ensures the strike group and its crew are ready to deploy. The exercise will be the ship's last test, and certifying for its western Pacific deployment. You can read more about these stories at NAVY.mil. From All Hands Update, thanks for watching.


Partitioning relationships, partitioning could happen from solid to water phase alright. Saturated soils, pores are filled with water, CS is the concentration of the solids, concentration retained on the solids, CW is the concentration of the contaminant which remains in water clear. So, this is the KD parameter. So, imagine if I have 1 gram of clay and if I dip it in a solution of some molarity, some concentration of cations, how many cations have got sobbed on the clay particle can be obtained by detecting the CW from the initial concentration by using the ICP or Atomic Absorption Spectrophotometry. This is okay. So, CS is the sorbit which is sobbed on the solids and CW is a sorbit which is remaining in the solution at Eclutium. The second one which is quite intricate and difficult to simulate in the laboratory condition would be water vapor. Nature does it very beautifully. It is not easy to create interface between water and vapor in the laboratory circumstances. You must have heard the Henry's law, right. So what is CG? Here we use CS upon CW. This is CG upon CW. But the guys who are working in the field of climate science, aerosols, air quality analysis, for them I hope you realize the water vapor interaction is going to be extremely important. So, CG is the concentration of the gas which is getting sobbed on the solids divided by the concentration of the sorbit which is remaining in the liquid phase. So, we have solid water or we have water vapor, two types of interaction. Then you can compute the total mass per unit volume of the geomaterial by using these relationships, okay. So, theta W is the volumetric moisture content, theta G is the volumetric vapor content, theta is the volumetric moisture content which is equal to saturation into porosity. This is a gas component. This is the fluid phase component and you know this gets converted into when you are talking about no gaseous phase, this gets converted into the concentration of the solids, concentration on the solids and concentration which remains in the water solution. This is how the partitioning is defined. Do not write down this equation. You just understand, you get a chance to work in this area, you will learn it automatically. So far so good. I hope you are realizing the intricacies associated with environmental geomechanics henceforth. We are still attempting it. A good example of this would be gas hydrates where we have a three-phase system and you lower down the pressure or increase the temperature and the decoupling takes place in the material. Well, so to start with determination of sorption and desorption of geomaterials. Normally batch tests are done or column tests are done. Batch tests are you take some material, few grams of soil or geomaterial in a powdered form, why you have made powder so that all the particles contribute to the process and then put them in a solution which is in a beaker or a container. What is happening is that you are allowing 100% interaction between each and every particle with a solution. So this is the best possible form of studying contaminant, geomaterial interaction or the immobilizing agents. Unfortunately, this type of situation is not going to occur in the field. Why? Because the soil mass is in compact form. So all the surface of the grains is not really contributing to the interaction. Because when you compact it, what happens? A substantial amount of the surface of each grain gets hidden by next grain. So it does not come in contact with the contaminant directly. So that means if you are doing batch tests, you are going to get something which is very extremely lower value of the KD parameter. So what people do is they do batch test, sorry column test. So you make the columns and let contaminants pass through them and then see how much has been solved by the soil column or the geomaterial column. Now this is going to be realistic because in nature also you have soil beds but unfortunately this is a very time consuming process. Why? Because the permeation through the compacted soils and the geomaterials is time consuming, clear and extremely expensive. So this is going to give you a very lower value of the KD. But yes, these are the two tests which you can do. Whatever parameters we get from batch test and the column test, somewhere in between we have to select the right parameter for doing our mathematical model. So these are the two bounds of the KD parameters which you get by conducting laboratory experiments. This is where you can use centrifuge modelling also and I will show you some of the results which our group has published where centrifuge was used to obtain the KD parameter from the column test. We can also do these tests in the field. We can do field modelling test. There is another method which is known as distribution coefficient which can be obtained because of the presence of organic content in the soils. So the soils which have higher organic contents would have higher distribution coefficient. So there is a empirical relationship which has been given by KoC equal to KD multiplied by 100 upon Oc. So KoC is the organic carbon normalized adsorption coefficient and Oc is the percentage of organic carbon which is present in the sample. Do not write these things. These things are available in the courts and you can use them in case you are working on these topics. These are the courts and the information which is available already. I hope you can realize as far as the Indian context is concerned we do not have any guidelines. So these are mostly ASTM standards and the OCED standards. You know what is OCED? Organization for Economic Cooperation and Development. These type of treaties and the guidelines are useful when you are exporting and importing any material from any country that becomes a mandatory thing. If you send a courier through any of these courier agency they will take a declaration from you that this material is not toxic. There will be some 20-page gadget associated with these document which you have to sign and you have to declare that the material which you are sending as a consignment does not fall in the category of toxic material, export and import. So these are the standards and the international norms which have to be followed. The list of the parameters which influence the sorption and desorption mechanisms is big. Whatever comes to your mind can be written here but primarily surface area contributes a lot because surface area contributes to the cation exchange capacity also, pozzolonic activity of the material, liquid to solid ratio. What is liquid to solid ratio? If I take 1 litre of water and if I add into some salt of known weight I can create a solution of certain molarity. This is your 10 plus 2 signs. So this becomes my contaminant. In this contaminant if I add 1 gram of soil, clear? So 1 gram of soil I am adding to 1000 cc of or ml of water. So this becomes liquid to solid ratio of 1000 alright. So what I have done indirectly is I have simulated a situation which is similar to the pore solution. So all the studies I will be doing by using this liquid solid ratio where soil is 1 gram and the solution is 1000 ml. So the more realistic value would be 20, 25, 10 that means 20 times solution 1 gram of soil. pH of the solution, buffer capacity of the sorbent, temperature, grain size, presence of other ions, ionic strength, organic content, iron, magnesium oxides and the carbonate content. This list is very big. I have just given you some parameters which would be influencing the KD parameter directly. Just to remind you why KD parameter is required because you wanted to solve one dimensional ADE. You remember? So unless you get KD parameter you cannot get CT as a function of x, y, z and t. So the batch tests are you take certain amount of soil or the geometry in the powder form, put it in the solution, stir it over a period of time, heat it also if you want and then create different liquid solid ratios and then keep on dosing or sampling out from the solution and see what concentration of chemicals is getting sobbed onto the solid phase. So this is what I was discussing. The CS is the concentration of the contaminant in the sob form which can be obtained by subtracting whatever is the concentration in the solution after equilibration from the initial concentration multiplied by L by S. So this is how we do this test. These tests are extremely intensive to conduct. Each point you might be getting after few days. So there was my student Dr. Pankaj Patak. She did her PhD on this and I think she is one of the pioneers in the subject. She has published three international journal papers in ASC and two patents. That is really remarkable and the patents are in the form of the guidelines which have been created how to perform these tests. You should be aware that there are no guidelines which are available to select the concentration of the chemicals and that amount of soils and we realized from the completely negative results that if you do the synthesis of results properly you can get an extremely interesting idea which can be published in the form of a paper and a patent. So never ignore the results which you get which appear to be incorrect because there is a story behind that also. If you have time and if you sit down and apply your mind you will realize there is something interesting which has happened and which was going totally unnoticed. So at different L by S of the solutions when I take certain soil and when I allow interaction to occur what you are observing here is CE is the concentration of the contaminant in the solution. So concentration of contaminant in the solution decreases over a period of time. Why? Because this concentration is getting sobbed onto the solid phase and hence the sorption is going on. So after certain time what you observe is that concentration becomes almost constant. This is what is known as equilibration time. So for every contaminant and geomaterial the equilibration time is going to be different. So the moment you change the parameters here the equilibration time changes. Just so sensitive. Now how to analyze these results? How to get the sorption characteristics? So sorption characteristics are obtained by using these three mathematical models and these three mathematical models are known as isotherms. The term therm which is associated with this model is a miso number. It has nothing to do with the temperature because these are the plots of concentrations but because the concentration is very much susceptible to the temperature all these parameters have obtained at a constant temperature and hence all these graphs which are being shown correspond to a specific temperature. So what normally is done is you plot CS versus CE just to remind you CS is the concentration which is sobbed on the solid phase and CE is the concentration which is still available in the solution phase. So when you plot these two against each other these are the models which are used. Linear isotherm, Langmuir isotherm, Friendlich isotherm. You just understand how the interpretation is done. What you will observe is out of the three which are very common you can also come out with your own isotherm. So that would become XYZ isotherm. This matter is still the subject is under developmental stage. So if you propose a kinetic process it goes in your credit. So once you draw the straight lines or fit a best fit to the data which you are getting what you will observe with that some of the isotherms do not follow experimental conditions there are some which will follow better. So like in this case what we have presented here the Friendlich isotherm is giving very good results as compared to the linear isotherm alright. So this is how you have to train the experimental data. The slope of these lines is nothing but KD parameter. So here you can observe CS upon CE is KD clear. So once you have plotted these graphs you know the trends take the slopes this is KD parameter. So in most of the cases the slope of the line is the KD parameter. I hope now the methodology is known to you you can perform this test and you can use them. The best example of KD parameter would be in pharmaceutical industry how? I hope you know that the carrier of the medicines or the tablets which you are taking is a claymendal and that claymendal is dosed with different types of medicines. So the moment you swallow it you want to accelerate the desorption process or sorption process.  At the same time if I want to impregnate your body with some chemicals which are required as nutrients. So what I will do I will take these metrics of the claymendals charge them with that particular species of the bacteria, medicine whatever and the best way to inject this would be through your asapagus eat it it goes in your stomach becomes a part of the blood tomorrow. So sorption desorption in the best possible way can be practiced in this manner think about it. I hope you are getting now the applications of how to do this. You must have realized what we will do is after achieving the equilibration in the sorption you take out those samples which are fully contaminated put them in fresh water and as the time increases what happens the contaminants which were soft there will ooze out into the fluid phase and keep measuring them every time. So after a certain time what you will observe the concentration of the contaminants in the solution phase is going to increase and becomes constant. So this is a desorption characteristic and this is what is known as desorption equilibration time. Rest methodology is same you can find out the KD parameters for sorption desorption by using the same isotherms and you can designate the geomaterial contaminant interaction. Many people are trying to quantify this contaminant geomaterial interaction in the form of CEC and I hope you understand that CEC is linked with surface area clear. So why surface area becomes very important because it gives an indication of CEC and CEC gives an indication of KD they are all interrelated with. So you are trying to work on this model so that we can get rid of the conventional soil classification system. Conventional soil classification system cannot be used for environmental geomechanics applications because nowhere you talk about the geomaterials interacting with contaminants I hope you will agree with this, agree. But we have created so many case studies to make you convince that you cannot isolate the geomaterials from the environment, geoenvironment which is either manmade or natural. So this is becoming a very interesting debate in the international fraternity. Can we eliminate all these conventional tests and come out with simple parameters which would define how geomaterial interacts with geoenvironment clear. So once you have done this, this is going to be ultimate Brahmastra that is what people are trying to do. So we have shown here KD is dependent upon L by S different type of minerals are related to KD to CEC. We have shown that how KD changes with time, how KD changes with pH. So these are the subjects which have to be studied further. This is the thesis of my PhD student Dr. Naidu who is a faculty member now at IIT Chennai. He did remarkable work and he was the first one to crack this problem of electrical conductivity of a geomaterial contaminant system directly giving the KD parameter. So imagine if I create some probes or sensors, so sensors will give me directly the EC value and that EC value can I from that EC value can I obtain the KD insorption and KD in desorption. If this can be done, this would be interesting. Now comes the column test. Having talked about the batch test, we create a column here, something similar to the falling head per millimeter test which you normally do. This is a sample which is sitting on a porous stone and the whole system has been mounted on a base plate where we have two more concentric cylinders. What we do is we fill up the inner cylinder up to a certain point with the contaminants, they percolate through the sample. Whatever percolant comes or the leach ends come, they get accumulated in the middle cylinder. In case they overflow, they will get accumulated in the outer cylinder. So these are the typical column tests which are done. This is where we use the concept of the pore volumes. How much volume of the solution should be added which will ensure that the contaminant is passing through the sample and saturating all the pores. So this is a philosophy we created like number of pore volumes is equal to volume of the soil divided by volume of the physical volume of the sample. So if you see this term where the porosity has been multiplied, so porosity is volume of voids multiplied by total volume of the soil sample. So truly speaking, this is nothing but volume of the voids. So number of pore volumes are volume of the solution divided by volume of voids. So if volume of voids are unity, I have to add 5 times the pore solution to do these tests. We get a very interesting relationship like this. I hope if you concentrate on y-axis and x-axis, you will realize that this is also sort of a BTC breakthrough curve where we have Ct by C0 increasing with time first, this is a sorption process. And at this point, if I start desorbing, washing, I get the tail of the curve where Ct by C0 decreases very fast with time. We did this test in centrifuge, we saved our time and this was the first of this kind of the study which was done by somebody Dr. Naidu where we established the breakthrough curves in the centrifuge for a soil contaminant system. And you know how to get the KD parameters from there and what we have done is we have used this information to solve one-dimensional ADE. This is the form of the ADE, you remember del C by del t equal to diffusion coefficient del square C by del z square minus Vs into del C by del z minus the density of the porous media Kd upon porosity del C by del t. If I take this term over here, this will become del C by del t equal to di del square C by del z square minus V upon r del C by del z and 1 upon r here also, where r is equal to 1 plus rho dry density Kd upon porosity. Porosity can be determined by using porosimeters, mercury intrusion porosity meter MIP the best possible way, density of the porous media is known. If Kd is known, retardation coefficient can be obtained. So, by conducting these tests, you can get Kd parameter also and once you get Kd parameter, you get r parameter also and now you can solve the ADE. I hope you have understood the whole story. So, just out of curiosity what we did is we did centrifuge modeling of sorption desorption process. I think, I think you are doing a course on centrifuge modeling. So, the big question was can we model the phenomena in centrifuge and what happens in the prototypes and we model the time. TP corresponds to prototype, TM corresponds to model, N is the centrifugation effort. So, if I say that TP equal to model N to the power y, this is what is going to give me the complete picture. This is how we were doing this modeling of sorption desorption mechanisms. And what we observed is that we got for sorption, we call them as scaling parameters, scaling factors. So, for sorption process which is a slow process, if you remember, if you see this graph, you will realize that sorption is a slow process, contaminants getting assimilated with the surface, but desorption is very fast. If you see there the desorption time factor is 0.5. So, these are the interesting things which we did a lot is to be done in this area. I hope this discussion of today must have given you an idea about where we are, where we could contribute to the knowledge and what needs to be done further. The practical utility of these type of work is extreme and I hope you can realize that if you have to safeguard the environment against its contamination, many times you have to come back and fall on this equation and predict what is the impact of our activities on the geoenvironment, which if you remember, we discussed in the beginning of the course under the realm of EIA, Environmental Impact Analysis. So, because of any industrial activity, the waste is generated and if I am dumping the waste somewhere, anybody is going to ask me a question, what is the impact of this waste in the near fields and the far fields over a period of time. So, when you answer all these questions, you have to resort to the mathematical modeling. But as I said, it is very easy to resort to the mathematical modeling provided you know the coefficients which are unknown. And in order to get these coefficients, you have to do a long journey, you have to create your own setups, you have to derive the expressions, you have to analyze the whole situation and those parameters have to be plugged in over here, the suitable boundary conditions to get the answer. So, this is where we are, I hope people like you will contribute further and the subject grows much, much, much.