CQ Development Team Server “In A Box”

Posted in: System Administration

Just wrapped up a project with the Headwire team to create an example server environment for getting up and running with a new CQ project quickly. The server has all of the elements needed for a CQ development team like Subversion, Nexus and Jenkins already installed, configured and integrated. There are also instructions for setting up your CQ environment, including deploying the CQ binaries into Nexus and making them available to your Maven builds.

The server is packaged as an Open Virtualization Archive file, so you should be able to import it into most virtualization tools (VirtualBox, VMware etc).

Check out the documentation here:



Posted in:

I am a full-time consultant who is available to engage with clients remotely or onsite anywhere in the world (I currently hold dual-citizenship between Australia and the United States).

To discuss your specific needs, please call me on +1.650.336.5877, or email me at craig@craigsdickson.com, or use this Contact form, or download a copy of my resume from this page.

The following is an overview of the services I provide to clients:

Software Development Process Improvement

  • Coaching for Agile process evaluation, adoption or improvement, including Scrum, Lean, Kanban and Extreme Programming (XP)
  • Definition, refinement and documentation of team processes and practices
  • Definition of Quality Assurance and Quality Control standards
  • Integration of defect tracking systems with other tools and processes
  • Engagement with customers and requirements elicitation

Software Development Team Management

  • Job Description authoring
  • Salary range and benefits package definition
  • New candidate acquisition and screening
  • Team workspace design and office space evaluation
  • Skills assessment of existing resources
  • Collaboration strategies for teams

Vendor Management

  • New vendor discovery and screening
  • Vendor proposal reviews
  • Offshore vendor management, including onsite visits and reviews
  • One throat to choke multiple vendor management

Software Configuration Management (SCM)

  • Introduction of an SCM system to teams not already using one (Subversion, Git, CVS etc)
  • Subversion and CVS training
  • Subversion and CVS server installation and configuration
  • SCM process definition and documentation, including branching and merging processes
  • SCM system migration, particularly CVS to Subversion

Build Management

  • Implementation of Apache Maven and Apache Ant based build systems
  • Automation of builds, particularly in relation to a Continuous Integration system like CruiseControl or Hudson
  • Management and versioning of produced code artifacts, particularly in relation to an Artifact Repository like Nexus or Artifactory
  • Release numbering strategies and Alpha and Beta customer release programs

Software Architecture & Design

  • Enterprise-level system architecture definition, existing architecture reviews
  • New database design and existing database design review
  • Formal UML based architecture definition

Enterprise Java Development

  • Specialist in full-stack JavaEE development
  • Public API design and documentation for ISVs
  • Web service development and integration
  • Code reviews and performance tuning
  • Service Oriented Architecture (SOA) design and implementation

Web Development

  • HTML, JavaScript and CSS development
  • Integration of AJAX style JavaScript libraries including GWT, JQuery and ExtJS
  • Integration of Adobe Flash and Flex components

Automated Testing Strategies

  • Introduction of tools like JUnit and Sellenium to teams that currently do not do any automated testing
  • Integration of tests into automated build scripts and generation of metrics
  • Static analysis of codebase quality

Mobile Development

  • iPhone application design and development, specializing in integration to JavaEE based back ends
  • Web based mobile development

Social Media Strategy

  • Specializing in small to medium business that do not have dedicated in house Social Media resources
  • Evaluation of current Social Media presence
  • Recommendations for Social Media platforms based on particular business needs and goals
  • Evaluation of Location based services in relation to business needs and goals

Once again, to discuss your needs and to find out how I can help you, please contact me by phone on +1.650.336.5877, by email at craig@craigsdickson.com, or simply use this Contact form. If you would like more detailed information regarding my experience and qualifications, you can download a current copy of my professional resume from this page.

Subversion Best Practices Webcast

Posted in: Software Development Best Practices

CollabNet is sponsoring a webcast tomorrow entitled Subversion Best Practices: Maximizing Productivity.

You can register to attend here:

Twitter Recap for Week Ending 2009-06-08

Posted in: Social Networking
  • Bad sign for attendence @ #javaone. Keynote hall set up much smaller than previous years, definitely fewer seats #
  • Sitting in #communityone keynote session #
  • Wondering if physical disaster recover sites should now be replaced with cloud services #
  • First technical session of the week – Taking Advantage Of Subversion’s New Features #
  • Family Blog Update: insert witty fork pun here… http://bit.ly/b28K3 #
  • 2nd session of the day “Test Your Product On Multiple Machines in Parallel with Hudson” #communityone #
  • @chungsean welcome to #javaone sir #
  • Sitting in “Community Equity: Social Value System for Social Network” #communityone #
  • Just arrived @ pavillion reception for #communityone #
  • @alicia_s is it really small? Stupid fat hobbit #
  • Following semi-naked marching band to next party @ #communityone #
  • @alicia_s we’re talking about whatever you want to talk about #
  • Frankie says relax at #communityone party #
  • @srabon having an OK time. I am carrying some flu symptoms, so taking it easy to make sure I last the whole week. in reply to srabon #
  • Need one more person to use me as a refererence for #javaone registration to get the Flip. Earn yourself some good karma points – W1302019 #
  • In #javaone opening keynote, waiting for it to start, same DJ as last year #
  • Grey foggy morning in SF, will only get worse if Ellison shows up at the #javaone keynote #
  • Some McNealy and no Elison so far. Oh and I caught on on t-shirt. Good so far, #javaone #
  • I spoke too soon, Elison on stage now. ;( #javaone #
  • Elison was doing ok until he dissed AJAX – wrong room for that statement. #javaone #
  • In 2nd tech session of the day already at #javaone. This one on Amazon EC2. Also saw the one on OpenESB and BPEL. #
  • Is #OpenSolaris the product with the most swag and the least number of users at #javaone? Seriously, I do not get it. #
  • Watching JBoss mini-talk on there new ESB in the pavillion #
  • Thanks to @abridgwater for inviting me to the Press/Analyst Reception tonight. Cheers mate. #javaone #
  • Heading to the Java Community Process party at the Intercontinental for more #javaone fun #
  • Family Blog Update: cute of the day… http://bit.ly/PxdvC #
  • Mashed Potato Martinis at the JCP party! #javaone #
  • In a lab at #javaone about building social apps. using Zembly – same tool that @briankous demoed to the Behr team last Friday. #
  • In Joshua Bloch’s Effective Java talk for about the 5th year straight. #javaone #
  • In HtmlUnit session w/ @briankous at #javaone #
  • @briankous the jboss party is tomorrow night @ jillian’s, not tonight. how about a team dinner instead? in reply to briankous #
  • Netflix just sent me Weeds: Season 4: Disc 1 #
  • team dinner @ Magnolia, 1398 Haight St (Haight @ Masonic) 7:45pm – meet in lobby of my hotel 7:30pm to share taxi, or see you there #
  • Having dinner w/ @briankous @chungsean @michaelpallas and @tshumaker @godfather #
  • BTW, what kind of douche uses @godfather as their Twitter handle? Freakin’ Vito #
  • Sitting in a restaurant on Haight St in San Francisco and they are playing The Grateful Dead – is that just gratuitous? #
  • #JavaOne After Dark moved to the Marriott (4th & MIssion) because of probable bad weather tomorrow (actually later today really) #
  • RT @ABridgwater: Adrian on ZDNet.co.uk “The view from the floor at #JavaOne” http://bit.ly/3gb6d #
  • Urgh, the OpenSSO lab I am in is full of problems. #javaone #
  • FYI, if your English is not so good, strapping on a mic. and yelling and speaking really fast is not going to help the situation. #javaone #
  • #JBoss Party is starting. Free beer and a front row seat to watch the Lakers on a 20ft screen. I love Java. #javaone #
  • Damn, @briankous just broke a beer glass. Half a beer and we are going to have to cut him off already. #javaone the corruptor of innocents #
  • @gorkeyv are you high? #
  • @chungsean and I have moved on to the After Dark Party @ the Marriott #
  • I am watching the original lead singer of Toto sing Africa. i think I have slipped into a totally awesome alternate dimension @ #javaone #
  • @gorkeyv since when do you get so sticky over the Lakers? #
  • If there is any actual original member of Skynyrd on stage, is it OK to scream for Free Bird? #
  • I just saw any original member of Skynyrd play a 10:30 version of Free Bird – all bets are off for the rest of the night. Fuck yeah! #
  • Last keynote at possibly the last #JavaOne has just started – probably a few teary eyes in the room by the end I expect #
  • Today’s #javaone keynote, no emotion expressed, no acknowledgment of the end of JavaOne in this form, and also no “see you next year”. #
  • 2nd to last #javaone session about to start. Hopefully Mr Galbraith will be as interesting as usual and will keep me awake #
  • #javaone we are off to on on good start – Ben just slammed SAP user interface :) #
  • @jazzlifejunkie and if that all goes well, red eyes in the morning #
  • Beer Log: Dogfish Head 90 Minute IPA #
  • #Beer Log: Rogue – St Rogue Dry Hopped Red Ale #
  • @jazzlifejunkie touche sir #
  • #Beer Log: Rogue – Hazelnut Brown #
  • #Beer Log: Rogue – Anniversary Charlie – Dry Hopped American Strong Ale #
  • #Beer Log: Moylan’s – Hopsickle Imperial Ale – Triple IPA #
  • Family Blog Update: He’s coming home today… http://bit.ly/Dnuoo #
  • @gorkeyv thanks for the balanced well thought out reviews. you realize that it is #apple that has cult like followers , not #palm right? in reply to gorkeyv #
  • Maybe that should be the #pre tag line “Guaranteed to be really a lot like an #iIPhone since we used the same people” #
  • Adelaide Crows def. Essendon Bombers, 130 to 114 #
  • Family Blog Update: Back From San Francsico http://bit.ly/bZJhT #
  • Family Blog Update: Birthday Present http://bit.ly/Om85e #
  • Family Blog Update: Certified : Totally Nerdy http://bit.ly/sc7nF #
  • Family Blog Update: Are You Going To San Francisco? http://bit.ly/rAjbc #
  • Family Blog Update: Fog In San Francsico? http://bit.ly/2A6nBL #
  • Forgot my camera cable. Finally able to post my #javaone photos. http://bit.ly/KjZTE #
  • Everyone expects the new #iPhone to be announced tomorrow at WWDC, but will it also be available in stores tomorrow? http://bit.ly/t1U6e #
  • Family Blog Update: Stayin’ In Touch http://bit.ly/gyyGb #

The Subversion Chronicles – log

Posted in: Software Development Best Practices

The log command can display the commit messages associated with the revisions of resources.

General Form
Get log information for a resource(s) that are in the local Working Copy.

svn log [PATH]

Get log information for a resource in a repository.

svn log URL[@REV]

Usage Example 1
Get the log information for all resources in the Working Copy.

$ svn log
r42 | releasemgr | 2009-05-13 13:25:51 -0700 (Wed, 13 May 2009) | 1 line

Commit message
r40 | cdickson | 2009-05-13 13:23:18 -0700 (Wed, 13 May 2009) | 1 line

Commit message
. . .
r2 | cdickson | 2009-04-18 11:34:29 -0700 (Sat, 18 Apr 2009) | 1 line

Initial files for new project
r1 | cdickson | 2009-04-17 16:41:07 -0700 (Fri, 17 Apr 2009) | 1 line

Creating basic project structure

Usage Example 2
Get the log information for the file File1.txt that is in the current directory, which is part of a Working Copy.

$ svn log File1.txt
r42 | releasemgr | 2009-05-13 13:25:51 -0700 (Wed, 13 May 2009) | 1 line

Commit message
r40 | cdickson | 2009-05-13 13:23:18 -0700 (Wed, 13 May 2009) | 1 line

Commit message

r4 | cdickson | 2009-04-20 16:59:55 -0700 (Mon, 20 Apr 2009) | 1 line

Feature X Implementation
r2 | cdickson | 2009-04-18 11:34:29 -0700 (Sat, 18 Apr 2009) | 1 line

Initial files for new project

Notice that there is no revision 1 for File1.txt, because that resource was not changed as part of that revision.

Usage Example 3
Get the log information for the file File1.txt that is in a repository but there is no local Working Copy.

$ svn log http://mydomain/repos/test/exampleproject/trunk/File1.txt
r42 | releasemgr | 2009-05-13 13:25:51 -0700 (Wed, 13 May 2009) | 1 line

Commit message
r40 | cdickson | 2009-05-13 13:23:18 -0700 (Wed, 13 May 2009) | 1 line

Commit message

r4 | cdickson | 2009-04-20 16:59:55 -0700 (Mon, 20 Apr 2009) | 1 line

Feature X Implementation
r2 | cdickson | 2009-04-18 11:34:29 -0700 (Sat, 18 Apr 2009) | 1 line

Initial files for new project

The Subversion Chronicles – add

Posted in: Software Development Best Practices

The add command allows a client to schedule resources in their local Working Copy to be added to the repository as part of a future commit – until a resource that has been marked to be added to the repository has actually been committed to the repository, other users will not be able to see it.

General Form

svn add [OPTIONS] PATH

Example Usage 1
Add the file File1.txt in the current directory to the repository.

svn add File1.txt

Example Usage 2
Add the directory subdir1 and all of its contents recursively to the repository.

svn add subdir1

The default behavior for directories is to add the directory and everything recursively below them.

Example Usage 3
Add everything below the current directory to the repository.

svn add *

Example Usage 4
Add the files File1.txt and File2.txt to the repository, but nothing else in the current directory.

svn add File1.txt File2.txt

The Subversion Chronicles – checkout

Posted in: Software Development Best Practices

The checkout command is used to copy a set of resources from a repository to your local file system, creating a Working Copy where you can make your changes and then commit those changes back to the repository. Until you commit the changes in your Working Copy to the repository, no one else will be able to see them.

General Form

svn checkout [OPTIONS] URL [PATH]

You must supply a URL argument to tell Subversion what you want to check out from the repository. By default the checkout command acts recursively and checks out everything under that URL, including sub-directories. Also by default, the checkout command will check out the latest revision of each object under that URL.

It is not necessary to supply a PATH argument; the last directory name in the URL will be used to create new sub-directory under the current local directory and the results of the checkout will be placed in that sub-directory.

If you do supply a PATH argument everything under the URL will be placed in that directory. The PATH does not need to exist before executing the checkout command.

Example Usage 1
Checkout the trunk of the exampleproject project from the repository, and create the local Working Copy inside of a sub-directory of the current directory called trunk:

svn checkout http://mydomain/test/exampleproject/trunk

Example Usage 2
Checkout a branch of the exampleproject project, and create the local Working Copy inside of a sub-directory called bugfixes-1.0.x :

svn checkout http://mydomain/test/exampleproject/branches/1.0.x bugfixes-1.0.x

Example Usage 3
Checkout all of the resources under the trunk of the exampleproject project as they were in revision 22:

svn checkout -r22 http://mydomain/test/exampleproject/trunk

The Subversion Chronicles – mkdir

Posted in: Software Development Best Practices

The mkdir command has two forms and both are useful in different situations.

The first form uses a URL argument and operates directly on a repository. This is useful when you do not have local Working Copy, like when first creating a new project in a repository that is laid out in the multi-project form (see this post for more info). When using the multi-project layout for a repository, you need to create at least 2 directories for each project – the first being at the root of the repository and should be based on the project name (for clarity), and then a 2nd directory that is a child of the first directory called trunk.

The second form of the mkdir command uses a local directory name argument and operates on the local Working Copy only. Using this version of the mkdir command is a shortcut for using your operating system’s equivalent command to create a new directory and then using the Subversion add command to add the newly created directory to Subversion. The Subversion mkdir command does these two steps in one command.

General Form
The URL form is.

svn mkdir [OPTIONS] URL

The local directory form:

svn mkdir [OPTIONS] PATH

Example Usage 1
Create a directory on the server, in the root of the repository, to house a brand new project, and then create a trunk directory on the server, ready to add the code for a brand new project:

svn mkdir -m “Commit Message” http://svn.mydomain.com/repos/test/exampleproject

svn mkdir -m “Commit Message” http://svn.mydomain.com/repos/test/exampleproject/trunk

Example Usage 2
Do the same thing as the previous example, but do it in one command by passing the --parents option, that tells Subversion to create any intermediate directories that do not already exist.

svn mkdir -m “Commit Message” –parents http://svn.mydomain.com/repos/test/exampleproject/trunk

Example Usage 3
Create a new sub-directory in the current local directory (which is part of a Working Copy) and mark it to be added to the repository the next time a Subversion commit command is performed.

svn mkdir mylocaldir

The Subversion Chronicles – import

Posted in: Software Development Best Practices

The import command allows you to add a single file or a whole directory tree into a Subversion repository for the first time.

This situation however should be the exception, not the rule. Possible exceptions are – perhaps you are taking over a project that never used a code repository before, or you are migrating to Subversion from another repository or you are getting code dumps from a 3rd party vendor.

For a greenfield project you should never need to use the import command, your code should always be in a Subversion repository from the start of the project – NO EXCEPTIONS.

General Form

svn import [OPTIONS] [PATH] URL

If PATH is omitted, then the current local directory is used. Also keep in mind that if you do specify a PATH, no part of the path will be created in the repository. Only the contents of the directory (including sub-directories) specified by PATH will be added to the repository at the URL you supply.

Example Usage 1
To import the contents of the current local directory (including sub-directories) into Subversion:

svn import -m “Example Message” http://mydomain/test/exampleproject/trunk

Example Usage 2
To import the contents of a specific local directory (including sub-directories) into Subversion:

svn import -m “Example Message” /path/to/local/dir http://mydomain/test/exampleproject/trunk

The Subversion Chronicles – Properties

Posted in: Software Development Best Practices

Subversion supports the association of meta-data, called properties, with assets within the repository. Properties can be added to files, directories and revisions. A property consists of a name (a string) and a value, which can be a string or a binary value.

Properties on files and directories are versioned just like the assets that they are attached too. So if you change a property value, or add or delete a property, you have to commit that to the repository and it will cause a new revision to be created. You can thus retrieve the value of a property as it was on a file or directory at a specific revision number.

Because revisions in Subversion are a static resource (ie. they do not change over time), properties associated with them are not versioned. If you add, edit or delete a property, the history for that property is lost.

Property names beginning with the string svn: are reserved for the system and should not be used to store user properties. Some of the special system properties include:

  • svn:log – the message associate with the committed revision
  • svn:mime-type – the mime-type to be associated with the file that the property is attached too
  • svn:executable – indicates if the executable status of a file should be preserved on *nix systems (useful for scripts being stored in the repository)
  • svn:ignore – when attached to a directory, sets a list of files and subdirectories to be ignored by Subversion