Friday, May 20, 2016

Spring Core 4.2 certification

I got my first certification today.  I have not been a big believer in these, but this is what my awesome employer was paying for this year so I took it.

I took the class first week in April and took the test today (5/20/2016).

Java configuration was a big part of this.  It seems like a big complaint people have had about Spring since the early years was the amount of XML needed to configure dependency injection.  The SpringSource/Pivotal people have been working for years to reduce the need for XML, first with annotations, then more recently with Java configuration.  I was fine with the XML and never really got on board with Java configuration, until now.  After learning this new style, well, now I can do it, but I'm still feeling lukewarm about it.  I feel like the motivation for this was more to silence the critics than to actually make the framework better.  I managed to struggle through a full conversion of a web flow application I wrote 2 1/2 years ago.  It's not quite a one-to-one mapping converting XML to Java as things are organized a little differently, and there are still a few things that aren't 100% comfortable to do in Java.

The MVC stuff was pretty familiar to me.

The class devoted quite a bit of time to RESTful web services.  The conventional wisdom in the Spring world is you could use JAX-RS but it's overkill, just implement REST services using MVC @RequestMapping.  I saw it done this way at some NFJS presentation a few years ago and since then they have added a bit more support (@RESTController, REST template).

AOP is a feature of Spring I have not really found much occasion to use, so this was something I needed to brush up on.

Some non-core topics covered in the class and the exam were Spring Data, Spring Security, Spring Boot and Spring Cloud.

I understand the focus on Spring Boot as this is quickly becoming the default way to work in Spring.  All the 'Getting Started' exercises are now written for Spring Boot and most of the labs for this class were also written as a @SpringBootApplication 'main' program.

I guess they chose to make Spring Security part of this because it is pretty much indispensable for doing any kind of real-world web development.  It has been around for a while, but my first exposure to this was in Spring Boot in Action last year, so this was a good refresher about 6 months later.

Spring Data simplifies the task of working with relational and NoSQL database so much, once you have started using it you will never go back.  In fact I questioned a little bit that they were spending time on JdbcTemplate but I guess it is part of Spring Core.  JPA is also covered.

Spring Cloud was the most 'out there' topic covered.  I have played around with this a little but some of the other people in the class were totally lost.

Generally I would say this was pretty hard.  The exam focuses on a lot of nit-picky details that you might not necessarily know even if you were working in Spring every day.  Before the class I was thinking 'could I schedule the exam on the last day of the class', but that would have been a disaster.  I spent about 6 weeks re-reading the 900+ page presentation from start to finish, experimenting with changes to my own code, and finally just re-reading selected parts of the reference documentation.  Think memorize-and-regurgitate.

There were about 5 people in the class, so, reasonable class size.  There was one guy who did not even have any Java experience who was slowing things down, and we were running behind right up until the end, but the stuff we didn't get to was not that important anyway (JMS, who uses that any more? and JMX).

The labs were just right for me.  I had to think but they weren't overwhelming or anything and I was mostly able to finish them during the allotted time or at least on the same day after class.

The supported platforms for the class are Windows and OSX.  In particular you do need one of these for the video chat for the online class.  I went to all the trouble of setting everything up in Windows 8.1 but afterwards was able to get Spring Tool Suite and the exercises working in Linux (my preferred environment).

One thing that confused people is the USB drive with the class materials comes with an ancient (3.6.4) version of STS.  That was about 16 months out of date at the time of the class.  So people were getting popups asking did they want to update?  Updating didn't seem to hurt anything, neither did simply importing all the exercises into an up to date STS version.  This was a bit troubling given the emphasis on Spring Boot since the recent STS versions have added some Spring Boot support that is not available in the older version.

In order to take the test, you must first take the (expensive!) class.  Taking the class entitles you to a voucher to take the test one time for free, after that it is $150.  Getting the voucher takes 2-3 weeks.  I can't help feeling they are being greedy here not allowing people to just come in off the street and take the test.  The instructor told us 'if you master the material in the lecture notes and the exercises, you will be able to pass the test', which I would agree with.  There were no surprises or anything I thought was unfair in the exam.

The test is fairly high-security.  I had to put my phone, watch, wallet and also empty my pockets(!) into a locker.  You need to sign a statement that you won't reveal the test contents to anyone (I hope I'm being sufficiently vague here, I could really tell you a lot more, but please don't ask).  It is 50 multiple-choice questions and the 90 minutes provided are really plenty to get through this.  I went through all the questions and then carefully went through them all again and finished in about 45 minutes.

As far as Spring itself, I'm still feeling very upbeat about this framework.  The future looks bright for Spring IMO.

It's a relief to finally finish and I'm looking forward to spending at least a couple of days not eating, breathing and sleeping Spring during every spare moment.

Thursday, December 31, 2015

Spring Cloud, Cloud Foundry

I returned to part 6 and part 7 of Building Cloud Native Apps with Spring with the idea of deploying the app into my local Cloud Foundry instance instead of IBM Bluemix.

I have to say that once you have got through the ordeal of setting up Cloud Foundry locally, it is a lot less trouble to work with than Bluemix.  I skipped over gobs of instructions about checking things into github, writing little shell scripts and navigating around doing things in the Bluemix web GUI.

All I needed to do to get this working was to register Eureka as a CF service:
cf cups ocr-eureka -p '{"uri": "http://ocr-eureka.bosh-lite.com/eureka/"}'
 and then make the changes described to the application.yml files.

I had a problem with the Hystrix app.  It was giving me a big stack trace about Tomcat failing to start.  This turned out to be the error that was causing the problem:

    java.lang.NoSuchMethodError: javax.servlet.ServletContext.addServlet(Ljava/lang/String;Ljavax/servlet/Servlet;)Ljavax/servlet/ServletRegistration$Dynamic;

I found some discussion of this at Getting NoSuchMethodError: javax.servlet.ServletContext.addServlet in Spring Boot while running a Spring MVC application.  Checking the dependencies, I found that Turbine had a dependency on servlet-api 2.5.  I tried excluding that in the Hystrix POM:


and that fixed the problem.

Deploying an app into CF seems really slow.  It's doing some big downloads every time (Open Jdk JRE 1.8.0_65, Open JDK Like Memory Calculator 2.0.1_RELEASE, Spring Auto Reconfiguration 1.10.0_RELEASE).  I feel like it would be hard to work this way.  Wondering if there's a way to speed this up?

Wednesday, December 30, 2015

Setting up a local Cloud Foundry instance

My platform for all of this is Linux Mint 17.2 (rafaela).

It has been 2 or 3 years since I played around with Cloud Foundry.

The first thing I noticed is they have really raised the bar in terms of the effort required to bring up a local instance.  There used to be a thing called Micro Cloud Foundry where you just downloaded a VMware VM and you were good to go.

Today, that is gone... instead there is a whole build process to go through.  On the one hand, it is good that these tools and sources are available, but I can't help feeling like this is a fairly big hurdle for the casual developer who is trying to evaluate CF.

I mostly followed the BOSH-lite README starting here.

When you get to Deploy Cloud Foundry, there are two choices.  The first choice leads to Deploying Cloud Foundry using BOSH which I found to be a trail of tears with lots of manual steps and big, slow downloads.  In the end I was not able to get this to work.

The second choice, checking out cf-release from github and running bin/provision_cf from your checked out bosh-lite directory, did work for me and seemed to go a lot faster (relatively speaking... still have a fast network and hours to spare).  Inside of this shell script you will find some of the same steps the first method does manually, but all neatly packaged and tested.

This got me to the point where I had CF running in my Vagrant VirtualBox and I could run 'bosh vms' and see all the VMs up and running.

My next challenge was to get access to my shiny new CF instance.  Deploying Cloud Foundry using Bosh said to try
curl api.subdomain.domain/info
but of course api.subdomain.domain is not the literal value, just an example.

I found several places indicating that the correct value here should be api.10.244.0.34.xip.io.  I read up on xip.io a little, verified that my computer was resolving this name, but still couldn't get this to work.


Googling on, I found a guy who was having this exact problem and the solution that worked for him.  So, using api.bosh-lite.com I was able to access my local CF instance:


Having done all of this I was able to complete the remainder of the setup just following the documented steps with cf api, cf login, cf create-org, cf create-space, cf target... See Running Cloud Foundry Locally with BOSH Lite for example.

So, cool, sort of... I spent about a day on this and feel like I have just reached the starting line...

I configured the Eclipse integration and worked through Deploying to Cloud Foundry from STS.  Everything works.  I saw the 'Hello world'.  Ready to try this with a real app.

Here's a nice short presentation I found afterwards that sheds a little more light on Bosh: Why Must I Use Cloud Foundry's Bosh? I just Learned Chef/Puppet!  For when you want to customize your CF instance, and apparently it can do more than just manage CF.

Monday, December 28, 2015

Spring Cloud

Last month I watched SpringOne2GX 2015 replay: Getting Started with Spring Cloud.  OK presentation, but they rush through a lot of material quickly and at the end I just had a general impression of coolness but without much in the way of detailed knowledge of how to use it.

Working through Ryan Baxter's Building Cloud Native Apps with Spring (8 part series) has left me with a better understanding of Spring Cloud.  You could divide this roughly into 4 parts: doing the initial setup of the application, the Spring Cloud Netflix components (Eureka, Zuul, Feign, Hystrix, Turbine), deploying to IBM Bluemix, deploying to Docker.  These are mostly nice bite-sized chunks that you can get through in an hour or so, if you are familiar with the other infrastructure (e.g. if you are not learning and installing Docker for the first time).

At first I tried this with the latest Spring Boot version which was 1.3.1.  I had some problems with that but everything worked with 1.2.8.

I elected not to do parts 6 and 7 which involve the use of IBM Bluemix which I gather is based on Cloud Foundry.  This is not a free service although you can get a 30 day free trial.  No thanks.

Part 8 is about deploying into Docker.  I had been playing around with Docker earlier and had it mostly installed, so this proved to be a bit of a refresher and I learned a few new things too, such as Docker Compose.

Links to all of the blog posts: 1 2 3 4 5 6 7 8

Here is one more... this is sort of an introduction... why do things differently when working in the cloud, microservices architecture, 12-factor: Building Cloud Native Applications.


Sunday, November 29, 2015

What's new in Grails 3

SpringOne2GX presentation about what's new in Grails 3

This seems to have been a particularly good SpringOne2GX and a lot of the presentations are becoming available now.

There were several good presentations about Grails and my general impression is the demise of Grails was greatly exaggerated.

Grails has a new corporate sponsor, OCI.

Groovy Grails Tool Suite remains unsupported but Grails 3 Released: Installing Gradle and Groovy 2.4 Support in Eclipse/GGTS offers some tips for continuing to use GGTS with Grails 3.

Another interesting thing about this presentation is Graeme Rocher is using IntelliJ IDEA CE (community edition, i.e. the free version) to demo everything.  I've been using IDEA to debug Groovy scripts because just debugging a script in isolation doesn't seem to be very well supported in the Eclipse-based IDEs like GGTS.  But this is opening my eyes to the CE version having a lot of functionality and being a pretty useful tool.

I like the direction of taking advantage of existing infrastructure like Gradle as the build tool.

One downside of the many changes in 3.X is there is no direct upgrade path.  This seems like it is going to be a big hump to get over, especially for projects using a lot of Grails 2.X plugins (as we do at work).

Learning priorities

What I'm most interested in at the moment
  • Spring Boot/Cloud, generally getting back up to speed in Spring
  • Gradle
  • IntelliJ IDEA
  • TextMate
  • Cloud Foundry (free version running locally)
  • Docker
  • Jenkins, CI

Sunday, October 11, 2015

Java 8

Wow, have I really not posted anything since January?

I'm coming up to speed on Java 8.  I've been working in Groovy for like a year and a half so these concepts are not new, but the syntax is just different enough that I have to think about it.

Here is some code I wrote a while back.  It is a solution to a Cracking the Coding Interview problem to write a boolean method taking two strings as input and returning whether one string is a permutation of the other (same characters in a different order):


This is basically Java 6 the way we've been writing it for the last 10 years or so.

isPermutation stays the same so I'll just be showing changes to signature.

Use a Java 8 lambda and a stream to iterate through the String.  Note the use of String.chars() returning an IntStream which is where the stream comes from.  You'd think there's be a CharStream, but no, so I'm using a rather awkward conversion to get the int back to a char:


Not a big improvement so far... next I use the cool new Map.getOrDefault() to replace 7 lines of code with one:



That is starting to be some more expressive and maintainable code... finally there's nothing sacred about the signature being implemented as a Map<Character,Integer>, so let's change that to Map<Integer,Integer> which will make it possible to remove the awkward int to char conversion and make the lambda body an expression rather than a block: