 Hello everyone, welcome to our next session. Java life is short and I agree, Kevin. My name is Ro Hozman. It's my pleasure to introduce our speakers for today's session, Kevin Dubois, as you can see. Not only is Kevin a great idea guy with a lot of energy and I loved that I had the privilege to mentor him for a small period to make him even better than he is today. He's been a great developer advocate within Red Hat for a while now. He's even a principal developer advocate. Well done, Kevin. And he has a great mission to supercharge the developer joy. Let's be honest, we all want that, right? And he uses open source as his guided light. Follow him at Twitter via Kevin Dubois. It's easy to find, so it should be easy. And it's also a way to ask questions. Obviously, if you have any questions during the session, please submit them in the chat window. If possible, we will address them during the session. If not, then absolutely we will be able to find your questions and share the answers with you directly after the session as well. As we've said in the previous session, a recording of this and actually all sessions will be hosted on the developer advocates and the Red Hat developer YouTube so that you can easily see them at a later date. We also encourage you to join us during the live chat, during the break on the main stages or for live dialogue with fellow Red Haters that are here to support you to have a wonderful time. With that, let me turn things over to Kevin. Kevin, please take it away. Thank you, Raul. All right, so welcome to the session. Like Raul said, Java life is short, which is all about productivity and developer joy with open source. So basically, I'm going to go through a couple different tools and solutions that I found and that make me a little bit more productive with Java. So that's the idea of the session. So a little disclaimer, of course, it's an opinionated talk because there's a lot of tools out there. There's a lot of different ways you can make yourself more productive and have fun developing with Java. So I'm just going to pick and choose a few things that I think are really cool. So this is, of course, my personal experience and recommendation. But so don't yell at me if your tool isn't getting highlighted because I can't do it all, of course. And you'll see quite a bit of quarkus in this session too because that's my favorite Java stack these days. And it does really make me more productive. But we'll get right into it. So at the base, if you get started with Java, you've probably seen this at some point in your career, or if you're a student, maybe you've come across this pretty recently. But so the typical hello world class with Java, this is the way to get started to just show hello world. And it's kind of a lot. So because you have to know what is a class, why is it public? Why do you need these methods in there with also public or private protected? What's the difference between those? Then you have to know what static method is. What is this void thing? It's a return type. Well, in this case, there's no return. But you have to know all that. And then there's this arguments. And well, it's not even used in this case. So it's very confusing. And it's a lot. Once you learn a little bit more about Java, you get used to this, but and you probably never write this again, right? Because there's stacks and frameworks and everything to make your life a little bit easier. But you know, when you get started with Java, typically, or often this is the case. Now, the Java world itself is doing some work as some projects like project amber that that are going to make this a little bit simpler and everything. But you know, right now, this is kind of the way to get started. And then you would have to do, you know, compile your your code. And then finally, you can run it to get your hello world. So you know, there's a lot going on to just get your hello world. Whereas in other languages, it's it's quite a bit faster and easier. So one tool that I think helps with that, you know, to get started. But also to write simple scripts with Java in the CLI, even that, you know, maybe typically you would use, you know, bash or Python or something. Actually, you know, you can use Java and J Bang to do that pretty well. So J Bang, to get started with it, you know, you do something like J Bang init, and then you give a name for your file, which will also then turn out to be your class. And then you just run it. So J Bang main Java. And actually, if you don't have Java installed, it'll even install Java for you. So, you know, let's, let's take a look at that real quick. So I'll go to my terminal here. And we'll do that, right? So J Bang, init, and then hello div nation Java. And I'll start that. And now you can see that J Bang has created this file for me. Hello, div nation. And you can see basically the same thing, right? So hello world with pretty much what I showed in the previous example. And then you can see this comment here, which is kind of handy because it helps interpret this file. So I can just run it without actually doing J Bang, even though I could write I can do the J Bang div nation.java. Oh, hello, nation.java. And then we can run it and it shows hello world, or we can just do, you know, dot slash for the file name. Oh, Jello. That's fun. Hello, div nation. Same thing. So we can get it started pretty easily. So you can use J Bang for simple script. So of course, I could put some more stuff in there. But you can actually also create CLI scripts pretty easily. So you can do kind of a similar thing. So you can do J Bang, init, and you can use these templates. And so one of the templates that you use with J Bang is CLI. So you can do J Bang init, template CLI, and then I'll call my class CLI.java. And then we can see again, CLI.java. And in this case, we actually have some more stuff in this file, right? So we have this comment depths. So actually, you can add dependencies, libraries to J Bang scripts kind of in this way, which means that you don't need to immediately learn or use Maven or Gradle or something, and then, you know, kind of build with those build tools. Those are great. But, you know, for typically bigger projects, in this case, you know, we just have a simple script and self-encapsulated script. So we can just use J Bang to interpret those dependencies, and we don't need to use anything else. So in this case, you can see we're using Pico CLI, which is a way to use CLI, to build CLI scripts with Java pretty easily. So you can see here, if you're not familiar with Pico CLI, you can see, you know, it has a couple annotations. And basically, that helps me add parameters to my CLI script. So then I can run it exactly like we did our previous ones, the CLI.java. And well, if we run it like this, it'll be hello world. And actually, there was a parameter so we can say our parameters that nation, and then we can see hello, that nation. And the cool thing with Pico CLI is, too, that you can do, you know, like with typical scripts dash age or dash dash help. And then we can see what the scripts expect in terms of parameters. And that's all kind of built in with that. So very easily and very quickly, we're up and running with CLI scripts with Java. And there's kind of, it's a little bit gimmicky, but something that you can also do with J bang. It's a preview feature. So I have to do a dash dash preview in it. And then call this GPT.java because yes, you can use chat GPT with J bang. So you can say like, create a script that returns the square root of, square root, if I can type, of a given number. And we'll see what that does. So this is going to go out to the GPT API, and then is going to create some sort of script with that. So we'll see what I created. And every time this is different. So I don't know exactly what I created. But you can see here generated something that looks like it might work, right? So that will actually create return the square root. So we can try it. Let's see if it works. Sometimes does sometimes it doesn't. So square root of nine. And it's asking for the number, which is also fine. And it works, right? Square root of nine is three. So, you know, kind of gimmicky, but sometimes it works sometimes it doesn't. I wouldn't trust it necessarily. Blindly, I would definitely look at the code, but it's handy to get started and maybe have some ideas. So that's, that's J bang. That's one of the tools that I think is pretty handy to get started in and to get working with and to create CLI scripts and self encapsulated Java programs. So I showed you how you use J bang, J bang init with pimpled CLI. And I showed you with GPT. So you could also do like, you know, print the cat and it'll print the cat or, you know, create a currency converter or something. So some ideas that you can use J bang with, you do need an open AI API key. But other than that, you know, you set that in your environment variables and J bang will take it from there. So that's J bang. Now, you know, when we're developing Java, a lot of times we're working with different versions of Java, right? So maybe we're at our organization and there's still some legacy projects that are using Java 8 and then, you know, some newer projects that are using Java 11 or state of the art Java 17, even though it's been around for a few years now. Or maybe, you know, you want to experiment with Java 20, the upcoming Java 21. But you need to switch between these different versions. And then maybe your organization also use like a specific version of open JDK provided by, you know, the adoption program or by IBM or another vendor or something that have a specific open JDK version. So you need to switch to that. And then maybe you're also using girl VM, etc. So you need to switch between these projects, which isn't always so easy. So one project that does that, you know, pretty, you know, that makes it a little easier is SDK man. So you can use something like SDK list Java. So you install SDK man, and then you can list, you know, the Java versions that are available through SDK man. And then you can install a specific version of Java and then another version. And then you can switch between them by saying SDK use this version or that version. So let's look at that real quick. I need my terminal back. So I'll start it up here. There we go. And so I'll go to my workspace. And so let's see SDK list Java. Right. And so if we do that, we can see, wow, there's a whole bunch of different Java versions available that I can install through SDK man. And then so you can do SDK install Java. And then if you do tab tab, then it's going to suggest the different versions that are available to install. And then, you know, as you type a little bit more, so I can maybe I want to install Java 21. And then I'll tab some more and see, well, these are the versions that are available. So, you know, for example, open JDK, so SDK install blah, blah. And then this will install Java 21 on my machine. And then it'll ask me if I want to use it or not. Now I'm just going to skip this so we can say it's shave off a second or two. But so you can also switch different versions of Java. So right now I think my Java version Java version. So right now I'm running Java 17 Timorin. So by the adopt open JDK, the adopted version of Java, which is also what's maintained by Red Hat, by the way. And so if I now want to say I want to switch to a different version, I can do SDK use Java. And then I can tab and see which versions are available on my machine. So I have an 11, I have a 17 Timorin, I have a 17 open and a 20 open. So if I switch to 20 open, and then now if I do Java version, I can see that, you know, I'm using Java 20, so I can switch around pretty easily. So with SDK man, so you can do install different versions of Java, but also other JVM based components such as actually J Bang is one that you could install by SDK man. So SDK install J Bang. And then again, we can see, you know, all the different versions, which are quite a few of. And so for example, I can install 107, which I've already installed. And then I can install also, you know, the Quarkus CLI, for example, SDK install. And then, you know, this will install the latest version of Quarkus CLI, which in this case is 313 final. And then I can set this as my default version. Sure, why not? And so there we go. Now I have the latest version of Quarkus installed on my machine. So SDK man, pretty handy for working with different versions of Java and different components, such as also Maven, J Bang, Quarkus and a bunch more. So, you know, definitely take a look at that project. So now usually with Java, right, you write your code, then you have to compile, then you have to deploy, then you can finally run and test, and then repeat, right? Then you have to code, you have to recompile, and that's kind of annoying to have to do that manually every time. So there's a few ways to make that easier. My favorite way, of course, is using Quarkus and the Quarkus Dev mode. So Quarkus Dev mode, you start Quarkus, and you start Quarkus Dev and or Maven, Quarkus Dev, or Gradle, and it'll start your application in this kind of Dev mode where it's constantly checking to see if there are changes and as you save them, it'll reload just, you know, the classes that you're changing. So you have a very quick feedback loop. So I can show that real quick too, you know, we're just going to go through some demos because why not? That's fun, right? So if I create a new Quarkus project, so I just installed the Quarkus CLI, so that's handy. Quarkus creates app and then let's give it a name, Dev Nation. And so, you know, I could add dependencies and I could change the names and everything. But you know, this is a very simple example of Quarkus create app Dev Nation. And so, you know, we created this new thing, new application. And so if we go and you can use VS code, for example, so code Dev Nation, we start up our project. And so Quarkus, just like that has created a project for me with a greeting resource, which by default is hello from Recize Reactive. And so now I want to start my Dev mode. So I open a terminal and I do Quarkus Dev. Then, you know, the Dev mode will start and it'll expose this REST endpoint on my local machine. So let's give it a moment to start up. There we go. And so, in just a second, we'll see that it's running. There we go. And so if I now go to my browser, I go to local host 8080, where it's running, we can see that, you know, our Quarkus application is running. And there's a hello endpoint that shows, and I'll make it a little bigger, hello from REST easy reactive. And so if I want to now do my, let's say, development, I'm going to make a big code change, right? Hello from Dev Nation. And I save it. I don't have to recompile or anything. I just hit refresh. And, you know, I got my changes. So I get a really quick feedback loop, which is pretty cool. If you haven't seen Quarkus Dev mode yet. So that's pretty cool to be able to do that. And you can do the same thing with your tests too. So incidentally, when you create a new Quarkus application, it'll even provide you with a little test. And actually, you can see that it doesn't match, right? So we can start our live testing mode as well by pressing R. You can see it here in the bottom. And so if I hit R, it's going to run my tests. And we'll see that it fails, right? Because we changed it to Dev Nation. So if I change that to Dev Nation, and again, I'm not doing anything, it automatically reruns my test for me as I'm developing. So I get a very quick feedback loop. And it's not like, you know, I'm making all my code changes, kind of forget about my tests. And then, you know, after a while, I'm doing a maven package. And then I get all these broken tests because I kind of forgot about it. Now, in this case, we're getting a very quick feedback loop. So, you know, as I'm changing my code, or as I'm doing my tests, you know, I can immediately get feedback that, hey, your test is broken again, because you have this exclamation point. Let's remove it. And then we can see that the tests are passing. So, you know, that's pretty handy with the Quarkus Dev mode. So, let's go back to our presentation. We're going to move pretty quick here to the next subject, which is test containers. So test containers is a very cool and handy project, especially if you work with, you know, kind of dependencies like a database or a Kafka or another messaging system or something. And, you know, you're working on your local machine. And then, well, then you run your tests. And that means if you want to do kind of the proper integration tests that you need to have a database running on your machine, you need to configure it. You need to maybe even install a Kafka cluster or something. And that's not so easy to do, right? It's kind of a pain in the butt just to run tests. And then same thing in your CI pipeline. As it runs through tests, it needs to have those dependencies. So test containers is cool because you can define, you know, those dependencies to, you know, have a certain configuration, but they're running in a container. So you can spin up a container as your tests are running. And then when your tests are done, it'll tear down the container. So you're not using extra resources. But then on your local machine as well, you don't need to, you know, configure it manually install all these dependencies. So test containers is a really cool project. But it gets even cooler, of course, when you use Quarkus. So Quarkus together with test containers is even cooler because Quarkus uses test containers not only in the test phase, but it also uses it in the form of dev services as you're developing your code. So let's say that I'm starting an application and I have a dependency on a database or, you know, I'm using an application, you know, I'm cloning an existing application that has dependency on something. And I don't need to, you know, worry about, you know, how to install the database or the other component that I need and how to configure it. So I have a small project here that already has a database dependency. So I have my Quarkus with DB and so we'll do code Quarkus with DB. And so in this project, it's very simple still. But in this case, I have, you know, little fruit resource and fruit entity, which returns the fruit name and season. You know, if you haven't looked at Orem Panache, it's pretty cool because what you can see, I'm defining my fields as public strings. And I don't have getters or setters. And actually with Panache, it's gonna, as you build your application, it's going to change those into private properties and then create getters and setters. So I don't need to worry about that. But anyway, so let's say that I have this project. And, you know, I can show you here in my Pub and this off, I don't have a database running right now. I don't have any running on my local machine. But clearly this application does have a dependency on a database, right? So if we go look at my pom.xml, you can see, you know, that somewhere in here, here we go, there's JDBC Postgres dependency that this application uses. So when I started up, it's going to look for a Postgres database. So again, I'm going to start in that dev mode. And when we started up, we can see that it's going to look for a database and doesn't find it. And then so it says database starting in a container for you. So automatically figures out that, Hey, you don't have a database. So I'll start one up for you. So now I look in my Pub and desktop and we can see, Hey, cool, there is a database Docker IO library Postgres. And you can see the test containers component that's running with it. So Quarkus Dev Services uses test containers to start up this container. And so if we go look at our application here, we can see that there's a fruit endpoint. And this is coming from the database. So we can see all these different things that are coming straight from the database, which is pretty handy, right? As you're developing. So if I stop it, and I go back, I can see that my database is gone, right? So and of course, if I show you here, if I refresh, of course, there's no application running anymore. And definitely no more database. So that's pretty handy for development. So it works for databases for Kafka and a couple other Dev Services. So that's Quarkus and Dev Services and test containers. So right now, let's say that I've done some local development, you know, with, with those external dependencies, I was developing basically in my inner loop room, you know, doing my development, my testing, debugging, whatever. And then at some point, my code is good enough. I think at least, and then I'll create a pool or a merge request or something. And then we'll go into the outer loop where, you know, somebody might do a code review, we'll build our application, we'll do some automation, right? Continuous integration, continuous deployment, delivery. Maybe we'll do some compliance checks, some security scans and everything. And then eventually we'll go to production. But so in this outer loop, as Java developers, there's actually some gains to be made to make our life better and, you know, not deal with nitty gritty stuff. So of course, you know, these days, the outer loop is containers and cloud and Kubernetes and serverless and all that stuff. So we need to learn a little bit or at least know a little bit about that stuff as Java developers as well. And so, you know, there's some projects out there to work with containers, you know, there's a whole bunch of them, I'm not going to go through them. But again, you can learn one of these specific tools. Some of them are a little easier. Some of them are a little more complicated, depending on use cases and everything. But, you know, again, Quarkis makes life easy with that too. So you can do, so for example, Quarkis image build. And just doing Quarkis image build will use, if you have Docker or Podman running on your local machine, it'll use that to create a container image. If you want to use a different tool, such as Jib or Buildpacks, that's also kind of supported out of the box with Quarkis. So pretty easy and handy to do. I wrote a little blog post about that. That's here in the links too. And I'll share the slides, don't worry, so you can see how to do that. So I'll demo it real quick. I need to be conscious about my time here. So CD Quarkis with DB. And then we can do Quarkis image build. And just by doing that, I didn't really need to do anything else. It'll build a container for me. And it looks like I have some dependencies because I switched to a newer version of Quarkis that is going to download. So we'll give that just a moment to finish up. And in the meantime, I'm going to close my other window here. There we go. And this one as well. And so, okay, I built my container image. Now I did have in my application properties a few values. So by default, it'll still build your container, but it'll use a local host and your computer name for the container path. In my case, I added a few values in my application properties to say, hey, I want to create this for Quay.io with the image group Kevin Du Bois. So it's all ready to actually be pushed to Quay. So I could do that. So I can do Quarkis image push. And actually, I could have done that with also build. And then it would build the application, build the container image, and push it all in one go. So in this case, I've already built the container image. And I probably need to log into Quay. So it'll fail because I'm not logged in and I'm too lazy to do it right now. But this would push my container image automatically to a registry. And then you can add a dependency for, for example, Kubernetes. So if we go back to our slides here, so we created our application, we created our container image, and now we need to deploy it somewhere, right? So while these days, a lot of times that's to some Kubernetes. And so Kubernetes means that we need to be experts of YAML, right? Well, ideally not. So because this is a lot, right? So this is like a very simple deployment that you do in Kubernetes. You need to write all this stuff. And then you have a deployment here. And then you have to have a service. And then you need to expose it with a route or with an ingress or something. So, you know, that's too much for, you know, to do by hand, right? So again, kind of handy that Quarkus has capabilities to make our life easier with that as well. So you just basically, for Kubernetes, for example, your Quarkus extension add Kubernetes. So in Quarkus, you can add extensions to, you know, add capabilities to your application. And so you can do Quarkus extension add Kubernetes. And then you can do Quarkus deploy to deploy it to a Kubernetes that you're logged into. So let's, let's try it, right? So Quarkus extension add Kubernetes. And I think in this case, it probably already is added. And so what's cool about that is, and let's go back to my VS code, it's a little bit easier to show up here. So when you build your application, it'll create a Kubernetes folder in your target with a Kubernetes YAML, which has a service and has a deployment to deploy it to Kubernetes. So it creates that for you. So that's pretty handy. So you can do Quarkus deploy. And I may need to log into my cluster. Let's see what happens here. And so what I've done here, I have this developer sandbox. So if you go to developers.redhat.com, you go to developer sandbox, explore the free developer sandbox. You just create a free account if you're not logged in yet. And then you can start a free Kubernetes OpenShift sandbox, a place where you can deploy your application and expose them and you can even share them. It's a temporary, I think it's 30 days, but then you can redo it or whatever. So in this case, I have a new OpenShift sandbox. And so I want to deploy my application to it. So what I can do is I can log into it. And so I'll generate a temporary token. And my internet is a little slow right now. That's always fun. And so now I have a token, which is temporary. Oops. So now if I log in OC or Qubectl, OC log in. Oops, I was already part of the command. Okay, so now I'm logged in to my sandbox. And so let's see. Actually, it did push to a different Kubernetes. That's fine too. But we're going to push it to our sandbox. So because I logged in to this OpenShift sandbox, right with that token login. And so in just a moment, we're going to see, okay, it's pushed. And so if we go to our OpenShift sandbox, we can see that our corkis with DB was deployed. But of course, we're going to see that we have some issues, right? Because it has a dependency on a database. So we need to quickly add one database, postgres, instantiate. And then I think I have corkis as the username. And so if we create that, we'll create a database that our application can use. So it's already configured to use that. So in just a moment, we'll see that everything is up and running. Now the problem is that in this case, I started up my application, it seemed like it was up and running, but it wasn't right because it was airing out. So what we would need to do is to need to add health endpoints to our application. So that's something that you can do as well. So MicroProfile is a very handy project, which is a spec of specification to define how to do cloud-native kind of add cloud-native dependencies capabilities to your application, such as exposing health points, fault tolerance, how to call another RISTS application from your application in a standardized way. And so different implementations exist, corkis uses MicroProfile, for example, there's other frameworks that use it too. And so that's how you can add health endpoints to your application. I'm going to skip the demo of this because we're running a little bit late. But so let's say that our application is now running on our Kubernetes instance, on our OpenShift sandbox. And so we're done. I mean, this running, no problem. Of course, it continues because we need to monitor, we need to see how is our application performing and everything. If there are issues, say a user is having some issues, we need to have some way to trace exactly how their request went, what was happening. And so we need to basically add observability to our project. And so a project that helps with that is OpenTelemetry. OpenTelemetry allows you and helps you to do, to add tracing to your application. And then there's another project, which is Micrometer, or some people call it Micrometer, that adds metrics out of the box to your application. So you can profile and see, you know, how long did requests take for this application? What is the garbage collector doing in terms of performance and everything? So it generates a whole bunch of metrics. So I have a little application here where I've already configured that. So let's go take a look at that. And so CD, blah, blah, blah. And we can see here, Quarkus observability. And these are available on my GitHub as well. So you can find them there. I'll share the link afterwards. So we can go to Quark. Let's open it with Quarkus observability. And we can see in this case, I've added a few extensions. So I've added OpenTelemetry extension. So you can see it here. And then OpenTelemetry JDBC. So it ties in with my database. And then I also added an extension Micrometer. So these extensions, you can add them very easily to Quarkus. So I already showed you how you can use Quarkus extension add. You can also, for example, use your IDE. So there's Quarkus plugins for those. So you can add an extension. And then, you know, so you have a whole bunch of them. So you can search for, let's say OpenTelemetry. And then you can just add them this way too. And, you know, if you click on it, then it'll add it. And of course, in my case, it'll say, well, you already have it installed. Come on. Focus. All right. So we can run this application on our local machine. And what I'm going to do is, and this is in the source code of the application as well, there's a small Docker compose file to start up a Yeager tracing, which is going to allow me to actually see the traces that I'm going to be producing with my OpenTelemetry component here. So I'm going to start that up. So again, in PubMed Desktop, this is very easy to do. So you see Yeager all in one is already there. Hit the play button, and that's going to, you know, start up this container with that dependency. And then so now if I run Quarkus div, hopefully it'll start up my application, which is very similar to the other one, expose the fruit endpoint. I think it may have just a couple of fruits instead of the more fruits that the other one was was showing. And we'll go and see, oh, it's starting up my database in a container, right? Because I don't have a Postgres running on my local machine. And now it's up and running. So if I go to my local host, so here we can see by the way that everything is running properly in OpenShift. But I'm going to close that. I'm going to go back to my local development. So we have a fruit endpoint once more, in this case, just a banana and an orange. And I'm going to hit refresh a couple of times. And so that generated some metrics and some traces. So this is the Yeager component that I started up with with Docker compose. I'm going to refresh this and we can see that it's running on my local machine now, make it a little smaller. And we have my demo app service. And so now we can go look and find the traces. So I guess I've hit refresh 11 times. And we can see the latest request here was a few seconds ago. And we can expand this to see exactly which components were being used as I called my application. So we can see which services were called. And in this case, because I also added the JDBC OpenTelemetry, I can even see that what in my database was hit with which tables. And even, you know, I can even expose my select statements and everything. So, you know, that helps a lot with, you know, having visibility of your application. And then you have also the dev mode of the WI in Quarkus. So you can see kind of what components you have in your Quarkus application to make this a little brighter. And then here we can also see that we're generating micrometer metrics. And so, you know, these are all the different metrics that my application was producing. This is, of course, now right now on my local machine. But this could be consumed by something that collects metrics such as a Prometheus or something to give us feedback on what's going on in our application. So let's go back to our slides. So wrapping it up, we went through a whole bunch of different components. It was very quick. Let me know if anything interests you. Follow me. I typically post about different things that I find, you know, interesting tools and whatever more. This session had, you know, kind of a focus also on Quarkus because it does really help a lot. But, you know, you can use any of these components with Spring Boot with other stacks too. So, you know, but it does make it a lot easier if you use it with Quarkus. But again, you don't have to. So we used, we looked at SDKman. We saw a little bit of the OpenShift Sandbox. You're definitely welcome to use that. It's free. It's out there. We looked at J-Bang to create those scripts. We looked at OpenTelemetry. We used Podman Desktop to use containers on our local machine. We looked at MicroProfile. We did not look at JReleaser today. That's another really cool project if you're creating a distributed applications. So you can create new releases and then notify on different channels. You can create, you know, packaged release in different ways and create checksums and everything. Really cool project. Definitely check that out as well. The Sandbox here, you know, so we'll definitely post it in the chat. But it's very simple developers.redhat.com and then you'll find it right there. So you can start playing around with OpenShift. My colleagues, and I think I saw Natalia in the chat, she's one of the authors of this cool book, Marcus Eisel as well, modernizing enterprise Java applications and kind of migrating from, you know, let's say a legacy application to an application that uses, for example, Quarkus. So there's a free download for that book. Also on developers.redhat.com, by the way. And we actually have a bunch more books. So, you know, definitely take a look at that. I'll share the slides. Here they are actually. So I can put that link in there. And that's it. So, you know, here's some ways that you can connect with me. Reach out if you have any questions. And I will be on the Slack as well. And if you want to post anything here in the chat, I'll try to answer that as well. Thank you, Kevin. It was a great presentation. I even learned a couple of things. I'm actually looking forward to use that VM juggle tool because I've been always messing around with those. So much appreciated. I hope the audience also got some valuable insights, I suppose so. As a reminder, this session will be made available on the Red Hat Developer YouTube channel. So definitely watch it again and share it with friends if they need some help with shortening the non-fun things of their lives and actually focus on the developer things they need to do. Next up is a presentation around building modern microservices at scale with DataGrid and Quarkus. So if you want to join that, please stay around. There's another four minutes into the break. If not, you can hop over to one of the other sessions like building sentiment analysis with Kafka and AI ML or on the other stage is the fine-grained API authorization using 3Skill and the authorization system. For now, thanks, Kevin. Thanks, everyone. Thank you. See you in the next one.