Software Development in Brisbane

Archive for the ‘Development’ Category

Eleven reasons to use the Play! Framework for Java Web Development

Saturday, April 10th, 2010

The Play! Framework is a great tool for rapidly building Java web applications. Play! takes many of the ideas from the dynamic languages world (Rails and Django), and provides them to Java web development. Reasons to conside Play! for Java Development are:

  1. Rapid development via a local development server that automatically compiles your java code for you. It’s amazing how good it is to develop like this, and what a difference the rapid feedback loop makes.
  2. A good clean MVC famework.
  3. Nice testing support baked in.
  4. A useful routing table to make clean urls easy to work with.
  5. A focus around REST, but no slavish observence of it.
  6. built-in simple JSON support.
  7. A good module framework with useful modules including a “CRUD” module, and a Scala module currently under development
  8. An interesting mix of Java class enhancement that makes it easy to work with code, and then have the enhancer provide some of the hard work for ensuring that multiple threads are handled well.
  9. Deployment to a range of platforms, including JEE Servlets (Play! 1.0.2 has been tested on containers such as tomcat, jetty, JBoss and IBM WebSphere Portal 6.1), and the GAE.
  10. Enhancements to the JPA which make it really easy to work with.
  11. An active and supportive community. There is the right balance between having strong opinions about the “Play!” way of doing things, and helping people to get things done.

Play! makes Java web development fun and productive. The feedback loop is really quick, and much of the boilerplate code is removed. It’s well worth considering for any application you want to write in Java.

Take a look at the video, and work through the tutorial to get a feel for what development with Play! is like.

Notes on Installing the Connections 2.5 Pilot

Tuesday, November 24th, 2009

The installation of the Lotus Connections 2.5 pilot looks easy. Unfortunately the out of the box experience was not at all pleasurable for me. Here are some of the issues that I encountered while doing the install. I’m not sure how many of these were specific to my environment, but they did all hurt.

1) Don’t install from a directory with spaces.

If you download the pilot to your desktop and try and install from here, things will crash and burn

2) Don’t expect the VM to be easily moved around networks

I started my second installation on my laptop at home, then brought it to work. This crashed and burned.

3) Use fully qualified hostnames

While the installer said that you could specify a short hostname or a fully qualified hostname, the short hostname did not work for me.

4) Connections 2.5 is RAM hungry

1.5 GBytes is not enough 2.5 GBytes is. Not sure of the exact threshold for it to work, but I can confirm that 2.5 GBytes is enough RAM.

Making the Home and End Keys work in Eclipse 3.4 on Apple Mac OSX

Friday, June 12th, 2009

Hidden in the comments of the article of Starry Hope – Mac Home and End Keys are some instructions for how to make the home and end keys work well as begin and end line in eclipse.  I've done all the other tricks to make this work on my Mac, so was getting really frustrated with Eclipse.  double home and double end are common key combinations for me in IntelliJ and Eclipse on Windows, so the current behaviour of going to the beginning or end of the file drives me crazy.  The details of doing this differ slightly in Eclipse 3.4.1, so I'll list the steps I followed below.

  1. open the eclipse preferences pane
  2. general->keys
  3. in the filter type line start and note that there will be existing bindings when editing text.
  4. select line start type home, and ensure that the "when" field stays with Editing Text
  5. apply
  6. follow this process for select line start, line end, and select line end.

After doing this, expect your anger at eclipse on Mac to decrease to much more manageable levels.

 

Port forwarding with iptables and debain

Tuesday, June 2nd, 2009

 

Subtitle: 

Avoid Remembering that VMWare Server Listens on Port 8333 

Alternate subtitle:

Make Tomcat Listen on Port 80

It's increasingly common for applications to have web front ends.  These all tend to run on their own port, which is nice in that it stops services from running into each other (and means that they can run as non-root), but is somewhat painful in that there are always a whole heap of different ports to remember.  Exposing a service over port 80 makes it much easier to use (especially on ie which is dumb, and doesn't know to make requests to non standard ports default to port 80, generating much rsi, and many hours logged into the IE Waste Recorder).  Making services listen on port 80 on Debian is pretty straight forward.  Follow the process below (which I pinched from someone somewhere in the blogosphere a while ago, put on a server as a part of some work with SSH Tunnelling, and only remembered recently when we were getting some VMWare servers setup). So here is the script. In your /etc/network/if-up.d add a script with the following:

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

# Flush any existing firewall rules we might have
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Perform the rewriting magic.
iptables -t nat -A PREROUTING -p tcp

1
--

dport 80 -j REDIRECT

1
--

to 8222
iptables -t nat -A OUTPUT -o lo -p tcp

1
--

dport 80 -j REDIRECT

1
--

to-port 8222

This forwards requests from port 80 to port 8222, and will work for local and remote requests.  I keep this in a script called /etc/network/if-up.d/firewall, because iptables is firewallish, and I believe this is the standard place for this to live.  Remember to chmod +x the script. 8222 is the http port for vmware, and will redirect to 8333 using https. By putting the script in the /etc/network/if-up.d it will automatically be run when the networking layer of your debian installation is brought up.

As per the NewInstance post, this will work for Tomcat as well (Luigi put the iptables rules in a different spot, but that was in 2005, and /etc/network/if-up.d is the right place for this).

So with the above iptables rules, it will be easy to make any service available on port 80.

Updating RubyGems in OSX 10.5.7

Wednesday, May 27th, 2009

.7When recently trying to install Sinatra via RubyGems, I got a message that RubyGems was out of date. I figured that gem would be smart enough to have an easy upgrade command, so there had to be a command to easily upgrade. Naturally there is:

1
<span style=" background-color: #ffffcc;">gem update --system</span>

I only found this when looking through google, and I got a series of pages warning to be careful when using

1
<span style=" background-color: #ffffcc;">gem update --system</span>

as it can kill existing gems (http://puctuatedproductivity.com/2007/11/01/unistalling-ruby-installed-by-source-on-os-x, http://thenoobonrails.blogspot.com/2008/06/doing-gem-update-system-might-lose-all.html) so I was a bit nervous.  Since I have a periodic use of ruby and I'm lazy enough to make Larry Wall proud, I figured I'd take a punt on just using

1
<span style=" background-color: #ffffcc;">gem update --system</span>

.  Turns out it just works, and I've kept all my old gems.  Hooray.  Given that the posts talking about issues are old, I'm either assuming that they've done things differently to me, or things have been fixed since then… so… if you need to update gems due to a message:

ERROR: Error installing sinatra:
fastthread requires RubyGems version >= 1.2

or similar, just use

1
<span style=" background-color: #ffffcc;">gem update --system</span>

A Review of 5 Java JSON Libraries

Thursday, May 7th, 2009

 

json.org lists 18 different Java libraries for working with JSON (Flexjson gets a double mention). These provide varying levels of functionality, from the simplest (the default org.json packages), to more comprehensive solutions like XStream and Jackson. Join me on a quick review of some of these, focusing on those which have friendly licenses, and meet my requirements.  If you are lazy, you can fast forward to my summary

My Requirements

  1. Serialises and Deserialises JSON
  2. Lightweight and Simple
  3. runs on Java 1.4
  4. Friendly license

The contendors

  1. org.json
  2. Jackson
  3. XStream
  4. JsonMarshaller
  5. JSON.simple

Serialises and Deserialises JSON

This might sound like an obvious requirement, but I’ve seen at least one library which was completely focused on spitting out JSON, without any support for reading JSON. I’m actually using this as a pre-requisite for inclusion in my comparison. If a library can’t read AND write JSON, I’m not going to consider it.

Lightweight

I’ll begin by stating that my actual usecase is to operate within a plugin for EditLive!. I don’t need a all singing all dancing JSON serialisation/deserialisation library. There are some very cool libraries out there that do awesome stuff, but all I need to do is read and write JSON data.

Coupled with this is that I’ll want to be able to keep the memory footprint pretty low, so want to work with Java Streams without needing to necessarily pull in the whole serialised object if I don’t need it.

Runs on Java 1.4

Yep it’s still out there. Thankfully Java 1.4.2 has reached it’s EOL, but businesses can still request patches, and there are most definitely still Ephox clients running on this JRE, even though more recent JRE’s work so much better. (side note: If you have the option of upgrading your JRE to Java 6, please do it, the children in Africa will be much happier. Everytime someone runs up a 1.4 JRE a puppy dies). 1.4 is in it’s final death throws, but it is still kicking.

Friendly License

For Ephox to make money from the product/component that uses JSON (gotta think about the $$$ at the end of the day), I’ll need to make sure that the license is non-viral and Enterprise friendly. Apache license good. GPL bad. (sorry FSF)

Assessment 

So having run through the requirements, we can now consider the options. For each library, I’ll provide a simple table.

The metrics I’m using to judge the libraries are included in the table. The most crude metric that I’ve got is the number of classes. I’m more than happy to admit that this is a very crude way to measure how lightweight the library is, but it does provide an ok rough heuristic, particularly given that there are order of magnitude differences.

org.json

The granddady of them all. This comes pretty close to being a reference implementation. It provides a nice simple API (7 classes), doesn’t try and do any magic, and just makes sense. I’ve used it before when working with small amounts of data. Unfortunately it doesn’t provide any streaming goodness.

url http://www.JSON.org/java/index.html
classes 7
Streaming support No
Friendly License Yes
Java 1.4 Yes

Jackson

Jackson advertises itself as a fast powerful conformant JSON processor. It provides heaps of features, and looks to be a good tool for reading and writing JSON in a variety of ways (see the Jackson tutorial for more). The drawback of Jackson for my purposes is that it isn’t exactly svette at 250 classes.

url http://jackson.codehaus.org/
classes ~250
Streaming support Yes
Friendly License Yes
Java 1.4 Yes

XStream

XStream gets a mention because it’s cool :) . I haven’t really considered it because it provides more of a direct object serialisation format, which wasn't quite what I'm looking for. Also, it’s heritage as an xml serialisation format shows, and it likes Java 5 much better. The ability to directly go between Javabeans and JSON java classes is cool, but I don't need this magic or the 200+ classes that come with it.

url http://xstream.codehaus.org/
classes >200
Streaming support Yes
Friendly License Yes
Java 1.4 Yes

Json Marshaller

Json Marshaller sells itself (it almost sounds like a bolierplate project description by now) as “Fast, Lightweight, Easy to Use and Type Safe JSON marshalling library for Java”. It’s been under consistent active development for a number of years, and looks to be headed in the right direction. Unfortunately the current version has 3 deal stopping flaws for my environment at the moment.

  1. It requires Java 5
  2. It has a dependancy on ASM (the developers are looking to remove his dependancy)
  3. While it hasn’t quite piled on the bulk of XStream or Jackson, it still has a couple to many classes for me to consider

These constraints make it not quite fit for my purposes, but like all decisions, it depends on your own situation.

url http://code.google.com/p/jsonmarshaller/
classes ~50
Streaming support Yes
Friendly License Yes
Java 1.4 No

JSON.simple

JSON.simple advertises itself as “a simple Java toolkit for JSON”. It provides reading and writing to JSON streams. It’s lightweight and focused on generating JSON from Java code. The critical feature it provides is support for Java IO readers and writers.

url http://code.google.com/p/json-simple/
classes 12
Streaming support Yes
Friendly License Yes
Java 1.4 Yes

Summary 

For the interested, here’s a table that summarises my findings.

  org.json Jackson XStream Json Marshaller JSON.Simple
classes 7 ~250 >200 ~50 12
Streaming support No Yes Yes Yes Yes
Friendly License Yes Yes Yes Yes Yes
Java 1.4 Yes Yes Yes No Yes

 

Conclusion

If you are looking for a simple lightweight Java library that reads and writes JSON, and supports Streams, JSON.simple is probably a good match. It does what it says on the box in 12 classes, and works on legacy (1.4) JREs.

Choosing a data storage format

Wednesday, May 6th, 2009

In case you haven’t noticed, XML is not a silver bullet. (google xml+silver+bullet). It is not, and should not be an automatic choice when thinking of a data storage format. The ubiquitous libraries for working with XML are often hard to use, and are often overkill for a simple storage format. In today’s world, I’d suggest that the following options should be considered (at least briefly).

  1. Native Object Serialisation
  2. Custom format
  3. XML – Extensible Markup Language
  4. YAMLYAML Ain’t a Markup Language (obviously created by geeks with the recursive name)
  5. JSON – JavaScript Object Notation

Join me in having a look at these formats, and I’ll let you know some of the issues to consider. The main problem I’m solving is for data that belongs to your own application. I’m not considering databases or interoperability.

Native Object Serialisation

Consider this briefly before running away. I’m particularly familiar with the idea of Java Object serialisation. I’ve used Prevayler in the past storing java objects, and xml (So while I’m having a dig at Java Object serialisation in general, I’m not specifically having a go at prevayler).

While the use of native object serialisation is often easy, it has costs, making the content unreadable by humans, coupling the data storage to your implementation language, and can create object migration issues. These costs will typically outweigh the benefits. Having human readable data to aid debugging would provide reason for not using native object serialisation if there was nothing else.

Custom Format

The use of a custom simple text format should not be discarded out of hand. The lack of any third party dependancies is a useful feature, and should be considered. That said, if you have a library that does the parsing for you, that should not be sneezed at.

XML

As wikipedia says, “XML is a general-purpose specification for creating custom mark-up languages” (Wikipedia on XML). Parsers and tools exist for many platforms and environments, which makes it a useful tool when you want to share information between different environments. While a good tool, the syntax is verbose, and can be hard for humans to read.

XML has influenced the birth of two of two more recent notations which are useful for data storage: YAML, and JSON

YAML

YAML purports to be “a human friendly data serialization standard for all programming languages” (Yaml.org). It has a well defined specification (YAML Spec), and makes for an easy to understand data storage format. Implementations of YAML exist for a wide range of languages, including Java, C++, Ruby and Javascript. It’s been around for a while, and has a decent amount of uptake. If it wasn’t for JSON, it would probably be a good default choice.

JSON

At first glance JSON seems much less suitable than YAML for languages other than JavaScript. The kicker against it is that it has “JavaScript” in the name, which has always made people feel icky. That said, it does make for a good cross platform format, it is human readable, and is implemented on a wide range of platforms (Json.org).

JSON has also has the advantages of having mindshare, and is slightly more familiar to developers than YAML. Every developer who has had anything to do with the web has done stuff with JavaScript, so the basic format will be familiar to them. Also in JSON’s favour is the fact that JSON and YAML are syntactically very close (see Redhanded). JSON appears to be very close to a subset of YAML(Ajaxian). In addition, the general applicability of JSON is higher, particularly for people who are going to be doing Javascript development. Also, if you have any possibility of playing with JavaScript, JSON is a very good option because of the native support in JavaScript.

These factors combine to make JSON an excellent choice.

Summary

Tim Bray makes a good case for this being an automatic choice based on your circumstances(http://www.tbray.org/ongoing/When/200x/2006/12/21/JSON ). You’ll still need to think about the pros and cons of the different technologies for your situation (see http://webignition.net/articles/xml-vs-yaml-vs-json-a-study-to-find-answers/), but you’ll often find that JSON is a good format to use for data storage.

Bridged Network Connection + VMWare Fusion 2 + SMEServer + WiFi = Fail

Saturday, April 25th, 2009

When recently doing some testing of a SME Server VM using my wireless network I was getting a variety of different connection failures. 

Accessing the server manager in Safari was giving messages containing text like: Safari can’t open the page…. Safari can’t establish a secure connection to the server.  Occasionaly connections would work but 9 times out of ten the connection error was occuring. 

In addition to the https related issues, ssh connections were being reset. A ssh connection attempt with full debug (-vvv) can be seen below.

ssh -vvv *****
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data ****
debug2: ssh_connect: needpriv 0
debug1: Connecting to ****
debug1: Connection established.
debug1: identity file ****
ssh_exchange_identification: read: Connection reset by peer

Strangely google wasn't much help with my issue.  It was only after reinstalling a new VM using NAT that I saw things working.  From what I can see it must be the combination of the services running on SME Server, WiFi and Bridged networking.  

So if you have a Apple laptop, wireless, and SMEServer running in a VMWare virtual machine, use NAT for your test server and things will work much much better for you.

 

Getting php and MySQL up and running on OS X 10.5

Wednesday, January 14th, 2009

Much of the free and open source web technologies in the world runs on Apache, MySQL and PHP. Getting this up and running on your Mac is important to ensure you can do development on the Mac. Once you know the right steps to follow in setting this up, it isn’t too hard, but finding the right information can be a bit tricky.

As at January 15 2009, here is the process that works. If you have problems, let me know and I’ll update this page accordingly.

I’m assuming that you have basic knowledge of how to use a Terminal.

1) Enable php in Apache

Ensure that the php module is loaded. This is done in the httpd.conf, and simply involves uncommenting the LoadModule line. sudo vim /etc/apache2/httpd.conf remove the comment (#) char at the front of the line containing LoadModule php5_module

1
LoadModule php5_module libexec/apache2/libphp5.so

After doing this you will need to restart apache

1
sudo apachectl restart

2) Install MySQL

Download MySQL from http://dev.mysql.com/downloads/, and follow the instructions (if you go with the dmg file it’s really easy).

3) Download and Install the MySQL System prefPane

System Preferences is the place to start and stop things in OSX. Many versions exist. The one that actually works with 10.5 is available for download from the MySQL site: ftp://ftp.mysql.com/pub/mysql/download/gui-tools/MySQL.prefPane-leopardfix.zip

4) php.ini

You’ll need to tell php where the MySQL socket lives. To do this take the default php.ini provided, copy it to php.ini, and ensure that the mysql.default_socket and mysqli.default_socket settings both reference /tmp/mysql.sock (that’s for the MySQL and MySQL improved extensions).

1
sudo cp /etc/php.ini.default /etc/php.ini

1
sudo vim /etc/php.ini

1
mysql.default_socket = /tmp/mysql.sock<br />       mysqli.default_socket = /tmp/mysql.sock

After making these changes you’ll need to restart apache.

1
sudo apachectl restart

5) Install phpMyAdmin

phpMyAdmin is the standard tool for administering MySQL databases. It’s a php client that just works. While you might be able to get away with using a rich client on Mac OSX you should probably use phpMyAdmin because it’s the standard, and running on servers everywhere. Grab a copy from http://www.phpmyadmin.net, read the documentation (there is a quick install guide), and you are off and running.

Fixing”No backend servers available” running Vignette on Weblogic

Wednesday, November 26th, 2008

After spending a considerable amount of time looking at WebLogic and Vignette groups and sides on the net, I finally worked out the cause of a recent “No backend servers available” error message which was occuring when trying to access the vcm 7.5 AppConsole on a recently installed version of Vignette.  In the end google didn’t know the answer to my question.  It’s time to teach google a lesson.

So after getting quite frustrated with what was happening, being unable to find documentation, and finding that a reinstall wasn’t helping much, I pulled out a developers true friend, and started poking around with the runtime services console.

After playing around with the runtime services, I was able to work out that the default install of Vignette  was setting up a cluster, containing the single server.  The combination of suspending and restarting my vmware virtual machine was leading to the Weblogic server to not be started correctly, resulting in the “No backend servers available” error when trying to visit the AppConsole. 

This problem was resolved by following two simple steps:

  • being patient after a restart, allowing the system to do all its checks, (waiting about 5 minutes worked for me) and then
  • simply starting the server using the runtime services console. clusters->[cluster name]-> control -> start/stop -> startup.

So if you end up in a situation where you are seeing “No backend servers available” with Vignette and WebLogic, don’t despair, it can be resolved by simply starting the servers in your cluster (even if it’s a cluster of 1) after patiently waiting (about 5 minutes) for the server to get into a stable state.

Thankfully google knows this too now.