Sunday 7 December 2014

Dragonmeet 2014

Yes, it's December, which must mean that it's Dragonmeet again. It's been moved to a new venue from Kensington Town Hall to the Ibis Hotel in Earls Court ("more room" according to one of the volunteers).


To me it seemed smaller, or more compact. There weren't many vendors there, but perhaps more producers, including a new card game called Stak Bots:


I bought an RPG that I've had my eye on for a while, which seems to be a bit different from the usual character based games:


Unfortunately, I didn't get a game so, on my way back, I stopped off at Covent Garden to do a little more shopping and saw the lights:


Wednesday 3 December 2014

Turning Japanese - 47 Ronin and Kick-Ass 2

Two films from my Amazon subscription. The first is the sequel to the popular Kiss-Ass. Bored with premature "retirement", David Lizewski a.k.a. Kick-Ass (Aaron Taylor-Johnson) and Mindy Macready a.k.a. Hit-Girl (Chloë Grace Moretz) join with other super-heroes while struggling with growing up and leading a normal life.


I must admit that I haven't read much of Mark Millar's work, in particular the Kick-Ass books, so I can't compare them to the original. The one book I have read, Wanted, was awful, and the film much better. The original Kick-Ass had a kind of naive violence, like Tom and Jerry, and the corresponding charm. This has the difficulty that the novelty has worn off, and the violence seems a little more serious and intense, as does the whole film. Jim Carrey (Colonel Stars and Stripes) plays the father figure that Nicolas Cage (Big Daddy) played in the first film, and the supporting cast is good enough, but it is an inferior sequel to a mediocre film.

The second film is 47 Ronin, based on a classic Japanese story. Kai (Keanu Reeves), a mixed-race woodsman in feudal Japan, is treated with suspicion and ill-disguised contempt by his master Lord Asano's (Tadanobu Asano) samurai retainers.


A visually stunning film, and worth watching for that alone, the cast, aside from Reeves (who isn't that bad, really), is excellent, headed by Hiroyuki Sanada as the lead samurai and the beautiful Ko Shibasaki as Kai's true love. Tadanobu Asano and Rinko Kikuchi are also suitably evil as Asano's nemesis and his sorceress.

It's problem, however, is that it adheres too closely to the original story for the Western audience (and is too conservative a film for the modern Japanese audience: Battle Royale is more typical) and yet is too Western for the Japanese audience, so it's no surprise (but a bit unfair) that it's the second most unsuccessful movie of all time, losing $20 million at the box office. You can imagine the effect on us if Hollywood decided to make a film about The Battle of Britain with Harrison Ford as Hugh Dowding, or The Dambusters with Nick Cage as Guy Gibson. Nah.. they wouldn't... would they?

Saturday 29 November 2014

Once Upon a Time in the East End - Wild Bill

Every so often, there's a new film on Film 4. Mostly I've seen them through other media, but Wild Bill was a new one and a little gem. Having served eight years for crimes he did commit, "Wild" Bill Hayward (Charlie Creed-Miles) returns to his East London home to try to reconcile with his estranged sons and lead a quiet life.


A kind of anti-revenge film, Creed-Miles is great as Bill, trying to avoid any trouble with his former associates, while dealing with the resentment of his eldest son Dean (Will Poulter) and keeping his youngest Jimmy (Sammy Williams) away from the villains. The supporting cast is top notch, with Olivia Williams as Bill's probation officer, Sean Pertwee as the cop who arrested him the first time and Andy Serkis as his even wilder former boss. However, it's Bill and his family who hold the attention until the final, inevitable, confrontation looms like a thundercloud. Very recommended.

...oh all right then. YES, there's a trailer out for the new Star Wars movie coming out next year. And, YES, it looks good. And, YES, it's got the Millenium Falcon in it. Go on then...


J.J. Abrams is at the helm and if Lucas is smart, he'll let him do what he wants: it didn't do Star Trek any harm.

Sunday 23 November 2014

It's The (Dead) Rozzers Part 2! R.I.P.D. and Non-Stop

Two from my Amazon film subscription. First the latest Liam Neeson film. Struggling alcoholic U.S. Air Marshal Bill Marks (Neeson) sets off on a trans-Atlantic flight, but is being sent mysterious messages threatening the safety of the passengers and crew:


With a ridiculous plot, bad pacing (there's are some very tedious moments) and small details that let the whole thing down (why would RAF Typhoons be anywhere near Iceland?), the only saving grace is the action scenes, special effects and the cast, although wasted. Better than nothing, but not much.

Marks might have been better off dead, which brings us to my next film, R.I.P.D. Having being shot and killed by his partner (Kevin Bacon), Boston Detective Nick Walker (Ryan Reynolds) is teamed with a former western lawman (Jeff Bridges) and tasked with returning "deadoes" back to the afterlife:


From a comic book of the same name, this is an enjoyable hybrid of Ghostbusters and Men in Black, let down only by Bridges trying to lampoon his own version of Rooster Cogburn. The effects are good and the supporting cast, especially Bacon, Mary-Louise Parker as their boss and Robert Knepper as their first suspect (much underused). Good fun and a decent pizza movie.

Wednesday 19 November 2014

Spring Boot and Spring Data

Continuing on from the previous article, I finally managed to get to Spring Data. In a way, this is just Spring JPA and looks like this:

@Configuration
@EnableAutoConfiguration
public class Application {

  public static void main(String[] args) {

    ConfigurableApplicationContext context = SpringApplication.run(Application.class);
    PersonRepository repository = context.getBean(PersonRepository.class);

    for (Person person : repository.findAll()) {
      System.out.println(person);
    }
    context.close();
  }
}
Although this looks similar to the Hibernate JPA previously, there are some significant changes. The first is the use of a Repository interface, PersonRepository. This has to descend from the Spring Data Repository interface, usually via another interface:

public interface PersonRepository extends CrudRepository<Person, Long> {
}
I’ve used CrudRepository, the most basic, and given it the class name of the POJO and the type of the unique identifier, which is a Long. Notice that you have to use the class equivalent of the primitive type. You don’t need to define anything else if you don’t want to; CrudRepository defines the basic functions as standard:

public interface CrudRepository<T extends Object, ID extends Serializable> extends Repository<T, ID> {
  public <S extends T> S save(S s);
  public <S extends T> Iterable<S> save(Iterable<S> itrbl);
  public T findOne(ID id);
  public boolean exists(ID id);
  public Iterable<T> findAll();
  public Iterable<T> findAll(Iterable<ID> itrbl);
  public long count();
  public void delete(ID id);
  public void delete(T t);
  public void delete(Iterable<? extends T> itrbl);
  public void deleteAll();
}
As before, the field mappings have to be put directly in the POJO using annotations. Something to remember is that with Spring JPA you have to make sure the column names are lower case.

Next you have to configure the connection properties. This goes in a file called “application.properties”, the default:

spring.datasource.url=jdbc:jtds:sqlserver://localhost:1433/A_DB
spring.datasource.username=aaron
spring.datasource.password=********
spring.datasource.driverClassName=net.sourceforge.jtds.jdbc.Driver
You may have noticed in the application definition is the use of the EnableAutoConfiguration annotation. This is from Spring Boot, which is our next subject.

Spring Boot

So far, behind the scenes, so to speak, we’ve been adding dependencies into the Maven POM file with some abandon, but, to get Spring Boot working, we have to remove them. Why use Spring Boot? I can’t really give you a straight answer, other than to say there are a lot fewer problems when using Spring Data. Take my word for it.

As described in the starting guide instruction on the Spring Boot web site, you have to add the following:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.1.8.RELEASE</version>
</parent>
… which goes in the project root. Next you want something to tell Spring Boot to pull in the Data JPA layer:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
… which goes in the dependencies. Clear everything else out of the dependencies: this will cause all kinds of errors in the code, but resist the temptation to fix this by pulling in the dependencies. You will regret it if you don’t. Do a build (or clean and build), you’ll find that new dependencies have been pulled in via the parent and you don’t have to define anything. This also sorts out any import errors.

The dependencies that do have to be put in are specific to this particular project and that is the JTDS driver for MS SQL Server:
<dependency>
  <groupId>net.sourceforge.jtds</groupId>
  <artifactId>jtds</artifactId>
  <version>1.2</version>
</dependency>
You will be surprised to find that all this works straight away with no other configuration.

Spring Boot Web Services

So far, we’ve just been playing with the data, outputting the results to the console. To get it to do something useful, we need to introduce web services, in the form of a REST interface. This is what Spring Boot is really used for and this introduces the idea of Micro Services.

Micro Services are an architectural concept that takes componentisation to a system level. A system is divided up into sub-systems, each of which is considered a system in its own right, with its own security, metrics etc., and even its own built-in web server. These components are connected together using REST web services, so the definitions of these interfaces become very important. The implementation of one sub-system, or Micro Service, is independent of others, providing the interfaces are adhered to, so you can have one service built using .Net and another in Java, yet another in Node.js and JavaScript. There are lots of technologies being introduced and maturing that support, take advantage of or are being taken advantage of by this concept, in particular Docker, for deployment, Spring Boot and Drop Wizard for Java development.

Now we’ll add a REST service to the previous data project. First, we remove the data code from the Application class:
  public static void main(String[] args) {
    SpringApplication.run(Application.class);
  }

Exactly as before, just without the data code. This has been moved to the web service class, MyController:

@RestController
public class PersonController {

  @Autowired
  private PersonRepository repository;

  @RequestMapping("/")
  public String index() {
    StringBuilder sb = new StringBuilder();
    sb.append("<!DOCTYPE html>").append("<html lang='en'>");
    sb.append("<head>").append("<meta charset='UTF-8'>");
    sb.append("<title>Something, something</title>").append("</head>");
    sb.append("<body>");
    sb.append("<table>");
    for (Person person : repository.findAll()) {
      sb.append("<tr>");
      sb.append("<td>").append(person.getId()).append("</td>");
      sb.append("<td>").append(person.getFirstName()).append("</td>");
      sb.append("<td>").append(person.getLastName()).append("</td>");
      sb.append("</tr>");
    }
    sb.append("</table>");

    sb.append("</body>");
    sb.append("</html>");
    return sb.toString();
  }
}

The class is designated a RestController, which tells Spring that it’s the class that handles http requests as REST requests. The RequestMapping annotation tells it which path to respond to, in this case the root. I’m responding with a string at this point and creating a simple web page as the payload.

Notice that the repository is automatically created by annotating the declaration with @Autowired.

The POM has also been added to with Spring Boot dependencies, spring-boot-starter-web and spring-boot-starter-jetty:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

The former seems to be mostly used to enable the web services, but also to prevent Tomcat being used. Instead it used Jetty, which is simpler. The only other thing needed is to tell Maven that this is a Boot application, rather than a Java one:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

That’s pretty much it. If you now run up the application, it will start Jetty on port 8080 and the response will be a web page with the Persons loaded from the database.

JSON

Instead of delivering an HTML page as the payload, we can deliver a JSON string. This is all built into Spring Boot and is just a case of altering the definition of the index function:

  @RequestMapping("/")
  public Person[] index() {
    List personList = new ArrayList();
    personList.addAll((Collection) repository.findAll());
    return personList.toArray(new Person[0]);
  }

findAll returns an Iterable, so this needs to be converted to an array via ArrayList. The array of JobType objects is coded to JSON and sent as the response automatically.

Friday 14 November 2014

Scaling Business Application Development with Play and Scala

Yesterday evening, I went to see a presentation by Peter Hilton at Skills Matter on using Scala and Play for small-scale development.


In an affable and down-to-earth manner, Peter went through two case studies that his company had handled, both small scale web developments in Holland, where he is based. This is somewhat unusual for Scala in particular and any JVM-based language in general: normally much "lighter" technologies, such as ASP.Net or PHP, are used.

He highlighted the use of a stack of technologies: Play, Scala, Slick (for database connectivity and access), PostgreSQL and MySQL for the database and Bootstrap for the website layout. In particular, he went through the use of Slick, which he recommended, as it has an unusual, more SQL, feel compared to other ORM's.

He also emphasised the speed of development and that the amount of code needed was much smaller than previous applications he'd developed: the first application was ~4000 lines and the second ~2000, which are both a lot smaller than the applications I've worked on. It was interesting to see how his team short-cutted: using social media for security (why not?) and Excel spreadsheet integration for record maintenance.

Overall, it was a good presentation about using Scala in a different way.

Sunday 9 November 2014

It's The Rozzers! Welcome to the Punch, Robocop and Gotham

I've managed to watch some DVD's recently from my Amazon subscription (what used to be LoveFilm). First up is cops-and-robbers drama, Welcome to the Punch.

After being shot by career robber Jacob Sternwood (Mark Strong), detective Max Lewinsky (James McAvoy) seizes the opportunity for revenge when the formers son is found severely wounded.


Although it has it's moments, it's a little too domestic and small scale to impress as a good crime thriller. Strong is good enough to carry the role, but McAvoy has never impressed me that much and he's not much better in this. The supporting cast is pretty good, with Johnny Harris as the main villain and Peter Mullan as Sternwood's old partner, but the plot is a little tedious and uninspired. As I've said before with The Sweeney, the Americans do it better: they've got more money.

They're not always inspired or inspiring, though, and that brings us to Robocop (the remake). After being assassinated and left for dead, detective Alex Murphy (Joel Kinneman) is transformed by a large multinational into a new kind of policeman:


I don't really have the heart to slag it off as much as others have done. True, it does lack the novelty of the original, but then that's inevitable, given our world of drone strikes and cybercrime. The production is good and the supporting cast is excellent (Gary Oldman and Samuel L. Jackson), but Michael Keaton doesn't really impress as a villain. Perhaps that's the problem: Omnicorp isn't evil enough. Plus the original had a kind of grizzly humour, which is lacking in the remake. Clarence Bodikker (Kurtwood Smith), where are you when the film industry needs you?

Maybe it's in television? A new series has started in the 'States based on the DC Batman characters.

Jim Gordon (Ben McKenzie) joins the Gotham Police as a detective and is immediately struggling not only with his conscience, but survival itself:


It looks promising, with nods to the original characters such as The Penguin and The Riddler, but whether it gets too weird and/or camp remains to be seen. A good mark in it's favour is Donal Logue as Gordon's partner. His series, Terriers, was one of the best U.S. series ever made.


Apparently, it's available on Netflix.

Monday 3 November 2014

Database Integration with Java

The other week I saw a presentation on InfoQ regarding Spring Data, so I thought I’d have a look at how Java connects to databases.

JDBC

The most basic way of connecting to a database in Java is to use JDBC (Java Database Connectivity). This involves creating suitable objects, establishing a connection to the database, executing a SQL statement and parsing the results:

try {
      Connection connection = null;
      ResultSet resultset = null;
      try {
        Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
        connection = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/A_DB",
                                                 "aaron",
                                                 "********");
        Statement statement = connection.createStatement();
        resultset = statement.executeQuery("SELECT "
                                           + "firstName, "
                                           + "lastName, "
                                           + "gender "
                                           + "FROM person");
        Person person;
        while (resultset.next()) {
          person = new Person();
          person.setFirstName(resultset.getString("firstName"));
          person.setLastName(resultset.getString("lastName"));
          person.setGender(resultset.getString("gender"));
          System.out.println(person);
        }

      } finally {
        if (resultset != null) {
          resultset.close();
        }
        if (connection != null) {
          connection.close();
        }
      }
    } catch (ClassNotFoundException ex) {
      Logger.getLogger(ConnectingUsingJDBC.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      Logger.getLogger(ConnectingUsingJDBC.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
      Logger.getLogger(ConnectingUsingJDBC.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
      Logger.getLogger(ConnectingUsingJDBC.class.getName()).log(Level.SEVERE, null, ex);
    }

Legacy systems contain a lot of code just like this, or variations of. As you can see, there’s a lot of “boilerplate” code: connecting to the database; closing the connections and cleaning up afterwards; mapping the fields in the recordset to the attributes of the class, etc. However, it is standard with the JDK, which means you don’t need any third part library. You can also remove some of the boilerplate using the latest features such as multiple catches and try-with-resources:

try {
      Connection connection = null;
      ResultSet resultset = null
      Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
      try(connection = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/A_DB",
                                                 "aaron",
                                                 "********");
        Statement statement = connection.createStatement();
        resultset = statement.executeQuery("SELECT "
                                           + "firstName, "
                                           + "lastName, "
                                           + "gender "
                                           + "FROM person")){
        Person person;
        while (resultset.next()) {
          person = new Person();
          person.setFirstName(resultset.getString("firstName"));
          person.setLastName(resultset.getString("lastName"));
          person.setGender(resultset.getString("gender"));
          System.out.println(person);
        }

      } finally {
        if (resultset != null) {
          resultset.close();
        }
        if (connection != null) {
          connection.close();
        }
      }
    } catch (InstantiationException | IllegalAccessException | SQLException | ClassNotFoundException ex) {
      Logger.getLogger(ConnectingUsingJDBC.class.getName()).log(Level.SEVERE, null, ex);
    }

Try-with-resources saves having to tidy up as it closes the resources for you. The multiple catch gain saves you some lines, but only if you do the same thing for every exception. This is now 34 lines as opposed to 53, but you still get the feeling that there’s an easier way to do this. And there is…

Hibernate

Look up the word “Object Relational Mapping” on Wikipedia and you get this:

“Object-relational mapping (ORM) is a programming technique for converting data between incompatible type systems in object-oriented programming languages. This creates, in effect, a "virtual object database" that can be used from within the programming language.”

In the list of ORM software for Java you’ll find a reference to Hibernate.

Essentially, what Hibernate does is map objects onto the result set fields, reducing the code even further, or, really, moving it somewhere else:

    Configuration config = new Configuration();
    config.configure();
    Session session = config.buildSessionFactory().openSession();

    Transaction tx = session.beginTransaction();
    try {
      List result = session.createQuery("from person").list();

      for (Person person : (List<Person>) result) {
        System.out.println(person);
      }
    } finally {
      tx.commit();
      session.close();
    }

The connection details are moved to an XML configuration file that, by default, is named hibernate.cfg.xml and contained in the root resources folder:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:jtds:sqlserver://localhost:1433/A_DB</property>
    <property name="hibernate.connection.username">aaron</property>
    <property name="hibernate.connection.password">********</property>
    <mapping resource="jobtype.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Notice that it refers to a “mapping resource”, in this case another XML file called “jobtype.hbm.xml”. This is where the details of the mapping are kept and it’s in the root folder again:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="org.laughing.lemon.Person" table="person">
    <id column="ID" name="ID" type="int">
      <generator class="assigned"/>
    </id>
    <property column="firstName" name="firstName" type="string"/>
    <property column="lastName" name="lastName" type="string"/>
    <property column="gender" name="gender" type="string"/>
  </class>
</hibernate-mapping>

Notice that it’s mapped the class name to the table and the column names to the attribute names of the Person class. This, in turn, has to extend the Java Serializable interface:

import java.io.Serializable;

public class Person implements Serializable {

  private int ID;
  private String firstName;
  private String lastName;
  private String gender;

You still have to do the work (you can, in theory, leave the mapping if the column names and attribute names are the same and it will work out the mappings automatically, but better safe…), but it is now done in configuration files rather the Java. You also have to introduce some transaction handling for the first time, which was done automatically for you in the JDBC.

The problem with this is that it’s not a standard. There’s still a fair bit of messing around if I wanted to switch to different ORM software. To impose some kind of standardisation, Java now has JPA, the Java Persistence API.

JPA

This is not a library or framework of any kind, but a standard or specification that ORM’s now adhere to, usually by implementing a plug-in or extension, which is what Hibernate does. Thus Hibernate JPA:

    EntityManagerFactory entityManagerFactory =
          Persistence.createEntityManagerFactory("org.laughing.lemon");
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    
    List<person> result = 
         entityManager.createQuery("from org.laughing.lemon.Person", Person.class).getResultList();
    for (Person person : result) {
      System.out.println(person);
    }

    entityManager.close();

Very similar to the Hibernate implementation and, like Hibernate, it takes the connection information from an XML file, in this case “persistence.xml”:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="org.laughing.lemon" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>org.laughing.lemon.Person</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://localhost:1433/A_DB"/>
      <property name="javax.persistence.jdbc.password" value="********"/>
      <property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="aaron"/>
    </properties>
  </persistence-unit>
</persistence>

Notice that the persistence unit has a name that then gets used in the Java application. The mapping is done in the POJO class:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="person")
public class Person implements Serializable {

  @Id
  @Column(name="id")
  private int ID;
  @Column(name="firstname")
  private String firstName;
  @Column(name="lastname")
  private String lastName;
  @Column(name="gender")
  private String gender;

Conclusion

So far, I've shown three seperate ways that a Java application can connect to a database. JDBC is the most direct and basic, with Hibernate and JPA abstracting the database table to Java objects.

Saturday 4 October 2014

Comic Reading

I've been reading a few of the latest trade paperbacks recently. First up is Mind Mgmt (no, not a misspelling) from Matt Kindt. A reporter and author, Meru, tries to complete her book on an airline flight where everyone lost their memory.


Although the art work is a little too sketchy for me, the story line is quite good, something along the lines of the TV series Fringe or "Life During Wartime" by Lucius Shepard, with secret organisations and mind control.

Following on from this was The Nowhere Men by Eric Stephenson (writer) and Nate Bellegarde (artist). Science multinational World Corp tries to recover some of it's employees lost during the explosion aboard a space station, while avoiding public exposure and fighting off the attentions of one of it's original founders.


Although the art work is pretty good, this first instalment was a little confused and fractured. Was it a story about the scientists who set up World Corp, or a story about the team aboard the station and what happened to them? It seems like an opportunity squandered at the moment, but, hopefully, it will improve.

The third is Sex Criminals, by Matt Fraction (writer) and Chip Zdarsky (artist). On finding they both have a unique ability, two people decide to use it rob banks, but find they don't have it all their own way...


Quite funny and an original story, the artwork is pleasing to the eye. I don't think it'll get onto TV, though.

Saturday 13 September 2014

The Proactionary Imperative with Steve Fuller and Veronika Lipinska

Today I went to see a presentation hosted by the London Futurists at Birbeck regarding a new book about transhumanism.


The book is written by Steve and Veronika, two academics, one on science and philosophy, the other in law.


Their idea is that there is a trend in society of being over precautionary (the example was given of the Bush government's restrictions on stem cell development, severely inhibiting biotechnology in the 'States). Their counter to this is to examine the current state of transhumanism and to make some recommendations based on an idea proposed by Max More called the Proactionary Principal. This is to say that instead of trying to avoid the consequences of change by not changing, the risks should be managed on a national or even global scale, underwritten by governments and the benefits distributed by the same to all. They also propose an idea of "hegenetics", which is a portmanteau of genetics and hedge-fund, that when a person, or group, have their DNA exploited they can benefit from it. It's a bit like you or I copyrighting our own DNA.

The presentation was very engaging and the discussion afterwards lively, Steve noting that the Futurists aught to be more politically engaged than currently, and that it seemed to be more of a hobby than a movement.

Saturday 6 September 2014

Brighton Mini-Maker Faire 2014

Today I went for a day out to Brighton to the Mini-Maker Faire. There was the usual collection of stands there, with rather a lot of 3D printers in evidence. There's a move to put 3D printers in every school!


There was also robots and sculpture and sculpture of robots:


There were also some very stange tricks with LED's. This is a set of spinning LEDs making a globe:


I went for a walk on the seafront afterwards and saw some rather good grafitti:


Monday 25 August 2014

Using PowerMock to Test Singletons

Back to the Job again.

I've been trying to test a small suite of classes based around exception handling. One of the classes is a class factory implemented as a singleton, which has proved impossible to test with the usual techniques, i.e. sub-class and override and Mockito.

A class factory is a class used to create and initialise other classes. A singleton class is designed only to be instantiated once and then every use afterwards uses the same instance over and over again, rather than creating multiple copies of the same class.

Sub-class and override is a technique used to isolate various methods of a class during testing. Take a simple class like this:

public class DemoSuperClass {

    protected List createNameList() {
        List returnList = new ArrayList();

        returnList.add("Steve Stranger");
        returnList.add("James Jones");
        returnList.add("Harry Harnot");
        returnList.add("Bill Blogger");

        return returnList;
    } 

    public void printNameList() {
        List nameList = createNameList();
        for(String name: nameList)
            System.out.printLn(name.split(" ")[0]); //prints the first name
    }

}

Say you want to test printNameList but with an empty list of names, or different names. The best way to do this is in the test harness declare a sub-class of DemoSuperClass and override createNameList:

private class DemoSubClass { //class in the test harness

    @Override
    protected List createNameList() {
        List returnList = new ArrayList();
        return returnList;
    } 
}

Now the sub-class can be tested.

Even if the method being overridden is called by the constructor, it will still work:

public class DemoConstructorClass {

    protected DemoConstructorClass() {
        procedure1();
    }

    protected void procedure1() {
        System.out.println("procedure1");
    }
}

    //in the test harness
    private class TestDemoConstructor extends DemoConstructorClass {

        @Override
        protected void procedure1() {
            System.out.println("Overriden procedure1");
        }
        
    }


Where this won't work is in testing singletons. The singleton I'm trying to test looks something like this:

public class SingletonClass {
    private static SingletonClass instance = new SingletonClass();

    public static SingletonClass getInstance() {
        return instance;
    }
    
    protected SingletonClass() {
        procedure1();
    }

    protected void procedure1() {
        System.out.println("procedure1 called");
    }
}

    //in use, say, in the test harness
    SingletonClass instance = SingletonClass.getInstance();

Notice that the constructor is protected and cannot be accessed from outside the class. The only way to create the class is through getInstance and that returns the private static instance field created when the class is first referenced. Sub-classing and overriding has no effect, because the call to constructor happens as soon as the class gets referenced and the private static instance gets created. Mockito spies don't work either for the same reason. Enter PowerMock.

PowerMock is a set of libraries used to extend existing mock libraries, such as EasyMock and Mockito to cover situations where it's difficult to use them, such as static or final methods and constructors. In particular, the MemberModifier.replace method allows us to override methods (but only static ones) without instantiating the class.

    public static void replacement() {
        System.out.println("replacement");
    }
    
    public void testGetInstance() {
        //procedure1 has to be static to be replaced
        MemberModifier.replace(MemberModifier.method(SingletonClass.class,
                                                     "procedure1"))
                .with(MemberModifier.method(this.getClass(),
                                            "replacement"));
        SingletonClass result = SingletonClass.getInstance();
    }

It's a bit brute-force, and with better design of the singleton class maybe unnecessary, but at least it can now be tested.

Saturday 16 August 2014

The Future of Futurism with Amy Zalman

Today I went to see a speech, hosted by the London Futurists, by Amy Zalman, who is CEO of the World Future Society.


Amy introduced herself. She's worked in various strategy think tanks and the like, including the U.S. War College. She wants to promote futurism and the futurist profession, intoducing the idea of the "Now" futurist.

There was a lively Q&A afterwards, which was, to some extent, more interesting that the main speech.

Monday 4 August 2014

Rhythms of the World 2014

This Saturday I went to the Rhythms of the World festival in Hitchin with my mate John:


He and his wife, Alison, are moving to France shortly, so this may be the last time we do the gig together. Jill, the organiser, was somewhat disappointed to hear that he wouldn't be able to do it in future, misguidedly attempting to dissuade him by pointing out that France was full of French people.

We did our usual four hour shift and caught an excellent sitar player, Mehboob Nadeem, half way through his set:


Truly excellent!

I also spotted the mural, done every year:


Exhausted, we had our free lunch and retired gracefully. I tell you now, if you had to pick up dog ends for four hours, you wouldn't smoke!

Thursday 31 July 2014

Half a Century

To celebrate having reached the half-way point (hopefully), I went into town last week for my annual trip to the Design Museum, accompanied by some of my relatives.

It was a nice, bright shiny day in Old London Town:


The Design of the Year exhibition was on and there was a mix of the practical and strange:


On the left is a wall calendar made of Lego and, on the right, a giant-sized Twitter feed printer. There were cars and smartphone apps and chairs and dresses. There was also a rather nice, if expensive, folding bike:

and a new type of aircraft, similar to the Westland Pterodactyls of the 1930's:


More mundane, but perhaps just as significant, is Fairphone, from Holland. As the name implies, it's an ethically sourced smartphone.

Saturday 19 July 2014

True Detective

True Detective is now out on DVD in the U.K. Louisiana State Detectives Rust Cohle (Matthew McConaughey) and Marty Hart (Woody Harrelson) are called to the scene of what looks like a ritual murder:


The series follows the case in flashback as the two detectives are interviewed many years after by their counterparts working a similar murder. A lot of fuss has been made of the series, preempting a cult following, but it is justified. McConaughey is hot property at the moment, after Mud and more recent films, and Cohle is a very suitable vehicle. Some of the weirder ideas that Cohle has (or purports to have: you're never quite sure if he's just playing games) would sound rubbish from a lesser actor, but he holds the attention perfectly. Harrelson's role is more solid and conventional, but it contrasts well with Cohle and is no less compelling. I honestly believe that you could just show the interviews without the flashback and it would still be good watching.

The direction and script are equally good and a third component, even a third actor really, is the atmospheric Louisiana countryside, part industrial (a strong feature being the refineries and chemical works supporting oil industry along the Gulf coast) and still very rural and religious.

Very, very recommended.

Tuesday 15 July 2014

Jack the Giant Slayer

A retelling of the old fairy tale, Jack (Nicholas Hoult) takes his horse to the City market to sell, exchanging it for some mysterious beans and embroiling himself with the Princess (Eleanor Tomlinson) and the King's scheming advisor (Stanley Tucci).


An amiable story, well told, with a good supporting cast including Ewen Bremner, Eddie Marsan, Ian McShane and Ewan McGregor. More fun than you would think and very recommended.

Sunday 29 June 2014

BDD and JBehave

I've been in my new job for a few weeks now and encountered Behavior Driven Development in the code I'm looking at, using JBehave.

BDD is a way of structuring unit tests in such a way as to make them more human-readable. Typically, a conventional unit test looks something like this (this is for a small builder class I’ve created):

@Test
public void testOneWhere() {
    //select with one criteria
    SQLBuilder instance = new SQLBuilder();
    instance.select().table("A_TABLE");
    String result = instance.where("A_COLUMN", "A_VALUE").build();
    assertTrue("result is not proper SQL: " + result,
            result.equals("SELECT * FROM A_TABLE 
                           WHERE A_COLUMN = \"A_VALUE\""));
}

This is quite a small test, but it’s easy to see that someone non-technical would have difficulty following what was going on here. Plus it’s not very flexible: if you want to test boundary conditions, for example, you either have to do a lot of cut-and-pasting or some fancy footwork with the test libraries.

Compare this to the equivalent BDD statement (called stories):

Scenario: with a where clause

Given a new SQLBuilder object
When select is called
And table is set to A_TABLE
And where is set to A_COLUMN equals A_VALUE
And build is called
Then the result is SELECT * FROM TABLE WHERE A_COLUMN = "A_VALUE"

This is supported in the test harness by methods bound to the statements in the story:

@When("select is called")
public void selectIsCalled() {
    sqlBuilder.select();
}

@When("table is set to $table")
public void tableSetToTable(String table){
    sqlBuilder.table(table);
} //etc.

Not only is the story more readable, but you can parameterise the calls, setting up tables of inputs and expected outputs. Nice.

Tuesday 27 May 2014

Penny Dreadful

Imagine all the Gothic horror stories of the 19th Century, real and fictional. Throw them all together in Victorian London and you'd end up with something like this:


Seems a bit over the top for me, but the acting seems up to scratch.

Monday 19 May 2014

Goodbye to All That

Today was my last exam at Bromley for the Foundation Degree Course. It was Computer Systems, i.e. assembler and digital circuits using something called VHDL. My least favourite subjects on the course.


I've done very well at the development side of the course, pulling out all the stops and getting 91% in the object-oriented software development assignment, for which I won (jointly) first prize:


Rather expensive, too.

It's been an adventurous two years, something I never thought I'd be able to do, but I did it and that's something.

Wednesday 14 May 2014

Introduction to Neo4j

Neo Technologies run little evening seminars to introduce their graph database technology and I took the liberty of attending one yesterday evening. You get a free book!


They're based around the back of the Tate Modern, in an area which seems like an extension of Shoreditch with loads of start-ups and overpriced coffee.

It was a very interesting presentation, given by Rik Van Bruggen (Belgian), giving the background to the database and a really good demo using belgian beers as a dataset. Neo4j also has a community version that you can download as well as a free on-line course (with registration).

Rick also demonstrated a web site that visualises recommendations in Amazon.com, which is quite groovy.

Sunday 11 May 2014

Premiership Blues

Y'know a while ago, I mentioned that it looked like Chelsea had the Premiership sewn up. Then Liverpool came into the running and it looked like they were going to win. Funny how things turn out...


Inch-by-inch, City took over the top slot, first from Arsenal, and then from Liverpool (Blue beating Red twice).

Even better is that not only have the people across town won nothing, they're not even in Europe, having been pipped by Tottenham. Sad, really. And funny. They'll be back, though. They're annoying like that.

It does feel weird, City winning things. Nice to have to get used to it, though.

Wednesday 7 May 2014

UXB on the Wild Shore

Before I start my exams on Friday, in a kind of pilgrimage of sorts, I went for a walk on Shoeburyness sea front only to be faced by a long fence:


(Taken using the steam-driven mobile and thus the poor quality). There were signs on the fence explaining it's purpose:


Locals know that Shoeburyness was the army ordnance testing range for some years and still has a military/M.o.D. presence. Then again, the Luftwaffe used the river to guide them into London and could have dropped something on the way back; or it could be something related to the ammunition ship, the Richard Montgomery, sunk off the Isle of Sheppey, although that's mostly opposite Thorpe Bay, so that's alright, then.

Saturday 3 May 2014

Sid Meier's Ace Patrol

I'm always on the lookout for cheap games and I thought I'd check this one out.


I've managed to survive the missions so far:



It's £4.99 on Steam and, like all Sid Meier games, it has a certain charm and certainly fun. The game plays a little like Wings of Glory (what used to be Wings of War), a card-based miniatures game:

Friday 2 May 2014

Lego Simpsons

Now I like Lego and I like the Simpsons: yes, it's lost it's edge over the years, and I got into (and out of) Family Guy, but it's still pretty good. However, I'm not so sure about the latest Lego minifig series:


Apparently it's to go with one of the latest episodes:


I must not complain about the new Lego minifigs. I must not complain about the new Lego minifigs.
I must not complain about the new Lego minifigs. I must not complain about the new Lego minifigs.
I must not complain about the new Lego minifigs. I must not complain about the new Lego minifigs.
I must not complain about the new Lego minifigs. I must not complain about the new Lego minifigs.
I must not complain about the new

Thursday 1 May 2014

Wednesday - The Graphs of Gaming and Recruitment

Yesterday evening, I went to a presentation on Graph Databases (specifically Neo4j, who were the organisers), hosted by Skills Matter.

First up was Nigel Small who talked about Zerograph, a new container/server for Neo4j.


Nigel gave a quick overview of Zerograph, highlighting it's ability to host more than one database and the use of ZeroMQ (thus the name) to increase reliability and robustness. ZeroMQ is a message queue, which is a piece of software designed to buffer and schedule messages between two systems in a more controlled way than a direct connection. It also, in ZeroMQ's case, allows for temporary disconnections, saving the messages to be processed when the connection is resumed. How this works in practise is another matter.

One of things emphasised throughout the talks was the speed with which Neo4j processes queries and returns results. Graph databases are designed to cope with information which is highly relational in nature, so something that in standard SQL would take seconds or even minutes with multiple joins, takes a fraction of that in a graph database.

Next up was Matt Wright to talk about the work at his company Stitched regarding the use of Neo4j in social networks for recruiting.


A quite amusing presentation, Matt illustrated the problems with existing social networks, such as Facebook and LinkedIn, and how "private" networks could be used to give more authentic results.

The last speaker was Yan Cui, from GamesSys, to talk about his experiences using Neo4j to model his company's Freemium online game "Here Be Monsters".


The game is resource based and can be incredibly complex and interrelated, so any small change in the underlying data can have considerable consequences. They've tried to make changes by rule-of-thumb, but this proved too unwieldy, slow and error-prone, so they've been modelling it with Neo4j and had much better results.

One of the things mentioned during the presentations was Cypher. Being interested in cryptography, I was a little baffled, but this turns out to be the Neo4j equivalent of SQL:

MATCH (n:Person)-[:KNOWS]->(m:Person) WHERE n.name="Alice"

Looks similar enough, although I can't see why they didn't call it Graph Query Language (GQL), which would be much more obvious.

Saturday 26 April 2014

Saturday - The Future of Healthy Longevity

Today, I went to a presentation on longevity, quite a popular subject amongst the London Futurists, second only to the Singularity. It was done in three parts, the first by Phil Micans:


Phil discussed the issue that ran through all the presentations: that absolute longevity (how long you live) is only as important as how healthy you are, otherwise the suffering, and it's associated cost to society, make the extra years pointless. He mentioned various new technologies, especially peptides, which have produced amazing results, including growing back one chap's finger tip:


Next on was Avi Roy, who discussed the possible areas of research and narrowed it down to nine different areas, each area affecting different diseases to a greater or lesser extent:


The effect being that if you address one factor, affecting one type of illness, another illness replaces it. All the nine factors have to be tackled together.

The third speaker was Tuvi Orbach, who discussed the effect of lifestyle on longevity.


He's a bit of an advert for his subject, being 65. Healthy living!

Wednesday 16 April 2014

Dependency Injection with Google Guice

One of the problems that we get in software development, specifically in the design of software classes, is that of the connection between classes. If one class uses another directly, even though it works, this can cause problems later on and is known as "close coupling". Here is a mundane example:

//a really dumb message sending class
public class MessageSender {
    public void sendMessage(String message) {
        System.out.println(message);
    }
}

//another dumb class that uses the message sender
public class MessageUser {
    //a reference to the sender object
    private MessageSender messageSender;
    //the message sender object is created in the constructor
    public MessageUser() {
        this.messageSender = new MessageSender();
    }
    //send the message via the sender
    public void sendMessage(String message) {
        messageSender.sendMessage(message);
    }
}

//the main class that uses the message classes
public class MessageMain {
    public static void main(String[] args) {
        MessageUser messageUser = new MessageUser();
        messageUser.sendMessage("This is a test");
    }
}

OK, this is really mundane, but can see that MessageUser cannot use any other way of sending messages. If you want to use another means, say email, you'd have to either change what MessageSender does or change MessageUser to use a different class, call it EMailSender. However, we can now use an interface instead of a class:

public interface MessageSender {
    public void sendMessage(String message);
}

//an implementation of the interface
public class SystemMessageSender implements MessageSender {
    public void sendMessage(String message) {
        System.out.println(message);
    }
}

You still have to change MessageUser, but to use an interface given to, or "injected" into, the MessageUser object via the constructor:

public class MessageUser {
    //a reference to the interface
    private MessageSender messageSender;
    //the interface is sent to the object using the constructor
    public MessageUser(MessageSender messageSender) {
        this.messageSender = messageSender;
    }
    
    public void sendMessage(String message) {
        messageSender.sendMessage(message);
    }
}

This works if we then, in the main class, create the object that implements the MessageSender and pass it to, or inject it into, the MessageUser object:

public class MessageMain {
    public static void main(String[] args) {
        SystemMessageSender messageSender = new SystemMessageSender();
        MessageUser messageUser = new MessageUser(messageSender);
        messageUser.sendMessage("This is a test");
    }
}

Now if we want to have MessageUser send emails we create a class which also implements the MessageSend interface:

//an implementation of the interface
public class EMailMessageSender implements MessageSender {
    public void sendMessage(String message) {
        EMail.textMessage(message);
    }
}

All that then has to be done is create an object of this class in the main class and then pass it to MessageUser, as before:

        EMailMessageSender messageSender = new EMailMessageSender();
        MessageUser messageUser = new MessageUser(messageSender);
        messageUser.sendMessage("This is a test");

This technique, known as Dependency Injection, is quite an important design pattern and is mandatory in certain frameworks, such as Spring.

Introducing Google Guice


So far, so good, and it's difficult to see how this can be really improved upon. However, Guice (pronounced with a J rather than a G) does for dependency injection what Mockito does for unit testing. To introduce Guice into the above example, we have to create another class, an extension of Guice's AbstractModule class:

public class MessageModule extends AbstractModule {
    protected void configure() {
        bind(MessageSender.class).to(SystemMessageSender.class);
    }
}

You can sort-of see what's going on. The module is responsible for creating the class that implements the interface, so whenever the interface is used, the object is bound to it. The magic happens in the Injector, used in the main class:

        Injector injector = Guice.createInjector(new MessageModule());
        MessageUser messageUser = injector.getInstance(MessageUser.class);
        messageUser.sendMessage("This is a test");

Notice that the module hasn't been told about MessageUser, so the Injector is figuring out it's dependencies from the constructor of the class, and this also has to change using the @Inject annotation:

    @Inject
    public MessageUser(MessageSender messageSender) {
        this.messageSender = messageSender;
    }

Now all this doesn't seem like a big deal, if anything we've added lines and classes, but if you've got a lot of classes with umpteen dependencies, Guice can save you a lot of work.

Tuesday 15 April 2014

Captain America: The Winter Soldier

Being (relatively) cheap Tuesday at Empire Cinemas on th' BasVegas Strip, I took advantage and went to see the latest in the Marvel Avengers franchise. Now an agent of S.H.I.E.L.D., Steve Rogers, a.k.a. Captain America, is confronted with a conspiracy when Nick Fury is attacked.


There's lots of bangs and crashes and a reasonably decent plot, but is a Superhero movie at heart despite higher ambitions. All the team turn up, so it ends up being an Avengers movie without the Avengers, but the acting is ok, if a little pedestrian (it seems a long time ago since Robert Redford was in All The President's Men) and there's a fair number of cameo's, but it's Samuel Jackson, as Nick Fury, and Chris Evans, as th' Cap', that drive the movie.

Saturday 12 April 2014

Salute 2014

For a change of pace, I went along to Salute 2014, the South London Warlords exhibition at Excel in the London Docklands.

There was a good turn out, with several different styles; historic, fantasy, science fiction and even horror (i.e. zombies), as well as the usual stalls. This was a large scale miniatures battle of Trebbia (Second Punic War: Hanibal vs. Roman Republic):


There was also a very large simulation of Sword Beach, one of the British D-Day landings:


as well as a Space 1889 attack on a Martian city by British Forces:


I got tempted by the stalls, eventually, and bought some model bases from Micro Arts Studio:


Nice!