 So, good evening guys, okay. So, my name is Deepu K. Shashidaran, you can call me Deepu. I am a solution designer for Tata consultancy services. I am also core J. Hipster team member and OSS enthusiast as well. These are my profile thingies here. So, what are we going to do today? Okay, I think most of you guys would be familiar with building web applications. Can I assume that? Most of you would have done web applications. At least one web application from scratch, can I assume that as well? Okay, at least you know when building a web application, what are the things you do? If you have to build it from scratch, at least you would have learnt. Okay. So, traditional way let us see what it takes to build a modern web application for the current trends and technologies. So, for the demo purpose, let us see what we need to build. I am taking a simple blog application, a simple blog where you can create a blog handle for different users and each user's handle can make posts, create some simple tags. So, very simple application. So, if you have to deploy that blog into a production environment and if you have to open it up to the world, then what are the features that you would need? So, today since responsive web applications are the hip thing and since you do not want to maintain different code bases for your mobile and desktop and stuff, so definitely you would want it to be responsive. Single page applications are all the rage currently, so you would want that as well. Security, of course, you would want security and to be more hip, you might want to have social login so that you can use your Facebook or Google accounts to login instead of having to maintain user accounts. And if you want to scale this up, you might want to have distributed cash, then definitely being a blog application, you might want to have it good search capabilities. Then from developer perspective, definitely you would want some good fast builds and any of you who would have actually deployed web applications into production might have experienced what production optimization is and what pain it is. So, to have your production app optimal and performant, it is not a very simple task. It might sound very easy when people say just minify the stuff, cash it, have some G-SIP, but it is not that simple, but we want that stuff as well. And just to be hip enough, let us say I want SQLDB with some versioning, database versioning as well. And of course I would want some automated tests, I would want some performance tests, I would want BDD tests, all those standard business stuff. Then for once your application is in production, you would want to monitor that, so you would need some metrics as well. And of course you would want user management, audit logs and say since I am greedy, I want internationalization as well. So, what is required for building that kind of an application? So, Bootstrap is the de facto for responsive these days. So, I would take that and for SPA, Angular is kind of the leading framework when you take SPA. So that and we can have it on Spring Boot since that is a very good start of framework. So, you can use Spring Security for your security and since we are using Spring Security, of course, same Spring Social for social login and for distributed cache, of course Heselcast and Elasticsearch is the best open source you could get for your search requirements. And of course for fast builds, yes, there could be people, may even people here but just to be hip, I am going with Gradle and Gulp with Bower for front-end management and for production optimization, yes, your standard GC cache things. On top of that, some Gulp magic with Aglify, I mean if I have all those stuff, I would want that and for your SQL versioning, I would go with Likubase. You could argue Flyaway as well but let us go with Likubase here and of course Hibernate and for my tests, I would go with Kama and Protector for my automated test so that I can do all my Selenium tests. Anyway, I am using Angular so Protector goes well with that and for performance test, there is something called Gatling which I could use and Cucumber for BDD tests. So again for metrics, I could go with, since I am on Spring Boot, I could go with Actuator and some drop wizard magic then I could, anyway user management, you have to build your user management, some custom code there and audit logs and audit and log there and since we are on AngularJS, we could use a library called Angular Translation for our internationalization so what does that cost me actually? I mean to use all this, I do not know if you would agree with the estimate, I am assuming 8 hours a day so I am just taking working hours. So responsive, having bootstrap setup and having a base skeleton that is going to take me around 4 hours and having Angular working and all those base plug-in setup and all those is going to take another day. So all these security another day, social login, distributed catch another day. So search, elastic search integration with Spring Boot and having that working altogether it is another day and builds of course having Gradle, Gulp, Bower, NPM, everything working together that is definitely going to take another day and production optimization as well. Trust me if you start writing Gulp tasks from scratch to get a proper production optimization workflow it definitely actually would take more than 2 days so I am just putting 2 days there for that and liquid base setup, again having liquid base setup with all your basic tables and all those things and your Gradle integration that takes another 2 days and 1 day each for each test setups, automated performance and VDD and 4 hours for metrics, 4 hours for your custom user management, so 1 day for your audit setup and or your dynamic log management with log back and stuff and 1 day, give 1 day for internationalization you have to write all your JSONs for all those modules as well. So is that it? So that comes around 17 days but that is not enough, if you are going to expose this you would want some nice swagger documentation that is going to take another 4 hours and developers we have to be nice to the developers as well, they should have a very nice workflow they should be doing all the hard stuff. So let us put in browser sync there then we would need development and production profiles as well, so that is another 4 hours and yes I want web sockets I want to track what my users are doing, so I would use web socket for that and you definitely would need some entities for your, since we are building a Java web app you need some entities right, so for the blog app you have to design your entities and build all the crud for your entities that is another day and whatever business logic you have that might take another day. So that is around 21 days with this that is 4 weeks but if you factor in velocity of your team that could add another 2 weeks because no team would be 100% right, so say an approximate 60% velocity would give you another 2 weeks, so that is 6 weeks, so 6 weeks to get started base skeleton with all your entity domains setup and all your tables setup everything that takes around 6 weeks, do you guys agree or do you think it is less or how many of you think that it would take around 6 weeks okay, how many of you think it would take more than 6 weeks okay, how many of you think it would take less than 6 weeks okay, so let us assume 6 weeks for now okay and so I mean we have all those cool technologies for everything, I mean there is a new framework coming out every day, every other day you can see a new framework you know to ease out things, every framework claims to ease your development or like you know make your life easier, I mean spring boot reduces stuff to an extent but it is still not enough to you know bring it say this is using spring boot but still takes around 5 to 6 weeks practically, so isn't there another way, let me say that yes there is another way and rather than talking about it let me just build that application for you okay, so I have this okay, so let me do your, is it visible for you okay, let me hit out J Hipster for you, sorry I am on the latest 5.6 point something I guess just a second, no sorry NPM I think I am on 3.7 or something yeah 3.7.1 and no dial beyond yeah 5.5, so okay, so I have fired up J Hipster with J Hipster you get to make 3 kinds of applications, monolithic classic microservice or a microservice gateway, I will go into the microservice parts later, let's since our blog app is very simple, let's go with monolith, name of my application I will call it SINGASO package, I would want you know session based with social login that's my mechanism and of course I will go with SQL for this, I could go with Mongo as well but let us go with SQL and I will take my SQL for production, I will take H2 with this persistence for my development, I need hassle cache so that I can distribute, I mean I can have nodes of my apps with synchronized caching and of course I need elastic search, I don't want clustered sessions I can do with my normal Tomcat stuff, so no for this and I need spring socket yes and since we are hip we are going with Gradle and yes some SAS magic and internationalization of course I would want English as my base language, say I want Chinese and Hindi as my secondary languages and yes I want all kinds of tests because testing is good okay, so since NPM likes to download the internet and likes to take around 5 to 6 minutes normally or even more depending on its mood, I have cheated with, I have already copied the node modules folder here so NPM, I am kind of cheating NPM so it takes lesser time, I cannot wait for NPM to download the world, so that would take around okay, that is taking more than what I anticipated okay, when it is running let me just show you what is generated, so I have this demo app folder, as you can see that a lot of folders and code generated, so you would have a Gradle folder with all the you know your Gradle files there, you have your Gulp subtas there since we are using Gulp as the front end build, your node modules and all your source code is here, so there is no hidden source or there is no jar magic or like you know hidden jars doing stuff for you, it is all plain Java and JavaScript and HTML code there on your disk which you can do whatever you want with it like any of your normal apps, damn this is taking along okay, that would take along and I have no connected, guys can I use your PayPal list, you know the pass, safe payments, payments, I am sorry for that, thank you and and I am sorry for that, okay. So NPM cannot cheat NPM when I am offline, okay, that is news, okay. So okay I am going to stop this and start this again, okay, never mind that, that is classic with Windows, not GIP errors. Normally all this happens in one step, I mean your NPM install runs then your Bower install happens and Bower is intelligent enough to take from Cache and not download every time. So once Bower install is done then there is a Gulp install task which wires up, you know wires up everything and makes your application ready. So Gulp install, okay. So while it starts let me start up the app, what is generated. So I will just run GradleW here, we ship with the Gradle wrappers, so you can directly use the wrappers, you do not have to have Gradle or even if you choose Maven, we ship the Maven wrapper as well. So let Gradle start up, if you look at the source you could actually see that there is no XML configurations of any source. So and if you look at the Java source you could see that there is your app name dot Java which is your app file, you can actually run this, I will zoom that up, you can actually run this off your ID directly since it is a Spring Boot app, okay. So my Gradle is almost ready, it is configuring my Twitter connection factory since I chose to login, okay, app is ready, since you make it good for the development as well, let me run Gulp serve which serves a browser sync enabled, you know proxied app so that you can do all your live reloads and stuff on the fly. So you do not have to wait for your application to, you know, I mean you do not have to go and refresh your browsers every time you change something, so that is done automatically for you as well, okay. So our app is ready, as you can see you have all the account related stuff, you have all the languages you chose, that is cool right, out of the box you get all the languages, so we have around 25 languages, it is pretty much covered. So yes, I chose H2 for development so this is running on H2 database in memory and if you deploy in production profile it would be using a MySQL database, you can see all the configurations, if you look at your resources there are some configuration files, you could see a development YML and a prod YML where your configurations are there. So basically if you look at your dev YML you have H2 configured here and for production you have MySQL, you just need to fill in your username and password here, so let me just log in, since I chose social login those stuff are there but of course you have to put in your keys in order for those to work. So I am logging, as you can see there is no entities yet, we have not generated any entities but you have all the basic stuff like your settings, your password and your session monitoring and all those stuff and of course the cool admin stuff, you have user management out of the box, you can provision users, you can assign roles, all those stuff right out of the box and you have a cool web socket based tracker, so basically it tracks what your users are doing, so if I am to open up something else or if I am, if somebody else is using my account or something you can basically track and if you are an admin you can basically track for all the users, so that's cool and we have some good old metrics, some nice metrics for your app and your health, this is all spring boot stuff, actuator stuff, we provide some nice UI on top of that and all your spring boot configurations, a lot of configurations, you can view all that here and of course you have some user audits and dynamic logs, you can actually change your logs at runtime, you don't have to redeploy or anything, anyway that is spring boot stuff and you have nice swagger API documentation for your app, so that's nice, so you have all your swagger API documentation, so this is all out of the box and since I am using H2, I even have my database directly here, my in-memory database but of course you won't have that if you are using MySQL or anything, so this is not enough right, this is not a blog app yet, so let's go and build a blog app, yes? At this point having chosen so many technologies is there, does it generate some sort of check list of all the next steps you have to do manually so that you don't forget anything? There is no much manual steps you have to do, I mean whatever business you have to do you have to do, that we cannot tell you right, what business steps you have to do, but okay, I think that is the only thing you have to do, you have to put in your database password, to be very frank that is the only step you would most probably do, so all are auto configured, most of your things are auto configured and all the configuration, there is a default configuration for everything except for your database username and password which of course you have to put in, so once you put in your database configure, I mean username and password everything else is auto configured, so most probably you wouldn't have to do any configuration unless you have a specific use case and most of that edge cases are documented in our documentation side, so in most cases you wouldn't have to, we have some in J-Hitster as well and yes there is standard spring document as well, so for the entities there is an entity sub-generator which you can use to create entities one by one, but in a real world use case, I mean I have built real world applications with J-Hitster as well, but it is very difficult to you know build a lot of entities, I mean if you have some 20-30 entities, I mean some 10-15 you can make one by one, but once it goes beyond that, it's very difficult to do one by one, so that is why we have come up with something called JDL Studio, of course we came up with our own domain language, sorry about that, but I think it is even simpler than your normal entity declarations or your real-world syntax or whatever, so we have this JDL Studio where you can actually design your entities, you will get a nice visual representation of that as well, so you can use the simple syntax and build all your entities, so this is a sample which we normally load up when you go to the JDL Studio, so you have all your entities here, basically declaration is your you know a keyword entity with your entity name and your attribute name, type and whatever validations you need like required all those stuff, so you can even have enums and then you would you know you would declared relationships, so this is a simple syntax which we have developed, so I have already build a domain, so I will just upload that here, so for this blog application this would be the this is very simple domain which I could have, this is converted to that I will get there, this is very simple domain, I mean model, it has only 3 entities but I just wanted to show you how this would be used in a real scenario, I could have done this by hand as well, but so we have 3 entities, we have blog, we have tag and we have entry, so these are the fields for blog, we have name, we have handle and for tag we just have a name and for entry we have title, content and date, so the types are there and validations required are there as well, then I am having my relationships here, so the editor actually you know prompts you with autocomplete, it is actually easy to build using this then you know doing one by one hand and this is only an online version, it is only an audit, so we do not save anything or like we do not save anything to our database or anything, this is whatever you do here is only saved in your local storage and you can either download or you know upload that, it does not get saved in any of our remote servers or anything, so relationships you would want to say, so we have a many to one from blog to user, we have a one to many from blog to entry, we have a many to many from entry to tag, just one thing you have to make sure when you are modeling something is that make sure your you know entities are in order of dependency, so that say for example if tag, entry request tag make sure you put tag before entry, so that when your database is being created it does not fail, so just make sure of that, it is all documented in our website under J-Hipster-UML, you have a subsection called JDL where all these are documented, so there are few more options which you can define here, so I can define my pagination rules, so I am saying that you know I need pagination for tag and entry but not for blog and I need DTO, mapstack DTO for all my entities and I would like to have all my entities through a service layer, so I am defining a service implementation model here, so once I have this model you can just download a JDL file and I am downloading directly into the app, so it stores as a .jh file, so once you have this you can go back to the application and you can just do .jh import JDL and you can you know give you a path, so since I have it in the root I am just running with that and you can see all the entities being imported, takes seconds, sorry I am on windows, takes few seconds, so it prompts you that is the yeoman thing, it prompts you when existing files are over so all my entities are generated, so I have all three of my entities and you can see that browser thing is doing its stuff already, so your friend would have been already updated but we still have to compile the new Java files created, so just waiting for all the gulp tasks are done, so I am just going to compile this, one good thing about the latest spring boot is that it does live reloading for you, so even that is cool like you can compile your new classes on the fly and it reloads the application on the fly, so let me wait for my stuff to finish, okay in the meantime let it load, it is done, so my application is reloading, so almost done, almost there, okay done and okay, browser sync reloaded it a bit too fast I guess, okay so you can see all the new entities here, my blog, tag, my entry, so let us go and create a blog, so let us create blog here, call it user and assign it to user, let us create another blog, admin's blog, call it admin and assign it to admin, so okay so let us go and create few tags, you can see I have not touched any of the database stuff yet, I have not done anything for the database, so all my tables are created automatically, all my tables are even managed automatically by Liquibase, whenever you create entities the tables are updated with the new tables, I mean the new tables are created on the fly, so let us create few tags, let me put in an angular tag, let us be nice to spring and put a spring tag as well, okay so my tags are ready, I have to go and create my entries now, so yeah that is cool, so let me create a post, yeah so but not enough right, I mean if I am doing a blog I would not want to have a single line where I could type in my stuff right, so let us do some power magic, there is a small plug in called text angular, so I would just install that plug in here, so it gives you a very nice rich text editor based on angular, so it is nice to have, so that I can compile my vice leak blog, so yes I have done that and you need to add those to your app, let us add it to our angular module.js, you have to define the new leak added directives and since you are going to do some html binding, you need ng sanitize as well but that is included with angular but you anyway have to define it in your stuff and let us go and replace the directive entry dialog.html, so you can see that our content currently is just a input field because I selected string as a type, so let me just replace that with the new directive, so I am just replacing the directive, remaining things are the same, the model all those are the same, so yes processing yes reloaded, now when I go I should have some one second something did not finish there yet, something wrong with my font awesome, so supposed to be icons here, anyway I am having my rich text here, I forgot which one is for emphasize, I will make it a pre, let us tag it to admins blog, that is nice but my content is still not html, so let us replace that to bind html as well, I have already typed all those stuff here, so that I do not have to do that again and again, I could use multi-paste but I do not find it very intuitive at time, so this is simpler, let me reveal that my entity, so I am just going to replace my table here, so there is a table, I am going to replace that with the content here, nothing magical just some html, so it looks better and my html is rendered as html, since there is a few notice there is a ng bind, there is an ng bind html on my content, so that my html is rendered now, so there is still one more problem, we see all users post, I can see admins post and I can see a Singapore SCG post, we have to have our own post right, so it has to be some security there, so if you look at the generated javasai, you can see the repositories, spring data repositories, if you look at the blog repository, you can see a method already there, find by user is current user, this is already generated by jfister because you defined the relationship to the user, so I am just going to use this method on my service, so I am going to my blog service, so currently my find all is just find all, it finds all, so I am going to replace that with this method and I have to do same for my entry as well because my entry currently shows all, so in entry also I have to replace that but if you look at the entry repository here, you do not have that kind of method, you do not have a method where the data is filtered based on your user, so because there is no relationship to the user there, so it is not a direct relationship here, so but this is some spring data, so it is quite easy to write your own query, so I can just do these two lines and it would do that for me, I could just put this, I would just add the imports and now let my service use this method instead of the find all method, that is simple enough, let me go back and compile that, I wish these things are faster, I think Maven is bit more faster, compiling stuff, some awkward silence there, yes by the way if you are wondering what console I am using, it is con emu, so I now see only what I am supposed to see, so I only see admin stuff and if I am going to create a new entry then in the drop downs I only see admin's blog, the user part is gone and if I sign out, sign in as user I would see the user stuff, so I would see the user stuff, so that is almost basic blog app what we need, so how much did that take, so that was, how much was that man, some 20 to 25 minutes, so that is around 167 hours saved, I am taking it 1 hour not half an hour, so that is 167.5 hours saved, I calculated it as 83 cups of coffee, sorry if you differ and 20 more days for vacation if you want, so that is my 6 weeks reduced to 30 minutes, yes, this is 1.5, yes, angular 2 not yet, it is on our road map for jipster 4.0, this is 3.0, we have not released 3.0 yet, supposed to be released this month end, yes. Okay, if you want to add attributes to the user table, since the code is there, you can always go add your new attributes to your domain and your liquid base, there is an XML for liquid base, so you can just add to your domain and your XML and it will be in your table, it will be when you rerun again it will be updated to your table or you can use Gradle or Maven, we have a goal to generate diffs of your table versus your actual code, so it generates the diffs and updates your tables, so you can do that as well. And with 3.0, we have introduced, I mean we have upgraded the entity generator to have features to edit an existing entity as well, that means when you run an existing entity, it will prompt you with an option to either edit, I mean add or remove fields and relationships, earlier it was not possible, but now we have added that, but still we do not expose the user entity to be editable via the APIs, you have to manually edit your user entity because it is a special entity for us, because we manage a lot of stuff around the user, so once we start exposing that then people could add whatever, so many different weird things to that and everything will be broken, so it is better that you do your user entity edits manually so that you know what you are doing. So what exactly is J Hipster, I mean if you, I think some of you would be familiar with what a Eoman generator is, it is a framework to write scuff holders, like application generators, you can basically write a generator for pretty much anything. And we use that to build J Hipster which creates a Spring Boot plus Angular application and currently, I mean these are some of our stats, we have around 12k downloads in last 30 days, some 3600 stars, 200 contributors, we have 200k overall downloads, NPM, Devbox, all those docker, everything, 10k plus app generations per month and 12k unique users as of now, sorry. How is it easy to delete an entity? Sorry? Suppose I want to delete the entity and it is a scheme. Okay, we do not have a sub generator or anything, delete an entity, but I would say if you are using it, that is pretty easy for you, I mean if you are adding a new entity, you would have added as a new commit right, so it would be as easy as resetting your last commit, I mean if you are using it and we expect people to use some kind of versioning tool, so if you are doing it as a serious stuff, definitely you would be having some kind of versioning tool, so you would have to depend on that because those are things which you have to manually take care of because you could have added all your custom stuff on your entity, it would be hard for us to detect all that and delete for you. So at core when you generate an application, these are the things which we include as default, so it is based on, since we are based on Spring Boot, so typically wherever we could use Spring, we would try to use that and so Spring Security, yes AngularJS is by default Bootstrap and with 3.0 you have options to actually you know either skip your client side or skip your server side, so you can actually skip all the Angular Bootstrap stuff and just generate a backend app, so that facility is there. Then we have moved to Gulp, earlier we used to have Grunt and Gulp, we have dropped that, so now we provide just Gulp and we use Bauer for our friend and you know dependency management as we provide Swagger out of the box, we use drop wizard metrics and we use Karma for our JavaScript tests, we use browsing for live reloading, whatever you saw just now. And if you know if single page application is not sufficient for you, if you have to do a traditional multi-page application, we provide timely support out of the box as well, so you can use that and if you are using, if you have chosen SQL or MongoDB, then we do all the Spring Data magic there and for SQL yes of course Hibernate and Liquibase and there is Cassandra option which we have our own code to do Cassandra stuff. And that is not it, so those are the base stuff, on top of that you have all these combinations to choose from, I mean you can choose to build Monolith or Microservice or Gateway, I will go into details of that on the second part of the session. And if you are choosing Microservice stuff, then you have all the Netflix stack there, you have Docker support, you have Kibana, again if you are using Microservice and you have option to choose May 1 or Gradle, you can enable SAS and you can enable Internationalization, you can choose from all our predefined languages. So for all our modules, whatever module we provide out of the box, we provide translation along with that. So there are users who have contributed translation for all these different languages, so you only would have to add for your newly added entities, you know whatever you have to write your own translation. But again we provide the skeleton files for that, you just have to update the values there. And for social login, yes we use, we provide option of session OAuth or JWT, we used to have Xauth but we have moved to JWT and we have options for electrical software, eHcache or Hazelcast. Then for databases, if you want SQL, you have more access to SQL and if you want, then you have MongoDB and for testing, you have gate names, so all these are possible. So if you think that is a lot, then we even have more. There are a lot of sub-generators. So entity sub-generator, some of you might be familiar if you are familiar with J-Hipster, that we used to relay on the entity generator to create entities by hand, one by one. Now we have import JDL function and you know an easy way as well. Then there is a service generator to create a spring service bin, just a skeleton generator kind of thing. Then if you forget to, I mean earlier we used to have language generators as a separate thing, that you have to generate your application and then you have to go in and add your languages. Now during your generation, you have an option to select your base language and add your additional languages. If you forget to do that or in you know some point of your application development life cycle, if you want to add a new language, then you can use this language generator to add an additional language. It would put in all the files required for that additional language to work. All the JSON files and all these would be generator for you. And we have a client and server generator as I said. If you do not want a full-fledged app, if you just want to create a server-side app, you can use the server generator. It will just generate a spring boot server app without the angular and bootstrap part. Or if you just want an angular and bootstrap part without the server thing, you can use the client generator. And for deployment, we have sub-generator for AWS, Cloud Foundry and Heroku. We used to have OpenShift but we have deprecated that due to a lot of API issues and bugs. So currently AWS, Cloud Foundry and Heroku is our first class cloud options. If that is still not enough, we still have more. We have modules. So you can actually go in and write your own module if you want. If you think something is not there in J-Hipster and you can write your own module for that. Or you can also choose from all the modules which are already there. So we have a marketplace to go to our website. You can see a marketplace here which lists down all the available modules. So currently you have a lot of modules there. I think around 19 modules there. Most of it from our core development few from other contributors as well. So this is not managed by us. This is not in the J-Hipster organization or anything. You build your modules, you publish it to NPM. Just add a keyword J-Hipster module into your NPM file and we show it here. So it is as easy as that. So whatever customizations you want to do, you can do. And with 3.0, we expose some APIs from J-Hipster so that it makes it easy for you to build your own modules. So say for example, if I want React on top of, you know, instead of Angular, I want to use React. So I can easily build a module to generate just the backend part using J-Hipster and put my own React stuff. And of course that is something I am working on currently. You can actually see a React module here which is a work in progress. So you can do your own stuff there. If you want to change the frontend, you can generate your own. So I will just show you a sample of how a module works. Let us say I want some cool boot swatch themes. So we have a module called boot swatch. Let me just force so that I do not have to answer to all the diffs. So basically what this module does is it adds support for a team picker kind of theme so that you can change your boot swatch themes. You can choose from all the available boot swatch themes and you can change them on the fly. So I have just added that. Let Gulp add those new JavaScript to the index. I think it has already done that. Okay. Not yet. Okay. So it is there. So you can go ahead and play with your themes. So there are a lot of such modules as there is a bootstrap UI module which adds angular bootstrap material UI. So that is how modules work. You have a module for entity audits. It gives you a nice audit page for your entities. It does all the entity snapshots similar to inverse but not exactly inverse. Something similar. So all those things are there. And if still not enough, there is still few more things you can go and check out. If you are a traditional person who likes to do your EML, there is a project called Jifstra EML within our org where you can design your EML using Gen My model or Visual Paradigm or any of those EML stuff. You can import that from the EML. You can directly import us entities. It will generate entities from that. And if you want to create your own module, there is a module generator for that as well. Yes, we have lot of sub-projects. And there is an incubator organization for us. It is called Hipster Labs where we do all our incubator projects. Okay. So maybe you guys need a break or you want me to continue. How is it? I think I can go for another 30 minutes or maybe 20 minutes. So how do you want to take a break? Can? Okay. So are you fine? Okay. So can I assume that most of you are familiar with microservices? Most of you have heard microservices. The hip word. So wherever you go, people would be like, everybody wants to do microservice for everything. Even for the blog app which we did now, some people would want to do microservices. So yes, I can have my tags as one service. My entries as one service up to them. Fine. But there are some genuine cases for microservices as well. I mean, so you want to do microservices. How many of you have tried to do microservices? Great. I appreciate your patience and all those things. So anybody who wanted to do microservices and is not willing because of the complexity in setting up and understanding initially. Okay. I think it would be very familiar with microservices anyway. So then can I take that most of you are not very familiar with microservices? Okay. It is basically the idea of having separate services for each of your individual tasks so that you have separate services for each item independent. It is like how you used to do EJB in the olden days kind of thing. So instead of RMI, you do all these rest API calls. So you have separate services here and there. You might have multiple nodes of the same service. You might have it in different networks. All sorts of combinations and yet you access all those through same single gateway and all these services work together to provide a common goal. So that is kind of, sorry if I was wrong anywhere. So that is kind of what microservices does. And if you have not tried that because it is complex to start up with, I mean there are lot of new concepts to learn. There are lot of, I mean you look at, I mean Netflix provides very good set of tools and frameworks to start up with microservice. But as soon as you hear the names of those, it would not make sense to you because somehow they chose to name weird Greek names or something for those. So by the name of it, you would not understand. Still you start to read all those together. You would not still understand how all those fits in and where to put what. There are just lot of options and it is just difficult to start up and it would be great if someone gives you a skeleton or something that binds all this together. So that is what we are going to do with 3.0 because in J-History 3.0, one of our main thing is that we have started to support microservices. So let me just show you. So how many of you are familiar with Docker? Okay. How many of you do not know what Docker is? Okay. If you are from a Linux background, you might be familiar with this. It is like running a small virtualized environment within your, you know, within your container, I mean within your operating system. You can have standalone virtual environments within your operating system. And if you are from other OS as well, you might be familiar with VMware or like, you know, virtual box kind of things. So it is basically virtualization. So what Docker does is, say VMware kind of technologies, it virtualizes an OS for you. It gives an entire OS, virtual OS for you to work on. What Docker does is instead of giving you an entire OS, it gives you a small virtualized segment with say a single service or a single application or a single tool running in it. So all these, there could be multiple Docker containers running and interacting all together to give you common functionality or like, you know, or you could have a single war running in a Docker, you know, instead of, so what Docker does is instead of giving you an entire heavy weight OS, it gives a small segment with just what is required for your service to run. So it uses the underlying OS instead of creating a new OS image. So that is Docker. So what we have done is that when you have microservices, building a microservice architecture, properly working microservice architecture is a difficult thing. But even more difficult is once you have that ready, how do you deploy that? How do you effectively or efficiently deploy that and, you know, make use of that in a production kind of environment that is even difficult because and that is where we have combined the Netflix OSS spring cloud and Docker to provide you a nice and easy workflow so that you can not only create microservices, gateways and all these things with J-Hipster, but you can easily deploy that as well. Even if you are Docker newbie, even if you don't know what Docker is, I was a Docker newbie. I think I started using Docker last week or something. I have never tried Docker because I'm on Windows. Every time I would try to start Docker, something would go wrong, something, some issues. Yeah, it works nicely with Linux and Mac, but Windows it was just so I gave up and I was not going to touch there because we had Docker experts in the team who were taking care of stuff. So I didn't have to look at that. But for this, I had to use. So somehow I got Docker working on my Windows. So for me, as a Docker newbie, it was quite easy. So we even have a generator which does it even easier for you. Say for example, I have this project here. So what I have already done is I have created a small microservice project. So I have a gateway which I generated using jhipster. When I ran jhipster, you saw three options, monolith, gateway or a microservice. So I used the gateway option, answered a few questions and that is the generated app. I haven't touched that after that. And I generated two apps, MS app one and MS app two, again using jhipster's microservice option. I just generated. I haven't touched anything that. I wanted to generate. I didn't want to waste time generating all this here because it will take at least five minutes each. And then I have a Docker folder here. So that's it. So if you go into the Docker folder, it's empty. I don't have anything here. So what I'm going to do is I'm going to run generator here. Sorry, I'm slow with typing. Okay. So what this generator does is it generates, okay, Docker has something called images. So Docker files. So Docker file is nothing but a description of what the image should do, what service it should host and what service it should depend on all those stuff. So what this gen, okay, it's asking for application located. So my application is one level up from the Docker. So these are the applications. So I want to dockerize all of that. That means I am going to deploy all of them with Docker. So I want ELK. If you don't know what ELK is, it's Elasticsearch, LogStash, Kibana stack, which is used for logs, monitoring of logs, monitoring of metrics and all those stuff. You know visualization, Kibana is a visualization framework used for nice GUIs of all your stats and visualizations. So I need that as well because definitely for a microservice kind of architecture, you need some kind of monitoring so that you know what your services are doing, how it is performing and if there is an issue, you get alerts also. ELK gives that kind of features as well. So I am going to enable that and for this I am going to use the dev profile. So it has created some files for me. So if you see it has created the Docker compose YML file, which is kind of a configuration, which tells Docker to do, which tells Docker what are the services available and stuff and then you can see something called registry.yml. So registry.yml is nothing but, okay. Before that, let's when it is, I will just run it, then I will go into the next and explain stuff because the running takes a bit of time. So I need to do Docker compose up hyphen d. So I am basically going to start Docker. So I am telling Docker to start up all the services. So I will explain you what is happening here when it is starting. So for a microservice architecture, basically you need two important things. You need a registry, which as the name says, it kind of registers all your services. So you might have one to N services. Say you have your MS app, one MS app, two so and so. All this needs to be registered somewhere. So and that is where Eureka comes into picture. Eureka is a Netflix stack component, which does this registry part for you and you also need a config server, which kind of you can think of it as a centralized configuration, repository kind of thing, where all your configurations are managed, all these things. So this registry is a very important piece of the microservices puzzle. So and that is one of the key component as well. So we provide the registry as a runtime. It is not generated because it need not change for each application and the options are not going to change. So it is a pre-generated repo. We have a repo for registry. So it is kind of a runtime and we provide it as a Docker image. So when you start up Docker, this image is pulled and used. So you do not have to download the registry or anything by yourself. And for the registry, we have used Eureka and Spring Cloud config server both together. So that forms a J-Hipster registry and all of your configuration for production is stored in your Git repo. Another important piece of your microservice puzzle would be your gateway, the gateway from which you would access all your services because if you are exposing all your services directly, then that is not kind of a microservice. So all your microservices would be exposed via your gateway. So your gateway kind of proxies everything to your microservice and it also can act as a filter, it can act as a load balancer, all those things. So what we have done is we have, when you generate a gateway, so you can use J-Hipster to generate the gateway. When you generate the gateway, we configure the AngularJS app which access the front end for all your app. Then we use Zool proxy. Zool is again from Netflix. So we use Zool proxy and Ribbon again from Netflix for load balancing and all your access control, your user access control and your role management, everything happens there in the gateway. And it has its own database for that. And it also does some filters for your microservice. Say if you want to restrict your API usage, you might have seen public APIs, they have API usage restrictions for users, 1000 hits a day. Those kind of things we already provide out of the box and we provide security filters, all those basic things we provide out of the box. So that is the gateway which you can generate using J-Hipster. So once that is done, then you can generate any number of microservices and host it behind the gateway. So how many microservices want and how you want them, it is up to you. Your microservices can have a database, can be without a database, can use any database. I mean one microservice can be on MySQL, another can be on Mongo, another on Cassandra, that is up to you. So the green part is all what you have to generate. And the gateway also you can generate gateway and you can use some of the options as well to generate the gateway. It is not run time. Only the registry is a run time. And similarly, J-Hipster console, that is the monitoring part. So that is where we use Elasticsearch, Logstash and Kibana to provide a complete monitoring framework for you. And again, that is kind of a run time. We provide that as an image. So that you do not have to download or deploy. It docker just pulls and does it for you. So this is the microservice architecture which we are supporting with J-Hipster 3.0. And what I have done here is I have just started the registry and it has started Elasticsearch instance. It has started the Logstash instance. It has started my gateway app which I generated and it has started my both microservices apps and it also started the J-Hipster console. So if I go into chytmatic which is the UI for docker because that is where I would have to go and look at my logs. So you can see all these have started up. So my registry gateway has started, my console has started, my apps have started and my registry is running. So now how do you access this? In Windows, if you are using Linux, docker is even more easier and more efficient because it just works on top of Linux. It does not have to create a virtual container or anything since the concept behind docker is Linux specific thing. In Windows it creates a Linux box first and then runs inside it. So that is why I have to use chytmatic and stuff to look at the log. So my services are up. So this is my microservice. So you can see my entities are listed here. My service one entity is hosted on my MS app one and my service two entity is hosted on my MS app two and since it is a gateway you have an additional item here under the administration which is the gateway. So it shows what are your current routes. So currently we have three routes, two of my microservice and of course your gateway again is an application. So application on itself it can have its own entities and stuff as well. So that is a valid route as well and if you look at the registry which is running on port 8761. So this is the spring Eureka registry. So it also shows the same apps you can see. So all the apps are registered to the registry and if you bring down one app it automatically handles that and all those stuff and your scaling is also handled. If you have multiple nodes running the same app all those are registered and handled as well. So if you look at and user management is done only on the gateway. You do not have to manage users on each apps. It is done on the central gateway and based on that all other apps would be authenticated. So if I am authenticated on my gateway then I am authenticated on my apps as well. So you do not have to manage that separately and if you look at the health screen you can see additional items. You can see health of all the microservice items, your discovery client, Eureka, your refresh scope and your config server. All those can be seen as well. So say if I am creating an entity here let us see. I do not have a way to minimize this again. Let us look at MS App 1. You can see the logs. So I am going to create an entity here. It is a bit slow because of all the containers running. So you can see it being created in MS App 1. So if you look at the and if I am going to service 2 then there is nothing here. So I have to go to MS App 2. So it is properly routed and you do not have to do anything for that. So you just have to generate your apps then run a Docker command for it to be instantiated and everything is deployed to Docker and you are up and running. And if you are on Linux then you do not even have to go through this because here you can see that the URL is not, sorry, it is not my local host URL because in Linux I am under another container. Sorry, it is independent. That is the purpose of microservice. If you want both to be interlink then you would create them as a monolith. This is the very purpose of microservice to have independent services which does not have to do anything to each other but service some common goals. So if you have a say reservation system, your booking engine could be a separate service. Your check-in engine could be a separate service. And if you really want to communicate there then of course you can do the communication. There is no hindrance in doing that but sorry, somehow my, it is weird. So that is about microservices and so any, maybe later, questions later maybe. So for microservices as I was telling you we provide the registry, we provide the console, both these are runtimes. We have a dashboard, a historic dashboard. It is still working progress that is why I could not show you yet. That would be on your gateway, sorry, on your, yeah, on your gateway. And the Docker Compose is what I have shown you for your deployment part. And we have a J-Hipster OpenID Connect which is again a working progress where we are planning to provide OpenID Connect support as well. And this would be the Kibana dashboard. I could not show you the Kibana dashboard because on Windows still some problems I could not get it to load. So this would be the dashboard which my friend gave me from his Linux, I guess, yes. So all your JVM metrics are there and all your logs are here. So currently out of the box we provide visualization for JVM metrics and your logs. And we provide alerts. We configure alerts as well for using InstaAlerts. So all that would be configured. Okay. So that's about microservices. For real-world experience, yes, last time I wanted to talk about this but I overshoot my time which I am going to do here as well, I guess. So I couldn't talk about that. So I mean, I have spoken about J-Hipster to many people and most of them would tell to me that, okay, J-Hipster is a good tool to learn things. Like if you want to learn how to wire some stuff up, you can generate an app and see how it is done. So you can learn from that. And it's a good tool to do small POCs or demos kind of things. But it may not be a good tool to do an actual real-world app. That is what I hear. Even some of my friends used to have told me that. But where I'm working, we have successfully implemented production apps, very critical production apps with 100 plus entities using J-Hipster, using that to, I think, version 2.3 or something like that. That is when it was done. So we have successfully done that. And it has saved me, say, I would say around 40 to 50 percentage of my development effort. So say my development time was, say, around four months. So this saved me around one and a half to two months worth setting all these things together and wiring all these things and figuring out how to do certain stuff. So the base gave me all what I needed. And I just had to write my business logic and my UI stuff. Of course, you wouldn't want to go with the same UI which we use. You can use the admin part GUI. You might not want to change that. But of course, for your business, you would have to do your own UI. So two ways to go about it. Some people would like to build their own UI and keep all this as admin stuff, so that admin have a different UI to go and easily do entity crud and stuff like that. That is how exactly some people are using it. Some people might just rework on the generated UI and make it look better. That is what I did. I reworked on the generated UI. I changed the themes to my requirement and that was good enough for me. So yes, that app is into production and it was a very successful implementation. There was no delays or anything because this has saved me a lot of time. So yes, I would definitely suggest for production use. Yes, because definitely, I mean, anyway for production, you are not going to get code and deploy somewhere. You have to write your own code. And definitely, most of the code what we provide is based on a collective wisdom of a lot of people. So I would assume that it is definitely better than writing from scratch. So that way, yes. And if you have any questions on that real-world scenarios or anything, you can ask me. I would be happy to answer. Okay, till now, we didn't have any kind of reverse engineering support. We have added the first step. The first step is supporting a custom table name because currently what we used to do is if you define an entity, say you generate an entity called blog or say, yeah, blog, the table name would be blog. So if you want to reverse engineer, you can always take your model and you can create that into a model and you can generate. You can take your database, you can generate a UML out of it. You can create a UML model from your database and you can use the UML model with J-Hipster UML and to import the frontend. Then once it is created, you just need to remove the liquid base part and deploy and it will work with your existing database because liquid base takes care of all the database management. Once you disable liquid base, with 3.0 we will be providing switches to disable stuff. Say there will be a switch called, switch in the sense it is a spring profile. So if you add say prod comma no liquid base, then liquid base will be disabled. Similarly if you want to disable swagger, there is a no swagger. If you want to disable cache, there will be no cache. So that is something we are working on. That will be part of 3.0. So we can use these to do that as well and we are going to support custom table names. That means when you are generating an entity, you can provide a custom table name. So that is first step towards reverse engineering, not quite fully automated there yet but there is a way to do of course. The plan was to release by mid of this month. You know open source, how it works. So we are planning at least end of March or early April. How do you handle distributed transactions in the microservice? Sorry. Distributed transaction in microservice. Distributed transaction in the sense database transaction, right? Maybe or they are not. No, what is it? Say for example, if you are talking about database transaction, then consider you are having a same app in multiple nodes. That is same as how you would do a monolith in cluster. So say for example, maybe one service might be using over the other one might be using or actually. Yeah. Okay. That kind of transaction handling is not there yet. Across services is not there. Of course, within a single service and even if multiple nodes of the same service, already it would be handled by spring and the spring transaction and your caching will be handled by hassle caching. It does pretty good distributed caching. But if you are having two services with different DBs and if you want to handle transactions between both, then I would say there is something wrong with the design because you are having two separate services and expecting it to both to handle same transaction. So yeah, I would suggest you go monolithic there because to me that is not microservice use case. Because I would not do a microservice use case if I had to do a transaction in, I do not know, I am not an expert in microservice. So maybe any comments from microservice experts? What about service buses? Sorry? Service bus, like messaging between services when I want to publish some messages. I understand. I mean, we do not have support for that yet. So if I am not wrong, this could be, I mean this is just a first release of microservice support. So we are not quite there on all the use cases of microservices. The plan is to provide, the plan is to provide the basic architecture. So what I showed is a basic architecture that would be required for microservice. So the plan is to provide that and what is the most basic needs first? Of course, all these are like say advanced use cases. I would say advanced use cases. So not yet, but might be in a pipeline. We have not started to discuss on our 4.0 pipelines. The only plan for, okay, I have a thing on that as well. So the only plan for 4.0 now is to move to Angular 2 with TypeScript. So this could be part of a 4.0 or this could be something in between. Definitely. Once we have the microservice things out, then only then we would start getting feedback from users and only then we would know how to prioritize and what features. Yes, it could be there. I am not an expert on microservice as I said. So I cannot firmly say yes or no to you, but could be there. Yes. With regard to Microsoft special or strategic relationship with Docker, if you are not the Microsoft client, is there any difference between like yours independent from those non-independent? They are not knowing exactly what latest that they are offering between the parties. How would you know certain things that maybe you may not be aware of. So in your case I quite frankly lost you there. Strategic relationship, partner-shape for example. Those parties are not and we are using from cash only, you know, adopters. Is there any advantage or other things that are not known between the parties that we could be assured that, you know, we are not that kind with those improvements or innovation, whatever. To be frank, I cannot answer on that because there is nothing to do with J-Hipster because yeah, I mean, so that is something. To be frank, I wouldn't know. To be very frank, I wouldn't know on that because as I said I am a token UB. So and I found it very tough to get it working on my Microsoft OS. So I don't know how to answer that. So you mean if you have a web service, okay. What kind of web service? It's a rest service or soap service. Okay, okay. I am finding it difficult to visualize how you would generate entities from a web service. Okay, okay. WSDL which defines an entity. I mean, we are not supporting that yet. I mean, I don't know if we will be supporting that ever because that's a very unique use case. So I mean, you could get and convert that to a JDL or a... No, I mean, if you are talking about generating web services in J-Hipster, yes, we have a, okay, at least there are two modules there. There is a Swagger module, J-Hipster Swagger module which actually generates based on Sagger, you know, your Sagger, it generates Sagger clients based on your spec. Okay, so basically you can use that for your rest APIs but for soap, I am working on something. I am working on a module to generate web services with soap, WSDL. Even to do that, people might think that I am the old generation. So to mention WSDL, but still, since I find it a very common use case in enterprises and real world things. So I am writing a module which would actually generate web service skeletons and stuff based on a WSDL but you have to put the WSDL in a root folder. Then it would generate, you know, your Jacks B bindings based on that and it would generate a conversion layer based with map struct. So you can easily map your Jacks B bindings to your entities. So that I am working on. Whenever I find time, to be frank, whenever I find time because currently I am very much occupied with the jiff stuff and my day work. So maybe once 3.0 is out, might be a bit free than maybe in one or two months. Is there a sauce? Yes, of course. Or maybe I can publish whatever I have and if you want, you can continue to work on that. So since we are on roadmap for 3.0, I think I have already covered, I have 3 more minutes I guess. So I have already covered on our most, you know, I mean the huge stuff, the microservices. Then other things are like we are adding support for editing entities with the entity generator. We have dropped grunt, we are moving to Gulp and we are following John Papa's style guideline for Angular, which is pretty much standard nowadays. So those are the major stuff. There is a huge restructuring of our code base, internal code base as well as what is generated, the Angular part. So people using older versions of jhipster, you cannot upgrade with the new version because it will be a breaking change. So you can only use for newer application because the entire frontend code is, you know, kind of restructured. Backend is still the same. They are only the frontend part. So those are the major things. Then there are a lot of improvements and fixes and stuff, minor features, lot of minor features. So that's all for the roadmap. So yeah. Yes, I think you are happy. Okay. So questions, any more questions? Can you give us a source it's generated, just a peak? Sorry? The source it's generated, the jhipster generated for us? Yes, the source is in our repo. No, I mean the source, the generated project. I want to see what surface it's created, what kind of... Yes, yes, generated project, right? Yes, it is also in our repo. If you go to the GitHub repo, right, we have a sample for every option because basically that's how we test. So we generate a sample for every application so that so you can see here there is a sample app for every option. So that is basically the generated source or you can just install and generate whatever you want. It's source code generated anyway. So yeah, anything? I think we have two big projects in production and there are a lot of projects being built. There is a very huge project being built which would be in production soon. So that is within my company and I know people from other companies using it in production. I know very huge companies using this in production. I don't know, this is a very open forum. But yes, it is in production. Huge companies are using. Some they don't, they find it okay to accept, some they don't, because since we don't have anything as J-Hipster kind of thing, once you generate it's your own code. Even if you go show it to somebody climbing to be your own code, they would believe you because there is nothing to show that it is except for the image on the front page which you can remove easily. So, yes. Any more questions? Yes. No, we were supporting both grand and gull. But we found it, you know, waste of time to manage, you know, maintain both because it was, both were not doing anything differently. It was doing the exact same thing. So very similar way and gull piece better at that. So it is faster and simpler compared to grand. So we decided it's time to just focus on gull so that we can spend more time on that rather than maintaining both. Whereas we give, we support Maven and Gradle, because it's different. It's not doing the exact same thing the same way. So even from the language itself, it's different. But for grand and gull piece, it's not the same. It's javascript. So, yes. So will you wait for the release of the program to stable? Yes, actually, we are, we haven't found any huge adoption of Angular 2 yet. So people are still using Angular 1. So it may not be a good move to switch to Angular 2 now. So we would want to see first. If it is really adopted, then definitely. And currently, our plan is to support Angular 2 from 4.0 onwards. So that currently we can concentrate on microservices and then, because Angular 2 currently not quite there yet. And it's a huge learning curve. So suddenly we switch and even I pretty much, I know Angular 1 maybe, not an expert, but somewhere. Still I found Angular 2 very... Yes. When you were implementing your project, did you use, say, BDD and SDA? I used gate link. Protractor was something new we added. So when I was doing, Protractor and BDD was not there. Cucumber, we used for BDD. So Cucumber and Protractor was added later. So I couldn't use that. But gate link, yes, I used. And Protractor, it is actually very good. I find it very good. It was recently using it for some purpose. It's good, actually. Good to run all your automated tests with a browser and see what's happening and sit back and relax. Better than writing manual Selenium stuff. And you really used that in your... Gate link I used. Protractor, I'm... BDD, I haven't used because, as I said, this was added later. So after this was added, I didn't do any projects yet. So I think my time is over. So if you guys are patient and if you have questions, yes, you can sit and I'll answer. If not, we can conclude. Thank you. So you should go and check out some of these videos as well from Matt Reibel, one of our core contributor. So you can check the website for any most of the details. We will try to cover most of the documentation as much as possible. So, yes, thank you.