Okay, thumbs up, I'm starting. I'm Will Woods, this is a scriptlet forum in RPM independence. Building images in the container area, which is kind of a mouthful that I've been living with an academic for the past few years and academic use has crept into my brain. Will, can you be a lot more loud? Huh? Can you be more loud? Oh, I certainly can. Awesome. There we go. All right, so who's this guy? I'm Will Woods, I do stuff. I've done a whole bunch of things. Most of my career has been dealing with getting images sort of, or getting systems installed and booted. So like, once the system is actually running, I get bored. But all of our things that build images or do installs and things like that are things I have worked on. I'm also the person who said the phrase, BG Miracle, so sorry about that. Or you're welcome, I don't know. Thank you. So the main sort of thing that I want to talk about here as like background is where do the images come from? Because we have a whole lot of terminology and ideas around how all of this process works. And the last time we had a big talk about these things, I ended up, anytime anyone mentioned anything like a module or a component or a group, I would rate it down on a post-it. So we could try and figure out how these things are related. I ended up with a stack of post-its, like 40 high and we never figured it out. So instead I'm gonna tell you how it works. And really what it works like is this, and it's pretty easy, out in the world, so ignoring the way, just talking in the abstract, out in the world there are upstream projects and they release sources, they do source releases. We take those and we take a individual source release and build configuration, which is like, now a spec file, instructions about how to build things. Also all other like build settings and stuff like that. Put that into a build environment or the image build part there. And we do a build and you end up, so you put those things together and you get binaries to get a build.  This is a really oversimplified version, but that's basically how it works. And it's sort of important to make sure everybody's thinking about these things in the same way. And one of the important things is that it is a loop. You need a build environment in order to make builds, but you need the builds to make the build environment. So that's the thing we keep in mind. It's, you can get real mathy with it. And we kind of want to because one of the problems that we have is that when you're doing mathy stuff, like you don't have side effects. You add two in two, you don't get like four, but also a lizard is in your house now. You just get four. So we want to make our processes work a lot more like math and avoid side effects whenever we can. All right, so three comes in the middle there, but we'll come back to that. Take your time. But yeah, so this is roughly what we're talking about here, but there's one part at the bottom, right? Like you can kind of follow along.  And a recipe, well, okay, so you have a recipe which is user wants a few things and we can use that metadata and turn it into a manifest or like a list of the actual builds that would satisfy the recipe. Once you have that list of builds, in theory, if the world was easy, you could just take all of the contents of all those builds, smack them into some sort of container and be done, but that doesn't work. We need some sort of magic. There's some stuff that needs to happen in between taking all of the build out, put it and having it work in the image. And that's really, that's essentially that's where scriptlets happen and it's kind of a problem because it's magic and we don't really know how that works or what it's doing, but we can deal with this. So yeah, the magic is what makes this hard. Like in theory, the process of building an image, like I'm saying, should just be, all right, we've got all this build out put sitting around, cram it into a folder and you're done. Or maybe you have to do some other stuff. And we know some of that, but we really don't know what goes on. We have this enormous heap of magic scripts that happen and they do stuff. And because of that, we have problems like composers take a really long time. Sometimes it fails. We need root to do this for some reason, even though we're just, it's all just data. We're just moving data around. You shouldn't need to be the super user to just make an image. You're just moving files from one place to another. It's just moving bits around. So like, why is it all so hard? Why does it take so long? Why does it keep getting harder? Why do we feel like we're fighting with our tools a lot? And kind of the answer is that RPM was not designed to do this. RPM was designed as a way of basically delivering updates and other things. It's a nice little package format and it's a good way to, there's a bunch of stuff going on in our account. It's a build system. It's a packaging format and it's a delivery mechanism for data, but it wasn't really designed to make images. It was designed in an era where you sort of had, like, where the idea of having to build a whole lot of system images was not really something people thought about. You didn't have virtualization. You didn't have containers or anything like that.  So that was not what RPM was designed for. We've made it do all of this stuff, but that's not what it was made for and we're bumping into these limitations a lot. So thinking about what we're trying to do and that abstract view of what we're doing, we were gonna build it all now. The question, one of the central questions of what have you been working on for the past like year or two is if we were doing it now, like what would we build? What would it look like? And the more important part is how do we do that without just burning everything down and starting over? Because as fun as that sounds, it really, we can't do that. We have an entire enormous ecosystem built above and around RPM and we've inherited some of its limitations and we'd like to remove those, but we don't wanna cobble the entire tower. We don't want to blow up the engines while the plane is flying. We need to replace them. So that's what it is for. So this is what we've been concerned with. Project Welder is what we're calling the thing that we've been working on. Where Welder kind of stands for, well, it stood for a lot of things. The joke right now is it's been for the Wigum Enterprise Linux distribution we've lived in. So yeah, good for Ralph. It's sort of a experimental toolkit that we are working on and we've to look at how we could import build artifacts, store them efficiently and make it easier and faster to generate custom images, which is the things that lots of people wanna do and they have a hard time doing it. And part of this is also, we have a part called Composer, which is an existing and working actually. A cockpit-based UI and if you have for browsing, content building and building up recipes and composing images from those recipes. It's nice looking. I'm not gonna get too deep into that because it's sort of a different project than the stuff we're talking about here. The stuff I'm talking about today is more about lame foundations or making this more efficient. Because if we tried to run this thing using the tools that we had today for building images, it would fall over very, very quickly. It takes like 10 to 30 minutes to build an image and then you have to store all of them and it just wouldn't scale well. So we can get this working at a small scale but if we wanna do this in a much larger scale, we're gonna need better ways of building images. And a couple of quotes. I have a couple of little demos but I don't want you to, I like combining these two quotes, which is, you know, standard urgency part is that any solution has technologies and it's a ritual of magic. But as teller, a pen and teller has said, sometimes mad, but just someone spending way more time on something than anyone else may be able to expect. Which is a thing that has come up a couple of times. Here is, I hope, a demo of, so this is us using the welder toolkit to build a web server and build a Docker container that has a web server in it. Now I'm kind of skipping through it a little bit because I don't need to play a little deal but the important part right here is we've got, so we've got like a recipe, which will show. Yeah, so there's a recipe that lists some stuff that it wants to have in it. Oops, yeah, there you go. It's just a few packages. It's not important what's in there. Could it be included more than me? It's a video, it's a video. It's a video, so I kind of can't. Can you go full screen on the video? I don't know, can I try? Is that better? This is about the best I can do, but really the important part here is one little thing. Where are you at? So, Is that full screen button at the bottom right? Oh, there is one. Get bigger and bigger. Oh, much bigger. That was pretty bad. It's just bigger enough. Now, it's not super exciting, like text-based demos are not the best thing, but really what I want to show off here is this. The time it takes to do this, because we're gonna generate an entire, all right, so I'm gonna type my password and it's doing dev solving. It started with compose and in a couple seconds now the compose shouldn't finish and it starts doing a Docker import. So at that point we're done. Like that was a complete compose of a web server and the rest is at Docker import and then it takes a second to start out. It's mostly just IO down at this point and there you go. We enter the image and whoosh. So the problem is it doesn't work and I'll get to why in a minute. The second demo is similar, except this time it does work. It's the same sort of thing. We're gonna generate an image, except we're generating a Kikai 2 image this time around and we're booting it in QMU. And so, I mean this one takes a little longer, mostly just because we actually need to build a, or we need to do formatting and stuff of this image, but it's roughly the same thing. I think this one takes about 15 seconds, 20 seconds, something like that. The current, a lot of the stuff that we're trying to do for continuous integration, I think the average run time from kickoff to startup, there you go, it's already booted. So yeah, the usual time I think is about 10 minutes right now, so we're getting into about, yeah, in the range of 30 seconds and let's give it, try to optimize this yet. So yeah, here we go. It's now it's booted and I can log in and I'll log in and then you'll see me. Yeah, oh yeah, there's no net stack. Oh, but the demo continues, right? This is where you add in. Oh yeah, well yeah, well this is where I do a nasty bash hack. Yeah, to see whether or not the port is open, it isn't. And then I start the web server and it starts. So the point here is that we can build custom images really, really quickly that work like they're supposed to. And, oh and then I'm gonna go, you know, in this demo I go through and I do some other, not in the sense of throwing the package, it contains net stack just to sort of prove that yes we are building custom images at the time you ask and this isn't like, you know, smoking errors, it's a little bit smoking errors, but everything's smoking errors, right? But there we go, we're creating everything, built the image, it's doing that, right now it's doing some disk processing stuff because it's creating a QCAL and then it'll boot. So the point is, it works, it makes images that work and it works real quick. Which is gonna be, which would be super helpful for things like CI and CD. So what's kept here, sorry? What was kept here to be lost? There, yeah, so there is the question, how does it work? So there's a bunch of parts to this whole thing and mostly what we're skipping is scriptlets, but we're skipping a whole lot of stuff. So one of the things that we're doing is we've got, instead of pulling us all out of RPMs, instead of decompressing all of the RPMs, we've got everything stored in what we call VDCS, the binary data content store, or originally the big damn content store. It's deduplicated by other storage, it's built on OS tree, it's doing file-level deduplication, so we're not storing multiple copies of everything that's in there. And this is super helpful because 99% of the time, two subsequent builds are 99% the same thing. It's a couple of one-line changes or a small patch. And so storing, instead of having individual RPMs or everything, so by storing it in this form, it's equivalent data, but we're using a lot less disk space and we can pull things out a lot faster because we don't have to decompress the entirety of every package as we go through them. So yeah, as you can see, it's generally around 50% or less of the size depending on which dimensions you're putting in there. For Fidora 26, I just put in every arch but only the GA lease and it's about half as much disk space. The trial with REL, we just did one arch, but we did it over time and it went down, it's eight gigs instead of 22 gigs. That's compressed RPMs on the left and uncompressed but the view doesn't vary. Correct, okay. Are you sure it's uncompressed? They're actually uncompressed. Yeah, they're file-z's, so I guess they're gzipped but we're not compressing the entire thing into anything super heavy. So is that the input or the output? Those are the, so the BDCS is where we store the, we take all of the RPMs and instead of storing them in a yum loop, we cram them into the BDCS and this is partly just to make it so that we have a different, we have different forms of how this stuff looks on disk and what we can do with the metadata, which is the next thing, the MPDB, which is actually just part of the, what's the word? It's part of the BDCS but we kind of think of it as a separate object. We need to embed it in every seven gotten area. This is all very like early alpha prototype stuff but it's really an exercise in thinking about how we do these things. So the metadata database that goes in there, it's RPM-credited, we're just cramming it into a big SQL database but we're doing slightly different structure of it so that we can extend it if we feel like it. We could do things like have, we have, you know, we keep capturing sub-packages but you could do other stuff. We could have multiple markers for things that are like both docs and binaries or there's a lot of possibilities that we could open up if we started adding arbitrary data into our data stores and we can go into that in a little bit but I wanna kind of talk about the script like bits cause get out of here. There's a lot of interesting stuff we can do with more metadata but that's sort of some blue sky stuff that I wanna get to in a little while. So the other thing is we're using our own depth solver, a modular depth solver in fact so that we could extend things. It's a standard three set based depth solver thing like they've solved, it's a very well-studied problem. This is some fairly easy computer science type things. So we have a RPM compatible depth solver that's not using the RPM code base so that we can do RPM things but we could do other things too. So when you say RPM compatible, do you mean actually compatible or just work with the same thing? Let's talk about, yeah, let's talk about equivalence because a lot of times we talk about things being compatible or equal and we don't well do a good job of defining what we mean by that and we're kind of cheating a bit here in that we define whether it's compatible as whether the outputs work. So I don't care whether or not the dependency-solving output is identical to RPM or young, I care whether or not everything the user expects is in the output and whether the output works. So... Not compatible. I mean, what depends on what you mean by compatible, right? We use the RPM metadata, we get approximately the same results, we get working images and we do it a hundred times faster. So... And also we can extend it. The core of this is generic. It's just a SAT solver. So we could add modules for any other types of things we wanted to solve. In theory, we could do stuff like we could teach you about, say, cargo crates and just start pulling in rust crates and rather than having to manually repackage things, just pull them directly into the BDCS as they are and then a user can construct their things out of red hat content but also upstream content or Fedora content or whatever they can get their hands on and whatever we know how to do. There's probably some wrinkles to that but so far there's no technical reason that couldn't work. We just need to get enough metadata to understand how it works and most of it's already there. And also things like plugable policies. There's things in modularity land where you're gonna work out what I have. Sometimes user will want the newest version of the package if there's multiple providers. Sometimes they'll want whatever is the best or what is recommended by whatever and so having more types of metadata and more inputs for that allows more flexibility. We wrote it in Haskell. Oh wait, that's the wrong one. Wow, whatever. We wrote it in Haskell because, there it is, partly because all of our previous stuff is in Python and Python carries with it. You have to have your entire runtime environment. You have to have, and you have dynamic typing and so you end up with a lot of like none type errors so it's harder for us up front but the type system and things ensure that every time we hit it, every time we have code it doesn't compile, that's one mode that's not reported. We have to fix it before it goes out in a while. It's also really heavy into referential transparency and not having side effects and as I'm saying, for a lot of the problems that we have with our VM as it stands is about side effects and not knowing what's going on with scriptlets. So there's a whole lot of really nice stuff about working with Haskell for this sort of thing. It doesn't have to be it because mostly this is a research and development and experimental thing where a lot of what's gonna be born out of this project is not like code but sort of blueprints for how to do things or data or schemas for storing things. So, and you know, plus Facebook's using this so it's cool now, right? So yeah, it's, our time compatible, what, oh yeah. Is there an Easter egg in the second to last bullet there? We might not understand what that means. What, I mean, if you've ever looked at Haskell, yeah, everyone's like, well, what's a monad? It's just a mono in the category of endofunters. Like if you have any background in category theory, I see trivial. Oh, thanks for that, I quiz that right now. No, Haskell is sort of, Haskell is kind of an obtuse programming language because it was designed sort of for and by computer scientists but it's finding a lot of the concepts of functional programming languages are finding their way into mainstream programming paradigms and everyone's like, wow, this stuff is great and all the Haskell guys are like, yeah, we told you so. So there's a lot of stuff about referentially transparent so we always know exactly what's happening in the coded labs for really interesting stuff. Like, when we know, there's not gonna be, when we know that two pieces of coding aren't going to interact because we can see every point that we could and there's no side effects to any of the things where there are hidden interactions, you can do things like automatically parallelizing code just tell it to be parallel and it does. It's pretty cool. It has a lot of really nice stuff. It's not as easy as writing Python but really important code, I think. It's all right if it's hard to write if it gets written well and it doesn't get supposed to. So yeah, what we're talking about here is ArcM compatible but ArcM independent is the goal that we're shooting for. Where it does everything it's supposed to do but without using any of the existing code base so that we can figure out what, part of the larger problem here is that we as a sort of community and ecosystem don't know what all our parts are doing and if we want to improve them, we kind of have to pull them apart and look hard at them and be like, what are we actually using ArcM for here? Sometimes it's like, well, it's a pretty convenient data storage format. Well, there are better data storage formats that could be equivalent and that's fine but sometimes you have to know what all the pieces are to actually be able to know whether or not it's equivalent. So even just the exercise of trying to make equivalent software, it doesn't have to be successful. It still allows us to understand what's going on and improve things because we've identified how all the pieces fit together. So there's still value in that. So, scriptlet reform. One of the reasons this is important is when you look at all of the scriptlets, when you do a compose normally, we end up with a list of like 300 packages to 1500 packages depending on what kind of system you're building and the reason that what we do is fast is that we're skipping, basically we're skipping the scriptlets because normally you have to do install package one, do a pre-script, install payload of package one, F sync, do post-script, F sync and so on and so forth. It's very slow and a lot of times there's a lot of leased effort. Look at the pre-trans and the pre-post. Yes, there's pre-trans, F sync, pre, F sync, install payload, F sync, then post and then F sync and then maybe another post and then yeah, there's a lot going on there that doesn't need to be happening because at the time that we start the transaction, other than that wrinkle of scriptlets, we know exactly what files are going to be in that file system and then we need to run some scripts and because we don't know whether or not any of those scripts requires anything that's in the previous packages, we have no choice but to run them in order. We cannot reason about anything that's going on there, partly because we, like, our view doesn't give us any way to express it and we can't introspect on it. Like, what does that do? I found six different, I, the, just to make it a good quote. It's an empty file. Right, I found six different ways that scriptlets create empty files because I went through and read literally every scriptlet in row seven because sometimes magic is spending more time on something than anyone can reasonably find useful. So I went through and read literally every scriptlet in all of row. Yeah, exactly. Why would you even do that? It's because somebody's main file did that. Right, exactly because scriptlets are written by individual contributors, often little silos and they don't know, you know, and there's, we have some guidelines but there are no hard and fast rules about how things should get done. Nor are there tools for the common tasks. Nor have we really identified what the common tasks are. We're just sort of like, well, here's a hook. Best of luck. And so we have this heap of scripts that's sort of accumulated over the past 15 years that are maintained by disinterested people who don't necessarily know anything about Shell. The Java package scriptlets are a thing of horrific, Lovecraftian beauty. But anyway, so ignoring all that. Oh, and also there's the fact that it comes, there's like three separate Turing complete languages in there because you have Shell and Lua and also the template language itself is Turing complete. So in your review of all those scriptlets, did you find like meaningful scriptlet functionality that like did something that you need to take into account? I did. I found six, 99% of them are doing one of these six things. So yeah, mostly what happens here is one of these six things. There are some stuff that's totally insane where it's like, oh, let's load a kernel module because I might want to use it. Or I'm gonna, despite whatever the user might want, I'm gonna do forcibly turn on this service. Or there's a lot of, there's some questionable stuff that doesn't even have them. But 99% of it is doing one of these six things. And we do have tools to handle all of these. We have, you know, there's like system D now has stuff to handle this, a lot of them. Creating users and groups, we have sysusers.d. I would say we could just use that, but there's sometimes their file formats might be a little too simple. There's the whole problem with sysusers.d. If you try and tell it to make a user with a zero, like say zero day as a username. Yeah, you end up with a root user. Sometimes file formats can be a little too simple and this is why types are a good thing. You go back to Haskell for a second. Because if you know you're expecting a string, you don't care that it starts with zero. So you might want to be a little more. So part of what I'm sort of proposing here, and I haven't really, I'm still working on the schema and all that, what I'm proposing for a first step towards improving the entire ecosystem, allowing more of what we're doing to happen is that we identify all of the places where these tasks are happening, create standard tools that handle those and convert templates to use those tools. So to give you an example, the users and groups one is the easy one. I've got a nice long JSON, or I've got a schema here that basically says everything you can do when you're creating a user. This encapsulates all the stuff that happens. And it's not super complicated, it's long, but it's just like, okay, yeah, your GID is gonna be an integer. So this is a schema that describes everything you can do with a user. And so then what a maintainer would do instead of doing their, there's like, I've seen like six different ways that users get created in script that's all set. Instead, you just do that. And so, and in fact, what you would do is wrap it in that. So what you have here is, it's equivalent to what they had before to whatever user ad and all of that line is, except the logic of whether or not to add a user and when to add the user would be handled by the interpreter. Now the fact that we're using an interpreter here is that has two purposes. One is that we have some tool, a standard tool to handle it. The other is that external tools can examine the headers of the RPM. And when they see that that's the interpreter, they know that the content is gonna be that. And so we've moved from opaque code to nice introspectable data. That does have to be pre and not post. Does it? Yes. There's otherwise the RPM when it installs, the files have to be right. Oh yeah, it'll change. Yes, well see, there's another like, because I think you can just lay, I'm gonna lay down the files. I think RPM stores them. No, RPM does store them as strings. So yeah, RPM wants 30 to use the file and then it looks like UID from there. So this would have to be pre. One thing I would note at this point, this is not going against RPM for most of the fold. Yeah. No, I don't think so. Essentially it's a macro processor by itself. Yeah. That's just use of that. Yeah, exactly. And so the more, so this is one, this is a good example of a way that we can make changes to our ecosystem to allow us to do some really interesting stuff without burning the file down. With this sort of thing in place, we sort of think it in the demo that I showed, the second demo, we sort of think that we went through and looked through all of them and found every time something was creating the user and we just have a hack that creates every possible user before we build the, or when we build the image. But with things like this, we know what we can examine the payload of what we're trying to install and we can know whether or not we need to create users or we can do it later. We can reason about when and why we need to do certain tasks. For instance, going back a bit, like these scriptlet tasks, some things like registries, caches and things like that, you don't need to do those until, something you don't need to do until first bit. So if you're pressed for time, like if you want a dash dash turbo switch, yeah, just skip all of the registries until first bit. And actually nothing of type four should really ever exist in a spec file. Trying to get to the point where it isn't. Right. Our VM file triggers should seeably take care of everything. And almost all of that is already done, except for LD config because G-Lub C is resistant to change. But there's still the problem of knowing that that's what's going on in a post script. You still, like we still can't, well, or in a trip, like we can't just assume that every file trigger is a cache or a cache catalog or registry. Some things are required in some, like some things if you don't run it, your stuff's not gonna work. Some things, yeah. So having a way to express that sort of metadata is super useful. I'm just saying that the package itself should care. Right, well that's the long term goal is to get this stuff sort of back into data where you declare what you want to happen and the tools figure out what to do rather than being code that we just have to run, and we have to run it as root because we don't know whether or not it runs root and we have to run it immediately because we don't know whether or not we can do it later. And so one of the major themes about making this stuff faster and more predictable and less hard is any place where we can take complexity and declarative code and turn it, or complexity and code and turn it into nice data is a really good idea. And yeah, we only have tools that handle most of this stuff but it's just having a standardized sort of interface and we can have like a nice little RPM script that, or a RPM macro that would just be like percent user, whatever, and then give it the necessary stuff and then we expand back to whatever. I still want to see the interpreter line in there so that external tools can identify what's happening. So two, six, six. You can have multiple scripts. Yeah, you can have multiple for all of these. You can have multiple scripts, you just separate them into multiple. You can have multiple pre and multiple posts and it just runs them in order. Yeah. And the other part is that this allows us to actually do security holding, to automate the security holding before the change comes into the election. Exactly, and yeah, another thing that this allows is that in theory you can confine these things. Anything that has that interpreter should not be reading or writing to any file other than Etsy Shadow, Etsy Group, and Etsy Password. And if it tries to do any of that, no, you go away. So it's a nice little security there. I have ideas or I have schemas written up for some of the other tasks listed here, but I kind of ran out of time with my slides, sorry. So that's the sort of general idea that sort of the background and the big ideas, but also this one very specific little slice that we'd like to get moving on to enable us to make forward progress. So yeah, that's sort of my pitch and some background. Are there any questions before? So what you envision with this is you are hoping to get to a model or a universe where most of the art cams you care about, you can, your new dev solver or installer can actually look at that and say, oh, all of these scriptlets are run using interpreters I'm familiar with and I know that I can safely bash the activities that they're doing until the end. Yep, exactly. Or, and there's other nice things about that. Like you can, if we start marking, well, the ones that are turning services on and off, what if we were having a scriptlet or if we have RPM spec files to clear in what services are in there. And then you can look at a set of packages and say, and let me know exactly what services are going to be in the resulting image and whether it will be on or off by default. And then you could say, overwrite that as a user. Doing more, letting it be more of scriptlet or more data oriented allows us to reason about what's happening, rather than just having to dump it all in the box. You should only need to have the list of the services because the presets already handle which ones will be on and off. And if they're doing otherwise in the RPM, they are breaking rules. Yeah, it's surprising how much that happens. Well, yeah, I mean, actually just the audit, just the work you did to collect that data. It's actually terribly useful because we're trying to get, in the packaging guideline, there's one way to create users. That's the one you should be using.  Rather it'd be automatic, but. Yeah. Did not know if it was about real. What's that? The beauty of the real is being done. R-H-E-L. Yeah. Not for gold. I went through a lot of Fedora and I don't recall whether or not it was the same situation. I mean, there's a lot more so it gets a lot weirder on the other side edges. But no, I was in Braille, I was still finding things like non-standard, like programs I didn't even know existed being used to create users.  That's new. Those technically should be considered bugs. They should. Not in real, but in Fedora, yes. Sure. But even if we standardize on a standard script that people should be using, if it's a script, it's an opaque code and we'd have to go through and change all of them later. Except that you could do that in an automated fashion, whereas if they followed the pattern or as if it was random stuff, then you could just. The other thing that I've started doing is writing a shell parser that simulates shell to look at scriptlets and figure out what they're doing. So we can kind of convert from existing scriptlets to this format, to data formats. It's not complete yet because parsing shell is horrible, but it worked enough that we got a complete list of all of the places that users were being created. And we could probably extend it to other stuff. It's good. I imagine that that will be more like, depending on how easily we can convince people to convert scriptlets, it might be the case that we want to have something like that as a sort of like the Python two to three tool to be like, run this against your scriptlet and it'll tell you what you probably should be doing, but it'll also tell you if it's stuff, there's stuff that it doesn't understand that you need to deal with yourself. Or we can just say, everybody has to re-convert all their stuff now. But first we need to define the actual tools and all of that. And the tools are in progress but not finished and the schemas are in progress but not finished. So that's a couple of ways off, but yes, 80%. Nice. At the time, first it's like, October or September? That's like, I'm writing this answer down. Nice. I'd say like if it was my only priority, we could probably have something like that. We're just having the tools. Something, yes, so that actually works in packages and say, can we put this in your spec? Well, so, are you in the technical side of it or the political slash policy side of it? Because I can't predict what it's going to be for right now. What's that? It's all solved. When is the rough timeline when we cut over for I guess, when we open up for, what about F28, 29 or even, what month is this? 27 recently, we're at just 28. Okay, we just started, so we just started 28. So we could, I mean, definitely 29, we could probably start doing it in a, we could probably have tools ready for at least one of the, I mean, for at least users in the next month, easy. So next couple of weeks. Are the interpreters, are you suggesting those be written in Haskell as well? Whatever, they should probably be written in something that compiles to the native binaries. I would write them in Haskell just to get my Haskell muscles up, but. Then does the modularity people care that you now put Haskell in the minimal set of things that you need to get in? No, it's a build group for criminal. Yeah. They sort of care. For self-hosting? No. Nobody has a build group for criminal. Yeah. The build group, the build group for minimal has to platform is a lot bigger than minimal. Right, but you're trying to shrink. But if you just take Haskell in there as a hard dependency then. But if you start talking about the larger picture of what we're actually trying to accomplish, which is to say making it so that you can. A point that I didn't make really well here is that we're constructing images totally differently than we have in the past. And that we're constructing them using none of the tools that are inside it. We're constructing them completely from the outside. Which means that's a pretty major shift in thinking. And so things like, well, what's in the build group? It's like, I don't care what's in the build group because the build group is a totally different system. Maybe, most people already have pandoc in their game. Yeah, right. But somebody cares. Somebody else might care. There are people who are trying to figure out the minimal set of self-hosting which includes being able to build itself and install itself, which, I mean, there's another effort just down the hall that is worried about things like adding Haskell to that minimal set. That's the only reason I mentioned it. Haskell's more important than Rust right now. Well, sure. Haskell has dynamic linking, doesn't it? So the wins, as far as I'm concerned. I would suggest not blocking on the decision about whether or not to. Oh no, of course not! Yeah, I mean, I can write these things in Python but I would not be able to use them. And I would not want to be able to use them. And I wouldn't want to carry that because then you have the problem of it being in the pre-scripts for things. Right. So there's a little bit of finesse to be done there. Wow. So, yeah, write it. Because you didn't have to. I mean, we can extend the RKM. I mean, we could add a macro that's percent user, you know, and just do that and it would expand out to the part with the interpreter. So like behind the scenes, that's what it would be. But the user doesn't need to, or the maintainer doesn't need to handle that. And that would be my goal. I just kind of write out a time for that in the slides. But yeah, adding a set of macros that would do this for the maintainers. We will go eventually. Yeah. I mean, it's user-feeling to part. Yeah, exactly. But as long as the macro expense is something that has a well-known thing in the header and we know what the data inside is going to look like, then you unlock all sorts of new tricks. Something. So you could actually do the macro now? Yeah. And it could expand to what we use now? Yes. And then behind the scenes, it expands to, what, something else later? There you go. And then, or it could expand to two things, one of which is just creating a new header that we use. There's a lot of ways to do it. Okay. I... So one of the things for the interpreter is the assumption that you're never... That you're never meant to what? So you're just going to say, like, user then, well, the, like, add user, right? Right. If you don't put, like, a version of the map because anything is... I mean, that's fair. Especially user accounts, I'm not as worried about that for, because, like, user accounts haven't really changed their schema in 40 years. But no, for the other stuff, that's a fair point. I think we will really have this sustained doing the local account storage. There's always stuff that can change. Yeah. One constant. That worse is the conversion that they're somewhere. Yeah, it's probably a good idea.  Yeah. People don't have to see it. Yeah, the idea, yeah. That's the sort of thing that we could probably hash out sometime during the rest of this week is that sort of thing, because this was just sort of, like, the general idea is, hey, more data, less code. Did you mention this talk? Oh, yeah. And do you want to plug your talk, or do you want me to plug, because I don't actually... Well, I plugged it this morning, but similar things. We've got a bunch of stuff that... There are a bunch of scriptlets out there that do things like set up system-specific information about a service when it's installed, which is really bad when trying to generate something like a container image or a virtual gold master. So a while back, I worked up some packaging guidelines that I wanted to plug about how we can take those things and make them using SystemD to work out... To solve them on the first start of a service rather than at installation time, so they can also be wiped at any time to reset essentially the system to factory defaults. And that's scriptlet task number six. Right. So that's... Yes, exactly. So that's a talk I planned to give on Thursday morning at 11.30. Right. Anything that's generating, like, a unique ID or an encryption key or things like that. Yeah, that needs to get... It's certainly the other problem is that the scriptlets are wrong in using SLINU's specific context. So some of the operations will be denied under that context if it's launching certain things as a part of the... It's not a great scriptlet. Right, right. So having a separate interpreter needs to be doing SNI's transition or transition into a more confined domain. The mechanism I developed also could be a transition. For example, we can use system control because that's just a debug score, so we can confine what the system control under RPM scriptlet can do in that context using debug score to system D. But if it's something like your default in store, you showed it on the previous slide of the install, that's something that you just can deny completely in the RPM script or RPM install context. Yeah, I mean, really, this should be a line that declares I want this file to exist and have this mode. And that's a different theme. Yeah, absolutely. This is real quick. Right now, RPM is on the street today. When you're doing composes, not yet when you're doing composes on search side, but on the client side, we actually run... We basically have, like, an 80% rehabilitation of blue RPM. We run the scripts in bubble wrap. So, like, right now, every RPM scriptlet, like, so I'm on my workstation, I have a couple packages later, but those scripts don't have access to my home directory. Like, they just can't see it. We don't actually disable system CTALE because, like, part of the whole idea is to do an offline update. So rather than change your current pre-processed system and potentially restart soft services, but not much today. So, like, yeah. I think we'll have to try and make sure some of their efforts are aligned with, kind of, because we have it wider. And I will say that some of this stuff, like, mostly the object ingressions and caches, there's a lot of stuff that does that, and not all of it is designed to be able to operate from outside, or is not. I don't know if all of it's arched neutral, or I know not all of it is designed to operate from outside a system. A lot of it is, as far as I can tell, any of the tasks, except number four, can be done from the outside of the system pretty easily with existing tools. A lot of the registry cache type stuff can, but it isn't currently that we get shifted, and some of it just isn't, and that's gonna be the tricky part. Part six is potentially arch-specific. Right, anything that's system-specific should not happen until first boot, like, obviously. Yeah, that is exactly that topic. Yeah, and that's what we're talking about. So, as soon as we conclude you don't want, kind of, a system dependent with two, three should be trivial. Three's basically temp files, .d, and system temp file, right. Six statements can be solved. Yep. So, how many problems are four and five? So, five is arguably actually more like, you can make an argument that some of the stuff that's one and five, like, creating users and groups, and messing with the firewall configuration, you're really just sort of modifying a system configuration file. So, like, you could probably merge these together. Conceptually, it's easier to figure it that way. Making those declarative would be a big step forward. But yeah, exactly, and the existing tools that fall under the bucket file for system configuration, I think, can be used for any outside right now, so probably we can figure that out. But it's, yeah, that fifth one is sort of a miscellaneous bucket at the moment, so a little more research might be needed, so far it hasn't yielded anything scary. For, there's a lot of stuff that's like, okay, and then you have to run, you know, whatever code inside the thing. And everyone's just like, yeah, sure, that's totally cool. Run whatever binary you want as root every time I update this package. That's great to me. That's not my favorite. And a lot of those things are really old. Things like term info files being compiled. Like, I don't know if the term info guys were like, someday people are gonna want to create Docker images. Like, no, they didn't think of that. So, like they're gonna, there's gonna come a point where we're gonna hit some necessary tool that needs to build something that's not technically art specific, but it doesn't know how to build from the outside. And we're gonna have to like, think about modifying the tool to do it that way. Because I really, really believe that for the long term, health of like, how we construct images, doing them from the outside is the right way to do it. It's the only way that makes any sort of sense. Do you, and if this is obvious to everyone else, you know, forgive me, do you envision a day where the packaging guidelines forbid arbitrary batch scripting? That would be my first decree, like, oh my God. I'm sorry. Talk about that. I found that most of the time when you find it, it's things you really wish shouldn't be in there. Like, I'm going to modify your existing configuration file for this thing. Yeah, there's a lot of like random set, and I definitely found like places where people do it wrong. Like, I found a whole lot of bugs in Scriptlets where it's like, oh, you got your, you got the sense of this test inverted so that will never happen. Cool, well, okay. And in that sense, the migration from, you know, in it to speed, in it to system D is illustrative, right? Because you have these examples of all sorts of weirdly arbitrary ways of doing start, stop, restart. Except that there's- Yeah, there's, there's only, it's just a couple of macros and there's only two different patterns you're supposed to do. And it works tonsider, they're all better off. Exactly. And a lot of people are just so angry about it. As long as you can handle people like, all right, like, you can't do whatever you want, but all of the stuff that you want to do here is, you know, here's an individual tool for each of them. Like, people don't seem, well, no. There are plenty of people who don't feel mad about that, but they're the sort of people who are mad about anything when it's different. That's the 20% you haven't finished yet. Yes. We are out of time, but I'm only gonna talk about this for hours, but I'm gonna say, after five more minutes, you have to buy a new beer if you wanna keep talking about it. All right, now, I'll buy new beers. Hell yeah. You use OS tree in an intermediate format with the things you're generating are like regular admins at this point. We can generate OS tree output. It's not RPM OS tree because we're not generating an RPM database inside the output. We could do that and I've kind of come to the conclusion that we might have to synthesize an RPM database in our output and Colm's had some suggestions and tricks around that, but I really don't want to. Because in theory, so if you've got a system where you can almost instantaneously, like the reason it takes six seconds is because we haven't optimized it yet. It's almost instantaneous. We're IO bound essentially in creating images. So if you wanted to update an image, like why are we building an RPM database inside it afterward? Why don't you just generate a different image that has the stuff you wanted in it? That would be faster and easier. That covers a lot of use cases. Exactly. We having your RPM database or generating a new memory? Generating a new memory. Well, the other thing about doing it like that is that, yeah, it's almost instantaneous. We don't have to save them the disk. Like we can just write them on the fly as soon as you request them. Also, like if we're doing it so that the recipes are all deterministic, like if we know, okay, you did it on this day, we know you had this metadata and this recipe, therefore we already know what the output is. If somebody, and if somebody already did that and we cached it, we can just hand it to you again. Like maybe it's a little more messy. We need this in production. All this information, I mean in production, the metadata about what's in the system. Yes. How the things that aren't on the image that is being run, different from what was installed originally. So if the config files are changed and something like that, because the whole source report tool that we use in Red Hat support depends on that. Yeah. So we need to solve this case like Adam said. Yeah, there are definitely, this is another one of those cases where we have to look at the things that RPM does provide for us. And yeah, having a manifest inside the image that has the provenance and exact signatures of all of the files that were provided by them is like a really good thing. Yeah, it's absolutely insurmountable. It's to be inspectable also inside the running image. Yep, yep, no, that's definitely something that we need to do. We just haven't figured out how we're going to do it and I'm not convinced the RPM database is the best or only way to do it. Which RPM database they're changing it. Yeah, the fact that if you want to install a package, like especially if you're installing a module, you need like an XML parcel, a YAML parser, a SQLite database, a DB4 missing at least two other types of data formats. So RPM header is like, there's just so much that happens when it could just really be like, we have one database and one data format and you're good. We'll get there eventually, but we're not gonna worry about doing that all at once because we can't just part it down. Sorry, Raymond. Question, the syntax that you had on the previous screen to knowing, yeah, that. And then going back to the next screen, you were just not. So that syntax looks a whole lot like the Ansible definitions and we're working on the, or the Ansible variables. And we're working on the system rules using Ansible to define like a consistent way to configure all of those subsystems. We've already got a lot of modules that already add, remove users and basically configure the system. And so we're addressing a lot of the items under number five for like SE Linux and firewall, things like that. Is that useful at all as far as already having something that we're using to configure lives as strings and leveraging that same work to integrate in here? We just need to change the output of what it's writing to. I'm pretty sure there's stuff is YAML.  This is Toml, which is basically just JSON with comments that looks more like an in-ya file, but it's exactly J, like you can convert it back and forth to JSON, but you can also put comments in it. So it's better than JSON, yeah. But so yeah, we can, so the data formats are a good idea, but we can just translate back and forth between those things and that's one of the things that computers are great at. The tricky part is that the way that Ansible stuff wants to actually make the modifications happen is essentially you, as far as I've seen, you have like a Python module that then wants to run code inside the target system, which doesn't really work with our model. And I've talked to the Ansible folks a little bit about like trying to make their tools so that they can operate from the outside or the inside or thinking about that, thinking about doing it that way, but that's not really what they're thinking about. But having common data formats for the two things, and if we ended up building a tool that does the same thing, but it could do it from the outside of a system instead of from the inside, that wouldn't be bad for them either. So I think there's definitely some back and forth to be done there, but it's not like we got to immediately get to solve the problem for us, unfortunately. Does that make sense? Yeah, you got it. It does. I'm gonna harass you with that question more later. Feel free. I am kind of hard-line on the fact that we need to be building images from the outside and it is the same way of doing it because it's the only way to make it predictable. Like running arbitrary code inside a system, you don't really know what happens at that point. All that's are off, so don't do that. Also, the other thing that you should know about the demo is that it all ran as a user. Like we didn't need to be rude to do any of that, which is kind of nice for security of builders and things like that. And that's what happens when you make all of your process about transforming data instead of taking code that you're not sure what it's doing and running it and holding it for the best. Well still, the demo was one of a sort of. Yeah, only because I had to talk to the Docker dammit. But yeah, there's really nothing in that. Like at that point is when it actually two does. And that, and I need to get to pause there so that I can look at the thing. But yeah, the actual generating an image does not need to be rude. As long as you're not generating a QCAP and you need a route for that because you need to do partitioning and look back mounting, so. But that's just data. We can fix that. We've just been lazy about it. We'll get there, but yeah. It's, this is part of a really long thing in my head to sort of rework how stuff gets built in general.  And most of what we need to do is figure out how to make things not run, not be using opaque code when it could be data that we could think about better, if that makes some sense. So he's now at 612. Is there any last questions or is it time for escaping and getting a beer? All right. Thanks very much.


Yo, what's up all my international players, today we're here to talk about jump rope mistakes. Now here's the deal, when you're first getting started with the jump rope, you're gonna make mistakes. There's no way around it. This video is to make sure you don't make the most common mistakes that I personally used to make myself. Story time. So about 13, 14 months ago, Dan and I came together to create ZenDude fitness in a real way. We're like yo, let's go all in on jump rope. And so I knew when I went all in on jump rope, I had to figure out how to jump rope like a ninja. And the way I was able to transition over the last 13, 14 months from going from a novice to now being pretty skilled with the jump rope is by avoiding these top jump rope mistakes I'm about to get into in this video. Now before I get into these top jump rope mistakes and how to avoid them, I want to mention that we still got this free fall week challenge for y'all. So if you want to join that, you can click the link in the first line of the description or you can click the button in the top right hand corner of the screen right now. Also, the jump rope that's going to be used throughout this video you can grab. Let's get into this video, shall we? All right. The first thing we're going to start off with is where you're holding the jump rope. A lot of people don't talk about this, but it's extremely important. And so we're going to dive deep into where to put your hands on the rope right now. And so you can see here, you have very little control if you're grabbing the bottom of the jump rope. The rope is loose and it makes it harder to do tricks, but just get into a good rhythm. What you want to do is choke up on the handles so your fingers are very close to the actual steel cable and the ball bearing. This will give you a lot more control with the rope and make the spin a lot smoother. Next, we just want to talk to you about the importance of having a good, high quality jump rope. There's a lot of jump ropes out there and a lot of really inexpensive ones. And the reason why we talk about the cross rope so much is because it is the highest quality rope out there and it does make a significant difference in your ability to jump rope with more scale and your ability to jump rope, period. So the next thing we're going to cover here is a very subtle example of what it looks like to have your wrists too far apart. And so you can see here, when your wrists are too far apart, when you try to do tricks, for example, the crisscross, you end up tripping over the rope because it's spread too long, right?  And so you can see here, it's very evident that if your wrists are just a few degrees closer to each other, so you're bringing your, as you can see, I just demonstrated there, you're actually bringing your wrists closer to each other. It's easier to do crisscrosses. It's easier to just get more fluid with the jump rope and be able to get a consistent rhythm with what you're doing. And so a beginner mistake a lot of people make is they have their wrists too far apart so they trip over the rope. Just remember, whenever you're doing any tricks, bring your wrists just a little bit closer together and it's going to feel a lot smoother for you. Next thing we want to talk about is having just straight up good posture when you're jumping rope.   You have good posture throughout the movement. Next thing we want to talk about is how high you're going to be jumping off the ground when you are jumping rope. And so a lot of people when they first get started, try to jump high in the air so they don't skip, so they don't trip over the rope. But really that's the opposite of what ends up happening. When you jump higher in the air, a lot of times your hands come up and so when your hands come up, you are also bringing the bottom of the jump rope up and you end up tripping over the rope. When you come just in half inch or an inch off the ground, you have much more control.  The final thing I want to talk about is just your ability to get into a flow state while you're jumping rope. If you're really self-conscious by yourself and you're worried about tripping up or people see you tripping up, just let all of that go. All that worry about messing up or not getting as good as you want to as fast as you'd like to, don't worry about that stuff. The whole point of jumping rope is just to take care of yourself. So the fact that you're even doing it is a win in itself. Now beyond that, if you want to focus on enjoying it even more, you want to really just get into the state of being where the only thing that exists is every skip of that rope and so you want to even close your eyes sometimes and focus on just the movement of that rope or if you're listening to music, just the beat as every beat drops. And so put yourself in a state of being where you're completely present and you're going to get better at jump rope so much faster. Finally, if you've enjoyed this video, if you like this video, please give it a like. If you have any questions, go ahead and drop them in the comments below. Please subscribe to the channel. Zen New Nation is growing day by day. We appreciate each and every one of you so, so much.  Thanks so much for watching this video. Zen dudes out.


Curtin has a range of scholarships that suit many different circumstances. Consider the range of factors that affects a student's ability to study. So the great thing is there are advisors who are able to help you choose and apply for a scholarship. You can apply for a scholarship even if you are planning on taking a gap year. Some scholarships allow you to defer the scholarship for up to 12 months. So check the eligibility criteria. Also you can finish your gap year and apply for a scholarship then. Curtin have a team that will help find a relevant scholarship for you. You can also sign up to a scholarship email alert that will send you scholarships that have opened that might be of interest to you.


Welcome to Make It Many, which is a new series that reimagines trending recipes using La Crisay's mini-cocats. First up is a twist on the iconic pizza toast. This version has roasted garlic and truffle-permed sourdough and is topped with tomato sauce and melty burrata. Like and follow for more.


Today the pre-season WCHA coaches and media polls were released and Bemidji State was picked to finish fifth in both of them with Minnesota State atop both of them as well. Forward Jay Dickman, defenseman Justin Bodry and new transfer goalie Zach Drisk will receive votes for the media's poll of all WCHA teams. Tom Saratori also announced the team's captains Bodry and senior forward Dylan Ikestad will serve as co-captains and a trio of players will be assistants. If you enjoyed this segment of Lakeland news, please consider making a tax deductible contribution to Lakeland PBS.


But it's not helping for Toffy! DUDE, WHAT THE FRICK WAS THAT?! HOOH! HOOHOOHOOH! ALIEN ISOLATION! I-I mean, our after-isolation, d-d-yes! There we are, look! Hello, everybody, and welcome! Remember Fossil Fuel? Remember that giant, like, hybrid lizardman that we fought and killed?  Oh my god! Oh my god! I just got killed by a predator-looking thing! Yeah! This is the same game! Except for this time, they've had a DLC, which cost about £2. I don't know what this one is, it's called Raptor Isolation, I'm assuming that's a play on alien isolation, and last time I played this game, I did get a fair few jump scares. God, I remember playing, uh, Doom... BOOM! So, I'm kind of interested to see how this one goes. Uh, we'll do easy because, sod it, if it's gonna be in the-in the dark and things are jumping at me, I'd rather be easy. I don't need to impress you guys! Ha ha ha ha! Sierra Research Institute, five hours after EMP event.  Did it continue to come up? Huh! Oh. Oh, this is me. I have a shoe! I have two shoes! Oh no! Why am I a toddler? Ha ha ha ha! Why is the barrier so high? Oh! I can zoom in. Okay, cool. Um... Oh! iPad! I am a toddler. Uh, this cell phone has been destroyed by the EMP. There is no calling for help. Whaaaa! Oh my God. Why does it lag there? Eater and tractor at the toilet. Why can't I see anything? I've got like a weird halo on me. Scared the life out of me in a few occasions. I had some jump scares. I'm expecting it to happen again here. It's one of those types of games. Where it goes, Oh! Oh! A helmet! With light! Uh, a flashlight attached on a helmet. Allowing hand for use. Powered by a state-of-the-art lithium cell. You mean a battery. This light will last for weeks! And does not take standard batteries. No, it takes a cell. I'll take that. Uh, oh. Hold on, guys. Let me just, uh... Use... C... C... C to turn on! Oh! Not T? Not T for torch? Okay, cool. Cool. Entry 35! We are on our own! Something has knocked out the power of the animals are out! And killing everyone! The section of this base is fairly remote. But! A big Utah raptor has claimed it as its territory! And started to kill all the personnel in the silo. Uh, there are no weapons stationed in this section of Sierra. So we have to be resourceful. The main silo acts as a central point to access different floors. I have been trying to find a safe space for us to wait for help. But that damn raptor keeps finding us! We go, peek-a-boo! Blah! Heh heh. So, we have to stay on the move. I have left an extra flashlight helmet if someone needs it. Best of luck. Dylan McSharekin! Hydro... Hydraulic specialist Sierra Engineering. P.S. I have a room stuck with supplies if anyone needs them. The floor is a... One label on it, outside the door. So you can't miss it. Okay, so supplies... Door has number one on it. Gotcha. Cool. E for back. Wait, what happened? What happened? I'm scared. Heh heh heh. What happened? The music was like... And then, like, it's gone. I felt better with the m- Oh, no. Now I'm terrified. Oh, this is... I don't like this! No, no, no, no! Bad juju! Bad! But, hold on. That helps. Does it? Barely. Can I open any of the- Wait, what? Ah! What happened? Oh! Oh, oh! Okay. So, I just- I just run in, and then I'm just in here?  But I'm not. Heh heh heh heh. Am I? I have no idea. I'm sort of glitching through it. That's interesting. Okay, cool. Um... Alright. So we're wrapped- So what, we got mountain... And... Twelve. I can't even turn my flashlights on. I'm gonna go this way. Oh, is it elevated? Okay, elevator not working. Cool, cool. Right.  I don't know what that did. Oh, okay then! Come on, Mr. Raptor! Wait, oh no. Eh, yeah. Eh. Cool. Raptor! Hello? Hello? Oh. Peek-a-boo. Peek-a-boo. Person! He's gonna die, I bet.  You know that, right? So it's pro- It's best for the both of us. If I just turn away. So I'll check out this door first. You can have a couple more seconds of life before... There is a switch that operates this door. Of course he's gonna do it. Okay.  It's not- It's not down to me, okay? Right? Don't blame this on me. Oh my God. Somebody else made it. Don't worry.  Hi! Can you come round? Yes, you can. Well, that's no good, is it? Well, that's- I'm dead. I knew you were dying. I'm so sorry.   I can't go that way. Oh, the dude's still there. Right. Cool. We're fine, we're fine. We're fine. Oh, why'd you kick him? Dammit! Oh, wait, wait. What? Hold on. I'll turn my light off. I actually got passed. I don't think I was supposed to do this. Oh, it's snarly warlies. I think I opened it. I did click it. Yeah. I opened the door through there.  Look at him.  You're gonna come back this way? Cool. Okay, he's gonna go right, sweet. Da-da-da-da-da-da-da-da. Hot-da-da. Hot-digity-damn. Just gonna run this way. Oh, I have STAM. Oh, that tiny bar at the right. Oh, cool. We're gonna interact with this.  What am I interacting with? Okay, explore the Sierra Silo. It's the Sierra Silo. Number one, that's it. This is supplies. Oh, backpack. Jog strap. Game. Save. Yes, please. Save the slot one. Oh, wait. Oh, okay. I thought they were all... Oh, look at this. I remember these health files. Health kit. Empty syringe. I know you use empty syringe. It can be combined with serums. All right. And to do it. The hell's eye drops? Some eye drops. Good thing it's been a while since your cyber-eye surgery. Okay. Dry eyes would not be fun right now. This is of no use. Oh. But what if I want... What if the raptor has dry... It could be like the lion with the, you know, the thorn in its paw. I think I can check on it. What's my inventory? Tab. Okay, so I got plenty of space. I may as well just like take everything, man. Ah, we got empty syringe. Come at your seat to combine. Ah, okay. So I need to put the thing in the syringe and then use it. I can't just use it the way it is. Okay. Um, so how do I... Do I just click spacebar to use your health... Use health card? Okay. Cool. Well, we've got... Did I put an antidote in there? Antidote vial. Kind of wanted the health vial.  There we go. Okay. Can I move? Yeah, I can move. There we go. Put them down there. Yes. Oh, it's... No, no, no. Have that. Yeah. Or even better. That's better. Yeah. There we go. Just like Resident Evil. Hmm. I didn't say anything about number two. But we can have a look at number two. Kooie. Number two. Yeah, I've got my flashlight on. Don't I? But it's not helping for Toffee. Don't... What the prick was that? Why was there a golem? Let's follow it. Golem. Golem. Yeah, it's precious. But it wants to ring. Golem. Come on. Oh, I don't have a ring yet. Maybe that's the thing. Okay. Sierra Proxy Tracker. Okay. Sierra Proxy Tracker is an experimental belt worn... Oh, sorry, belt worn tracking device that uses an artificial, uh, odorant receptor to smell for nearby biological ent... Entities. Wait, is this who we're talking about? How do you use? A proxy tracker will auto-sync, not requiring any action from the operator. Once active, the tracker will beep when an organic entity is within 50 meters. Okay, so we're doing a little bit of a beep, beep, beep thing. Is that what we're doing? Oh, we're doing... Oh, okay. Where is it? Where's the tracker? Look! Is that it? Is it a little wiki? Oh, we... Okay. I guess we'll save again. I don't really know what I'm doing. Damn it. Bit weird. Where is this thing, then? Here we go. The US go... Oh, it's always the Americans, innit? The US government has already stated...  Started to poke its nose into my work. And if they ever found out about our human dinosaur crossbreeding, all my work would be gone. Luckily, you see the value of my work. The EMP will take out all the security communications. We will have at least 24 hours to 48-hour window to extract the key items of my research. Director... Moosk! So, like, Jurassic Park? Like, Dennis Nedry? Dennis Nedry turned off the power? Cool. Right. Is there anything else in here? Wait, where did that...? That's it? That's all it's here? Oh, sorry. Yeah, I found part of the list circuit, but it has been locked in the laboratory. I do not know the password, so I am at an impasse. One of the lab techs once told me that the password is the number of chromosome pairs of a human and chromosome pairs of a t-rex. I wish my phone worked. The answer has to be written down here somewhere. Wait. How many chromosome pairs? I could probably guess it, couldn't I? I probably could. Hold on. Here we go. Oh. 46 and 80. Oh, okay. Cool. Well, that was easy. I was like, I'll go to Google. Woo! I did it! I have the research! What do I do? Where is it? It's it. Concave lift circuit. The concave part of the lift circuit. Cool. I'll collect it. Do you want to go back that way? I kind of want to go down here. This looks cool. But it's golem down here. There's blood. Golem! Golem! Oh. I was like jumping like, Hello, you can't get me! Well, I have to do this again. Ah, that's easy. I remember what it is. Thanks, game. Well done. You did your best. Just give me the thing. Num-nums. Yes, yes. I guess I'll save. Oh, wait, what? Wait, I can't get out. Are you to interact? What? I'm locked in here. Explore the Sierra solo for an exit. Silo. Are you going to come down here? What? Why is it wiggling? Is that a person? God knows. Anyway, this guy looks like he's having a good time. Or had a good time, I should say. Wait, where did that raptor come from? Oh, I think I glitched. Wait, what? What's it doing? Why is it making weird noises? You're very strange. Can I have some of this? Proximity tracker. Cool. This cellphone has been destroyed. Yeah, I know that. I've got the proximity tracker. I don't think I have the proximity thing. Are you just going to walk about? Like, I have no idea. Is there anything I should be looking at here? How did they even get down here? Is there really no way? That's so strange. You know, I'm just going to play this. Really? Oh, we have- Oh. Do I just have to- Oh, come on then! Well, that's hardly fair. How am I supposed to do anything when it- Wait, can I open it again? Oh, I can't open it again. Oh, was I not supposed to do this? I have the elevator thing now. Cool. I guess I'm just going to run back to the elevator. Repair the- Oh, wait, hold on. Combine other circuit halves. Press to interact. You know what it is. I'm going to go back and I'm going to save, because I don't know if I was supposed to do that. Yeah, let's save it separately. Because I got out technically. I didn't have the tracker though. So I can't really see it. I'm stuck down here because someone removed the life circuit. It is two halves of a circle. I must find both. Well, I got one. But I can't- I guess I need the other one. Where's the other one? There must be another- Yes! Yeah, there we go. Do very slowly. Oh no, dead dude! Did I do this right? Can I jump off? Oh no. Or kind of can. Oh, that's not so bad then. Oh, look at me. Sliding up the ladder. He's got something. Interact. Replaces your flashlight with an upgraded night vision optical. The vision in the dark and like a flashlight. This will not alert enemies. Oh, cool. Oh. Well, I've just died. Wait, have I died? Wait, am I allowed to- Oh no. Oh. Oops. Hello. Should I go down here? See to turn night vision. Oh, well, that doesn't do much, does it? This puts a friggin' filter on. We're all out of the flashlight. Alright. Guess I'm going down. Ah. No, I can't kind of see. Where's Gollum? Gollum! It's me, precious! I knew you were down here. Where are you, Gollum? Gollum! I've got to watch my stamp. So many smoke clouds. Literally makes no difference whether I have this on or not. What is that? Oh, it's the snake! The friggin' sneaky snake! Does it still follow me? Yeah, it does. Do, do, do, do, do, do, do, do, do, do, do, do. Run from the snake, snake. It's like Harry Potter's! There he is!  Run from the snake! Run from the sneaky snake! What is this? Is this a thing? Guess I'll take them, I suppose. Wait, what? Oh, ladders. Oh, that's good. Ha ha ha! I can't catch me now, snake!  Wherever you are. Oh, we're reaching the end. There we go. Emergency door release. Cool. Interact. That's lucky. I'm going to turn that off. I like things being normal coloured. It actually gets darker when I turn on the night vision. Somehow. Somehow. I'm wondering if the proximity tracker is going to screw me over in a bit. Uh-ohs. Uh-ohs. I haven't even found any, what do we call it? Any save points, so. Oh, that's a sleepy raptor. So run. There we go. Yep, I'm in here. I can kind of see. Oh, what?  Yeah, I know. Yeah, I'm going to grab that. And I'll do it properly, okay? I'll do it properly. The game wants me to do this. I'm going to wait for the raptor to go around there. Okay. So now we're in the dark. Wait, hold on. I can... Oh, wait, where's my tracker? But I thought that, like... I picked up that proximity tracker. Should this not have helped? Oh, God. But I'm dead, aren't I? What was I supposed to do here? I just died! Oh, wait, I'm not dead. Wait, where am I going? Oh, God. Oh, okay. Oh, so the proximity tracker is literally just like... Oh, by the way. Yeah. Alert, alert in the bottom left. There's something close to you. Watch out. Still saying it's close to me. Oh, there's a locker there. Okay. Like, I'm in the locker, right? Hello, Mr. Raptor. I'm glad they gave you glowy eyes. All right, so now I can get through here. Lab door overrides. Uh-oh. Oh, God. Where am I going? I don't even know. Oh, back here again? Ha-ha! Wait, where are you going? That's how it got in the first time. I was like, bam! There is literally no reason for me to do this because all I get is I pick up something that tells me, oh, watch out. There's a thing that's near you. And that's it. All I'm doing is I'm missing a little warning and my bottom left. And that's it. Oh, there's a thing on this floor. Hell, yeah. Because I fell all the way down by accident. I didn't realize there's a floor here. Cool. Floor eight. Floor seven. Ah! Ha-ha-ha-ha. No, it was a trap. I missed out on a goddamn door, dammit. Number eight was a door. Okay. I couldn't get through. I didn't check this place out last time. Oh, you're kidding me. It was nothing. After all that, it was nothing. The door is locked from the other side. No! All right. Well, I guess that... Ha-ha!  Didn't fall for it. Ha-ha-ha-ha. Whoa! Hello! Sleepy raptor? Don't make any noise. Cool. Ah! Why? Yeah, I don't have to make noise. But the freaking, um... What's it called? The music's making noise. Aw, he's so cute. Well, that's annoying. What? It just saw me straight away? Like, ah, surprise! Got you! It could be that I nudged a box. Right, I must have nudged a box then. Uh, there's a light over there. I'm assuming... Interact? That's a pot. You kidding me? That'll wake it up. I'm sure it'll be like... It'll just fall. Okay. Well, I've opened this. Oh, did I do it? Did I get out? Wait, what? Wait, I'm the raptor! I'm so confused. What's happening? Wait, did I just open up... a raptor? Oh, I should have went this way. Oh, no. Oh, no. That's not good. That process! That whole thing that I've just done was to open up one door. After seeing that last raptor, I'm assuming I'm not supposed to wake this one up. Oh, hold on. Note! There is a second raptor! I might have trapped it behind the blast door. Unfortunately, the Convict's left circuit is trapped in there with it. Oh. Oh, so this is the place I was at before. But instead of coming this way, I opened the gate there and unleashed it. Oh! Can't get me now, can you? I mean, amazing game design. You can't touch me if I jump on top of things. Hi! Don't do that. That's not very nice. I'm now going to have to take a health syringe. I hope I've got you stuck. Are you stuck? Oh, my God. I hope you are. You kind of work. Oh. Oh, that's no good. It's a common. It's a common. Oh, God. Oh, God.  God, catch me! Oh, look at it! Things have come. Oh, hold on. I bet. Hold on. Let me get out of me. Oh, that is so good. I could save this now if things don't fall down. Because now it's just at the bottom. And I don't need to worry about it. Yes! Right. Now, I think if I was to die, it might respawn back in its normal position. So now, I need to not die. The only thing I can think of is to open up the other door. Yeah, you should be still underneath. Yeah, you're fine. That's fine. Yeah. Yeah, you're right beneath me. Oh, God. Here we go. Okay, ready? There we go. Ha!  Open up blast door. What? Okay, so this is where it is. I know exactly how to play you. I know how to play it. Watch this. Watch this. Come on, then. Yeah, okay. Let's follow me. Is that me already?  Yes! Ha ha ha! Yes! I'm going to make you fall down. Oh, I've never listened to this song so much that the bass has dropped. Wait, is that raptor just broken now? Yeah! I think he's actually legit stuck on the gate. So I think I can go back down there safely. I'm going to try it. I'm going to be extra ballsy here. If it's not, I tell you, it's a very clever girl. If I get right next to that door and it goes, ha ha! Gotcha! I bet you know what? Fair dude. Yeah, you may try it. Right, okay. You're going to be fine here. I hope so. I hope, like, it's not going to de-spawn. And, like, de-glitch. I hope it just gets stuck there. I finally have it. Yes! The final circle! You know, we may not have done it the way the game intended, but that doesn't matter. I'm not going to risk anything. It's good to go. Ha ha ha ha! Run, run, run, run, run! No, no, no! Oh my God, oh my God! Because of where everything is and the level's so small, nothing needs to load. So everything, it, like, doesn't get de-loaded. It doesn't get de-spawned. It doesn't get de-loaded. It just stays exactly where it's supposed to be. Yeah. Oh, this is the stuff. This is the stuff.  But you know what? I don't care. And we did it, guys! Yes! I think so. You know what it is? I'm going to save just in case. Alright. Mr. Elevator, take me to a new place, please. Yeah! Use the power of the lift! Cool. Right. Can I use it now? This panel needs to be activated. Oh, well. Use that, then. Choose. Ha ha ha! Oh, that's it. Wait, that's not freedom. I'm going to get crushed. Wait, what? Oh, it literally went up, like, one thing? Can we not? I've, like, climbed! Ha ha ha! Oh, I wonder what awaits us on this other end of the door. Cool. Is that it? Did we survive? We made it out! I can't believe we've done it! Yeah! Nothing could go wrong now! We're just to open up a million doors. We've done it, guys. It's not like we're going to find another raptor or anything. There could be only one, or two, or three! I don't know! Some of them said there was one. Some of them said there was two. And I could just see one coming at me here. Okay. To the door! I made it! Yes! I see my pets have missed one. Well, you haven't seen my finest work. I'll let you choose your destructor. So go on, and choose! Choose what? Choose your destroyer? Oh, so this is Mr. Moose or whatever, the guy who's, like, the man raptor or homo- well, we've seen homo-rector's wrecks. But I want to know, man raptor! Man raptor! Speed and malty as we bring man and raptor together for the first time. Yes! Choose! Thank you! I do want to try surviving this one. What do you mean, good luck? Where am I going? Man raptor! Oh my God! It's the garland thing! Look at him. Man raptor. Wait, are you going to jump? Oh, oh. Oh God! Man raptor! Wait, where am I supposed to go? Man raptor. Please have mercy. You don't want to do it, man raptor. I swear. I'm a good boy. That's all I could see. Man raptor! Man raptor! No! Down! Bad man raptor! Ow! Man raptor! That's not very nice. I can't get past you. Man raptor! No! Apparently I hurt man raptor. Oh, I get it, Elon Moose. Oh, that's so funny. I want to just double check. Homo erectus rex is the same one that I think. I mean, I saw Homo erectus rex, but we've seen man raptor. I'd like to see Homo erectus rex. There he is. Look at him go. Oh, look! That's what I'm talking about. Hell yeah. Hell. Okay, hold on. Let me just check the map. Okay. I think I want to go. Oh, I just, I just want to, I want to move. Okay. How about map now? Oh, there he is. That's a good job I've chosen this one because he's super slow. Oh, central engineering. This looks good. Oh, I hear him. Don't make this big footsteps. Oh, this is where he was before. Oh, okay. Don't want to go this way. Maybe. I don't know. I guess I'll try it. Don't want a gun. Oh my God. I don't know the key code though. 7812. 7812. 7812. Okay. Thank you. Left there please. Okay. Okay. Okay. Thank you. Left there please. Woo. I'll take it. I don't know if this is the best thing to do. I can't interact with that. What is this? What is that? Oh, it's a crusher. Oh, I should have waited for him to get in it. Okay. Well, fair enough.  Yeah. Or maybe I shouldn't waste this.  In his anchor. Okay. One more then. Yes. He is killed. Yes. Beautiful. Did I do it? We're going to cut scene or anything? You'll suffer then. You look. I'll give you that. You can get away with killing my babies. You have another thing coming. I'm sorry friend But this has always been a no-win situation. What do you mean? I can burn you right now for the final time Yeah, I guess like oh wait what I did it What am I gonna be against like the giant albino t-rex or something if it a final time? Yeah Okay, cool cool. Um What am I facing now, huh? Turbine, it's another t-rex. Is that supposed to do turn that off? Oh Okay, I'm hoping that you'll just come to get me and then get blown away almost there Freedom through the planes sorry dude, but I must have my freedom ending be Difficulty easy rank be 30 minutes Well, I don't know how you can have it harder like maybe just die quicker But I think even on like insane difficulty if as long as all the dinosaurs stayed the same You could just you could cheese it That we make our own ways here on the game beaver channel Anyway guys you enjoyed that that was a fun game for what two quid car could play really It's buggy. It's broken, but it's fossil fuels not even finished and I knew what I was getting into Well, you know, there was no trying to beat around the bush pretend what it's not, you know Like a triple-a game. No, no, I knew what I was getting into and you know what presently surprised If you enjoyed this video guys move a like and until next time. I'll see you guys later. Oh, bye-bye