OK, yeah, I'd like to speak about some high performance and scaling techniques that we've been doing in Golang, a small breakdown of the presentation, a few slides about myself and some work that we do with Minio. Do you understand me or not? OK. Is this better? OK. Is it better like this? Yeah. OK. Great. A little intro about myself and Minio. Then I'd like to speak sort of in general a little bit about, yeah, the Golang or Plan 9 assembly capabilities that Go offers. Then discuss two sort of projects that we've done with this, so Blake2b, Acceleration and Chart256, Acceleration, and finally some slides about some, yeah, distributed sinking stuff that we've been doing. One slide about myself, I've been mostly doing software development in sort of what's called the medical imaging space, so that relates to like CT and MR images from scanners, both 2D, 3D, as well as using GPU techniques and the last few years I've been involved in cloud computing and I'm now with Minio. Minio, as maybe some of you know, is an Amazon S3 compatible, yeah, Op-Yek storage server. It is, yeah, written in Golang under the Apache 2.0 license. The company was actually founded by Anand Babu Parishyami, who maybe some of you know as one of the guys behind the Gluster FS system, which is in itself a distributed file system, which is now part of Red Hat, actually. If you look at Minio itself, there's actually sort of really, yeah, one project, one binary, but you can run it in sort of three different flavors, so the simplest version is simply run Minio server with a single directory and then all your objects will be stored underneath this directory structure and there are also, yeah, two other versions that use a technique that is called erasure coding, so what this essentially does is all the objects are split up into both data chunks and parity chunks and, yeah, split over, yeah, multiple disks or multiple servers and the Minio server actually, the Excel backend which splits the data over multiple disks and goes from a minimum of four disks up to a maximum of 16 disks and it also uses a technique that is called BitRot protection, so this means that when the data is being read off the disk again, which can be many years later than when it is stored, a hash is computed to detect any, yeah, BitRot changes and if that happens then, yeah, we have other parity blocks to reconstruct the original data, but as you can imagine this BitRot protection is a very frequent operation, so any data that is written to disk hashes have to be computed and likewise when data is being read off the disk, yeah, the hash needs to be computed as well before we actually can return, yeah, any information to the client, so that's a pretty important operation for us and that's why we really looked at how can we get sort of the maximum performance in terms of hashing speeds while still, you know, having a solid proof and hashing technique, so that's actually how we, yeah, did our Lake2B project, but before I go into that, let me explain to you a little bit about, yeah, sort of the goal laying or plan 9 assembly capabilities. This is actually an integrated or integral part of the whole go tool chain and it's actually, yeah, it's kind of like a pseudo assembly language in the sense that it's not a direct assembly that you would write for, say, an Intel platform or an ARM platform, so there are some generalized instructions for like a move and an add and a compare and these instructions are then obviously translated to the actual instructions that will run on the underlying hardware platform. Most of the time, it's kind of logical how like this pseudo assembly language translates into the underlying assembly running on the CPU itself. Sometimes, yeah, that is not the case, so sometimes a little bit of trial and error there and also some architectural aspects of the underlying architecture they shine through, so on the ARM, you have like conditional instructions and you can do that too and obviously on an Intel that will not work. Also, for instance, data flows from left to right, so if you do like a move, you have a move R1 to R2, it's actually R2 becomes R1 and, yeah, like on the ARM platform in the other way around, so there's some things you have to be aware of. There's also some, yeah, like pseudo registers, so they're not actual registers but kind of like simulated registers for like frame pointer, stack pointer, program counter and also not all instructions that you would want to write are available, however it is possible to also, yeah, not use sort of the mnemonics but use the actual opcodes that will go into the assembly, so if it's not available you can resort, yeah, to that. If you talk about, yeah, what are sort of the advantages that you get with like assembly language and obviously, yeah, it sort of gives you the ability to get the maximum performance out of the underlying hardware and also if you do this, then, yeah, you still benefit from, you know, the nice quick and fast compilation that Go offers, you know, to get like assembly into your code you can also use, for instance, the cgo route but, yeah, that has some disadvantages. One is that, yeah, you need to have the cgo, yeah, available, it takes longer to compile because, again, it's more like a c-style compile that happens and also when you call into that code then, yeah, there is some runtime overhead because all the stack needs to be saved and everything and if you write your own assembly, yeah, you don't have that overhead and obviously if you use assembly you can take advantage of the SMID instructions for Intel or the neon instructions that are available on ARM. It's maybe a little bit kind of a word of caution is that you, yeah, you are a bit on your own if you do this kind of stuff. The documentation is kind of limited and a little bit sparse. There is a considerable amount of kind of example code in the Go repository itself as well for stuff like new taxes and some lower level stuff so actually if you grab for start out as in the Go code you will see, yeah, a lot of examples there and likewise we now have a few repositories where there is also some Go code in there and as an example basically this is actually also a file where you can sort of see the translation between this pseudo-assembly language and the actual ARM instructions as they are being generated. If you want to integrate assembly into Go lang then you have to use the .s extension for, yeah, basically assembly and that is actually prepended by sort of an architecture, yeah, identifier. So underscore ARM 64 means that the assembly is for the ARM 64-bit platform and likewise AMD 64 will be for the Intel or AMD 64-bit platform. And actually here is a snapshot of a repository. It's a little bit hard to read but here actually you can see actually several versions for the AMD 64 platform because in this repository we actually have a dedicated AVX2, AVX and an SSE version and then there is an ARM version. I'll talk a little bit more about sort of AVX2 and AVX later on in the presentation. So kind of one approach that has worked nicely for us is if you do this kind of stuff is to actually start out with an algorithm at the Go level itself because even if you do this then you are not likely to do all the work for all the different architectures that are out there so it always makes sense to have as a baseline sort of the functionality in Go itself and then sort of as you start to translate that functionality into assembly what we sort of did is we started out kind of like with small bits and pieces and so you comment out most of the Go code in your routine or class or whatever and then you start to translate small bits and pieces into assembly maybe initially starting just with passing in the arguments and writing back some results making sure that all works and once you got it working then you gradually start to translate more and more of your Go functionality into assembly and along the way make tests whether the assembly functionality is equivalent to the Go assembly. So actually if you look for instance at the commit history of the Blake 2B SMID repository you can actually see how we used this technique along the way we also developed a small utility called SM2Plan9S which actually generates byte sequence codes for Okko or assembly instructions that are not natively supported by Go itself so actually it uses the YASM assembler sort of behind the scenes so what you do is you basically write your instruction as you would write it regularly in assembly and then you run the tool on the file and then it will prepend that instruction with the actual upcodes that will go into the byte stream that will be executed. So that has worked nicely for us. If you look at what we have done with assembly we've actually accelerated the Blake 2B algorithm as well as the SHA256 algorithm and we're planning to do one more piece of work which has to do with this erasure coding which is actually called readSolomon and this uses some what they call Galoi field arithmetic polynomial multiplications and ARM actually has a specific PMO instruction so we want to use that instruction to accelerate the readSolomon computation of the parity blocks for ARM for Intel it is already accelerated but we want to do the same for the ARM platform and maybe when there is a need in certain pieces of the code then we will likely do more. So the first technique that we accelerated is a hashing technique that is called Blake 2B. Blake 2B is a hashing technique it was actually there was like a SHA3 competition a few years ago and they were one of the five I think final contenders. In the end they were not selected but it is a nice hashing technique with sort of the characteristics that it's really focused on speed as well as kind of like a relatively simple algorithm to implement while at the same time still offering sort of top of the bill security and it's really optimized for 64 bit platforms. So we developed a repository using the SMID instructions to accelerate the Blake 2B algorithm and actually we did it in sort of three flavors so there's an AVX2 implementation which is the fastest then there's an AVX and then there's an SSE implementation so depending on what your CPU support then obviously the highest level of SMID instructions that is supported that one will be used but overall we were able to achieve close to like a 4x performance improvement over the high level go functionality so yeah that helped us quite a bit because if you look at the table on the right you can it's a little bit too small but we can do about 850 megabytes per second with the Blake 2B algorithm on an AVX2 machine and this compares to if you look at SHA256 that is at like 190 megabytes per second and SHA512 is at about 300 megabytes per second and as an object storage you can imagine if you have large blobs of data written on the disk then again for us to be able to return like the first byte when people ask for an object say if it's a one gigabyte object then having a factor of four there that means the difference between being able to return something within a second or within it taking four seconds so that's a pretty significant saving there and again yeah so we developed this technique for the bit rot detection mechanism that is part of Minio if you look a little bit closer at sort of how it works at the top line those are actually there's a very small portion of all the kind of computations that are happening as part of the Blake 2B hashing so yeah there's basically four yeah additions there and these are on 64 bit integers and if you look at the AVX capability for the Intel platform you can essentially work with 128 bit wide registers so this allows you to do literally like two additions in parallel and this is kind of what you see here so with AVX2 you use what I call the XMM registers so again those are 128 bits wide registers so essentially this means that whereas here it's kind of like two lines you can do it here basically yeah in a single line and likewise at a second XMM instruction will also take care of two of these guys so you can sort of go from like four to instructions to like two instructions and if you go one step further AVX2 extended the pipeline to 256 bits wide which means that yeah you can use or do essentially four 64 bit additions with a single instruction so that's actually this guy and then here you use the YMM registers instead of the XMM registers and again those are 256 bit instructions wide so in a way this kind of explains why there's kind of four times speed up between yeah like Golang and AVX2 there's a bit more there but I mean fundamentally this explains it quite a bit if you look at Blake 2B the algorithm itself it actually has sort of 12 rounds of yeah working on the data this is kind of like the preamble where first the message is being read in then it's kind of shuffled around and then there are two sort of macros that actually do the actual like exploring and adding and rotations of yeah all the bits then there's like a diagonalized macro there which kind of rotates values between the different yeah values that you are working on and then there is a second half where you load more from the message you shuffle it again and you call the same macros again and finally you diagonalize so you sort of shift it back and if you look at yeah one of the macros so in this case this is the what's called the G1 macro it actually consists a little bit of like three columns so on the right side of the screen you kind of see the high level Golang instruction then in the middle part of the screen you sort of see the AVX instruction and then on the left side of the screen is the actual yeah upcodes that are being written into the assembly stream and so actually what this guy does is here there's like this is an addition this is like an XOR here you actually see a rotation but the Blake 2 algorithm has selected like shift values that nicely map on to yeah the Intel architecture so you can actually while it's a shift over there it's actually a shuffle so you shuffle bytes around in between the registers so and then there's more additions more XORing and then yeah get another kind of rotation and this happens you know over and over again and then in a total of 12 rounds and that's you know how you get your hash out there okay that was about the Blake 2B algorithm we've also done some work on yeah shot 256 algorithm most notably also for the ARM platform because the ARM platform actually has specific instructions to accelerate shot 256 yeah calculations and they make tremendous amount of difference because literally is a hundred times faster than not using those instructions and actually Intel also has instructions for shot 256 accelerations but they seem to be just defined in software and there seem to be no hardware implementations out there otherwise it would be nice to take advantage of that as well but actually the table here at the bottom you can sort of see yeah the speeds that we that we have an interestingly speaking actually the ARM just running at 1.2 GHz is actually the quickest one out there so it does about 640 megabytes per second and then we ran some tests on an Intel Xeon at 2.4 GHz the AVX2 comes in at about 355 then the AVX is running around 300 SSZ still a little bit lower than that and these are actually the go versions so if you do go on the Intel Xeon platform you get about 190 and the last one is the the ARM version if you look at you know how do you actually invoke yeah assembly code from go you do you essentially define kind of a yeah the prototype of the function that you're going to call into so for most of this hashing techniques you pass in like the digest that you start with and the message itself so the digest is basically just a slice of 32 bit integers and the message is just a slice of bytes and here we actually compute the 32 bit integers into the digest so that's this guy and then basically the actual message that you're going to hash is being passed in directly into what will be the assembly code and then once you're done then actually the result is written in this guy so that is what you what you return and this is actually an ARM example so the first line that's basically how you define the function in the assembly code and the first thing that you actually do is to read the parameters that were being passed in and this function takes two slices as as inputs and as maybe some of you know a slice is actually a structure with like three elements in it and the first element is a pointer to where the actual data is and the second is actually the length of yeah the slice so what we're doing is the first few instructions were reading this here and because this is running on 64 bit platform both slices in effect they take up a total of 24 bytes so again it's three elements but each element is eight bytes long so the first instruction basically fetches a pointer to where the digest is and the second line fetches a pointer to where the message is and then at the length of the message is being read in the third statement so it's another eight bytes further than yeah the already 24 bytes which point into the second slice that is being passed in and then further down here we do some initialization so here we load from x0 which corresponds to r0 the digest and we also load obviously from the message itself and there's also a constant stable so we get a basically a reference to the constant stable that's actually in r3 and r3 corresponds in neon to x3 so here we load values from the constant stable and this is actually sort of the main loop where the hashing is being done and again here r1 which is x1 is the pointer to yeah the message here actually the values from the message are being read and well there's some positioning codes to make sure things are in kind of the right order and then these and these guys are actually the specialized ARM instructions that give you know basically the hundred times speed up and then there's some more you know shuffling of data around but yeah all I have because these are specialized instructions the actual assembly is yeah pretty pretty pretty short and then yeah this is like the end of the routine so again there's some yeah ARM instruction or SHA extensions instructions here and then here it's basically put into v1 and v0 and v1 and here actually you write out the result in like register 4 1 and v1 into x0 which was the pointer to the the digest and then you return out of there and obviously here well as long R2 is the length of the message show you process 64 bytes at a time and when there's more work to go obviously you loop back and so that's pretty much you know how yeah a function like this looks a little bit if you look at some yeah some resources that we have that they're out there actually as maybe some of you know some of the origins of the go yeah like architecture and work go back to the whole plan 9 yeah worked on that has been done and actually yeah some of the assembly yeah still originates back to that so some of the documentation out there yeah it's literally at the gp.io website so not everything in those URLs is kind of applicable most of it is but it's their generally generally good resources to read through and get an understanding of how this all works and ties in together and then there's also like a high level as some document and there's also some pointers for arm some pointers for Intel about you know how neon instructions and you know AVX instructions work okay that was sort of the like the performance optimizations that we've done for yeah hashing techniques we also did some work on something that we called a distributed syncing technique when I earlier talked about the three flavors of Minio that are there the the last one that was listed is called the distributed version and so we have two versions that can work with erasure coding and then distributing the data across yeah multiple either disks for the Excel version or actually multiple servers for the distributed version and for the distributed version that can actually run from anywhere of a minimum of four servers up until a maximum of 16 servers we needed to have a synchronization mechanism between the servers and yeah we also looked at some existing protocols and techniques out there but yeah we like a technique like raft but we found that a little bit overkill for sort of what we were trying to do so we designed basically a pretty kind of minimalistic synchronization technique that yeah works well for us the design goals that we wanted to have was basically keep the design simple also meaning there's for instance no concept of like a master node because well if you have something with a master node and the master nodes go down goes down then yeah your whole system is down so you need to have backup master nodes and then you already talk about two or three master nodes and it quickly starts to become you know more complicated than what you initially think so in our system there's no concept of a master node so all the nodes are basically yeah equal it's also resilient in the sense that if multiple servers go down yeah the system just continues to function so basically up to a total of yeah and over two minus one servers can be down so yeah you can continue to function and yeah we also wanted it to be kind of like a drop-in replacement for the existing primitives that are there in the the goal language so the API or the interface is synonymous to the sync.rwmutex and actually the sync.locker interface as part of our requirements have we maximized sort of the maximum number of nodes to a total of 15 or 16 you could actually if you wanted to push that number up a little bit but 16 is good enough for us and how this works behind the scene is that all servers basically have a connection to all of the other servers and when one of the nodes asks for a lock it basically contacts all the other nodes and when a majority of the nodes yeah return back the lock then yeah the lock is grounded on that particular machine and when you release it again it sends out release messages and so it's relatively simple but yeah for us it works quite well. Here is an example maybe a little bit difficult to read but again the API is compatible with the regular rwmutex so basically this is an example where you just create a mutex and well then you lock it twice then there's some go routines that after one and two seconds unlock the read lock and then here you try to acquire a write lock and obviously the write lock can only be granted when both of the read locks that were earlier granted were released so you can sort of see here that so it's acquiring read lock one read lock two and then it's trying to acquire the write lock but it will block here until both first the first read lock and second read lock are released and only then will it require the write lock and obviously running this on a single machine is not really the point but you can just as well create basically three of these names mutex on three machines and then run one read lock on one machine another read lock on another machine and the write on the third machine and then the whole sequence of events would be would be identical in terms of like performance on a 16 note configuration we were able to do like seven and a half thousand locks per second and then it takes about sort of 10% CPU usage on like a regular server and typically a lock is granted within like one millisecond so this quite nicely met basically our requirement in terms of an object storage an object storage does not have the requirement that you're going to write like a hundred thousand objects to it in like a second so maybe for something like a key value store this wouldn't work but in our case it quite nicely met our requirements and it's nicely bundled with the menu distribution and actually here's a pointer to the repository and we also on our block we have a block post about this with some more details so that pretty much brings me to the end of my presentation thank you for your attention and go ahead so I have a question so you are using Blake to detect big big road and then you have performance problems but Blake is a secure hash so why don't you use a narrow detecting code which is probably much much cheaper instead of using a secure hash and then what do you mean by an error detecting code well actually something like rich Solomon or probably humming or I don't know something which is cheaper rich Solomon doesn't give you bit rot I mean it detects bit flips so maybe maybe rich Solomon I can't remember I have to look it up but humming codes for example detect errors and there are much better suited codes for detecting flip bit flips no the problem is there's there's parity blocks computed in rich Solomon but imagine you have four two data blocks and two parity blocks and when you lose say two discs so you're down to two blocks then if you would just have two blocks you have no way to determine anymore whether there's bit rot or not so you're right if you still have all the data and parity blocks available you could work out whether a block that you read off the disc has not been unchanged but it would be not easy to do so and when you lose those discs so you're down to the absolute minimum that you need in order to be able to reconstruct then there yeah then you have no way to detect bit rot anymore we talk about this later I don't agree yet but let's you mentioned that this code doesn't rely on cgo is there any complication at all compiling this kind of programs no it does not rely on cgo but what what is your question well is there any any complication compiling this program or is it just a go build and that's all that's it if you do a go get you will get all the repositories and it just builds normally and there's yeah you just need to have the go chain ok installed but no special other options or features of the go tool chain ok it will just adapt to the to the platform to the cpu and absolutely right any other questions thank you question there coming I was just wondering how did you write the assembly I mean you showed us all these opcodes did you use some other assembler and then extract this or how did you that for that we developed basically this tool so we developed this SM2 plan 9s tool which is also here you see the repository so basically this is what you write in your assembly file and then you run SM2 plan 9s on this file and it will prepend like the byte sequence I missed that ok thank you otherwise it's a bit cumbersome pretty cumbersome any other questions no oh yes yes my question was regarding to your SHA256 implementation have you thought about contributing it into the standard library yeah we were planning to do that but we need to do a bit more for that but that will be coming second question how come your implementation is faster than the GoSunder library for AMD64 since both are in assembly and have NVX2 implementation so what did you do something special well I mean there's different ways to do different things in assembly right so I mean it's not going to be effector 2x but I mean depending on how you exactly do it you may see like still minor differences so just like in regular high level Go you can also one maybe way of doing things maybe slightly better than another way of doing it so thank you


Hello again, my friends or rather, hallo wieder, meine Freunde! Since today I am building German Scout Car SDK FZ-222 in Scale 1245. It also called Leuchter Panzer Speewagen. In English it roughly means Light Armour Reconnaissance Vehicle. The kit is made by HobbyBoss and it has very detailed interior and chassis. The parts are very nicely molded and wheels are made from rubber. The nice addition are photo-etched parts include in the kit, so you don't need to buy them separately. Let's start with model assembly. I glue the metal parts with super glue. Interior is painted with Tamiya and Vallejo acrylic colors. The chassis and floor are painted with German Field Gray Color. Next I spray the model with clear varnish, then I apply the washes. When the wash dries up, I simply remove the excess wash with X20 thinner. This is the finished interior. It is pity that almost nothing from it will be visible after model completion. I must cover all the painted parts before spraying the model surface with sand color. Here you can see a nice example why not to use exact color shade recommended for the model. This is a quite dark sand color and it will be even darker after applying washes and spraying with varnish. Therefore, I usually prefer using lighter shades, because they are become darker after editing dark washes. For this reason I have chosen lighter XF78 wooden deck color. And of course I add some shadows using darker shade mixed from 78 and 64 bram colors. In my opinion model master chrome is one of the best enamel chrome colors you can use for paint brushing. Now I spray the model with clear varnish. When the varnish dries up, I add the water slide decals and use Mr. Color software to set them properly. I spray the model with another layer of varnish, this time a matt one. Then I apply the black washes. I let the wash pure only into the gaps since I have the matt surface now. I use a cotton swab moistened in Tamiya X20 thinner to wipe the excess wash off. The rust color is enamel paint. I paint all the scratches with a brush. If some scratches do not like nice, I can simply clean them with enamel thinner. The base paint is acrylic, so nothing happened to it. I can easily create smudges using oil paints and enamel thinner. The wheels are dusted with dry pigments. Such a procedure is very simple and quite effective. And voila, it's finished. Well, not yet. I'm going to add a bunch of equipment, although it's quite a lot of work. The model will definitely look much more appealing. Most of the equipment is taken from accessories kit made by Tamiya, Italeri and Akademi, all in 1-35 scale. I make the front holder for the canisters from a brass plate. Now I have to only paint it all and add some nice weathering effects. Ja, ze gut, jetzt is es schlüsslich vertich. It is finally finished and it looks really good. After I started building this kit, I wanted to try something new. I have not made a vehicle with a desert camouflage for a long time, so it was quite a fun. Anyway, the biggest challenge come with a selection of diorama. After a short search on Google, I found this picture. I bought the German vehicle and British soldier enthusiastically exploring it. I immediately liked this picture and decided to use it for my diorama. You can actually find it on Wikipedia. In my next video, you can see me making the diorama, especially the palm tree next to the car. It's a quite a thing. It's a perfect object for using my homemade photo edge leaves. Thanks for watching and see you next time.


I congratulate my friend Nikola Dobroslavic on this local dialogue in the beautiful city of Dubrovnik. I am very sorry that I cannot be there in person due to another commitment. I think it is particularly important that especially in these critical times when a brutal war is raging in a European country, we intensively discuss EU enlargement policy in the western Balkans and not only discuss but finally act. The EU's enlargement policy must once again become a real priority in the EU policy. The terrible events in Ukraine and the associated massive consequences in this entire European security structure require a radical change in the EU enlargement policy. If we continue with the policy of announcements, empty phrases, general promises and bogging down in irrelevant details without concrete results, non-European undemocratic powers will use the frustration of the people in the western Balkans to consolidate their influence in this part of Europe. Foreign powers that are not supported by peace, democracy and human rights will then be sitting in the middle of Europe. We therefore need an enlargement booster for the EU and that means a step forward for everyone. Intensification of the existing negotiations with Serbia and Montenegro with the aim of an early conclusion. Immediate start of accession negotiations with North Macedonia and Albania. Declaration of Bosnia Herzegovina and Kosovo as candidates countries. Concretely implemented reforms must result in immediate progress in the negotiation process. Promises made by the EU such as visa liberalization for Kosovo must be kept immediately. And finally we must do everything to ensure that the negotiations between Bulgaria and North Macedonia come to a quick positive conclusion and that Bulgaria gives up its incomprehensible blockade of starting negotiations with North Macedonia. What we can see is that the top-down approach has largely failed. Hence EU should focus on the bottom-up approach. That means regions and cities. So compliance with the principle of subsidiarity, decentralization and strong local self-government should be an essential criteria for progress on enlargement. Trust is the most important asset. Europe cannot afford to lose the pro-European citizens in the western Balkans and southeastern Europe. With this in mind I wish the conference in Dubrovnik a lot of success.


Everybody mad here for late in sports cards are up in three boxes of 2022-23 panini obsidian basketball These are for Daniel L. Good luck Daniel after this we have Chris F. And that'll be it for me for the day Force will be live doing group breaks on the main channel tonight starting at five Eastern about an hour and 50 minutes from now Grab your slots up for that and then Kyle will be over on the late in to channel tonight Ripping personals starting at five Eastern grab your boxes for tonight as well Bam and Clay Thompson Scotty Barnes and 49 this is volcanic Otto Avika Zubat to 149 That's rookie eruption Otto Christian Coloco Herbert Jones purple So to 99 and orbital Trey young 75 See some crazy history clothes out all day. It's Christian Coloco Sexton and Kevin Garnett to 25 Magnetic signatures Danny Green 99 rookie dual Jersey Otto Wendell Moore, Jr. Is John Wall? To 30 and LeBron James tunnel vision cards 20 of 75 All right, come on. Let's see a big hit. Let's see a big RPA here to close it out A big name low number Dirk ojiananobi Fred van Blee 50 Magnetic signatures Danny Green to 99. That is rookie Jersey Otto Jake Laravia This is Jeremy Sohan 21 of 50 nice rookie Orange a nice so on and equinox AJ Griffin on the back 88 of 99 Alright, that'll do it for your boxes Daniel appreciate it. We'll get these right out to you


Hey, what's up guys? Welcome to Road Ride. I'm Alex Fanover. I'm Bubby at Phoebe and I'm P-Devix. And guys, we have this awesome drone right here. It's called the Vision 40. If you haven't seen our video on the Vision 40, we're gonna have a link in the description down below to watch that. But we are out here at the office in California and we decided to be really fun because Mr. James over here has not done much racing. Actually, you haven't done any racing, that's right. This has been my first time on a track. Wow. First time on a track. That's crazy. So we wanted to set up a track not only to showcase, you know, what the Vision 40s can do on a race track but also what a great way to introduce you to some racing as well, because we might have some racing things coming up here in the near future that we need you to be a part of. So why not fly this thing, which is indestructible and you can just bang off the walls and whatnot and keep on going. So we set up a really cool track here. Thank you to the Sharma Group for letting us use this space.  We have a track that goes all inside, all outside. So all the footage that you guys see will be what we see in the goggles. HD, we're using the Fat Shark Voxnail avatar system. Yeah, you know, I've never really flown whoops that much in HD and at Rampage with this was kind of my first time really getting to push it. So I haven't done much stuff with racing on this and I'm really, really excited because the latency is really nice too on the walk snail system. So I think it's going to be really fun for racing. I'm excited to see you race. Yeah, I'm just, I've been enjoying just having HD in a loop finally. Well, something that's actually like you can whip around and fly freestyle. So yeah guys, this is going to be kind of like a fun fly episode where we're teaching James how to race, we're racing around the course ourselves. We hope you guys enjoy and let's go and get to it. So I've been crashing a lot like trying to get faster and faster and it got me thinking like in a race when you're a beginner should you try to go as fast as you can or is it better to just kind of slow down and try to make a lap? Yeah, that's a good question. We actually did a racing episode two, a couple of years back that we'll also link in the description down below where I talked a bit about this when it comes to racing strategy. I always tell new people just finish at the end of the day because half the time, half the pilots crash out on the race.  Okay, yeah. So while you're learning, I think it's good for you too because it's important to do laps consistently and when you're doing that, you're naturally going to get faster. But when you're early on in racing and you're just like pushing, pushing, pushing, you're going to be crashing way more than you're actually just getting laps and getting repetition because racing is really all about repetition on a course. Like how fast can you learn a course and be able to repeat the laps over and over again? So I think this will translate too well to your freestyle because racing is about being really precise going through obstacles, gates, keeping lines flowing smoothly from one element to the other. That translates really well over to freestyle where when you're freestyling now, you're going to have that confidence to go through those gaps even more. But also as a freestyle pilot, you're going to have that smoothness and the ability to kind of swoop through lines that you'll be able to translate over to racing. So it's good whether you guys are freestyle pilots or racing pilots, be sure to venture into the other side of things if you want to get better at the one that you love the most. Yeah, I do notice that a lot of the racers tend to be very precise freestyle pilots. Like they can put the quad exactly where it needs to go. I think it's like all those Jacobs ladders and things like that that just like built them to do that. Yeah, exactly. And the freestyle pilots are always like the smoothest ones to the racing course and keeping it smooth and steady wins the races. We've heard many, many times before. So yeah, I would just recommend you just like try and do a whole battery without hitting anything, tapping anything. Even if it's like ugly at times, like start with that and once you're doing that over and over again, then start to pump the throttle up a little bit more. Just like the goal should be to be finishing three out of every four batteries without mistakes. Okay. Until like you get really comfortable and then by the end of the night, I want to see you like just pushing as hard as you can out there. Yeah, yeah, yeah, yeah. I want to see raging out there. Yeah, I mean, it's fun to like really like pitch it sideways and just try to make it turn throttle. Yeah, especially in these cars. Yeah, yeah, yeah. Let's see what happens. All right, James. So we raised vision 40s all night. Are you hooked on racing now or? Yeah. What are you thinking? No. No, it's terrible. Now I had a lot of fun. It was a, it's something that like I always felt like was too structured for someone like me who like is really into freestyle.  Right. Just getting together with all the buddies. Yeah, yeah. And something that's like one S, you can crash into all the walls, setting up gates, making it look cool with all the lights. Yeah. That was awesome. So I think this style of racing is something that I can get into. Maybe not like the big five. Yeah, yeah. Just, I mean, just, we're just having fun. I think that's the one nice thing about whoops. It's like, it was not like super serious to it.  With five inch racing, man, I just remember going out there and I was, I'd burn like five motors in a day and just out there. Yeah. It's really grinding, but this is more just having fun with your buddies. Yeah. Yeah. Totally. I mean, I had a lot of fun racing the vision 40. It was fun to like really put it through its paces on the DRL style track. And racing in HD is just awesome. I mean, it's a whole different experience compared to flying whoops previously. Yeah. So that was really cool flying the course and big shout out to the ghost base and the Sharma group for letting us use our office to do our route racing in. So yeah, if you guys want to pick up the vision 40, go ahead and check it out and the link in the description. We sell it in a bind and fly and a built kit.  One S and two S. They were ripping the one S, but if you want it, the super saucy two S. Go ahead and try that. Link's in the description to all that. If you guys liked this video, make sure to like it, subscribe, press the notification bell and comment. I'll see you guys next time on Road to Ride. See you guys. I have to race the world champion. Yeah, Alex Zenover, 2019 DRL world champion. Yeah, I gotta race him too. Okay, this should be fine.


Arctic climate change has already resulted in amplified and accelerated regional warming. Satellite observations have captured this climate phenomenon in its development and in sufficient spatial details. Satellites have witnessed the impact of the amplification on phytoplankton and vegetation productivity as well as on human activity and infrastructure. This article was authored by Igor Esau, Lasse H. Pedersen, Matilde Kansit and others.


What's good, George Boy Rocks back out again with another video. So we're gonna check out 20 best world rumble surprise entrance ever a The real question that a lot of us are probably concerned with is who will be some of the surprise entrance for the men's and Women's Royal rumble this year. Hopefully there's some good ones. I think a lot of us are expecting Cody Rose to be one of the Surprise entrance and you have to use the word surprise loosely in that situation I think a lot of us expected, but I think the pop will still be you know Still be great. I think people will still be excited. It's one of those type of things where it's like If you guys remember when Edge have returned I think to the Royal rumble a few years ago And it was all it was rumored that he was coming back Like it was all over the dirt sheets all this other stuff But when he actually came out there the pop was fantastic crowd went crazy And I think it's more or less going to be the same here. I think one of the ones that was a real surprise AJ Styles making his debut at the Royal rumble. That was that was pretty impressive I'm not sure if a lot of people knew about that But I definitely did not see that coming at all when it originally happened So we're gonna check this out should be a good one. Appreciate all the love and support you guys shown on channel Rumble rumble man I want to be a rumble man Look, everyone forget last year the rumbles the best time of the rest in calendar year and why do we love it so much?  There's 20 of these bastards and we're burning daylight. I'm Adam Haley from parts fun And here are 20 best Royal Rumble surprise entrance ever Also, there's been loads of Royal Rumble content this month go back and watch it and then watch the Royal Rumble Tell us what you thought in the comments. Please be good. Please be good. Yeah Shout out to them getting the bag man Someone out there will well actually me on this but I'm pretty sure that Bob back and strolling into the 2000 Royal Rumble mid running for Congress after being out WWE for four years It's one of the first ever like surprise returns in rumble history. I think I think I think it is face Gets a monster pop to from the hardcore New York crowd then proceeds to do well bollock all in the actual match itself But gosh, they make a lot of noise for him I had no idea he was when I was a fan number 19 litre 2018 the first surprise enter that was a good one I was a good one gets the kind of heartwarmingly large reaction You'd expect from a legend last seen wrestling on pay-per-view back in 2006 for crime time came out to sell a dildo for 25 bucks Sure, she almost kills Sasha and Becky with the litre salt, but it's still good still good number 18 hacks or Jim Duggan 2009 ridiculous likes to pop in now and again to shout hoe wave a stick around and remind everyone that they're in America He's done a bunch of times, but by far the best one was in 2009 where he turned up.  No good matches ever came from Cody versus Dustin Monster gold dust this who was making his checks notes fifth return to the company Damn in the best shape of his life so much so that he stuck with the company for years after number 16. Mr. Perfect 2002 Man, I wish when I first started watching wrestling I knew Mr. Perfect was Chloe would have lost my tiny mind watching returned to 2002 Royal Rumble Kurt Hennig strolled in with the same swagger and lasted to the final three Before getting eliminated by triple Asian and shame about the rest of his short run the company afterwards Christian 2021 this I remember this so much higher if Christian actually returned in front of a live crowd Yeah, I've seen in ring for seven years since you retire to protect your brain made his return at the 2021 Royal Rumble That was a good moment with his brother and boyfriend edge I think it would have been tear-inducingly nice if it had been more than gifts for fans in attendance I really Pandemic era of WWE was just we're just pandemic in general, but it really hit wrestling hard That would have been a great moment to been seen in front of a live on the lowly immediately went to a w afterwards number 14 diesel 2011 the gap between how I remember this one to see someone how little they actually ended up doing has never been larger than Diesel's return at the 2011 Rumble Holy shit Happy to see the worst WWE champion of all time getting the kind of monster pop that makes the rumble special Look at Kofi's face Diesel chance to kind of the company never heard in 1995 and he walks around punches some people for being eliminated by Wade Barra, I guess good. Bye. Bye. Number 30 Rob Van Damme 2009 nothing compliments a shocking rumble return and JR screaming. It can't be Oh my 2009 after two years away Ronald Van Donald turn for Ronald Van Donald He arrived got a monster pop Didn't do a whole lot of important stuff, but everyone was very happy story of 2600 WWE career to be honest. Yeah speaking of ECW number 12 Baba Ray Dudley 2015 The fact that often goes unremembered before Daniel Bryan was eliminated the 2015 Royal Rumble was really good Bray Wyatt got to conduct a sermon interact with a boogeyman, which was brief and fun He had a fun return to but best of all Baba Ray Dudley returned for one night And he was greeted with such rapture. Yeah, he was him and divan both got nostalgia run later that year And it was also very funny to see Baba Ray run through all the signature Dudley spots with just the closest black guy You can help our truth Yep, everything else number 11 Ray Mysterio 2018 God the 2018 Royal Rumble was mint genuinely one of the greatest of all time due to its clever structure solid through lines and blistering final stretch With the roster being quite deep at the time unlike women's roster There were not many returns here hurricane swung by to say Mysterio arriving to a much nicer ovation in his last rumble in And in the shape of his life returning to the company after a spell on lucha underground He looked great still wrestled Hey shout out to Ray man still out there putting on pretty great matches like pretty good matches And still looks like he was saying in great shape after all these years, man That is just a testament to you know Just someone having the love for wrestling and the love for the business. It's always good. You can never go wrong with Ray I love me some Ravens dear. I will always love Ray bro. Ray is he has a special place in my heart It's just that one time he came at number 30 and everyone wanted Daniel Bryan. It just Is wrong time wrong place Ray, but we still love you Ray your son Nah, nah Dominic's doing some pretty good work as a heel. I love it I ain't gonna lie to you like a whip it and contributed to the ace old versus new narrative of the final six number 10 Ty Dillinger 2017 very occasionally WWE WWE actually does the yeah, so you say yay. They did the thing I like it when that happens and in 2017, which is not actually a good rumble year Despite the mega stars involved. They did the thing. Yeah Yeah, a man who got super over in NXT by being obsessed with the number 10 Got called up and ended the rumble and number 10 Yep, you times the main roster WWE actually seem to understand the NXT prospect They had on their hands I remember that the crowd once he came out and it was he'll crowd went crazy and they were just chanting 10 That was I was like, but it only makes sense In my in my mind, I always felt like Vince would be the type of person Ty Dillinger at 9 or at 11 instead of 10 just just to mess with the fans funny number 9 book a T 2011 this return is both beautiful and terrible After four years away gets a humongous pop does all his moves to the fans pro lapsing themselves enjoy looks great Gets a limit. Oh wait. Did y'all see that sign? Did y'all see the sign does all his moves? We coming for you?  That is great That just made this whole picture fantastic. We coming for you Look at it. Just the widest guy holding up the sign with glasses. I love it man Looks great gets eliminated the right times, but he on the heel faction running the rumble pretty much perfect in terms of a nostalgia That was fun great done without Matt Stryker shouting. It's a mark-out moment I'm marking out bro on commentary Repeatedly clapping into a live mic. That's not book a tease fault I suppose number eight Trish Stratus 2018 the first ever number 30 in the first ever women's rumbles the first ever women in WWE was reserved for a very special guest the doctor of Stratus Factology, it's always nice to see Trish Stratus. She's unironically beloved by all although This does rank slightly lower for the baffling decision to not have her and later Share the ring at the same Yeah, that that was a missed opportunity Yeah 2013 a major Royal Rumble surprise return that was actually a surprise Thankful with the platter of wrestling news that exists It's very hard to have a major Royal Rumble return happened without it being hinted at by the wrestling media Yeah, JJ thought sod that and shocked everyone six months after Dolph Ziggler ran him out of WWE like I'm in Tamsari and after Dolph walked in at number one Jericho returned at number two and no one knew it was coming Which is good number six Mick Foley 2004 in 2003 ran the orton adopted the gimmick that truly made him the Legend killer gimmick one of the legends killed was Mick Foley the Randall punted down the stairs and essentially drove out the company Which made Foley's return at the 2004 Rumble all the sweeter Mm-hmm had been in the ring for half an hour when Foley That Foley literally just came there to eliminate That's it was funny, bro Here's all it wasn't even for him to win.  Oh and heart and Jeff Jarrett do some fun stuff and the rumble accomplishes some important Never win this thing in a million years making it feel very samey throughout JR spends the entire rumble Asking when Austin's gonna show up, you know, like he's Pooching the one treasured memory though Mick Foley wearing all three faces of cactus Jack at number one 16 and dude love at number 20 It is very sweet number four That's what it's just for me, but it's a wonderful moment Definitely the best NXT rumble caller. That was cool his face off with Brock. I was like I think a lot of us was enjoying what we were seeing in front of us, man Oh, maybe Shayna Baszler earlier that night, but that wasn't really a surprise She was heavily tipped to win the thing Yeah, this was a joyous shock North American champion Keith Lee Striding into the Royal Rumble to stand face-to-face with an infatuated Brock Lesnar Pumping his Minnesota out. Yeah, it's my favorite thing. That was good AJ Styles 2016 I said this at the beginning of the video man AJ Styles coming out there was Fucking insane 2013 return everyone kind of knew that AJ Styles would probably possibly maybe WWE he strenuously denied it every time But even so people thought oh, maybe you'll go to NXT Maybe he'll be in the rumble, but probably not yeah No, he's in at number three Surely up the camera angle thanks Kev, but Styles walked into WWE to immediately square up to WWE champion Roman Reigns And it was a wonderful uncanny surprise. That was great. Edge both of them. Yep All right returns After being on the shelf for six months Edge returned speared everyone It came face-to-face with his former tag partner before ousting them from the match 10 years later after being on the shelf for nine years Speared everyone came face-to-face with his former tag partner for ousting them from the match on both occasions The fans went And it became an instant classic rumble moment You could argue the fans guessed both returns were coming Unlike number one John Cena 2008 that's a good one. That's a real that that's that actually is a good number one. I Still vividly memory remember it Jim Ross calling it no one thought Because he had just got injured no one thought and it was a serious injury. I forgot exactly I'm sure he'll say exactly what it was, but it was a serious injury No one thought he would get back that soon. I Think he was only out for like maybe four months or something like that I think the turn tap the turn tape or the turnaround for an injury like that originally I think it was like maybe half a year came back in like four months or something some crazy And he was in the rule number and people were like what? Everyone was shocked. I was shocked crowd went crazy I was like, how is he back so quick from a serious injury? That was insane The quintessential rumble return the top guy in the company at number 30 returning months before anyone could have expected Yeah, rising every single person in that building. Hell. It was so shocking that John Cena drew a rapturous pop Yeah, the Madison Square Garden and I want y'all to understand This is a hardcore crowd that with any other time will boo John Cena But the and this is my time he was getting booed a lot from the the older male audience But he came back Madison Square Garden in the roof went off the place Because no one thought he would get back that soon. No one thought he was gonna be the guy to come back in a war rumble New York fans who hated him all the time and still lost their collective minds It's still the best return of all time and one of the reasons why you can never rule out anything when it's true The royal rumble fight me and that's our list. What's your true true true true? Very very true. It's gonna be interesting to see what happens in this year's royal rumble I am looking forward to seeing any potential surprises Of course, I think a lot of us expect Cody to come into the Royal rumble The question is at what number either way the pop is gonna be great because we haven't seen Cody and In quite some time due to his injury and I'm just I'm just ready to see how things play I'm looking forward to the Royal rumble. Y'all have no idea. It's gonna be a great time So comment down below. Let me know what's your favorite World rumble surprise entrance of all time man. I appreciate y'all, you know Showing the love and support on the channel man. I am still yet undisputed YouTube wrestling champ of the world and Yeah, man, we'll see what how things play out. Appreciate talking to me. See y'all next time. Peace


The relinquishment of responsibility is a simple yet traditional event that is bridged with symbolism and heritage. The key to the ceremony is the passing of the colors. The various soul of a military unit is symbolized in the colors under which it fights. For they represent not only the lineage and honors of the unit but also the loyalty and unity of its soldiers. The custodian of the colors is Command Sergeant Major, who is the senior enlisted soldier in the unit and the principal advisor to the commander. The non-commissioned officer in charge, Master Sergeant Foster, will pass the colors to Command Sergeant Major Hood, who will turn past the colors to the commander. The passing of colors symbolizes the relinquishment of responsibility and the authority from Command Sergeant Major Hood. The commander will then return the colors to Master Sergeant Foster, the non-commissioned officer in charge. Ladies and gentlemen, the commander of the 598 transportation fleet, Colonel Joshua Hirsch. Good afternoon and good morning to everyone. I want to thank you all for joining us on a very important day in the history of the in-motion brigade. And before I say more about the great leader we're here to recognize, I want to start off by saying just a few words about the Hood family. Mary, Zachary, Ethan, and Jonathan. Hopefully Jonathan, you're up and watching on Facebook right now. Because today is your day too. To Mary, we can never say these words enough. Thank you. You've earned us candy for the past 30 months and we took them away from you and the family to locations all over Europe. As we all know it's not easy keeping things together at home and on top of that, Surgen has ideas to fill in with the 266 finance company. And most importantly, it bombs Zachary, Ethan, and Jonathan. Mary, you can do it all. And our brigade is going to miss him. There is no way I can touch on everything that Command Sergeant Major Hood has done for the 598. And the lasting impact he has had on this command and the lives of the soldiers, D.A.C. Billions, those station teammates and our families in just a few minutes. I will say this though, as soon as I arrived in command 10 months ago, it immediately became very clear to me that there was no part of this command that Command Sergeant Major Hood hadn't made better from his leadership. Ladies and gentlemen, even after all, Command Sergeant Major, Command Sergeant Major Hood. Good afternoon. I want to thank you all for being here today. It means a lot to me and my family that you are here with us today, even if it's virtual. This is a great day to be an Army. This is a great day to be a soldier. And this is a great day to be a service warrior. I want to talk about friendships. We make friends throughout our lives. Life is an endless loop of making friends, especially for those in the Army. There are a few things in life more worthy than making lasting friendships. In the past 30 months, I have built friendships that will last the test of time. For my special friends, the soldiers, civilians, and local national of the 598, I will always be there for you. As I've said before, my door is open, my computer is on, and my phone volume is up. I stand ready to help you anywhere you need it. Finally, and most importantly, I want to thank also six five-star, my beautiful wife, Mary, of 23 years.  You're the best mother, best wife, and the best friend that the boys and I can ever have hands down. Thank you all for being here. I am so blessed to be. I'm so blessed to have had the chance to serve in the 598 and now in the 595th as it does tonight in Kuwait. If you're, if you're ever in Kuwait, please spring by. We'll have a supper. Gas me and go buck out. People curse when you matter. Army show. Sir, ceremony charged. Ladies and gentlemen, this concludes today's ceremony. Please take a moment to wish you man such a major good and his family upon farewell. Thank you for your attendance.


How many are familiar with Steam? Okay, just wanted to verify. So let's go. I'm Eshed. I am a core developer in the Spring RTS engine. The RTS engine is then like real-time strategy. And while we have lots of games, well, I don't know lots, but there are quite a number of games, the engine itself supplies, you know, some underlying services that most games use. Like it supplies some scripting language so the games can actually be written by something that is not C++. It supplies physics. Everything is really, like, simulated. Units cannot shoot through units unless you, like, have a certain tag that says do not collide. You know, graphics pipeline, pathfinding, which is endless work, networking, so you can play with your friends. And currently we have 27, 963 commits, so it's been kind of busy. The first, like, version was released on 2005, more or less, so it's been, I think, April, yeah, and it's been working even before. In total, we had something like 100 contributors, but at the moment the team, the core team, the people who touch, you know, feel comfortable touching everywhere is kind of less than two. And I'm, like, half at least, at most. So this is the engine. It started as a reimagining of a proprietary RTS game, total annihilation that came out in 97. By 2005, you know, hardware was quite better. You could use, you know, video cards in order to render stuff. Total annihilation was using all kinds of weird tricks to render 3D models from a fixed camera. So TA Spring, as it was in the beginning, could do it from a different angle. And if you can see, this is, like, the same model. This thing is what this is here. And it really just used the assets from the original game, but using a real 3D engine. But time has passed, and people understood, wait, we have an actual game engine. We don't just have to pause total annihilation as it is. So other games were made, such as Zero K, which you can kind of see that it is similar to the mood and things, how they looked in total annihilation and evolutionary RTS, which kind of moved from it, but it is similar in some ways. And our games that looked quite more different went into not robots fighting robots, but, I don't know, you might recognize some of these things that we probably have no license for, or Spring 44 that nobody requires license for. And they play quite differently for total annihilation games. And you have, like, really different games. Kernel Panic, as you can see, like, entirely changed how the graphics is imagined. And it's still an RTS, but it's, like, inside a computer. Gravitas, which was made in a game gym in 72 hours, was quite fun to make. And it's a puzzle game, not even an RTS. The controls are WASD. It's really, really different. We've made more games in game gems. It's like, as a recommendation in general, if you make an engine, game gems are an excellent way of testing what is fast, what isn't fast, what things work, where developers need a little bit more help, like your users. So Area 17 was a really fun game about an alien looking for the partner who ditched it on Earth and you're, like, burning the entire place with doomsday weapons. And Parsonated was just a spooky, you know, a first-person perspective game that also could kind of happen. And then you'd be really, like, testing the limits of spring. It might be an RTS engine, but maybe the abilities can be used in many ways. But let's talk about Zero K. Zero K, as I showed, is one of the games. And they wanted to release some steam. So if we look about Zero K, like, the past history, the first version of it was released somewhere around 2007.  This is, like, a very important measurement. And this happened in, like, 2009. And since then, like, consistently, which is quite impressive to be more than 10 years consistently, you know, finding people to play with, it's, like, one of the more popular games in the spring engine at the moment I think it's the most popular. And in 2013 or so, Steam came up with the green light thing. Are you familiar with green light? No. And also I will say, green light was basically because Steam were understanding that they start to be a monopoly in deciding which games are released on Steam and which not, and when you are kind of deciding which games reach an audience or not, that might be a problem for governments and stuff. So they kind of offloaded the work to users. Green light was a thing where you put your game to the popular vote, and if there are enough votes, it will be released in Steam eventually. Like, it will be accepted. So Steam green light, like, Zero K put the game in April 2014. It was, like, in the same month, it was accepted because there were enough users to just bring and, you know, bring them to vote. And then, just, you can see it. This is in May. You know, even though you're green light, it doesn't mean you have to release the moment you get the green light. Liko is, you know, a core developer of Zero K, and he said, like, we have to prepare and double check lots of things now, so probably a couple of weeks. This happened in May 2014 when people asked when it's going to be released. And then, like, you know, in June 2014, a little bit more than two weeks, it got released. So that's all. Any questions? Yeah. So a question, like, that you might ask yourself is what really happened? Let's talk about something that happened a tiny bit before that. Remember that I showed next to Zero K another game, Evolution RTS. So it was released, the first version, also around 2007, quite near the timeline of Zero K. It never reached a big popularity. There were people playing, it has a community, it has a community now, but it wasn't in the same level. And it submitted itself to Steam Greenlight very early, like, near the beginning of this endeavor by Steam. Also got Greenlit in really, really fast because the entire Spring community happily helped it to be Greenlit. And it launched 4th April 2014. As you can see, this is very, very close to the Zero K Greenlight. Now, this all seems very nice, except that there was a catastrophe. Steam decided that they want to advertise games. And on the main screen, when people opened Steam, there was this feature about Evolution RTS. Now, you can say, oh my God, this is like the most amazing thing that can happen to a game. Not exactly. But if the game is stationed on a server which isn't even its own, it's like a server of the Spring engine and the Spring engine never experienced a big influx of players. And maybe we had some problems where every user gets all updates about all other users. If you count fast, this is O of N squared. So when there are 100 people, there's a day when there's like 500, maybe 1,000, all right, but this goes up fast. And if everybody and his sister from Steam comes at the same time, what you get is this. This is a core developer of Evolution RTS, a one-man army, and he wrote on the forums in 7th April 2014, please help me. I'm at work and Steam users are flooding in. Blah, blah, blah, this is like, we had technical issues now. In order to explain how big of a problem it was, people from Spring that don't even play Evolution RTS came and started helping and assisting people how to get into rooms, how to open them. We will see later why it's hard. There were people from other games also trying to steal Evolution RTS players into their own game and then somebody starts a game an entirely different game. So it was mayhem and then you have all the people that it doesn't work and things became slow. And then you can see reviews cropping up like this one. And this is very sad. Note, this is not a review of the gameplay itself and you'll find out why in a second. The download for the game is simply a download for a game, lobby. Oh god, why? I hung around for around 25 minutes trying to figure out how to just start a game. Okay, this makes no sense. Like, somebody wants to start a game, they should be able to start a game. Something was definitely rotten in Spring and the entire ecosystem if somebody spends 25 minutes trying to run a game. Now, this is even worse when your game is free.  They have sunk costs. They will spend 25 minutes an hour to learn your game, to do something. If they downloaded it for free and things don't work, they will just uninstall it and play something else. There is no sunk cost. There is no big reason for them to persevere. So, this is the current state. Now, it was worse before that. It was worse after the release. But currently, it's like 50 percent. Positive reviews is not good. And the bad thing is that it's not about the game. The game is quite nice. It's not bad at all. So, I talked about lobbies. And let's start talking about lobbies. This is how a lobby looks. It looks nothing like evolution. This is a past client. This is also the F lobby, I think. And, wait, spring lobby. As you can see, many people tried to write lobbies. There were always people unhappy with how the previous lobby looked. And, wait, I think there are more. This is spring web lobby. And then they made another version of spring web lobby using React. And 0k understood that it just makes no sense that every lobby's work with all games. Maybe they should make their own 0k lobby. But you can still see other games like pants, narration, and so what is going on. And, oh, this is like, this is a new one. Actually, I gave this talk a year and a half ago, more or less. And this is a new one that somebody started making. Just a screenshot. It wasn't released yet. And I also found this one. And, okay, something is really, really insane. If you have like 10, I don't know how many. I missed some. So many lobbies. Why is a lobby even necessary? We're trying to play a game. Why can't I start evolution RTS? And this is for a very interesting reason. When you start spring.exe, this is what you see. What, I don't know what to do here. Like select a game, select a map. What is a script? What is this? This looks horrendous. And this is, I'm not even exaggerating. When I first downloaded spring in like 2007 or 2006 or something like this, I was sure I'm going to play single player total annihilation with spring. Because nowhere in the website said it's multiplayer only. There is kind of single player. That's basically multiplayer. And I just run spring.exe because it made sense. And I see this and I don't understand anything what's going on. And I just gave up after a bit. And then I found launchers for some of the game had single player launchers in order to replace the lobby. And what is a launcher needed for? Because if you just run the spring.exe, you just get this screen that isn't supposed to be used by any user. Instead, there's this text file which is called a script. Which says, oh, this is the game used. There are this and that teams. And this who-and-gainst-whom, like their line says, it holds an IP if you're trying to connect somewhere. And something has to generate it. And it's not the user. So naturally, this program will be a lobby that handles all the network stuff of like, this is what's going to the game looks like with the server. And then they send directions to the users to generate this text file and start spring with that text file. Okay.  Like, it would make no sense for any place to use it. But I think it's an inherent thing in open source software. This is a quote by Eric Raymond. It misses the attribution. But anyway, there's a closely related issue, however, that I don't know. Doing systematic user interface and user testing. And why is that so difficult to test user interface with end users? Because basically, users don't want to do tests. And you cannot trust developers to do tests because then they use text files and stuff like this. And user testing costs money. So if you don't have it, it's a bit of a problem. Or you need lots of users that will agree to, or maybe not agree, just release a version and see what's going on. Because everybody has a testing environment. Some people are lucky enough to have a totally separate environment to run production in. We always do it in the spring. We just like release stuff and see what happens. So in this case, the big, I don't know, the huge loss here was evolution. Yes, they were the testing environment for 0K. So 0K sees that like a week ago, there was a disaster with the current situation. Something has to be changed so we don't release and we don't suffer the same fate. And this is why it wasn't released two weeks later. So this is kind of what I said. And user time is a limited resource and dev time is an even more limited resource. This is why we don't just pay developers also to check because we want them to develop stuff. And you know, good will. You can only release so many CREP releases until you won't have any users to test them. And we talked about free games having it worse. And even if you are improving stuff, some people will not like it because they've been playing since 2005 and they're used to things just remaining the same way. If you don't know this XKCD, check my presentation later and really it is one of the best. But basically users like things to stay the same and if you're trying to get to new audience, you have to change the things that are broken. So there's kind of a tension. While you are doing the tests for the new people, you're losing veterans. And is it worth it? Are you sure that the new people will come? It's a bit of a problem. It's a bit like from the end user perspective, they think that you're just trying to ruin their day.  And when I was teaching in junior high, I understood that the kids don't understand that I'm on their side. And if I'm telling them something is wrong, it's because I want them to get it right the next time. And I have to tell the kids all the time, I'm on your side, I want you to succeed. So this is kind of the same with our end user. They just think, oh my God, the developers cannot just, you know, and keep the things good. They have to change things all the time because they are bored. And no, we don't. We actually want things to improve. We are very sorry that things don't always do this. But like, yes, sorry, this is like a zero case length. I hope you like it. If not, well, nothing to worry about it. It's a, yeah. Anyway. Okay. So let's understand what had to be changed between like the planned release and the release. First of all, the server. We talked about the O of n square. Something has to solve this. So you can actually support 1000, 2000, I don't know, as many as might come. A lobby, of course, is a problem. We cannot just use the current system. It makes no sense that you will see a list of 20 games and the lobby doesn't even look like the game. You know, people look in a screenshot in Steam and they want the things they run to kind of look the same. It's about branding. It's about like understanding what's going on. User interface. I will show in a second why it had some problems. But as a game made by developers, kind of for developers, it was very customizable to like too much. Single player. Like many, many games, the multiplayer community is much smaller than a single player. And you kind of get, you know, a foot in the door if you have some single player presence. So you're not just like for the die-hard, you know, Starcraft insane people. And the trailer. Because if you change things, like you had all trailers, but if you change things, then you need a trailer that shows how the game looks now and not how it looked before. How did we solve all this stuff? And when I say we, even though I wasn't in 0K, because it was kind of the entire ecosystem had to like work and change things in order for this to improve. How much time? When did I start? 20 minutes. Amazing. So first of all, there was seven migrations. 0K decided to just make their own backend. And like at first there were some issues because why can't you just like work with the current server, which the server was good. But in the end, this was the exact tension about when you're a game that is released, the biggest thing you need is stability. And they couldn't just stay on the bleeding edge of the server like it's in the engine. Second thing, in-game lobby. Why not take the lobby and put it in the same executable? So you don't have to like run lots of stuff and this is a good thing. The GUI revamped was like basically trying to standardize everything I will show it. And the rest was compromises and luck. And we will go through everything. First in-game lobby, like when we started talking about lobbies, as you can see like that many people did lobbies, even more people tried to like come up with different designs on the forums. It's more just like funny. And basically all the people were just forum-posed about stuff instead of actually doing anything. What even, like I can say that I don't understand what's going on here, but actually it made this one, so I do understand. Yeah, this was like criticism of the entire 0K project. Anyway, this is the in-game lobby. I think it's quite nice here. And you know, there are two really, really important things. One of them, it has 0K in the top, so you know that you started the right game. It's not a joke. And other things, like there's like a single player and it doesn't like clutter your screen way too much. And you will believe me, maybe I will show later, how like you really need very few clicks in order to get in a game. You don't need like to spy this small ready box that you have to tick in order, and I don't know what. And there's like they implemented a matchmaker. So it's like in two clicks you can wait in a queue. If the community is a bit bigger than you wait so time, now it's like a long time after the Steam release, you might wait a lot. But it's like with regards to the approach, it was really, really useful in the first few weeks, let's say after release. And even now people are using the matchmaker for a competitive playing. This is like the old user interface. And you can see like you have lots of stuff just floating around. And they're not entirely like, how do you call it, consistent with each other, like this player list, which is kind of in the way, it doesn't really look related to any of this stuff. And this just floats, I don't know.  And you have like if you press F11, you can choose all kinds of widgets and stuff that you can add, you can remove. Everything was like immensely customizable. That is awesome. It's part of the reason why Spring's user interface is very powerful, but very ugly. Like there's a cost benefit here. But once you want to release a game, you should kind of use what power already exists and try to make things more consistent. Now I don't want you to think that the only thing changed was moving the minimap from the left to the right. You can also flip it, there's like a setting. But in general, everything is kind of better docked to places and they got rid of this really, really bad button that lets you move everything. You can, if you really, really want to shoot yourself in the leg, you can kind of find it hidden somewhere in the settings. But in general, this was much better. And like I use it. There were also compromises made. This is a single player campaign. Instead of going full red alert with stories and the plots and I don't know what, this was kind of the idea in the beginning. Just somebody came up and said, okay, let's just do a galaxy map when you go from planet to planet and every planet you unlock new units. And there's not story. Just like you progress. You learn how to use this unit. It's like kind of between a tutorial and a single player experience. It's not as good as something with a story, but you can have fun here. There are bonus missions. You can do it on hard difficulty, which is quite difficult. And it works. This is a single player. People can play it at home before they are getting shredded by the pros in multiplayer. And there's luck, which is basically that we needed trailers. And for trailers, you sometimes just need the right people. I think that sound is kind of not very good here, right? Or do we? Okay, we will see because I'll just show you the trailer and if you don't hear anything, then I'll try to narrate it. Oh, I'm muted. Yes? Give me a second. Yeah, I'm muted. I'm not muted. I don't hear anything. I think it's trying to go through. Yeah, I will see if I can change it. Oh, here. Give me a second. No, no, I think. We have Caster. Caster is even, yes. We have Terraforming. We're like almost the only game that I know that has petfinding with Terraforming. Anyway, this spring. Aha! Anyway, so there are things you cannot always plan for. Like that you will have people as talented as Dinefreind and Spring that will do this trailer. But it works. And it showed the new UI, which is important. And before the Steam release, we did a smaller release on itch.io. Anyone here doesn't know it. It's a smaller platform for publishing games. Much more limited. And it was kind of trying whether people can download it and run it and not cry. And there's a smaller risk because the reviews from there are not going to be passed into Steam. So it's just like a great opportunity for feedback and knowing what works. So it works very nicely, actually, because we worked for quite a while on fixing everything. I didn't talk about the in-game lobby. This is actually something that I worked on a little bit. Not on the lobby itself. The lobby was someone, a guy, of doing. But you needed to change and have another state during scripting. And there was lots of fun stuff. But everything kind of worked, which was quite surprising. And then there was the Zero Case Steam launch in April 2018, four years after it was planned. So these things took time. And we really spent quite a bit on it. And then we should ask ourselves whether it was a success. So this is like the number of unique daily users and daily first-time players. And while you can see that the days after Steam are at least twice than the all-time peak, which is quite nice. And this is quite 2020. This is now. So we're already stabilized after the really, really big peak in the beginning. One thing that's important, we survived the influx in the beginning. And then a week or two later, I think it was the week after the release, that I made an error and broke the server during the weekend exactly when we were supposed to get an even bigger peak. So I'm sorry about that. But it doesn't matter. We managed to get players. And even though we don't entirely know how many of the people coming are old players, because sometimes people used to play and say, oh, this came on Steam. I liked it back in the day. Let's go and have some games more. So it's a bit hard to check. But all in all, I think this is nice. But the bigger question is about retention. Because all these things that we changed were supposed not to bring many people for the first time. You really want to see whether more people left or less people left very fast. So retention graphs are a bit weird. But in general, I think there is a little bit of better time. This is like the Steam release. So you're a little bit better retention here than, let's say, here. And you know why here the retention is bad, because this is when all the things were changing all the time just before the release. So it's like the question, when you think, was it worth it? OK. And this is also a nice measurement of success, which I think we have lots of user reviews and they're quite positive. And I think I've read each and every one, especially the bad ones. And it's really fun reading bad reviews. You have the ones that are like, they have good reasons. And then while like, why is it not Age of Empires? And I'm like, well, listen. But yeah, and I should really proudly stop reading because it's a bit of an obsession, although it's fun. So let's talk about, was it a success? Because when you work on something for four years, we didn't work on a more interesting feature, let's say, because we wanted a Steam release to work. So first of all, donations cover service cost. We got more donations, which is nice. Before that, they didn't cover service cost. They even like, they covered the 0K server and then 0K sent some money to Spring to cover our service, which was nice. I had to ask them. But it's getting maximum amount of players really our goal because maybe changing the game could also get more players in a similar manner. Because there's something very, very charming, for me at least, in having this die-hard fan base, which is also why we have players for 10 years, because they think this is the best game. They're not playing it because it's free. They have money. They're just playing it because it's almost payload to them. And maybe maximum amount of players isn't really needed. So maybe we want more exposure to get more devs. I don't think we got even a single dev from Steam. I don't know. Maybe we did get a little bit of contribution, but I know for sure that Spring didn't get anything from the Steam release. Do I think it was success? I think it was. I learned a lot. I had fun. It was very, very impressive. I don't know, user-wise. Considering our goals, I think it was quite nice. But different people have different opinions. The aftermath. The devs were burnt out a few months after the release. There was nothing being done. And then there was all the talks about whether stability is more important or stability is more important. And when these are the same on paper, but they're not, from the engine, the point of view, the version of engine that was used in 0K had bugs. And we wanted them to update. But they didn't want to because these were known bugs. Who knows what new bugs are in the newer versions. And there were lots of arguments and trying to work out how to really keep changing the engine and keep using a newer version. Which still goes to this day. And what I think we'll learn is minimize MTTF. Do you know MTTF? It's mean time to failure. Usually. I change it into mean time to fun. Like I said, when you have user interface or anything, you want the player from the moment they started the exit into when they're having fun to be as short as possible. Like two clicks, fun. This is good. If it's like I have to read lots of stuff and I don't understand what's going on, not fun. This is about anything. Like tutorials, user interfaces, buttons, anything. Also compromise, like the final version didn't entirely look like what we expected. I gave it an example, the single player, some things that the engine planned. You know, not everything works and you have to put like the line, okay, we're releasing this. And we hope that it works. And that's all questions. And this time, yeah. Do we have time? Yeah, we have some time. Okay, yes. I was just wondering because if it's a question of genera or what's the link between? Yeah, they were started being developed. Well, not started, but Spring was started before Supreme Commander was released. And 0K I think also about the time. So it's just the genre. That's the genre. They're both like drawing a lot from total annihilation. So this is kind of how you do it. Sorry? Oh, planetary annihilation took from... Oh, sorry. No, no, no, that's total annihilation from 97. Yeah, more questions? Yes. So what? Yes, we had a few. Oh, I was asked whether we had media exposure. So 0K wasn't advertised on Steam like evolution RTS. Maybe it would have a fair battle, but this doesn't matter. We had some articles not in very big places. There was actually more media exposure about 0K back in the days, like in game magazines. We have people to this day that saw it in like a German game magazine that sent CDs or something back. Things that I think disappeared. There was even one article that I have to tell you. It was about someone who tried to play it on like a gamepad or something, an RTS game. I have no idea. And they were quite frustrated. I can understand why. Anyway, yes?  Yes. OK, I was asked whether if I would go back in time, I would do it again. And yes, we've learned a lot. The product now is much better and we had fun and we didn't argue that much. It's good? Yes? How many people are working on it? What is it on 0K? It's hard to tell. Sorry, how many people are working on 0K? It's hard to tell.  It's much slower development now than it was before. It's really, really hard to quantify. But there are regular contributors doing things. Yes? OK, how do I see the future of real-time strategy? I don't know about the future, but currently it's dead. I hope this is the end. I say it is dead because just like from an observation of interest and what people want. I don't agree that things that will magically be solved because there's a new game that solves problems. I don't think so. Users know what they want and they want data or whatever. Yes, there was one there. Yes? OK, I was asked if there were forks of spring. There was one attempt at a fork, but it was an in-engine. He was an engine developer. He did lots of multi-thread stuff that nobody could write and then you had two versions of everything and it didn't go well and it was decided to remove this code. So he got quite pissed. I understand him. But then he went away and did the version without releasing his source code and violating GPL. So this didn't go very well because later it didn't keep up with our development and no game actually supports it. And that's it. Do I have more time for questions?