Tuesday, October 11, 2011

Initializing your Grails Services

by Richard Vowles

In one of my current Grails projects I need to do what I would normally use @PostConstruct for, but am unable to as usually GORM has not completed its additional methods by the time it comes to use them. So the general recommendation is to do it in the bootstrap - a technique I generally do not like as it means you cannot make it a best practice easily - just include a dependency and its always done.

Ideally I think I'll need to turn this into a plugin, but I hate source code plugins enough to just include the Bootstrap at the moment.

So this goes in your Grails conf, and its a slight modification of the one you find on Google - it checks the scope of the bean, singleton ones only are initialized.

import org.codehaus.groovy.grails.commons.GrailsClass
import org.codehaus.groovy.grails.commons.GrailsClassUtils

class BootStrap {
  def grailsApplication

  def init = { servletContext ->
    grailsApplication.serviceClasses.each { GrailsClass gClass ->

      String scope = GrailsClassUtils.getStaticPropertyValue(gClass.clazz, "scope")

      if (!scope || scope == "singleton") {
        def serviceBean = grailsApplication.mainContext.getBean(gClass.propertyName)

        if (serviceBean.metaClass.respondsTo(serviceBean, 'grailsInit')) {
          serviceBean.grailsInit()
        }
      }
    }
  }

  def destroy = {
  }
}



Thursday, October 6, 2011

Grails and Maven - blue grails

by Richard Vowles

One of the things that has kept me away from Grails for a long time - even after spending a couple of years knee-deep in it has been the extremely poor support for a clean build and release.

The combination of Gant scripts and source-code plugin dependencies, the use of Ivy as a dependency manager, endless outstanding bugs and a tendency to just not understand why this was so important (I'm sure everyone had their list) led me to abandon using Grails or pushing Grails in any real way in my work life while working at Sky Television (NZ). I still used it in a side project, but not in any anger and long since left the developers discussion list.

As I prepared to take on a new job doing Grails development again, going back from an environment that focused on neat, tidy granular artifacts that were tested and released, wired cleanly with Spring and assembled with clarity and speed was something I didn't want to loose. I learnt a lot from the two guys I worked with in terms of the use of Spring, Maven and API design. I only hoped that Grails would be able to live up to it now it had moved on.

On jumping back into Grails I saw that essentially little had changed (even if it was about to with 2.0 and binary plugins). Application design still seemed to encourage big single projects where all controllers, domain objects, services and so forth were all in the one project, making it harder and harder to test, longer and longer to build and deploy. Knowledge of Spring by users was limited, consequences of Hibernate ignored, discipline around tagging and releasing artifacts almost non-existent. EDIT: I mean this in the context of the Grails community as a whole:

  • Spring encourages the use of interfaces. Grails encourages you to inject the service's actual class by its name (e.g. userService for com.bob.UserService) but by using a def you can mock it. Its Groovy, but its nasty.
  • Grail's finders ignore the consequences of the SQL generates and most developers appear to not look at the SQL Hibernate generates. Hibernate does a bad job with anything thats not basic, and createCriteria is a demon. Whether this is better or worse than any other usage of it I'm not sure.
  • Grails doesn't come with a "release" script - crazy in my opinion. The concept of clean, build, tag, checkout from tag in a different place, build is critical to knowing you have a reproducible clean build. Not having it is crazy and is an artifact of people who don't use Maven, or one of the many who use Maven who don't use properly.

So for the past few months I have been working with the University of Auckland and TEIQ to build a set of best practices around modular Grails development, using Maven in the sanest way possible (and it is sane, and nice, and clean). Sorting out the way we deal with the inevitable buggy plugins (including the Grails Maven Plugin), building composites that bundle together packages of artifacts that relate, standardising web services structures and looking always for opportunities to make things better and cleaner, faster and clearer, better tested and more robust. Its a great opportunity and I thank TEIQ and particularly the University for giving me the chance to make a difference. And great people - did I mention great people?

As part of this work, we are taking some of what we have learnt and pushing it out into open source - or probably more open documentation. To make the best use of what we have done, we really need to have the Grails plugins that we use available as Maven artifacts - and I can't see the Grails guys happy about us doing that. I'm going to document it here on my blog - to make sure I do it (document it that is) - I'd recommend taking what I write if it works for your team and putting it in your Wiki and augmenting it over time.

The first thing I'm putting out there which may be of some worth to people who come to Grails and consider using Maven is my set of scripts I use. Its growing - but it provides me with a great set of shortcuts to the commands I regularly use. Enjoy :-)

Wednesday, December 29, 2010

War against disinformation about Google

by Richard Vowles

Quyn Do posted an article entitled "War on the Google Giant: Engineers Defect, Then Rise Against".  The incredible absurdity of this post so astounded me that when @gianouts re-tweeted @darrylgman's tweet that this post was actually *interesting* I was flabbergasted.

To begin with, this person didn't seem to realize, with all evidence to the contrary, that using the free Gmail with targeted adverts would in fact target adverts based on their email.

And then they make the assertion that "our information gets sold to advertisers". Really? Where can I buy the service? It  targets your demographic, what you search for, what you are interested in and I buy those words - Google matches them up and serves ads based on them. Even the remotest amount of research would tell you this, so clearly not a clue here either.

And then Quyn talks about Disconnect - the tool for Google Chrome that blocks out cookies from various sites. Does Quyn not know that Disconnect was written to allow people to disconnect from Facebook peer sites? A little bit of searching (again) about Brian Kennish would have turned up Facebook Disconnect. It was so popular he left Google in a blaze of publicity and created Disconnect, a general purpose plugin for Chrome (when I last looked). Again, outstanding lack of insight or research on the topic.

And Adblock - adblock has existed for *eons*, it was a Firefox plugin for ever - this has *nothing whatsoever* to do with Google, what the hell is it even in the article for?

And finally about people leaving for Facebook - why, a completely different topic thrown in just so the heading vaguely matches? Seriously? People have been leaving for Facebook because they are willing to put something out and tweak it until it works, which is a different strategy than Google. They've had their pet projects cancelled and with their noses out of joint, have gone to Facebook. I'm sure there is more to it than that, people want a change of scenery, but what has it got to do with privacy at Google? Facebook if anything has a far, far worse track record than Google.

This post has to have been written by either (a) a person with an anti-Google agenda willing to bet people will be too stupid when reading it to realize what a appallingly badly written opinion piece it is or (b) someone who really is that stupid.

I'm betting on the first, there are a lot of anti-Googlers around at the moment.

Thursday, September 23, 2010

For my own sanity

by Richard Vowles

Oracle XE and EC2/EBS instances was not a fun time. Oracle being at fault here.

So I needed an XE instance and rather than downloading and installing a VM specifically for this particular test, I figured an easier way would just be to choose an Ubuntu VM AMI image and set it up there.

So some things to remember:

  • Make sure you use a 32bit i386 AMI (or it won't install)
  • When it starts up, you won't have enough swap to install XE, so add more
  • Make sure bc is installed (sudo apt-get install bc)
  • Follow the instructions for installing Oracle XE here and here

So the last bit which is really the difficult thing to find is that the listeners will kill you. When Oracle XE installs, it hard codes the machine name somewhere. So if you shut down and start up again, you get it failing the listener.

 

So you need to go into $ORACLE_HOME/network/admin and edit tnsnames.ora AND listener.ora and change the hostname from ip-whatever to localhost. But that isn't enough - Oracle itself will still screw up as it registers with the original name as installed each time - so you won't be able to connect to the listener, even though diagnostics imply it worked. So you need to look into the log (which is in $ORACLE_HOME/network/log) and you'll see something like this:

22-SEP-2010 20:05:55 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=ip-10-203-55-158)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0

That HOST=ip-10-203-55-158 - thats the domain name originally registered against your machine. Take that name and edit /etc/hosts (sudo vi /etc/hosts) and add it into localhost's config:

 

127.0.0.1 localhost ip-10-203-55-158

Then restart your Oracle XE

sudo /etc/init.d/oracle-xe restart

By the way, I'm using a script to tunnel to the box (so Oracle is never exposed to the internet)

 

#!/bin/sh
ssh -i KEYNAME.pem -L 8080:localhost:8080 -L 1521:localhost:1521   ubuntu@$1

 

This shows up as
21-SEP-2010 10:05:20 * (CONNECT_DATA=(SID=XE)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))) * (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=47502)) * establish * XE * 12505
TNS-12505: TNS:listener does not currently know of SID given in connect descriptor
failure when trying to use jdbc to connect using the typical url: jdbc:oracle:thin:@localhost:1521:XE when the IP address keeps changing.
(I added all that in for anyone using a search to find this page)

 

 

Saturday, June 26, 2010

When tests go brown

by Richard Vowles

So I'm at Citcon 2010 in Wellington - and its after a morning session around BDD and Fit style testing that I'm writing this. People in the discussion use all sorts of frameworks - Cucumber, WebRat, Concordion and of course myself using easyb.

One of the interesting discussions I had last night was with Nigel Charman - part of the impetus behind the recent changes in easyb that I have done around turning it into a parse/run (instead of just run/evaluate). Nigel posited that they needed precondition checks - a third state basically that said that this test doesn't actually meet the qualifications required to run. Now you could just fail here - but that doesn't actually tell you anything, normally a failing test implies incorrect code, but in this case the code may be correct, but the data is wrong - so this mornings discussion further clarified that typically preconditions are around data being wrong or systems being unavailable. And knowing that separate from a failing test is a useful state.

As it turns out, the latest version of Junit (4.8.1) has an assume style clause [LINK] which supports the concept, but still only has the red/green colours. What I'm more interested in is reporting on it.

What does this have to do with easyb? Well, easyb also doesn't have this concept - and recently an issue was filed requesting shoulds be added to the given and when clauses (e.g. given "account is in arrears", { account =  getAccount(1234); account.inArrears().shouldBe true }. I accepted the request but said it should be in a plugin as I don't think it fit with the use of should and the concept of a failure. Now I understand why I am unhappy about it being there, and particularly I understand the pain this person is actually having.

So perhaps its time to revisit this particular issue - should easyb support another state - perhaps "brown" whereby preconditions or assumptions about the state is not met. This should be reported on to allow for dealing with in another manner.  I'll take it to the dev team and see what they think.

Tuesday, June 15, 2010

Goodbye, Java Posse

by Richard Vowles

So I can pretty much say I have listened to all the episodes of the Java Posse - I came in a bit late in the peace - around 150, but I went back and downloaded them all and they entertained and informed me. But now its time to stop - and I had a lot more to say (thats what a blog is for right?), but really, Joe - you have spoiled it so badly it is no longer listenable.

Dick, Carl and Tor, thanks for the good times. Good luck to you - I hope you keep enough of your loyal fans to keep it interesting for the next five.

 

Thursday, June 10, 2010

Shaft me, I'm an iphone user

by Richard Vowles

Disclaimer: I believe the Cult of Apple has fractured, the Cult of Mac and the Cult of iPhone. There is an overlap, but many Cult of Mac people are deeply, deeply embarrassed by Steve Jobs.

So, why am I bothering posting this. I suppose its because I still can't believe that people can be so utterly stupid to consider using iPhones or even upgrading to that silicon turd, the iPhone 4. And I think I now understand what is behind the Jobs machine.

So, in his latest round of bizarre, Steve Jobs is banning pornography on the iPhone. Oh wait, no, he is "banning" pornography from iPhone Apps. Pornography will still be freely available from Safari, where most of the porn is anyway and so you can still see it on your iBone or iPad. Its not about his kids, even saying that is laughable. So its clearly not about pornography, per se - in reality, I don't think Steve has a problem even gonzo porn.

Consider common sense for a moment - there are a lot of other ways the iPhone team could prevent you from getting porn, parental locks on phones, categorizing iphone apps, getting Norton to get their fantastic (on Windows) Online Family product sorted out for Snow Leopard and available on iPhone/iPad among other things. But no. Its not about common sense. No, this faithful reader (yes, singular I'm sure is appropriate Mark) is not about porn, this along with all the other stuff (you can't show Ads on the phone if you also make a phone os, programming in Objective-C, and the list goes on) is simply about one thing.

iPhone/iPad users - Steve Jobs is using you for his personal pleasure in the most dubious way modern technology can provide him. Thats right, he knows he can make you bend over and shaft you again and again and you will take it and come back for more. You get drip fed features other phone vendors have had for years in hardware, and then other important liberties you simply wouldn't stand for having taken away from anyone anywhere else in software, and you take it. You beg for it. And Steve is clearly getting off on it, because you deserve it.  He knows it, every person who things you are a fool knows you deserve it.

The only iPhone worth having is a jailbroken one. Those things are actually pretty good!

Thats all, I'm sure I'll post again even if I say I won't so I won't say I won't.