Kotlin on the Server with Ktor by Hadi Hariri

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
[Music] cool good afternoon at first I was worried I thought like doesn't give me the last talk of the conference well that day in the smallest room but then there was a smaller room so I feel a little bit better about myself now so thank you for coming here and not in the smaller room so anyway I'm gonna give you a talk on a Kate or how many of you know Kate or any of you used it okay not gonna learn anything new I don't even have new jokes I'm sorry about the only new thing that I can tell you in this talk if you've seen this so anyone seen this talk before okay so I update it to the latest version of Kate or and nothing broke that's that's the new thing okay so you can go to a small room now but thank you for coming so yeah I'm gonna give you talk about a synchronous frameworks for connected systems okay now this doesn't attract a lot of attention so normally what I say for distributed micro services back with blockchain because it doesn't matter what technology it is as long as you throw in micro services and blockchain it's going to be awesome and you're gonna be able to sell it to your manager and everything's great so the good thing about this is that you can actually create micro services with Kate or now the big question is what is a micro service but it doesn't matter it's - whatever you want it to be so what is Kate or Kate or is a server it is also client it is multi-platform it is caught in through and through how many of you here familiar with Kotlin ok that's a good start so Collin is a programming language and it is a synchronous cater is also open source which means in our world free it's built on maintain environment primarily by us JetBrains the ones that also make Kotlin not that other company that sells phones inspired by other frameworks such as wasabi and cara now how many of you have heard of wasabi not the source the framework yeah so wasabi is something I created nobody ever used it it died but it inspired other people to create this and cara cara was kind of like someone that liked to Ruby on Rails so Kotlin and decided to bring a Ruby on Rails to Kotlin and they created cara and then someone thought the car is too overly complex so they created I created wasabi and then was Hobby led to Couture and now there's a new project on github which is Cara or Ruby on Rails on top of Kate or so we're full circle back where we were we could have just saved ourselves five years Kate or can be used for current and creating credit server-side applications eight that means HTTP API switch is different to restful systems but you can also create restful systems because restful systems are basically systems that comply with a series of constraints they're not pretty JSON with HTTP endpoints for socket programming for client-side connections and this is probably the most important slide Cato's goals are to be simple they're meant to be flexible performance cross-platform and I always kind of get get amused that I actually came up with this creative slide because who would put on a slide that you know Cato's goals are to be very bad in performance very rigid and just horrible right but I had to fill in something so let me show you a simple server this is basically the simplest of the service now if you familiar with JavaScript anyone it's okay you can put up your hands I'll judge you so anyone use express chairs right so this is why I created wasabi and now cater and all of this expressed yes was a was a step away from asp.net MVC which was or or Ruby on Rails or anything it was basically just simple endpoints trying to be as simple as possible and this is where it's all kind of inspired so here you can see that essentially in my main function in Colin what I'm doing is creating an embedded server and we'll talk about the different ways that you can create servers but in this case I'm just creating an embedded server running on Nettie and then inside that I'm creating what's called the routing or the routing depending on where you're from and inside our outing I am now creating a get call and that is responding with respond text now there's a bug here can anybody tell me what it is except you because you went to the previous nobody exactly so that's just to know if you're paying attention yeah this is text dot plain but with today's browsers it doesn't matter you can send back whatever you want and they'll accept it so what is the case for application a case our application is basically a series of modules and you can think of module as anything you essentially want it's it's kind of like this idea that was created in Kate or that nobody really uses to a certain extent some people use but think of module as like a grouping of your different aspects of your application so you know for example in spring how many of you do spring or know about spring so spring has the concept of customer controller right module has got nothing to do with that just so that you don't put that pairing together module can be for example something around your customers invoices and I don't know payments and then you can have another module that's for example for registration how you group it and mix and match things it's completely up to you and we'll see a little bit about how to actually use modules when we see the code but inside the module is essentially where your application is so you essentially have this request that comes in it goes through this routing mechanism and then you have your app logic and then your response as simple as that in between these things what we have are features and these features are essentially things that get added to your application now if you're familiar with Express yeah so any of the other technology you may know this as other terminology such as interceptors or middleware right in crater they're essentially code features and routing itself is actually a feature as well so this could be for instance encoding compression all of these things that get added to the pipeline in different phases from the request or response that add functionality and as I said routing is also a feature but the majority of applications already have routing built-in so to speak so let's see some code okay so we'll start with something very simple so I've got my example that we saw in the web in the slides up here where I have routine get and this is actually correct it's returning Tech's top plane now the only thing that you'll notice here is that I don't have any embedded star Bonetti what I showed you in the slide I don't have here why because generally you don't create your applications in this way what you do you try and externalize certain aspects of the application to configuration files which is kind of a better way to do things right because it's also flexible in that sense so in this case what I'm doing is I'm defining the routing however how this application runs on what engine it runs all of that I'm delegating to configuration files and that configuration file is over here it's called ho con syntax that it follows and essentially what it is I'm saying that this is a caterer application it's going to be deployed on port 8080 or the next port you find free and then the module it's going to consist of this module right so that's the simple is this thing over here it matches in names now I could add multiple modules here I could separate them by comma and add multiple and that's what I was talking to you about a module you can have one module or you can have a million modules in this example what I'm doing is basically using this configuration file to go through the example so in this case what I'm doing is essentially just loading the simple module now if we go to the another fall over here which is called the application this is the one that actually loads those parameters so in this case my main entry point is kate or server dot nettie engine main and then the arguments and the arguments are what's being passed on the command line and if nothing's been passed on the command line then it's going to default to the application comm file ok so what do I run I basically run this app and what this is going to do is going to read their app configuration file and launch the application for me okay there you go so you get the hello world right well you see it there see that hello world now notice that that was pretty fast someone said to me how'd you make it so fast in the demos I'm like I don't it's just that's how it is caterer is quite fast to launch now you can also to get started with Kate or there's multiple ways you can go to if we open up the browser and if we go to start Kate or I oh I don't know where this was inspired from but you can yes Kate or with project building on the shoulders of giants so you can see that you have all of these server and all of the features that we spoke about and if you're not a person that likes to open up their browser then what you can do is also inside IntelliJ just go file new project and then Kate or also gets you started right so when you click all of these things over here it's going to add a bunch of lines to that code that gets generated but we're gonna do that manually to see how it is okay so let's go to the next one and what we're gonna see is how to serve static pages right so I'm not gonna run every single demo here because you're gonna get bored but notice that the only thing that I've done now is essentially just change a value in the configuration file and I've restarted the same file but what in this case what I'm doing is using the static example and the static example what it is is essentially showing you the caterer has built-in support for static fault so if you want to start a static fault all you have to do is inside the routine call static and then the path which means that anything off this path is going to be served as static and then map that to the resources which would be essentially a folder on your machine that serves all of the static content so you can see here that I have reached static and then inside this I have Kate or logo SVG so in the browser I could do localhost 8080 and Cato sorry static Couture logo dot SVG and I should give me the Cato logo okay and you can define multiple static entries like it doesn't have to be under a specific URL anything that you put will just be mapped to that and you can have these in different folders etc now HTML this is an interesting one how many of you have seen code like this so what is that it's a DSL yeah what else is it HTML right so that is essentially HTML this is the HTML X library from Carlin anyone familiar with it so Carlin X has there's there's Kotlin and then there's called Linux which is a whole bunch of other functionality that we provide and there's this library called HTML X which essentially is how is statically type HTML that you can use in your application now here what I'm doing is essentially doing respond HTML and I've got this beautiful HTML here which gives me all of the completion I get all of the functionality that you would expect in the IDE and be able to write HTML and the best part of it is that I can mix and match that with actual Kotlin code right back in the old days in the very very old days we used to call this server-side rendering remember that yeah and then single page your applications came about and everyone decided to do what everyone else does and now everyone's deciding to go back to the server-side rendering but that's the beauty of our industry right some people look at this and they're like oh this is disgusting this is horrible like you're mixing HTML with code that's just horrible yes many people do the same they call it react right except there is called JSX here we call it Cortland but essentially it's the same thing and all those and to be fair it's not that you're mixing and matching like the idea behind separation of concerns is not that you should keep technology separate but is that you should keep concerns separate and this is actually about viewing information so this essentially you know I'm not going to run this but this base what it's going to do is when I call HTML DSL is going to shoot me back some HTML DSL right and if you're into the CSS stuff we also have CSS so you can do static typing we're using CSS or you can just combine it with your dynamic style sheets and basically just return HTML at any time on the server side you don't need any kind of view engine now if you saw in the browser when I show when I was showing you the different entries you can see that you got but free maker you've got velocity mustache time leaf so if you want to use some kind of view engine we have support for that as well but if you just want to do is your own server-side rendering on just HTML with Colin that is as simple as it gets okay now so far what we've seen is how to actually get do like a get verb right but hTML consists of mode and here this is how you can actually do a post so in this case what I'm doing is I've got my routing and then I've got get which essentially is going to give me back a form so I'm using respond HTML to create the form I'm adding a paragraph I'm adding a form notice that I have the actual name of the form the action here is form and keep an eye on this because I'll show you a better way to do this later on multi-part form data which means what the cater supports out-of-the-box file uploads and input fields method post and then just the layout of the form then I have another entry which is post which is the exact action that's on the form and then what I'm doing here is I'm going through the requests and I'm analyzing whether it's multi-part which means it's a file and then basically on that on each of these parts I'm processing each of these entries so all of that is being done for you right you don't have to do any kind of encoding or decoding one thing you want to notice is that a lot of things in in cater or on the call object they're not on request response directly and this is kind of like you know when you're working with sockets you have this quote you don't necessarily have the require response kind of approach to things so this one if I want to launch it I basically do the route so I can come here and then get rid of this and request it and you see that I have my form and then I could say choose file and that's for example say this one open it and send and you see that I get my form filled and I get the actual content type of the application okay so you have support for multi form data in cotton in Couture now all of these things that I've been showing you are actually what I was saying some of them are implemented as features so let's look at some of some other features that we have so here's a very very simple feature which is called default headers and essentially what it does is just give you back a timestamp and some other information that that the head of that by default it actually doesn't provide if you if you make a request to Couture and all I have to do to use a feature is just install it right so what I'm doing is installing the feature and then I'm defining my routing mechanism ok nothing else now a feature consists of two parts one of the initialization which we'll see and the other one is the actual work that it does in this case all I have to do in the initialization is just say install and then if you just type install here you know you get a whole bunch of different features like for example the content negotiation these are all different features that are available out of the box and then of course you can extend it with your own features which we'll see how and one thing that if you remember I mentioned to you at the beginning that routing itself is also a feature so where am i doing install routing I'm actually not doing that why am I not doing that because of this function over here now in case I didn't mention this I'm assuming everyone's familiar with Cortland this is a lambda right this is a higher-order function so if you look at this routing you can see that this is actually installing routing right so the routing is the one that's doing the install routing and it's just a convenient function that allows us to then define all of the routes inside that block and we'll see that generally you don't want to do this either because your application is gonna grow tremendously if you have everything in one segment right next thing you know you look you look like you're programming JavaScript so here default header is just going to return some headers okay so we won't run this let's go to something a little bit more interesting which is JSON so in the in the case of JSON what I want to do is basically provide support for JSON out of the box right so that when I send back some data it can automatically serialize it into G so now I hear there's feed the feature that I have to install is called content negotiation personally I don't very much agree with the wording here but that's another debate because content negotiation is more than just serializing data in a specific format right who are you familiar here with content negotiation right so content negotiation is essentially when you make a request to your browser right you can see that if we go to network and let's me just you can see that here I have content type image PNG right and normally although I'm not showing it here let's go to google.com okay let's see for example google.com okay so does anyone see the except I am missing it there yeah so you see this over here this except header okay this is essentially saying when I make a request these are the content types that I support right but it's normally not just a single content type it's multiple content types and each of them have this parameter Q and if they don't have the Q the default value is 1.0 right and this is indicating well it's called the weight or the priority of which one I support so this browser is sending a request saying I accept XHTML application XML application slash XML all of these different formats this goes to the server and the server then breaks this apart orders it by weight and says okay so this is what the request accepts this is everything that I can send back let's start sending that back and if it accepts it great if not we'll fall back to the next level right that is the whole concept of content negotiation so here when you install content negotiation is now going to take care of that for you it's going to analyze the types of accept headers that come in and then it's going to send back the content now in addition to that what this is also doing and this is where I say that I'm not entirely agreeing with the Nitin terminology because it's also this is the feature that you have to install - then get sterilization into specific formats right so if I want to support jisan sorry JSON what I can do is define the serializer that I want to use here now out of the box we support jisang Jackson Cartland serialization and in the case of JSON notice that I'm saying I want to use jisan but this also has its block and what is that block that is the initialization block that I was talking about before when you install a feature so a feature comes with just installed but optionally you can also add certain parameters to say this is how I would like you to configure this specific feature so in this case this is nothing more than actual all of the different hard-coded configuration options that jisan the serializer provides so we've encoded all of this for you you get the completion you get all of the options that jisan provides okay so in this case I'm saying I want to configure jisan to have pretty printing to serialize nulls etc and then essentially as soon as I've got that installed when I do a get customer that's basically going to just serialize this back for me in JSON I don't have to do anything else and I keep saying jisang when I meant to say JSON and I say JSON when I've been to say jisan apologies for that but um it's kind of like gif and jiff right it doesn't matter so let's do customer and we can see that we get back to you so right so obviously here I'm doing it for JSON this will work for XML they work for whatever kind of encoding format that you have authentication out-of-the-box authentication is also supported I won't run it but we have support for OAuth 2 and we've got support for the simplest of things like basic authentication how does it work exactly like we saw before so in this case I'm doing an installer authentication and then I have a basic auth so now I'm saying that as part of authentication I'm gonna support basic authentication in basic authentication you have this concept of realm which is basically the area that is authenticated and then you have some very very complex logic to validate the credentials don't ship this in production code please and then all I do so I've initialized the the the authentication mechanism of how I want things authenticated and then when I want to use that I just do authenticate and wrap everything that I want authenticate it in a block authenticate okay now the important thing here is that I could have basic authentications if I want so I could have basic another right and then if I want to use the another one I would use another over here if I want to use oauth2 I would use oauth2 authentication and put it in the workflow so in this case let's just run this one this case you can see that this route over here doesn't actually require authentication and anything under secure does so if I were to launch that you see and you need the credentials to access secure if I type secure I get my basic authentication and then I get access to the secure area now as I said like generally nobody really nowadays uses basic authentication but it shows you how to actually configure it with OAuth 2 it would be essentially the same now the features that we've seen how do you actually create a custom feature is very very simple you essentially have to create you follow a certain rule right you create a class that class has to have this nested class that contains the actual initialization parameters for that function sorry for that feature so in this case I have a class configuration and it has two parameters name and value and then basically this is the call to intercept so this is essentially how I set up the actual feature and then this is where the works going to be done and the work that's going to be done is essentially you have to implement an application feature class which you do as a companion object and inside here is where you actually do the actual work of intercepting that feature intercepting the call and then processing and doing what you want and from there you have access to all of the configuration parameters so this is basically the code to implement a feature and then when I want to use it just as before I do install custom header in this case what are my parameters the ones that I put in the object in the nested class so you see that I get completion for those these are the ones that I have access to and then I just use it exactly as before nothing different and if you look at all of the different features that are in inkay tour essentially all of them are implemented in the exact same way okay implement an application called an initialization block where you set all the different configuration options and then the actual intercept which is where you're doing the heavy lifting now routing apps kate or as opposed to other frameworks such as for instance spring boot is not very stringent in how you have to define things so for example if you take a look at asp.net MVC or spring boot or any of the other frameworks they essentially tell you you want to respond to the URL endpoint of slash customer creates a class called customer controller right you have to follow these patterns in certain frameworks you not only have to follow patterns but you have to follow folders and structures and everything like if anyone's ever done MVC or rails back in you know you had to put a folder controllers or fold the views or control a folder models and then place things there with Colin it's very versatile you can do essentially anything you want which is a good thing but it can also be a bad thing right because like how do i structure my program how should I be doing things and we're gonna see that but so before that though don't take this as an example of is this how my application is gonna look like because this is horrible like this is not the way you want to write applications in Couture or in any language or in any framework to be honest with you but what this is showing you that the flexibility not only comes of how I structure my application but how I can even define my routes so here I have my get root which is the root of the root that makes sense and then I have customer but notice that instead of using get slash customer in this case what I'm doing is root customer and then inside that I'm doing get and post so now I'm saying that anything that goes slash customer has a get and a post and then they behave differently right so I'm defining the different ways also notice that I have query parameters ID what is this ID this is essentially the query parameter so if I do ID 10 that is what that ID is referring to it's a little bit yucky here because it's what a string and we'll see a better way to do this in this case I'm doing route employee and I'm doing get ID what is this this is the route parameter so in this case this would be customer one right this is part of the route parameter and I call it with call parameters ID in this case I have nested routes I have shipment and then inside shipment I have international so in this case this will be shipment international and then I get and I could have my post here for that or all of the different headers possible okay but this is showing you like you can basically organize your routes any way you want you can organize them by the equivalent of what would be a controller and then just do get post head option put delete or you could have different paths it's it's entirely up to you how you want to do it the one thing you don't want to do however is this like you don't want to end up in a situation where you have everything in a single file or a single function so how do you actually structure your application so one thing that you can start to do is instead of having routing and then inside that have get it's basically move that function out you can just move it to its own function because ultimately essentially it's a function call but a better way than just making it a function call a good way is to do it as an extension function to route because when you do it as an extension function to route then you get access to the get post delete all of these verbs right so it's just much easier you don't have to do routing and then inside that write all of the different verbs and all of the different paths so one way to structure application is for example to have a file where you have route home route about route employees etc or you could divide it up into multiple files but using the extension on route is a pretty decent way to to try and structure things right and then inside my actual application so what we saw before here instead of having all of this instead what I'm just doing is routing and then calling all of these different functions and then this is basically injecting that route in but again it's very flexible if you want you can also kind of create a class and then do an initialization of the route in that class it really is up to you how you want to define your application structure now a few things that we've seen if we go back to this post if you remember I talked about this string over here if we go back to the routing we talked about the query parameters ID over here the route parameters how can we try and improve this in a way that we try and move away from strings because we all know what happens right you want to refactor something and then it's in a string and it all goes to hell now if you're using of course if you're using IntelliJ IDEA what you can do is we factor and then IntelliJ IDEA says oh do you want me to refactor all of these strings that I found and you quickly place yes do refactor and then you're like oh what did I just do let me rewrite it back because IntelliJ likes to you know sometimes go way and beyond it goes the extra mile so what you can use instead is location now this is again somewhere where I disagree with terminology because location isn't a good thing for this how many of you are familiar with the header location in HTTP so header is really really useful have you ever created or not record in the data and it's created it's generated an ID and you want to send that ID back you send it back as part of the JSON payload normally right do you know that there's an actual field specifically for that in the HTTP specification which is called location so when you do a post which is to create a new resource there's a header in the specification that says location will give you back the URL of the newly created resource so when I do customer slash new post I should respond with customer slash the ID you don't need to send that back as part of the JSON payload now if you're sending up a whole bunch of other stuff back sure add the ID but ideally it would be better to use the location that is what the location header means the Cato team has decided to use the same terminology for this which is a little bit confusing but basically this should be renamed hard-coded non hard coded strongly type route and what this is basically using is just playing on the concept of essentially using a class to allow you for strong typing of your route definitions so notice that the convention is to use the class in lowercase because it's not labrie their class it's just something that we're using this is again borderline are we starting to become JavaScript you know like oh if a function is in uppercase then it means it's a constructor if it's in lowercase it means it's just a function so if something in Kotlin if a class in colin is in lowercase it means it's not a class there you go I just I just coined that term definition so it's using index and then here I have class employee and basically what it's doing is mapping this employee ID so it's saying this is the URL for that I'm defining and then what I'm doing is doing class employee Val ID string so now instead of doing get as we saw before kind of get with the string what I'm doing is using this the generic type of get which is get index and I'm passing in the class in this case I'm doing get in and I'm passing an employee so this is going to do a get on employee with a route parameter and how do I access that roof parameter well now that this is of type employee class will not class that thing that's not a class I can just do dot ID and get access to the route parameter okay now this is good because then what I can also do is not have these form and action names inside - ml that I spit out or whatever everything is now strongly typed location is still experimental I think it's still experimental because they still haven't figured out a good thing to call it so if you want to use it you have to use this use experimental flag and Intel it in in Colleen so that it doesn't complain to you right when it comes to a sink so Kate or is basically built from the ground up using co-routines so essentially that means that you don't have to worry about anything it's all gonna work and it's all wonderful and the world is sunny and although it's a little bit too sunny sometimes but what happens if you want to kind of like have a long-running process right something that you don't want to essentially to block now initially the way that caterer was implemented there's like this failsafe mechanism in place that if it detects that your request is long-running it will prevent the server from blocking and it will try and offload it to another co-routine however their general recommendation is that you do what you do when you're using UI is in android or whatever which is long running processes basically just launch in its own core routine and then come back with it and use it the same way that you would whether you're doing Android programming or anything else or desktop programming but under the covers this is all a synchronous it's also spendable functions it's all basically co-routines and last but not least I know that for some folks this is not really important I mean I remember testing back in the old days when I used to write code literally we used to just test it by shipping it to the customer how do you test so Couture is basically built in a way that you do not need to create everything have it up and running in order to test you can test your whole entire pipeline or every feature that it has without having to run the server now that doesn't mean that you shouldn't run the server and test that's usually an integration test but what it does mean is that when I want to run some tests it's going to be pretty fast right I don't have to get everything running so if I go to my tests over here application tests see that I can basically just say run application test and it's essentially run it and it's already done right and the only thing that I needed to do was use this with test application and then pass in my application with the parameter testing equals true so this application is this testing and by default it's got the application testing false I'll be funny if you put that in true in production and that's it so you can basically test their own entire thing without having to start up the engine but again as I said you should usually do your integration tests as well okay so let's just give you a bit of a roadmap of where we're going with Kate or etc deployment options embedded you have jetty tomcat Nancy CIO anyone knows what CIO is okay I oh yeah you know what the star is yeah definitely not production ready so generally you don't want to use that because it's non production ready like this is an even experimental this is just non production ready the someone asked me why are we doing that because we want Kate or Toby to platform so Nettie is an amazing engine nothing is fantastic but at the same time we want to be able to run this on any platform so that's why we're trying to do the lower level stuff with that as well containers you have Tomcat jetty supports Java six through - I never update this slide I think it's Java 17 now are we on 17 or what I can't remember GAE Heroku docker containers kubernetes q8q nines I don't know I'm not keeping up to date and to also yes to get started go to start Kate or IO or Kate or dot IO as well if you come to the browser and do Kate or what an awesome website you know how this is like used for breadcrumbs yeah we did it wrong but it's got some nice samples there and you've got essentially everything that I've shown you is there to give you some more insight with we've also released one point three point six I believe right now just recently last week one point three point six I think and cater is not going away because we're using it ourselves right which is sometimes people asked like is what is this I mean is this an official Japanese product yes it's an official Japanese product and if you have heard of Japanese calm space anyone heard of space right space is our new integrated team environment so it's like code repository chats blogs issue tracker automation everything and that's built on Kaito right and we've been three years building that and we're gonna continue to support it so Couture is here to stay it's officially supported project by us JetBrains the tongue okay we are done any questions eight minutes of questions what do you have integration with j-unit yes I mean oh boy in what sense I mean the test I was using was using j-unit in my application I have now a unit so imagine I wanna move it to Kato from spring booth so I didn't want to recognize all my tests I just want to have magic yes there's there's a I I think your biggest problem there isn't going to be support for gel unit but that those tests that you've written for spring boot I mean I don't know how you've written or how tightly integrated they are with spring boot whether they will serve for Kate or if you're just testing the business logic but like J unit is completely independent J you need to support it by Kotlin so there's no real issue here so yes your answer is yes is it gonna be easy depends on what your tests are okay more questions thank you maybe I missed it but the skater supports some kind of automatic form binding like spring MVC does automatic forwarding form form binding force binding the form data - oh okay data binding no I don't believe that we support any kind of automatic data binding so the one thing that we got a kind of like it will probably be important - I know it's sometimes a blurry line but cater is not trying to be spring right you know spring is like spring is not just an HTTP framework it is an entire application framework that you can basically annotate something or end up annotating 70 things on one thing and have all of this different functionality so we don't have for example data binding right as far as I know the team is not planning to do it however does that mean that it's hard to do not really I mean you can do it as a feature right so essentially anything that you can think of can be done as a feature right and ultimately that's what it's going to boil down to well we would love to see is of course an ecosystem whereby we provides you support with certain things and then tomorrow where you do file new in addition to seeing our features you can see community contributed features right and then like data binding and then bring that in right but it would be nice to kind of have these things right because I mean for a lot of people are against the whole concept of automatic data binding right but then for some simple applications sometimes it just makes sense to have it okay well I'm familiar with spring boots a I'm doing some sort of comparison what would be the the preferred way to package and deploy such an a cater up application I'm like in spring booth you do the exact job I can say the same thing make jar not war it depends I mean we deploy a jars it doesn't really there's no real preferred way we support basically multiple options so really there isn't a preferred way beyond like for example what Josh even talks about around the benefits of jars over war files right so it really could use I mean we we deploy with jars okay more questions there are lots of times yeah blue yeah I was just wondering is growly and supported growl yeah I don't know I haven't tested it I don't know that's a good thing for you to test and if it isn't for requests and also just just to highlight you know I've shot yes over here how long do you think it will be before Kato will be supported in Cape Cod Lee native that's where I was actually gonna go mother yeah so Kaito first of all before that I've shown you cater on the server side okay and I talked to you about how kato is multi-platform kato running runs on the JVM right now on the server but caetera client and server so the client actually is multi-platform so the client runs on JavaScript that runs on JVM it runs on call in native now the next question is how long before we need to first finalize the cio once we get the cio many of the other features are already basically working because of the car linux multi-platform libraries that we have so I think that that's basically right now the showstopper that and time essentially and I did mention that it's open source right you know open source is great for actually contributing to as well not just it's not just I don't have to deal with the procurement office you know okay no more questions as it seems okay okay thank you honey thank you [Applause] you [Music]
Info
Channel: Jfokus
Views: 3,156
Rating: undefined out of 5
Keywords:
Id: DGquaQs-Lh0
Channel Id: undefined
Length: 47min 16sec (2836 seconds)
Published: Sun Feb 16 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.