All posts by dalexandrov

Thoughts on microservices. Part 3: Throwawayware.

Картинки по запросу throw away this

Microservices.. yes, nowadays they are everywhere! In my previous post I’ve shared my thoughts that sometimes just a monolith can do the required task without being cut into microservices. But it is wonderful if microservices are the most suitable solution! This is definitely lovely!

First, we’ve got a lot of benefit it provides to us, second, we’ve got a great technology support to implement them – there are a lot of frameworks and platforms helping us develop some really good microservices.

The most of the conference talks I have recently seen are basically “Hello world” talks. The main message is “Hey, look how easy it is to create a microservice!”, “Just few annotations, and you are up and running!”. How great this is!

But when it comes to real life, most usually between start of the project till the first really useful microservice there is at least one sprint. More often three sprints. You’ll say – “That is ok! We are serious people doing serious enterprise!”. I still ask myself – “What can be so huge in one microservice, that it may require several weeks to be created?”. “Why then this service is called MICRO?”

I’m not sure if there is an official definition of a microservice, but a well-established idea is that it is a piece of software which is designed to perform only one single function, but in the best possible way. It should communicate with the rest of the world with the most lightweight protocol possible, like REST. So, if we have a login functionality, a microservice should be able to login a user in the most fast, easy, reliable, secure way. Only login and nothing else. For logout there should be another service. The size and complexity of such a service are not in scope of micro, they can be of any scale. Technically, there should be only one function exposed, but what happens under the curtains are just implementation detalils.

This is why, the most of such services become really complicated, often even overengineered. From my experience, at the end of the day, each microservice in enterprise webapps becomes a usual three-tier application. It has its “UI” simplified to REST endpoints, it has its business layer with several services interfaces and their implementations, an infrastructure layer to talk to DB and other services. The interlayer communication is done via value objects. As a result, a usual call of a function of this microservice ends up with several data coping from one value object to another (in one of such microservices I’ve seen up to 14 of such hops). Why would you do this? The typical answer is if some part of the service changes, we will change only this part of it. Fair enough. If in return I ask, how many times in your life have you ever changed one of the tiers without affecting the others? Тhe answer is usually – never.

Once again, nothing wrong here. The complexity of the implementation of a microservice is orthogonal to the interface it provides.

Another question: how many times have you ever received a fully functional “freezed” interface definition? The spec that never changes? A guaranteed never to change document? In my case – never!

The changes are coming constant or even increasing speed. Even in terms of one API version. You may say: You are doing it wrong! You should plan more carefully, you should rethink your spec versioning policy etc. And you will be completely wright!

But.. there is something called real life! There are business needs that require quick reaction, quick change, quick time to market!

Looks like this constant change is just inevitable. For my 13 years in software development there were practically no projects that had really smooth stable development. A least every sprint there were some “tiny” spec changes, causing all codebase to suddenly go red. I’m sure I’m not the only “lucky” having this.

How should we solve this kind of problems in the microservices world? Its quite time consuming to create beautiful, complex, nicely architectured, (at least) three-tier microservices without frozen spec. As I already said, those spec changes usually require changes in all of the layers. This is hard! Most of us thought that’s just the way it is. Software development is hard.

But this situation kept me bothering. May be there is a way to expedite this change reaction? May be a microservice should be micro in all aspects? I mean really tiny? With as less internal abstractions as possible? Really tight coupled inside? When I’m writing this, I have a feeling I’m breaking the law. It is like I’m cancelling everything I’ve learned from the CS courses in the university. Why don’t we throw away all of the … tiers? Make it a really tiny one-tied micro monolith? A microlith? So that the object or even a direct line with data we receive from the infrastructure we transform to JSON object in one single class? With all the business logic also included in this one and the same class? You are absolutely eligible to say – “are you nuts?” What if the infrastructure changes? What if the Rest API changes? What if the business logic changes? You have to rewrite everything!

And then I suddenly say – “Yes! We will rewrite this service from scratch!”. Luckily, a lot of code in the service can be just generated. So, yes. We will rewrite it from scratch! We copy/paste. We do all the possible anti patterns. Only to make it work according to the spec and pass the tests! “But isn’t it a lot of effort?”. My answer is – “Pretty much the same as changing all of the classes in all of the three (or more) tiers!”. And people usually say – “Hmm…”.

This may sound really strange, but through several last projects, writing some really ugly small one tier microservices with really almost no architecture and no refactoring, then rewriting this from scratch saved me a lot of efforts. I have even created a name for this piece of software – “Throwawayware!”. Try to say it quick!

The next question that usually comes is – “Do you put this ugly thing in production??”.

My answer is: – “Ok, you got me! No, this does not go to production! May be sometimes..”. What actually goes there?

Putting this ugly little thing in production will be just catastrophic. That’s why I’ve tried some mixed approach.

First of all, we usually develop the tests to follow the contract. Yep, although I’m not a big fan of TDD, I think this is a good place to use it. Adjusting the tests to follow the spec and the contract is always the first priority to us!

Then we usually have 4 to 10 iterations on each microservice in this ridiculous “throw away” way. Funny thing is that up to 50% of the services do not even survive through those iterations! At some point the service may come obsolete even before production. This means that we usually save a lot of efforts for not creating something complex for something that will never be used (“Bingo!”).

Then when the service gets through those several iterations, we consider this service as “survivor”. At this time usually, the spec stabiles as well. And we do the same for each API version.

Just like the Garbage collector in JVM.. Haha! Yep, like the GC! Lovely!

For the survivors we usually make some really complex refactoring, or rewriting it completely new. We try to make their code really readable, expandable and maintainable. Quite often from the usage of those “throw away” implementations we can see some before unpredicted usage cases, like for example the pressure it should hold, or security, or fault times etc. This may end in three-tier architecture, but with really nicely designed layers.

Looks like this “two stages approach” works really well! Funny thing is that it fits perfectly in our SCRUM cycle. May be, I’m wrong, but this approach saved us a lot of effots and helped us establish good quality implementations in shorter time. In three projects so far.. We’ll see how it goes!

Any critic is welcome though…

TRIP report: Codefest. The siberian adventure. 🇷🇺

Right after Joker 2018 I was approached by one of the speakers Ivan Ugliansky with a very interesting proposal – “Hey, you know I’m from Novosibirsk, we have quite a big conference named CodeFest happening usually in the end of March. Would you like to come to Siberia?”. I answered – “This will be an honor for me!”.

It took me about 12 hours to reach Novosibirsk from Sofia. First 3h30m from Sofia to Moscow. Then I had my shortest night for this year – we took off at 21:30 MSK and landed 5:30 NSK time. The time passed quickly, the Aeroflot flight attendants were we so beautiful, that all of my attention mainly focused on them.

When we landed in Novosibirsk, I just couldn’t stop staring at my GPS position. Wow, I’m almost in the middle of Eurasia!

No photo description available.

The first day was quite intense! My great friend Ivan has made a wonderful excursion to a place named “Akademgorod”. In English this may sound like “academics village”. It was created from scratch bak in the 60s to accommodate Soviet workers of science in a very peaceful close to nature environments. As a result it has transformed in a huge scientific cluster. A lot of institutes and research laboratories are now located there. There is also a huge university.

Students and specialists from all over Siberia and even Russia come to this place for study and cool projects!

No surprise, there is a big IT presence here. A lot of Russian and not only Russian companies have their R&D here, and no surprise the CodeFest conference gathers more than 3k attendees.

I had the privilege to be invited to the office of JetBrains

and the office of ExcelsiorJET

I had some truly wonderful time there! We had some pizza and great chat! Huge thanks to Ivan for being such a great host.

The end of the day was dedicated to a special event – the local JUG meetup. Together with Paul Finkelstein I had the honor to give my talk about Java and JPU in front of the local community. The event took place on the 22nd floor in the office of the famous Russian company 2GIS. The location was really awesome!

More than 150 people come to the event! It was fully packed with even standing people!

To be honest, I was a bit scared to be in front of these people. Siberian developers are famous to be the most hardcore developers in the world. Mostly the strongest compiler writers. Isn’t my talk going to be too smoothy for them? At the end of it I was happy to find out that it was really ok! I had a lot of questions afterwards!

It was a sincere pleasure to talk to this community!

Картинки по запросу novosibirsk expo center

The next day was the first day of the CodeFest. Luckily I had my talk scheduled for the day two. It was really good news for me, since I still had some jetlag.

So.. the conference is huge! It has 7 tracks and it is not focused only on Java.

*Siberia is here!!

Actually the variaty of technologies and a SC fields was a big plus for me. I learned a lot of new stuff. I think I was mostly stuck at the Data Science track. I’ve been playing a lot with tensorflow lately, so it was a natural choice for me.

I’ve heard some nice Project management and Team lead oriented talks as well.

I was even interview on the conference radio. I had a lovely chat with Vladimir Plizga from CFT.

The conf is huge!

The day one ended in the local pub with the concert of … the speakers! Singing about.. coding!! Awesome experience!

My talk was scheduled to be the first on day two.. I’ll be honest, I have expected no more than three people to show up. Three listeners would have been a victory for me!

Surprisingly.. it was almost packed for my Microprofile.io talk! (based on the MicroProfile.io tutorial created together with Ivan. St. Ivanov)

Every went smoothly! All of my demos worked! What a releaf!

Usually its not just giving a talk on CodeFest and you are free. After the talk there is an expert zone, where the speaker can make some live discussions and answer audience questions. I spent almost an hour there! I’m really happy that Microprofile.io enjoys so much interest! I hope it was useful for the audience!

The second part of the day I have decided to spend in the city exploring it.

The famous Transsib railway is crossing the big Siberian river Ob here.

The old and new come together!

The cultural life is very intense!

The famous Opera and Ballet theatre is really huge!

Siberia and Novosibirsk are definitely wonderful places to visit! If you have the chance to go there, you definitely should!

I’ve met really wonderful people and had some amazing time!

The next day I was in the airport having something I’ve almost missed – Siberian pelmeni!

Image may contain: food

Ok, I’m going home! Siberia, you are endless and beautiful!

Image may contain: sky, airplane, cloud, outdoor and nature

Yet another 12000 km up in the air! (SOF-SVO-OVB-SVO-SOF)

Huge thanks to Ivan Ugliansky for making this possible.

Thoughts on microservices. Part 2. Evolution of Microprofile.io

Looks like public transport is a good place to blog. For several hours I just have a time on my own. I may stay focused on the topic.

So, I’m now on my flight from Novosibirsk to Moscow after wonderful CodeFest conference! I’ve got four free hours, an A/C plug and no free internet (yes, there is payed one). Only the views of immense Siberia from my window .. and the beauty of Aeroflot stewardesses disturb me a little bit when passing by…

I had an amazing time in Siberia! I had a lot of really exciting moments there! I met a lot of truly interesting people and had the pleasure to talk to them! Trip report to CodeFest will be published soon!

But this time on the plane I have I want to dedicate to some other thoughts I recently had in my mind, and they are about the evolution of MicroProfile.io.

I had the privilege to be invited to CodeFest to give my talk right about MicroProfile.io in Russian. I was very happy that the audience was so excited about this project. I had a lot of questions that kept me in the discussion zone for more than one hour after my talk. The interest was great!

The MicroProfile.io project is an amazing example of a community work! It is very young, but it evolves extremely fast! I was the eyewitness of the birth of the project, when it has started with just three specs inside CDI, JSON-P, JAX-RS. It was kind of brave move to start with just these specs, but the same time it was very wise IMHO. This ignited a lot discussion and community work. Shortly after that a brand-new Config spec was created, allowing us the creation of not only portable code, but portable configuration as well.

Community worked hard to establish what is really useful in the microservices world and created Fault tolerance, Health checks, Metrics and JWT propagation. The specs like OpenAPI, RestClient and OpenTracing made the picture complete. JSON-B came as a cherry on the top. Every new version of the MicroProfile.io came with some new specs and evolutions of the already available ones, definitely great! Let us not forget that all this happened only in about two years period.

Every time together with Ivan Ivanov we gave our workshop on MicroProfile, or we gave our talks about it we saw some really huge enthusiasm in the eyes of our attendees. Finally, there is a lightweight absolutely standardized and portable way to write microservices in Java world.

The platform vendors from their side made some really tremendous efforts to implement all of those specs. Some of the servers were rewritten like from scratch. Completely new projects like Helidon and Quarkus emerged.

Starting from MicroProfile version 1.2 (which I believe is mature enough) I’ve started using it in my projects. Although it is a bit hard with the testing, I’m quite happy about it. I just love standard code, I like the portability. I even have used it twice, when we had to switch servers from different vendors. It really went seamlessly. In one of my previous post I’ve described how easy it was for us to migrate to Quarkus one of our services. Almost copy/paste! The power of standards!

There are some things that nevertheless bother me. I’m reading carefully the discussion in the MicroProfile.io mailing list and I’m not sure if, for example, adding a persistence spec to the project will be a good idea. I know, a lot of services are stateful and persist a lot… but is it really relevant to microservices? Everything can persist and this is not something specific to microservices. Why then should we put it to the MicroProfile.io project? There are a lot of stateless services. They don’t need any persistence.

I had the pleasure to share these my thoughts with Emily Jiang at Voxxed Bucharest. I have proposed to start thinking a little bit differently – why won’t we make separate profiles relevant only specific problem we are solving? Should we have a special “Persistence profile”? Or if we want to make thing reactively we should establish a “Reactive profile”? And if we need more than one profile, we just combine them.

This may sound even absurd, but I believe, that current set of specs is just enough for MicroProfile.io. There are already 12 of them. Most of them are really microservices specific like Fault tolerance etc., other like CDI are the foundation. Should JPA spec one of the foundation specs? I really don’t think so. If CDI is really a glue to put it all together, JPA can be sometimes totally ignored, if the service is stateless.

I’m still not sure if I’m right in my thoughts. I sincerely wait for critics. But I believe that staying focused on microservice relevant specs is a better evolution path. There are more microservice specific thing to be discussed, like better servicemesh integration. Or a common set of server flags?

Currently these 12 specs in MicroProfile 2.2 solve all of my microservice specific tasks. It’s only the JSON-P spec that I’m not using it anymore, I do it all through JSON-B 🙂

Ok, our plane is approaching Moscow, I already see the Ostankino tower and the Moscow-city skyscrapers. Time to switch off the laptop..

Thoughts on microservices. Part 1. Does my app deserve to be microservice–based?

Ok, its ten minutes past 6.00 p.m. I’m on my way from Plovdiv to Sofia just right after the wonderful #jProfessional Plovdiv 2019. Although there are only 130 km between two cities, an express train makes them them for two hours and a half through beautiful Balkan mountaines. Just enough time to summarize some thoughts on microservices I recently had. I still wonder aren’t this thoughts too stupid, but they still bother me.

Just to mention, that this #jProfessionals Plovdiv was EPIC! It totally worth a separate post.

So:

Картинки по запросу microservices everywhere

Everybody writes microservices, no matter the reason, for good or for bad. Most of the talks on conferences are about microservices. Every new project is expected to be with microservices architecture. If there is no buzzword “Microservices” nobody from customers would ever listen to you. Some of the juniors I have on my teams say – “Of course microservices! Is there another way? Monoliths? Ah, they are bad! Why? It’s obvious!”

So, technically, I see everybody trying to make their software with this architecture. Or they say the do microservices, although the most projects I’ve seen usually consist of 2–3 fat services. Those projects look like a monolith artificially chunked into pieces that talk REST to each other. People try to decouple this chunked elements as much as they can, but most of the time it’s really obvious that these parts are still logically very coupled and cant live without each other.

I quite often have the following conversation when I consult some project:

– “Ok, you’ve got 40 request per day. The interface is for internal use. You’ve got a team of four developers. Why are you doing six microservices, you’re routing requests with Istio, you’ve got an angular UI”

– “Pretty cool, ah?”

– “How do you spread responsibility in the team, each of you develop his own service?”

– “No, everybody is responsible for all of the code.”

– “What will happen if one of the services will fail?”

– “We throw exception and render code 500.”

– “How do you deploy it?”

– “We’ve got one ubuntu VM on AWS right now. There is docker installed there.”

– “You will run all of the services there?”

– “Yes, and the database.”

– “Will you ever scale?”

– “No.. may be up to 50 requests.”

– “What about security?”

– “Oh.. It will run in secure environment!”

– “What do you mean by secure secure environment?”

– “It will run in intranet.”

– “Ok, now a general question: what is the problem you are trying to solve with microservices?”

– “What do you mean?”

– “Why would you split the app in 6 independent apps?”

– “They are logically split. What’s wrong?”

– “Ok, 50 request per day, it can’t work if one or more services stop… Isn’t a JSF/Vaadin small app just enough for this?”

– “Man! You are such a retrograde!”

I start thinking to myself, well, may be I’m getting old. I believe many C developers think the same about us Java developers – “Look how much overhead they make!!!”.

But still I wonder, is it really worth making everything as microservices? Will this automatically guard you from all of the architecture problems? Or would it create new problems you didn’t have before?

This architecture IMHO should not be considered as absolutely universal. Quite often this causes additional unnecessary overhead. The same time most of the developers I use to know sincerely believe that this is the only way of doing things. They don’t even consider other approaches.

I believe, that we as developers/architects should first ask ourselves – “What are the problems are we going to solve when applying microservices architecture? Do I really need it?”.

Before starting a new project, I personally do a list of answers on a single question: “Why this app should not be a monolith?”. If I find myself at least three technical answers different from “This is modern!”, “Everybody does this!”, “We can do it with one team!”, I start considering microservices as a potential architecture for the requested app.

And every time I start a new project I remember myself the dialog above. Does my app deserve to be microservice–based?

This doesn’t mean, microservices are bad and monolith is good. This means, we as professionals should make the right choice for the right case. It is very hard to give recipes, but it is always a good idea just to think before applying a certain architecture!

By the way, there are two great talks by Daniel Bryant “Seven deadly sins of microservices” and “Seven (more) deadly sins of microservices” (available in youtube.). They are very useful.

The interesting thing is that my current project really nicely suits to microservices architecture. We have several teams doing their own services. The services can run independently and they follow the main idea that “A microservice should be doing one thing, but in the best way!”. There will be pressure and scalability issues. Microservices architecture will help us solve these problems.

But there I have some thoughts about the way a current microservice should be implemented. This will be the subject for the next post.

And yes, train is a nice place to work. Especially if there is an A/C plug.

Oh, here is Sofia. It has beautiful renewed central station.

Quarkus: a blast from the future

Yep, Quarqus has definitely exploded just few weeks ago. As one of my friends said, it was marketing lvl8080! Just listen to the slogan – “Supersonic Subatomic Java!”. “A Kubernetes Native Java stack tailored for GraalVM & OpenJDK HotSpot, crafted from the best of breed Java libraries and standards”. Damn, so many buzzwords in one place! The twitter literally exploded as well. Literally everybody twitted about Quarkus.

I said – nah! Yet another microservices framework. There are many available now. The choice is really big. So, I almost ignored it. I’m honest here. Still the last Sunday I’ve downloaded it and played with some examples. My first experience was a failed build. I’ve submitted an issue in GitHub, and it turned to be my local maven issue. The fix was just to upgrade it. But as result this issue opened a discussion, and very same Sunday a maven version enforcer was added. The power of OSS! There are no weekend in OSS! Kudos to the team!

The twit flow nevertheless continued to appear in my feed. This somehow forced to open the Quarkus website and explore more. There was one logo that grabbed my attention:

I said – mmm MicroProfile. Lovin’ it! So it looks like I may try to pack a microservice (which is not Spring) in a GraalVM native image.

Ok, I need to try! This thought came to my mind about 3 a.m. this Thursday. Well, technically it was Friday already…

Luckily enough about a month ago we have deployed some CSV aggregation service. Yet another stage of some fancy bloody enterprise infinite process to generate some invoices. We have made it the most modern way using only MicroProfile specs, on WildFly server, running in some OpenShift pods (yes, we have a lot of RedHat licences). Mmm, a loot of cool buzzwords as well!

The service itself was completely stateless. With three rest clients we gather some data from there other services, mash them up in some CSV and serve it as a plain text on rest request! Technically it is insanely stupid! … making it the perfect candidate to be tested with Quarkus. By the way, all of the pipeline is still under development, so thus we’re not going to ruin someone’s bill and invoice.

Still the service has to work under some pressure. Thus OpenShift scales by adding pods. Since the service is stateless, we are totally ok with that! We also don’t have to care about rest providers from the other side. It’s their responsibility to scale 🙂

So, now comes the fun part!!! I’ve started a new project by copying some of the Quarkus quick–starters. Yes, I can generate a pom from an architype.. but I’m lazy.

I then just copy-pasted the code from my old project.. and it shined red.. Especially the the MicroProfile annotations.. ah. What’s wrong? 3 minutes of googling told me that for the MicroProfile stuff I need to add some Smallrye Quarkus extentions.. Ok, copy–pasted in the pom.xml.. Yay, the red is gone.

mvn clean package

… and BUILD SUCCESSFUL!

Ok, you made me sweat! Now let us:

mvn quarkus:dev

.. and .. http://localhost:8080/api/v1/invoicingRXT/1253211 (some contract)

AND I HAVE THE RESULT! That’s a WOW!!! This was one the fastest migrations I’ve ever done! I LOVE STANDARDS! Long live MicroProfile!!!

Ok, I have earned my coffee. It took me.. 17 minutes. Yes, this was mostly copy–paste, but look how cool is that!

… But, thats not over! Quarkus documentation says if I add -Pnative to the maven build command it’ll produce a native image! Let’s do it! Luckily I had already setup the GraalVM installation.

mvn clean package -Pnative

Waiting.. 1 minute… 2 minutes.. BUILD SUCCESSFUL! Lovely! Yes, it takes some time to build an image! I should admit, that the business logic code was written in quite straightforward way, without any fancy constructions, just some POJOs. There were no GraalVM specific issues.

Now let us just run the executable:

./invoicingRTXApp-runner

and the service is up and running in about a second! Although the console says the startup time is 0,212 sec. Technically from the run command to running service is about 2 seconds. THAT DOESN’T COMPARE to ~49 seconds startup time of the WildFly server..

Ok, now lets go to http://localhost:8080/api/v1/invoicingRXT/1253211 and what I see:

“”,””,””,””,””

Something went wrong!!! Why the example from the quick-starters work? Hmm… It looks like I’m missing one annotation over some classes – @RegisterForReflection. Reflection works a little different in GraalVM. Building it once again. Waiting another two minutes. Oh, how can two minutes can last so long..

Good! BUILD SUCCESSFUL! Now lets go to http://localhost:8080/api/v1/invoicingRXT/1253211 and what I see:

data1,data2,data3

IT WORKED!!! (Now imagine the famous Dexter from Dexter’s lab cartoon shouting this loud). That is so damn cool!!!

Картинки по запросу dexters lab it works

Nice! It’s been 42 minutes since the beginning of the experiment (coffee break included)!

Ok, now let us go back to the OpenShift setup. It will be nice to see if it’s ok in our test environments under some pressure. After making some yaml permutations I’ve rerouted 10% of the traffic to go the new native image pod. After 4 hours watching it work I see no errors! Only sometimes I receive some messages from surprised testers like “Something’s wrong, some pods start in 3 seconds only…”. And I say “Haha! This is magic.”

Now some intermediate conclusions:

– WildFly 78 Mb image, Native 21 Mb image;

– WildFly ~49 seconds start-up, Native ~2 seconds start-up time;

– WildFly ~300 ms per request, Native ~270 ms per request (we are dependent on other services).

– Wildfly ~359 Mb RAM (serving 1 request), Native ~22 Mb RAM (serving 1 request)

Lovely! Just, Lovely!

What can I say – Quarkus is definitely a good thing to play with. It showed extremely well in (almost) production code. Yes, I know the example is really stupid, but that’s a real world demand. The migration took me about 40 minutes by just copy–paste. I love standards!

The coming Monday I’ll make a full native setup, we’ll see how it goes! May be even in production soon..

Disclaimer: Sorry, I can’t share the code. It’s corporate..

Trip Report: DevoxxUA 🇺🇦

Картинки по запросу devoxx ukraine

In the beginning of this year I was quite skeptical, that I will make more then 2 conference, including the one I’m part of – jPrime.

But the end of the year was definitely very intense. After coming from St. Petersburg I had the pleasure to speak at several local events, including the oldest and most prominent local conference OpenFest. It was a great opportunity to meet not only Java programmers, but also to talk about different platforms and languages as well.

As I was in Oslo and St.  Petersburg Ukrainian guys Andrii Rodionov and Oleg Dokuka approached me and invited me to submit a talk to the inaugural Devoxx Ukraine. So I did it, and very soon I’ve received an email saying I was accepted! Actually I was quite happy, since I haven’t been to Kiev for more than 5 years already.

The girls from the organisers helped me a lot to get all the invitations and was able to enter Ukraine without any problems!

By the way, that was the first time I had a direct flight to a conference, without any layovers. This is so much great! I’ve started appreciating this fact!

The conference takes place in a beautiful congress centre “Parkoviy”,

with a beautiful view of the Dnipro river. Well.. at this moment it was a foggy day (like the most of the days in November in Kiev)

The venue itself is very nice and modern..

There was even a car parked inside!

The entrance (or I would say – “the portal”) was extremely cool!

Actually the theme  of the conference was like “You are in a spaceship!” which is really lovely.

Unfortunately I was there only for the second day. I’ve missed some cool sessions like the keynote by  the famous scientist Lawrence Krauss.  It’s also sad, that I’ve missed the BOFs at the end of the day, I’ve started enjoying them a lot. I like this live discussion that happens in between.

But what I definitely really enjoyed was the first session of the day two – “Software Engineering Theory vs. Practice: A Song of Ice and TireFire” by Baruch Sadogursky and Evgeny Borisov.

It’s not very much technically oriented, but the topic about the “Technological maturity”  of a company is something I really have to dive in. I often find myself asking why we need this or another technology to solve current problem. Is the technology we’ve chosen able to solve this problem in the most efficient way and are our teams ready to implement it. Definitely a good talk!

Now I’m looking forward to see the videos of the talks I was not able to see. There were a lot of them running in parallel, the choice was hard!

As for my talk… the was a challenge for me: I had to talk in parallel with awesome Orkhan Gasimov, Doug Stevenson, Nakul Mishra, Reza Shiftehfar,  Mary Grygleski .. and Dr. Venkat Subramaniam. But I was sincerely surprised when I had my room completely packed with extra chair and people standing..

So I’m very grateful for all people that have attended the talk! I hope that the attendees will find good application of the technology in their projects!

I’m happy to have received this awesome comment!

And as always – conference is meeting great people! And finally meeting them in person!

Like Michael Simons! Finally we have talked to each other in real life!

And Rafael Benevides with Dr. Venkat Subraniam

And many many more!!

As I was late to the lunch after my talk, I was arranged a special very Ukranian lunch made of borsch, vareniki and salo!

This definitely made this event very special for me! I’m really grateful to Alina and Irina for arranging it for me!

It was a wonderful conf. Made with all of the Devoxx traditions!

I had a lovely stay! I’m very grateful to everybody who made it possible!

Bye bye, Kiev! Till the next time I hope!

 

Trip Report: Joker 2018 🇷🇺

Image result for jokerconf

It will be a bit strange to call this blog post a “Trip Report”, bearing in mind that I’m fairly local. Yep, technically I’m living in two homes – St. Petersburg, Russia and Sofia, Bulgaria. So coming to Joker was kinda switching home, but to make it more unified I’ll still call this post a “Trip Report”. A trip report to Joker Conference!

There is one disclaimer I have to make: in this post I do not follow any timeline. Here I just want to share some thoughts and emotions.

So, what is Joker Conference? This is Russia’s biggest Java event, which usually takes place at October/November  in St. Petersburg.  The city itself is now unofficially considered as a technological hub, accommodating a lot of IT offices and foreign representations. Like Oracle for example, they used to have a big R&D office in it. You may be surprised, but Java ME for example, or the biggest part of lambdas in Java 8 were created in St. Petersburg. Now, for some reasons, there is no more R&D, but some other activities. Still a lot of banks, telecoms, retailers, aerospace etc have some quite big R&D offices in St. Petersburg. The Universities produce a lot of very qualified developers to satisfy the huge needs for that.

So, as a result Joker is a big conference. There are usually about 1500 attendees.

The conference is run by JUGru group, and it is absolutely professionally organised.By professionally I mean that conference organisation is their main job. Joker was the first one guys&gals have made, now there are more than 15 conferences they manage. And they  are not only Java oriented.

This was my fourth Joker Conference, and I kind of see its evolution.

For me it all started back in 2015 when it was held in one of the hotels and it was sincerely crowded, but starting from 2016 the conference moved to the Expoforum – a huge expo center near the Pulkovo airport.  This venue definitely has opened some new possibilities like convenient transforming auditoriums, big expo and dining area. The venue is really one of the best I’ve seen in my vast “conference junkie” career.

The stage is cool!

And there is a lot of attendees!

The conference has mixed Russian/English set of sessions, so the speakers were also mixed local and foreign. The audience is mainly local. By local I mean Russian/Belorussian/Ukrainian/Kazahk – or in other words Russian–speaking. But the quantity of foreign speakers grows constantly trough the years, and I consider this as a good sign. All the visa barriers are handled gracefully by the JUGru team.

Russian conferences tend to focus on more hardcore topics. Just introduction talks receive the lowest scores. Russians prefer hardcore stuff! Yes, the talk should be hardcore, with a lot of deep dives, algorithms and case studies. If you can describe, for example, why your JVM consumes few bytes (or gigabytes) more than expected, and you know what experimental flag to put in the JVM params to stop it from doing this, describing in implementation details why this actually happens – this will be a cool talk! You may say, oh, isn’t it kinda JVMLS? Not exactly, dissecting Spring Boot or some Micronaut or Microprofile stuff is the expected topic. Not just knowing that the framework/technology can do this or that, but how actually it does it, and what are the corner cases causing unexpected bugs.

Yes, hardcore is highly tolerated! Why am I saying this? Actually I know this from the source. This year I had the honor and privilege to be invited as a member of the program committee. We had a wonderful team of eight – Gleb Smirnov, Victor Polischuk, Andrey Kogun, Oleg Anastasiev, Vladimir Sitnikov, Ivan Krylov, myself and first Valentina then Daria, to select the best possible talks for this conference. So, we were able to preview all the submissions, make rehearsals, make corrections in the talks, sometimes even redo the talks from scratch. Yes, you’ve got me right. On this conference (or actually on all JUGru conferences) the committee actively works with all the submissions and the speakers themselves. If you submit your talk to Joker – be prepared, that in few days someone from the committee will contact you and ask you for a rehearsal.

Many foreign developers  find this weird. They usually say: “Hey, hey man, I gave my talks at JavaOne, Devoxx etc. I had my rooms packed. Why should I do a rehearsal?”. But at the end of the day, those who accepted to rehearse usually say: “Damn, that was so much useful! And the feedback you gave me is so valuable! And that was totally for free!”.

As a result – the content is very strong and nicely prepared!

This is one of the key aspects that makes this conference kind of unique – a very intense content preparation. Usually the committee starts its work half a year before the conference, and active rehearsals are made until almost the last day before the conference.

By the way, there was even special time slot for direct interaction with the program committee.

Image may contain: one or more people, people sitting and text

Another thing I’ve seen only on Joker are the discussion zones. Every speaker, after giving his talk, is usually invited to answer questions about his talk or continue the discussion. This usually lasts for an hour.

Image may contain: 2 people, people standing

Image may contain: 2 people, people standing

In case of Dr. Venkat Subramaniam and Josh Long those discussion zones have lasted up to three hours. People had so many questions, and they both were answering them all that time!

This year’s conference continues its growth not only in terms of quantity of attendees, but also in terms of activities. There were two additional stages set in the expo area, so that the companies a the booths are able to present some quickes at the breaks.

The booths were also full cool stuff.

Image may contain: 5 people, people on stage

Image may contain: 1 person, crowd and indoor

Btw,  unlike other conferences, it’s not easy to win a prize at these booths. To do this, you have to solve several weird programming problems, most of which are like puzzlers.

Image may contain: 6 people, people smiling

There were also so called experts areas set, where every attendee was able to ask the strangest questions  about certain technology to the coolest programmers and solve their concrete issue! .. Or ask them to sign a book!

Image may contain: 7 people, people sitting

Everything was done to keep everybody busy till the late night (literally) the day one ended up with several cool BoFs. Together with Shelaev, Pangin and Chuyko we have hosted one of them regarding moving to Java 11.. And it was pretty cool! We had a very good discussion, with a lot of interaction, … and we were forcibly stopped, since this could have run all night long! I’m not totally sure whether the Java 11 was considered as a game changer, but one day we will have to migrate to it. The main discussion about it was, as expected, should we pay starting from now???

Image may contain: one or more people, shoes and crowd

Image may contain: 11 people, people sitting, crowd and outdoor

The activities at the conference hadn’t been strictly about knowledge but fun too, like a big exhibition of retro computers and games everyone could try playing.

As always the greatest part on each conference is meeting great people! I’m definitely happy I could meet Sebastien Blanc.

So much great to meet Gerrit Grunwald! I think the last time we have met was in SFO in 2015!

Together with the coolest Tagir Valeev watching Andrey Pangin’s talk.

With the so cool JBaruch (as a JFrog)!

It was great to meet with Ivan Uglyanslki from Novosibirsk!

A great honor for we was to meet in person Robert Scholte – one of the maven creators! It was also great to discuss the future of maven with him!

And we all had a lot of fun!

I liked a lot talking to John McClean not only about Functional programming but about Irish music as well.

https://twitter.com/DataDuke/status/1053722000223596549

This is the most OMG picture I’ve ever taken:

It was very interesting to talk with foreign speakers not just about the technology, but also about Russia. The most of the speakers are for the first time in the country, and it is very delightful to hear that they like the town of St. Petersburg a lot! Some of them have said: “They show us different thing on the TV..”

And by the way (yes, yet another by the way), on this conference I was not only part of the committee, but also a speaker. I gave a talk about Microprofile.io based on the tutorial we have done together with Ivan St. Ivanov from our BGJUG. My session was scheduled as last of the day one.  Surprisingly the room for 700 people was almost packed! Never thought so many people would like to dedicate their time on Friday evening for the ” bloody enterprise”.

Image may contain: 1 person, eyeglasses

I would like to say huge thanks everybody for coming! I hope this will be useful for your next projects! I liked the phrase several people have said – “Oh, this microprofile is like the light in the tunnel for the enterprise! This is great! It is so cool the technology is evolving so fast! And the community is there to help!”

At the end of the second day, as a final nontechnical keynote we all have listened to a very both interesting and strange talk about people’s digital mental health by famous in Russia Dr. Kurpatov.

Image may contain: 1 person

Actually there were a lot of take-aways for me from this talk. I still keep training my personal multithreading, but at the same time I train the concentration on a particular important task I have to finish on time with great responsibility.

And the last but lot least thing I should mention – just before the conference, the previous day the world’s greatest java speaker Dr. Venkat Subramaniam gave  his wonderful two (technically almost three) hours jug session. I was very happy to meet him after he came to jPrime to Bulgaria earlier this year. It was absolutely great to have his book signed for me! I’m feeling blessed now!

fbt

As expected, it was fully packed on this event!

Just to mention that this event took place at the Oracle office in St. Petersburg. Like every other building there it looks like a palace!

Image result for келлерман центр

 

So, Joker was great! As always great! Getting more and more great!

Thanks Andrey!

Thank you Alexey!

And thanks to the team! It was huge honor and pleasure to be part of this event! Hope to see you next year!

Image may contain: one or more people and crowd

Cheers!

And St. Petersburg is just amazing in autumn…

Image may contain: tree, outdoor and nature

See you soon, beautiful home!

Image may contain: sky, cloud and outdoor

Trip Report: JavaZone 2018 🇳🇴

Hmm, too few posts. I definitely have to change this. In my defence I’ll say, that only for this summer I’ve visited 12 countries. But you will argue, that for example Josh Long (my hero) made 12 countries only for this week, and he still has written several blog posts for this time. And you a right, I’m too lazy, I have to post more often!

Finally I’m in the local Starbucks, my cappuccino is ready, looks like it’s a perfect time to remember one of the greatest adventures of this year so far – JavaZone 2018!

When earlier this year, in May, I have received this email telling me that my talk “Java and the GPU: unlock the massive performance” was accepted for this year’s edition of JavaZone in Oslo, Norway, I literally jumped out of mu chair shouting out “Yes!!!”.

Visiting this conference was definitely one of my dreams, I’ve heard so many good words about it! Now finally this dream came true. Huge thanks to the committee for accepting my talk!

Finally September has arrived, I’ve landed in Oslo and literally fell in love with Norway from the first site!

An express train brought me from the airport directly to the Oslo central station for only 19 minutes. You may ask – so what? Actually the airport is about ~60 km away from the city and we were cruising with more 220 km/h. And those trains are scheduled to make this route every 10 min. This so cool!

For this conf choosing the train was the best choice, as the venue – Spectrum arena is just next to the central station. The hotel was there as well. So we were perfectly located.

Oslo welcomed us with a grey rainy weather

But just 20 min later it was beautiful and sunny, like in every northern town

In the evening we were invited to the speakers dinner that took place in a beautifully located restaurant with some stunning views of Oslo!

Oh, thats Chris Thalinger also making some photos of this wonderful sunset. By the way it’s raining.

Definitely a wonderful place to relax before the conference. We stayed there until late.

The next day was the first day of the conference. The first thing I saw was the looooong queue of the attendees.

The good (or may be the bad) part was that my talk was scheduled on for the second day. So the first day I had a chance to explore a little bit.

The conference organisation, or I may even say “architecture” is totally different from all other conferences I have attended. The venue is a huge arena, where big concerts take place. There is a big central area where you can find a lot of software company’s booths.

 

Just take a look how big is it and how many people are in!

The conference kick-off was lovely with some guitar players

sdr

The coolest part is that practically all the booth serve their own food all day long! Yes, yes.. you can have food all the time, all day long.. all two days! There was only one major problem for me – I couldn’t taste it all! I haven’t had enough capacity! Definitely OMG.

But not only food, but tons of other cool activities

One of the unique features of JavaZone are the 8 parallel tracks. Yep, 8! That’s a lot! The rooms are themselves not very big, but that makes the cozy.

That’s me attending Vlad Mihalcea’s great talk.

And like every conference the main reward is actually meet and talk to people! Hey, that’s Chris (..and Doug)!

My good friends Simon, Simon, Phillip and my new friend Jennifer

Finally could meet Sharat Chander in person!

Awesome hardcore JVM company of Doug, Volker and Steve

The discussions we had were really useful to me!

At the end of the day we had a wonderful hangout with David, Vincent and Matthew

Then actually came the funny part. My talk was scheduled for 9.00 the next morning. I was sincerely wondering who will ever be interested in GPUs and massive parallel computation so early in the morning? I was a bit nervious wen my talk was approaching.

But I was ready!

So I was expecting a maximum audience of 3 people to show up. What was my surprise when I found my room fully packed!

Oh My God! Absolutely unexpected!

I sincerely want to thank everybody that came. I hope the talk useful and fun to you!

By the way, it became available just few hours later in vimeo! Cool organisation at JavaZone!

When I was done with my talk I took the chance to hang around the beautiful city of Oslo!

Definitely a beautiful capital!

JavaZone 2018 was a great new experience for me! I’ve seen a cool organisation, met great friends and made great ones!

I want to say huge thanks to Rafael, Rustam, Mark and all the team for having me and making this conf a blast!

At the end as always my best five IMHO sessions of the conf from those I was able to see myself live:

Now I’m on may way watching the other talks I’ve missed (and those I’m able to understand)! They are just great!!!

So good bye Oslo! Thank you for being awesome! Hope to see you again!

 

 

Trip report: Devoxx 2017 🇧🇪

I’ve watched all of the published ~180 videos from this year’s Devoxx Belgium. Not all of them till the end, but it was still pretty hard. Also, it’s great nice that the videos are published on the very next day.

This is my first trip report. I’ve never done any of this before, But I think now is a good time to start. And there is a nice reason for this! I had the chance to speak at Devoxx 2017!

Disclaimer: There will be a lot of Me, Myself and I in this post. Its not much technical. It’s just like sharing my own emotions. …I’ll call it a “smoothy post”. If you want to get straight down to my recommended talks (my post-event playlist!) skip to the end section.

Here I’d like to encourage you to attend this type of event, and your employers to support these initiatives. These events are great fuel for personal growth!

All the conferences…

I think the best introduction for this was done in the previous post, so I’ll just copy and pasted it below:

This year was quite a DE(VOXX)ED for me! First I had a chance to speak in wonderful Romania, then beautiful Vienna, after that amazing Lugano, then the loveliest Krakow, finally at the huge Antwerp event! In between I also gave some talks in my home towns Sofia –Java2Days and St. Petersburg – Joker! Let’s not forget that I was in the dreamteam of 5 to organize and run the coolest jPrime conf!

I’ve had quite an intense year!!! Each of these conferences deserves it’s own separate trip report. All of them were just wonderful!

However, I’ve focused on this event because, well, being selected as a speaker at Devoxx Belgium is quite an honоr! And at least twice as honorable to have two sessions!

Why Devoxx Belgium is special?

This is my third time to the city of Antwerpen, but first time to Devoxx. I believe that every developer must go there at least once. Actually, even better would be to go every year! Just because everybody is there, almost all of the Java influencers! Not only can you just listen to the talks, but you can literally talk to them directly. This is what makes this conference truly unique, especially for Europe!

(Well I haven’t been to JavaZone yet. People say it has comparable by attendees count. I hope one day I will be able to go there as well.)

Unfortunately I was not able to be all the five days there, so I’ve missed all the Deep Dive sessions. I was only able to make the three last days, but it was still great!

The funny thing is that to get to Antwerpen, Belgium, the easiest way for me was to make it via Eindhoven, Netherlands. It is only a one hour drive with a car from Antwerpen, and Ryanair flies there.

The event takes place in Kinepolis.

As I came to the venue, I as a speaker I have received a very special gift:

My first impression was that Belgium is not so much to the north for this kind of hats. This looks more like Russian then Belgian! But after spending some time in Antwerp and I have realized that this was actually the best gift for this time of the year! It kept me dry and warm. So thank you very much!

And it’s we’re talking about hats, they were quite trendy at this conference!

(Baruch Sadogursky, Alexey Shipilev, Oleg Shelaev)

Since I came Wednesday afternoon, this day I could not attend any session, just because all of my good friends were there in the lobby.

I just could not stop myself from chatting and greeting everybody!

I was so happy to meet my amazing friend Dr. Venkat Subramaniam and great Kirk Pepperdine!

My dearest friend Roberto!

Edson Yanaga and Peter Palaga!

And of course Sebastian Blanc!!!

(Yes it’s blurry, it was made in the end of the day when everybody was tired)

Meeting people is definitely the coolest part of every conference!

I could have a very interesting discussion with Chris Thalinger about project Sumatra and Johan Vos about Gluon! Chat with Davide Delabassée, meet again with Matt Raible, have some shawarma with Rafael Winterhalter.

These guys are awesome!

By the way at the end of the day I had the chance to attend this speakers BOF by Hubert Sablonnière.

Hubert always hosts very useful discussions about how to speak and perform well at conferences. I have attended first such discussion in Morocco and I liked it a lot!

Day one ended in a very Belgian way:

Day two

Day two (or technically day four) was the day I gave both of my talks. But before that, I was honored to be interviewed by amazing Yolande Poirier About my talk “Java and the GPU”.

It was also a great pleasure to chat with wonderful Katharine Beaumont, with whom we’ve met many times through all of the year on different Voxxed/Devoxx events.

To tell you the truth I liked the venue! In many ways cinemas are great speakers’ perspective: Huge movie screen, plus very comfortable for attendees!

Is a disabled in a wheelchair was always easy for me to find a convenient place as an attendee.

From the organisers’ perspective I know that there are some issues with cinemas, but still it was ok!

Finally it was my turn to speak! The first session was a bit strange for me. It was not exactly technical, it was more social. It was named “Disabled > work > enabled”. I’m truly happy that the organisers gave a chance to me to make this quickie. In those 15 minutes I tried to share my experience, and how it helped me as a disabled to find my place in this industry. I’ve also try to convince companies to hire more remote workers thus equalizing the chances of disabled people to get a good job.

Video can be found here:

My  second talk was “Java on GPU”.

But just before that, quite accidentally I was introduced to Brian Goetz himself by James Weaver. I was really happy! Its a pity I had to prepare for my talk and had to leave the conversation. My deepest respect for both of them!

I knew from the beginning that my talk about the GPU is not a hype talk. So I didn’t expect much people to come. Still I was quite happy that the hall was almost full!

sdr

(This is 15 minutes before the talk)

I must admit that I felt so nice as the demo worked. Since I was using the Amazon cloud, I wasn’t quite sure that the demo gods will support me, but it worked!

The video is available here:

By the way we have shared some of the Bulgarian Java User Group T-shirts in this event for free!!

It was an amazing experience! I want to thank everybody who attended this session I sincerely hope you found something new for you! I had a lot of questions and discussions after the session. Although the scope of the technology is quite limited, if the task is suitable, some huge benefits can be achieved. I’ve tried to demonstrate this. And GPUs can be easily used in the Java world.

After getting done get I’ve got this wonderful feeling of relief! That was a good time to hang around!

And suddenly whom do I see! Josh!! My old buddy Josh Long! OMG!! I must admit he was one of the people who inspired me to try to speak at conferences.

Not only Josh! Brother Mark Heckler is also here!

But thats not all! I’ve met Stephen Chin! I’ve been watching his night hacking series since the very beginning! And now I’ve met him!

At the end of the day there was a special edition of the Russian podcast Razbor Poletov.

We had a live emission together with Baruch Sadogursky, Viktor Gamov, Alexey Shipilev, Alex Borisov, Andrey Cheptsov and Mykyta Protsenoko.

http://razbor-poletov.com/2017/11/episode-144.html (in Russian)

It was a pleasure for me as a regular listener to be part of it this time.

Day three

Day three (or technically day five), was a short day. Unfortunately only half day was allocated for the final sessions of the event. So it was wonderful just to attend the talks. Still it was a tough choice – I wanted to attend all of the sessions! But it all ended up with the wonderful talks by Stuart Marks, Heinz Kabutz and Brian Goetz.

It was great! Definitely a must attend event!

After the conference…

As we had some time and our return flight was scheduled for the next day, we’ve decided to make a small ride to Gent. Absolutely lovely and very beautiful town!

The technical side

Ok, this was the “emotional” part of the event. Now some technical thoughts.

This Devoxx actually represented all of the modern trends in Java (and all around Java) world:

  • Java 9 and modularity;
  • Java Enterprise;
  • Spring and all around Spring;
  • Kotlin;
  • Machine learning and AI;
  • Some Devops/Containers/Clouds;
  • Microservices.
  • Hardcore stuff

As I’ve mentioned above, I’ve watched about ~180 videos of the talks I could not attend. So I’ve made my own short list of the talks I liked the most, including those I’ve seen there myself:

Once again!

It was a truly great experience and a lot of run! Special thanks for Stephen and the team for having me!

and special thanks to Ivan Ivanov, Vlado Pavlov  and the Bulgarian guys/gals for the full time support!

And as member of The Gang of Five which stands behind the jPrime conference, I’ll try share the experience I’ve gained with the Bulgarian Java Community and inside my Company.

I’ll try to make some more posts.. if my talks are accepted elsewhere 🙂

Java as a technology glue, or how to use GPU from JavaScript

Ah! It’s been a while since I’ve posted the last time!

But this year was quite a DE(VOXX)ED for me! First I had a chance to speak in wonderful Romania, then beautiful Vienna, after that amazing Lugano, then the loveliest Krakow, finally at the huge Antwerp event! In between I also gave some talks in my home towns Sofia –Java2Days and St. Petersburg – Joker! Let’s not forget that I was in the dreamteam of 5 to organize and run the coolest jPrime conf!

Quite an intense year!!!

So finally this weekend I had some time just to play. Of course play with coding!

As may be some of you saw, I’m really interested in the Nashorn engine to run JavaScript on JVM. I gave once some talks about it!

But not only this bothers me! For several years I’m interested in General Purpose computations on Video Cards (GPGPU)! I even gave some introductory talks on how to use GPU and Java together.

On Devoxx in English:

https://www.youtube.com/watch?v=BjdYRtL6qjg

And on Joker in Russian will be hopefully available soon 🙂

But! What will happen if actually unite these two my passions? How to run some code on the GPU but submitted from.. JavaScript!!!

You will say just use WebCL! But, isn’t it a little bit not ready yet? And as far as I know it is not exactly a full binding to OpenCL but mainly browser oriented stuff. Please correct me if I’m wrong. I’ve even played with some experimental drafts.

What if I want to utilize the full control of our computations on GPU through JS and make it very dynamic?

Yes, yes!! Nashorn is here to help us! And yes, we have the full power of the available bindings like those provided by JOCL!

So let’s do it! The usual example with vector add will be just cool enough!

That’s the JavaScript code:

I just put it all in jscl.js file.

As you in the beginning I’ve added some type definition shortcuts just to make code look more readable.

To run it in the console I just put:

JJS is available by default if you have minimum Java 8 installed.

The JOCL jar you can just get from their site.

And what we have (on my Mac):

Isn’t this lovely!!

Funny fact that is that because of the memory latency it about 700 ms no matter if I make 1k computations or 100m of them 🙂

Still, this may be good example of how Java/JVM can be a kind of a technology glue. Having in mind that there are more than 40 languages running on JVM, all of them can benefit from the de facto standard libraries already available for Java.

This is so much cool!! Have Fun!