Engage

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.

Apple MacBook Pro Hard Drive Upgrade

Posted in: System Administration

In a previous post (Apple MacBook Pro Memory Upgrade) I detailed the reasoning behind choosing to perform some upgrades on the MacBook Pros in my family instead of buying new ones. In this post I will go over the process needed to upgrade the hard drives to give us a little more room to move for the next couple of years and hopefully some performance improvements as well.
Continue reading »

Coding Standards – Quality From The Ground Up

Posted in: Software Development Best Practices

Coding styles are THE religious debate of the Software Engineering industry. Everyone has an opinion, but no one has an iron clad argument as to why their ideas are better than someone else’s.

It doesn’t matter what language you write your code in or what company your work for or even what open source project you contribute too, the topic of coding styles will sooner or later raise its head. The debate can range from the banal, like which line the curly brace goes on, to the overly subjective, like how to name variables.

In the end most of the decision points are pretty subjective and it is somewhat irrelevant what you choose, as long as everyone agrees and you are consistent. But don’t be mistaken, a consistent coding style is an important consideration on any project, from the solo developer to the multi-national team.
Continue reading »

Should You Use Recruiters?

Posted in: Consulting & Entrepreneurship, Software Development Team Leadership

There has been a good debate on the Los Angeles Java Users Group mailing list this week about working with recruiters, both from the job seeker side and also from the employer side.

In my career I have worked with recruiters on both sides of the fence and I think the argument boils down to the same issue no matter which side you are on – working with good recruiters is a good idea and working with bad recruiters is a bad idea. Apologies if you were expecting something more earth shattering!

Many recruiting houses are simply glorified keyword matching services and they all function almost identically. If you visit their offices you will find a large room with two large tables, one designated for “Hardware” and one for “Software”. All the folks around the Hardware table are working to fill Hardware related positions and the Software folks are doing the same for Software positions. There will be 4 to 8 folks at each table, each with a computer and a phone permanently strapped to their head. At the end of each table will be a large white board with the “Hot Jobs” listed with the keywords to try and match, plus salary and commission rate (not surprisingly the higher the salary and commission rate, the hotter the job miraculously becomes). The main purpose of the folks at the table is to process the highest number of resumes as is humanly possible (from active job board postings, from their DB of past resumes etc.) and bring the resumes with the best keyword match to the top of the pile, then do a bare bones phone screening interview (ie. does the person actually exist) and then pass the pile of resumes off to the employer. The employer then has to process the resumes all over again, screen out 80% of them because while the keywords are there, there is an obvious problem elsewhere and then interview the other 20% to find out if any are even close. Most of the time you can achieve the same results as an employer by paying the fees to monster.com and doing the search yourself – it might even be quicker.

But as a job seeker you do need to be in contact with recruiters because many positions are never posted widely/publicly (at the request of the employer). In this scenario the employer is engaging the recruiter to get at their pool of contacts that are hopefully pre-screened etc., some of which may not even be in the active job market, but are known to the recruiter. This becomes increasingly true if the position being filled is higher up the corporate ladder (manger, director, VP etc). However, a bad recruiter will waste a lot of your time if you are not careful.

As a manager, these keyword matching recruiters are the bane of my existence and 50% of the reason I never answer my phone at work (the other 50% of the reason is software sales guys, but that is another post). The endless cold calls just trying to present me “a really exceptional candidate” they have found or “just wanting to know” if I have any open positions. These guys are really the sleazy used car salesmen of the IT industry.

As a job seeker it will be pretty obvious if you are working with one of these houses. Firstly if you ever get a phone call in response to a resume you submitted and it sounds like the person on the other end is sitting in a room full of people talking loudly, then they probably are. I have even been asked to hold the line when talking to one of these guys and while I was waiting I could hear another recruiter at the table talking to another candidate on their phone about the exact some position!

One of the other classic traits of these organizations is their incessant need to keep the job seeker and the employer at arms length from each other – the theory being that they need to control the communication stream so as the employer and the job seeker don’t reach their own agreement and the recruiter misses out on a commission. This is a symptom of the fact that the recruiter and the employer are not closely engaged with each other and do not have a strong working relationship. This also just hurts your ability to present the best of yourself to the employer. You are the person who knows your skill set and experience the best, and yet you are letting a recent high school graduate with 2-days in house training represent you. Another tactic is for these houses to take your resume and rebrand it with their logo and add their contact information and remove all of your own contact information. This involves a cut-and-paste from the resume you submitted and invariably ends up in a less than professional looking document. Just wait until one of these guys takes it upon themselves to actually edit the content of your resume “on your behalf” without asking you and you will very quickly realize that these guys are probably hurting rather than helping your job search.

Also, just be a little wary about the employer if they are using these kinds of companies. Its probably not a deal killer for you as the job seeker, but just pay close attention to what else your employer might not be paying close attention too.

But! There are good recruiters too, they are just a little harder to find.

I have worked with good recruiters on both sides of the fence as well. From an employer perspective a good recruiter who knows your industry and knows the local talent pool can be invaluable. They can help you shape the job description and salary of an open position to align it with what is happening in the rest of the industry and so attract the type of candidates you want. They can find candidates that are not in the active job market because they have built up a high quality contact list of candidates they have placed in the past or have met during prior searches etc.

These recruiters are usually smaller shops with a smaller focused recurring client base. Many work on a mix of retainer and actual placement fees, so they are not all about placing as many people as possible, they have an incentive to establish and keep long term relationships with employers by providing exceptional candidates.

From the job seeker side you will have to do your research to find these kinds of good recruiters. They probably won’t be posting hundreds of jobs on monster.com because they simply are not filling that many positions at one time. All of the ones I have dealt with in my job searches have found me, not the other way around. When they call you, the background of their side of the conversation will be quiet, because they are not working in the bull pen, they actually have an office! They will likely want to talk to you for a while and have an actual conversation. They will want to determine if you are an all around good candidate, not just a good keyword match.

If you are presented to an employer by one of these trusted recruiters, you are going to be going into that interview with a lot of credibility already on your side. Plus you already know you are one of just a few folks that are going to be interviewed, because that is what the employer is paying for – to not have to do hundreds of interviews.

So in the end, a good recruiter is someone you want to be in contact with, no matter if you are an employer or a job seeker. A bad recruiter on the other hand can waste a lot of your time and also actually hurt your chances of finding a job or filling your position.

Get Your Firefox Add-Ons Under Control

Posted in: Software Development Best Practices

Firefox add-ons can be hard to manage – for me, mostly in terms of finding quality add-ons that do something you find useful.

There is a new feature available called Add-on Collections. The name is helpfully descriptive – basically people can now group related add-ons together, give that group (or “collection” if you will) a name and list it on the site. So if you are on every social network, there is a collection of all of the add-ons that allow you to stay connected with those networks from the browser. If you like to travel, there is a collection that pulls together all of the add-ons that will help you do your thing. You get the idea.

Read more about Firefox Add-on Collections here.

So, if you consider yourself a web developer of any kind, please take my recommendation and install the Web Developer’s Toolkit collection right now, today, without delay. Hopefully you are already using Firebug, but there are a bunch of other add-ons in this collection that you might not be using already and you really should be.

And if I can provide one more piece of advice today – learn to use the tools you have available to you. Every day I see software developers doing things the hard way, particularly when it comes to debugging issues. There is a cornucopia of tools out there to help you do your job and if you know how to use them and you know what issues they will help you solve, you will instantly become a better developer – more efficient, more productive, more reliable, more dependable – perhaps, dare I say it, a craftsman.

Imagine an Electrician who carried around a whole toolbox of tools, but only knows how to use a screwdriver and a hammer – he can probably complete most tasks with those two tools, but he is probably going to disappoint his customers and not make much money as a contractor.

So, in summary, get some decent add-ons for Firefox to help you be a better Web Developer, and then actually take the time to learn how to use them. Easy.

Twitter Recap for Week Ending 2009-05-24

Posted in: Social Networking
  • Family Blog Update: Subscribe! http://bit.ly/2M6nX #
  • First beta of Adium 1.4 with Twitter support just released. http://bit.ly/XkhAo #
  • Netflix just sent me Australia #
  • New Hoodoo Gurus album rumored for September. Sweet! #
  • RT @alleyinsider: Palm Pre Launching June 6 For $199 $PALM $S by @fromedome http://bit.ly/AhzGK – should make @gorkeyv happy #
  • Just added myself to the http://wefollow.com twitter directory under: #software #agile #j #
  • Just felt another quake here in OC. Confirmed with other people in the office, but not seeing much on the USGS site. #
  • OK, USGS now saying 4.1 magnitude and looks like the exact same location as the one on Sunday night. http://bit.ly/8nyvP #
  • @JonathanGiles there has been wireless in the last few years, but it can be spotty and usually non-functional the first morning in reply to JonathanGiles #
  • Go #Lakers! Ok, even I didn’t believe that. #
  • Netflix just sent me The X-Files: I Want to Believe #
  • Don’t miss Sun’s going away party at #JavaOne. Make sure Oracle gets the right message. http://bit.ly/QcLX2 #
  • D’oh, My Nam Is Earl just got cancelled. http://bit.ly/SxuL3 #
  • Testing out ping.fm #
  • 2nd Test of #Ping.fm #
  • Trying to figure out how to control all of my various content streams and get them to the right people without drowning anyone. #
  • Testing ping.fm from Blackberry #
  • #JCP Party at #JavaOnehttp://bit.ly/QJtMt #
  • #Hulu’s first live-streaming concert = Dave Matthews Band on June 1st. http://ping.fm/ElXz2 #
  • According to this site http://ping.fm/c2hB8 my “Power Animal” is a Honey Badger! Can this be true?? #
  • Just saw StarTrek. Total man-crush on James T. Kirk #
  • Internet connection is down … is suicide really painless as the opening credits of MASH taught me? #
  • Internet connection retored finally. Suicide averted. Verizon blows! #
  • Rolled 7 games this morning, averaged 151, not bad. And then breakfast in central park with wife and little one. God bless long weekends. #
  • @jazzlifejunkie What % of the latest Jonas Bros tour are you getting in exchange for Kalia? Just curious. in reply to jazzlifejunkie #

Installing JBoss Portal

Posted in: Enterprise Java, System Administration

Today I finished a successful fresh install of JBoss Portal. Below is the process I followed.

Versions

  • JBoss Portal — 2.7.2 (bundled with JBoss AS 4.2.3)
  • JavaSE — 5.0 Update 19
  • MySQL — 5.1.34 (Community Edition)
  • Linux Flavor — Red Hat Enterprise Linux Server 5.2 (64 bit)

Step 1 – Downloads

  1. I grabbed the Java installer from here http://java.sun.com/javase/downloads/index_jdk5.jsp. The downloaded file was called jdk-1_5_0_19-linux-amd64-rpm.bin
  2. I grabbed the Portal binaries from here http://www.jboss.org/jbossportal/download/index.html. The downloaded file was called jboss-portal-2.7.2-bundled.zip
  3. I grabbed the MySQL binary from here http://dev.mysql.com/downloads/mysql/5.1.html#linux-rhel5-x86-64bit-rpms. I downloaded the server (MySQL-server-community-5.1.34-0.rhel5.x86_64.rpm) and the client (MySQL-client-community-5.1.34-0.rhel5.x86_64.rpm) RPMs
  4. I grabbed the MySQL JDBC driver from this page http://dev.mysql.com/downloads/connector/j/5.1.html. The downloaded file was called mysql-connector-java-5.1.7.tar.gz

Step 2 – Install JavaSE

  1. I made the installer executable

    $ chmod +x jdk-1_5_0_19-linux-amd64-rpm.bin
  2. Then executed the installer

    $ ./jdk-1_5_0_19-linux-amd64-rpm.bin
  3. I paged through endless legal boilerplate and accepted it by typing yes and hitting enter (hopefully I didn’t sell my soul)
  4. The installer extracted the RPM file and installed it.
    I double checked the package was installed by querying the RPM database:

    $ rpm -q jdk
    jdk-1.5.0_19-fcs
    $

    This RPM installed all of the files into /usr/java/jdk1.5.0_19

  5. I edited the /etc/profile file to make the JAVA_HOME environment variable and Java binaries available to everyone on the box. I added the following lines to achieve this

    export JAVA_HOME=/usr/java/jdk1.5.0_19
    export PATH=$PATH:$JAVA_HOME/bin
  6. I double checked it all worked

    $ source /etc/profile
    $ echo $JAVA_HOME
    /usr/java/jdk1.5.0_19
    $

Step 3 – Deploy Portal Binaries

  1. I am never sure the correct place in a Linux distribution to put 3rd party stuff, but I went with /usr/local this time

    $ pwd
    /usr/local
    $ unzip ~/jboss-portal-2.7.2-bundled.zip

    This created the directory /usr/local/jboss-portal-2.7.2

  2. Once again, I edited the /etc/profile file to add the JBoss environment to it by adding the following line

    export JBOSS_HOME=/usr/local/jboss-portal-2.7.2

    Then I tested it

    $ source /etc/profile
    $ echo $JBOSS_HOME
    /usr/local/jboss-portal-2.7.2
    $

Step 4 – Change Default Port (Optional)
For my install I have no need to run Apache in front of JBoss, so I want JBoss to listen (or more correctly, have Tomcat listen) directly on port 80 – by default it listens on 8080.

  1. I opened the $JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml file, (which is a standard Tomcat configuration file) in an editor.
  2. I changed the port of the HTTP connector to 80 (you can find it by searching for 8080). I also change the HTTPS connector to use 443 (you can find this one by searching for 8443). I then changed the value of the redirectPort attribute of the HTTP connector to match.

Step 5 – Change Portal to be the root web app. (Optional)
For my install, the Portal will be the main application on the server, so I want it to be accessible from the root of the server, and not have to enter the portal context path all of the time.

  1. First, I disabled the current root application

    $ mv $JBOSS_HOME/server/default/deploy/jboss-web.deployer/ROOT.war $JBOSS_HOME/server/default/deploy/jboss-web.deployer/ROOT.war.old
  2. I opened the $JBOSS_HOME/server/default/deploy/jboss-portal.sar/portal-server.war/WEB-INF/jboss-web.xml file, in an editor.
  3. I found the <context -root> tag and changed the vallue to be just a single forward slash character.

    <context-root>/</context-root>
  4. I saved the file and exited the editor.

Step 6 – Install MySQL
By default, JBoss Portal will use a Hypersonic database for all of its internal data. My environment will be a production environment, so I want to use something more robust.

  1. I Installed the MySQL binaries by using a normal RPM install

    $ rpm -ivh MySQL-server-community-5.1.34-0.rhel5.x86_64.rpm
    $ rpm -ivh MySQL-client-community-5.1.34-0.rhel5.x86_64.rpm

    The installation process started the mysqld service automatically. It also installed MySQL as a service automatically.

  2. I checked that it was running

    $ mysqladmin version
    mysqladmin Ver 8.42 Distrib 5.1.34, for unknown-linux-gnu on x86_64
    Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL license

    Server version 5.1.34-community
    Protocol version 10
    Connection Localhost via UNIX socket
    UNIX socket /var/lib/mysql/mysql.sock
    Uptime: 5 hours 29 min 16 sec

    Threads: 1 Questions: 5 Slow queries: 0 Opens: 15 Flush tables: 1 Open tables: 8 Queries per second avg: 0.0
    $

There are a lot of things you might want to do to a base MySQL install before putting it into production, but that is beyond the scope of this document. I would start with this link for some of the things you need to consider: http://dev.mysql.com/doc/refman/5.1/en/unix-post-installation.html

Step 7 – Point the Portal at MySQL

  1. I connected to the MySQL server running on localhost, as the current user (which happened to be root in my case).

    $ mysql
    Welcome to the MySQL monitor. Commands end with ; or g.
    Your MySQL connection id is 15
    Server version: 5.1.34-community MySQL Community Server (GPL)

    Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the current input statement.

    mysql>

  2. I created a Database instance for the Portal to use

    mysql> CREATE DATABASE jbossportal;
    Query OK, 1 row affected (0.00 sec)
  3. Then I created a user for the Portal to connect as

    mysql> CREATE USER ‘portal’@'localhost’ IDENTIFIED BY ‘portalpassword’;
    Query OK, 0 rows affected (0.00 sec)
  4. Then I granted all privileges for the jbossportal Database to the user I just created

    mysql> GRANT ALL ON jbossportal.* TO ‘portal’@'localhost’;
    Query OK, 0 rows affected (0.00 sec)

    At this point I quit the MySQL interpreter.

  5. Next, I untared the MySQL JDBC driver

    $ tar zxvf mysql-connector-java-5.1.7.tar.gz
  6. Then I copied the driver jar file to the $JBOSS_HOME/server/default/lib/ directory

    $ cp mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jar $JBOSS_HOME/server/default/lib
  7. Next I disabled the original Hypersonic datasource

    $ mv $JBOSS_HOME/server/default/deploy/portal-hsqldb-ds.xml $JBOSS_HOME/server/default/deploy/portal-hsqldb-ds.xml.bak
  8. Then I deployed a datasource descriptor for MySQL. There is an example datasource descriptor in the JBoss Portal binary distribution

    $ cp $JBOSS_HOME/setup/portal-mysql5-ds.xml $JBOSS_HOME/server/default/deploy

    I double checked the username, password and database name settings in the file were correct

Step 9 – Check Your Work
Now I checked my handy work before moving on to the next step.

  1. I made the JBoss run script executable
    $ chmod +x $JBOSS_HOME/bin/run.sh
  2. Next I ran the script
    $ $JBOSS_HOME/bin/run.sh

    It will take a while but, eventually the server will finish booting.

  3. Now I hit the basic JBoss AS home page at this URL: http://myserver/ and made sure it looked OK.
  4. Then I hit the JBoss Portal page at this URL: http://myserver/portal and checked it as well.

If you have trouble accessing your URL, there could be an issue with the address that JBoss is listening on. This can be caused by various issues with your server setup (hostname, hosts file etc.). One quick thing to try is to pass -b 0.0.0.0 as an argument to the run.sh script – this tells JBoss to listen on all addresses, which might help you figure out where the issue is.

Step 10 – Setup JBoss Portal as a Service

  1. I opened the file $JBOSS_HOME/bin/jboss_init_redhat.sh in an editor.
  2. First I double checked the environment variables set at the top of the file (particularly JBOSS_HOME and JBOSS_USER) were correct.
  3. Then at the very top of the file, below the shebang line, I added the following 3 lines to make the script compatible with the chkconfig system

    # Comments to support chkconfig
    # chkconfig: 2345 80 40
    # description: JBoss Portal

    I saved the file and exited the editor.

  4. Then I made it executable

    $ chmod +x $JBOSS_HOME/bin/jboss_init_redhat.sh
  5. Next I linked the script into the init.d directory

    $ ln -s $JBOSS_HOME/bin/jboss_init_redhat.sh /etc/init.d/jboss
  6. Then I ran chkconfig to register the script for the correct run levels

    $ chkconfig –add jboss
  7. I then started the server by hand to double check my work and also just to get the server up and running without having to do a reboot

    $ service jboss start
  8. Then I hit the JBoss Portal page once again and checked that it came up properly

Step 11 – Have A Beer
It is always appropriate to reward yourself with a craft, micro-brewed or home-brewed beer!

The Subversion Chronicles – log

Posted in: Software Development Best Practices

Discussion
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

Discussion
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

Discussion
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