<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Rob Sullivan&apos;s Weblog</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/" />
    <link rel="self" type="application/atom+xml" href="http://www.jandrconsult.com/blogs/rob/atom.xml" />
   <id>tag:www.jandrconsult.com,2007:/blogs/rob//5</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5" title="Rob Sullivan's Weblog" />
    <updated>2007-01-03T17:20:15Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.2</generator>

<entry>
    <title>The 12 Days of Configuration Management</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2006/12/the_12_days_of.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=85" title="The 12 Days of Configuration Management" />
    <id>tag:www.jandrconsult.com,2006:/blogs/rob//5.85</id>

    <published>2006-12-21T15:15:05Z</published>
    <updated>2007-01-03T17:20:15Z</updated>

    <summary>I’m dreaming of an open-source repository Just like the one’s I used to know. (only better) May your files be compact and properly tagged And may all your repositories be free. (as in beer)...</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="Technical Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p><em>I’m dreaming of an open-source repository<br />
Just like the one’s I used to know. (only better)<br />
May your files be compact and properly tagged<br />
And may all your repositories be free. (as in beer)</em></p>]]>
        <![CDATA[<p>Our LIMS consulting team has gone through a long, evolving process in how we manage our files.  To share our experiences with you during this Holiday Season, I thought it appropriate to use a ‘12 Days of Christmas’ analogy where each day can be loosely associated with one year in the timeline of our team.  [Our team has only been together for 8 or 9 years, so this will really be the 9 Days of Christmas - or rather the 9 Days of Configuration Management (CM)]</p>

<p><br />
<em><strong>On the First day of CM, my true boss gave to me: a hard drive and a keyboard</strong></em></p>

<p>In the days of old, most of the team simply stored files on their personal hard drives and these files were shared with others on demand when the need arose.  As you might imagine, this lead to many problems with files being lost and other such atrocities.</p>

<p><br />
<em><strong>On the Second day of CM, my true boss gave to me: a shared network drive</strong></em></p>

<p>In more recent years past, we stored files on shared file systems using simple network drives.  This was still inadequate as there was little control over who did what. </p>

<p><br />
<em><strong>On the Third day of CM, my true boss gave to me: Groove</strong></em></p>

<p>Later, we elected to use peer-to-peer software to improve on issues such as overwriting each other’s files or forgetting to copy our files to the network server.  <a href="http://www.groove.net">Groove</a> remains to this day one of the most valuable tools our team uses.  But Groove is certainly not the ideal tool for maintaining software versions.  (wow, a whole paragraph on Groove and not a single snide remark about Microsoft <a href="http://news.com.com/Microsoft+to+buy+Groove+Networks/2100-1014_3-5608063.html">[groove aquisition]</a>)</p>

<p><br />
<em><strong>On the Fourth day of CM, my true boss gave to me: Concurrent Versions System</strong></em></p>

<p>The first quantum leap came in late 2002 when we acquired the first key component in our Source Configuration Management strategy: the version control system <a href="http://www.nongnu.org/cvs">CVS</a>.  We used CVS exclusively for several years and are still using it today.  Although a drastic improvement over shared drives or non-versioning solutions, CVS had some drawbacks.  Most annoyingly for our team, CVS did not allow files or folders to be renamed.  Further, CVS did a poor job of managing binary files (e.g. Oracle Forms/Reports files, MS Word documents, etc) – every time a binary file is checked in, the entire new version of the file is stored in the repository.  It is not uncommon for us to have 50 or more versions of an Oracle Form or Report, each version being 10 megabytes or greater in size.  This has lead to high disk usage demands on our repository servers.  These and several other downsides led us to search for a solution better than CVS.</p>

<p><br />
<em><strong>On the Seventh day of CM, my true boss gave to me: Subversion</strong></em></p>

<p>We thought we had seen the star in the East when two team members simultaneously and independently stumbled across a relatively new project that was beginning to gain popularity in the software world.  The <a href="http://subversion.tigris.org">Subversion project</a> made great effort to proclaim their goal: “to build a version control system that is a compelling replacement for CVS”.  We decided to test Subversion out on internal projects before committing to use it for production/customer projects.</p>

<p>Subversion did prove to be an improvement over CVS and addressed many of our gripes with CVS – I even wrote about our anticipated use of Subversion in previous <a href="http://www.jandrconsult.com/blogs/rob/archives/2005/02/version_control.shtml">blogs</a>.  So we began making plans to convert our customer repositories over to CVS.  However, during our investigation phase, we began to realize that while Subversion is great for many types of projects - such as .NET and other web-based projects or Java/C++ projects - it may not be as well suited for Oracle-based, validated LIMS projects.</p>

<p>We went to great lengths to try to squeeze Subversion into the mold of our LIMS projects.  But in the end, we could not make it fit.  I suppose it is possible that we were stuck in doing something the same way for so long that we could see it no other way.  But, I believe we gave our best effort to be open-minded about changing our process to be more closely aligned with the Subversion paradigm, and we still came up short.</p>

<p>The biggest problem we had with Subversion was the way it versions the entire repository instead of individual files.  In CVS, we had come to rely on modifying, versioning and delivering single files or groups of files where each file had a precise version.  Although Subversion does support the idea of a “version” for each file, the concept is more of a side-effect – versions in Subversion fundamentally apply to the whole repository not to individual files.  We could find no reasonable way in Subversion to apply “tags” to individual file versions or to be able to pick and choose precise versions of ad-hoc, individual files when creating builds.</p>

<p>After a long evaluation period we slowly came to the conclusion that Subversion was not the answer for our customer projects.  What we really wanted was something that worked like CVS but fixed the things we didn’t like.</p>

<p><br />
<em><strong>On the Ninth day of CM, my true boss gave to me: CVSNT</strong></em></p>

<p>T’was the night before Christmas and all through the company, not a team member was stirring, not even an intern.  Suddenly, Old Saint Jeffrey dropped <a href="http://www.cvsnt.org">CVSNT</a> down the chimney.  The goal of the CVSNT project, as with Subversion, was to improve upon the flaws of CVS.  However, CVSNT differed from Subversion in that it started directly from the open-source CVS codebase and began to add new features that CVS lacked.</p>

<p>CVSNT supports the following features that are not supported by CVS but are important to our LIMS development team:</p>

<p>•	File and folder renames<br />
•	Efficient storage of binary files<br />
•	File level locking and Reserved Edits<br />
•	Ability to run the server on Windows<br />
•	Simpler setup and configuration of secure, remote access.</p>

<p>We have only been using CVSNT for a few months, but so far it appears to address our concerns with CVS and at the same time is readily compatible with the procedures in place on our LIMS projects.  Stated more festively, CVSNT brings all the Holiday cheer of open-source version control without the downsides of CVS which are often associated with the feeling that comes from a night of too much <a href="http://www.noelnoelnoel.com/recipes/glug.html">glug</a>.</p>

<p>I hope that this Holiday Season finds you and your LIMS project well.</p>]]>
    </content>
</entry>
<entry>
    <title>Java Stored Procedures in a LIMS Environment</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/05/java_stored_pro.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=56" title="Java Stored Procedures in a LIMS Environment" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.56</id>

    <published>2005-05-19T18:25:24Z</published>
    <updated>2005-09-25T18:12:21Z</updated>

    <summary>In this blog, we will discuss the benefits of using Java Stored Procedures in a LIMS environment. When Oracle 8i was released (yes, the rigors of validation dictate that many modern LIMS systems still use Oracle 8), one of its significant new features it offered over previous versions was the ability to embed and execute Java in the database. This gave the LIMS developer opportunities to write object-oriented code that provided both reusability and performance increases....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="LIMS Consulting" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>In this blog, we will discuss the benefits of using Java Stored Procedures in a LIMS environment.  When Oracle 8i was released (yes, the rigors of validation dictate that many modern LIMS systems still use Oracle 8), one of its significant new features it offered over previous versions was the ability to embed and execute Java in the database.  This gave the LIMS developer opportunities to write object-oriented code that provided both reusability and performance increases.</p>]]>
        <![CDATA[<p><em><strong>Overview of Java Stored Procedures</strong></em><br />
Java Stored Procedures allow for server-side programming in addition to the standard Oracle database language, PL/SQL.  While PL/SQL can only operate inside the database, Java code can be created for file-system applications but then also uploaded to the database to operate along side PL/SQL programs.  Through the use of JDBC, the Java code can access and manipulate the database; and through the use of special "wrapper" functions, PL/SQL code can directly call Java Stored Procedures.</p>

<p><strong><em>Benefits</em></strong><br />
One of the obvious benefits of Java is the code reusability it provides.  Generic Java classes can be created and used by many different systems.  In a LIMS system, a Java class can be created to perform basic utility functions - for example, a diagnostics system that provides error messaging and outputs the logical flow of your code.  This class can then be used by the client applications and GUIs you create and at the same time can be loaded into the database and accessed by all of your database code.</p>

<p>In addition to reusability, Java Stored Procedures can provide significant performance increases over PL/SQL code.  PL/SQL is rather slow when performing mathematical computations and string manipulations.  So when trying to achieve performance increases, Java Stored Procedures are well suited for numerically or computationally intensive tasks.</p>

<p><em><strong>Case Study</strong></em><br />
As an example of the performance benefits of Java Stored Procedures, we will look at a J&R Consulting client whose system was entirely written in PL/SQL.  Though the system met all of the User and Functional requirements of the LIMS, the system was unacceptably slow for all but the smallest tasks.  Executions of the system on moderate or large datasets would take anywhere from 15 seconds up to 30 minutes or more to complete.  And the end-users' client sessions were tied up during the processing, leading to a poor user experience.  The consultants at J&R ported the computationally intensive portion of the PL/SQL code to Java, allowing the remaining PL/SQL code to concentrate on what it is best at - database access.  This produced a system that worked as follows:</p>

<ul>
<li>Query data from the database (PL/SQL)</li>
<li>Manipulate strings of data and perform mathematical computations (Java)</li>
<li>Write computed values to the database (PL/SQL)</li>
</ul>

<p>The final system provided dramatic performance increases.  Executions that previously took 15 seconds now complete immediately and the 30+ minute executions now complete in about 10 seconds.  Needless to say, the users are much happier with the new system.</p>

<p><em><strong>Deploying Java Stored Procedures</strong></em><br />
If you are convinced that Java Stored Procedures can benefit your LIMS system, the following provides a brief overview of how to deploy Java Stored Procedures:</p>

<ul>
<li>Write and compile the Java code using your favorite IDE (or using your favorite text editor and the command line)</li>
<li>Use the Oracle-provided <strong>loadjava</strong> application to load the compiled Java bytecodes into the database</li>
<li>Create a special PL/SQL wrapper package to publish the Java Stored Procedure (this makes the Java Stored Procedure appear as a normal PL/SQL package to the rest of the code in the database)</li>
</ul>

<p>The next time you are designing a LIMS system or sub-system, consider how Java Stored Procedures can be used to your advantage or to the benefit of your customers.<br />
</p>]]>
    </content>
</entry>
<entry>
    <title>My Mac is Like a Temperature Gauge</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/05/my_mac_is_like.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=38" title="My Mac is Like a Temperature Gauge" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.38</id>

    <published>2005-05-03T02:49:23Z</published>
    <updated>2005-09-25T18:12:21Z</updated>

    <summary>A few years back I owned a 1998 Ford Mustang Cobra. Like all modern automobiles, it had a temperature gauge. But instead of reporting the engine’s temperature in a quantifiable value, the labels on the temperature gauge simply indicated Cold and Hot. And to make it worse, after a few minutes of running the engine, the needle would move to a certain point on the gauge and stay put until the Cobra was shut down. It didn’t matter if I was driving like Jen&apos;s granny or like the Little Old Lady from Pasadena - the needle on the gauge was always fixed a little to the right of center. I began to suspect that the gauge was defective and started distrusting it....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="General Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>A few years back I owned a <a href="http://www.kbb.com/kb/ki.dll/ke.kb.rp?kbb.FL;;FL069&34711;34711&11;Ford;1998%20Mustang&98mustang">1998 Ford Mustang Cobra</a>.  Like all modern automobiles, it had a temperature gauge.  But instead of reporting the engine’s temperature in a quantifiable value, the labels on the temperature gauge simply indicated Cold and Hot.  And to make it worse, after a few minutes of running the engine, the needle would move to a certain point on the gauge and stay put until the Cobra was shut down.  It didn’t matter if I was driving like Jen's granny or like the Little Old Lady from Pasadena - the needle on the gauge was always fixed a little to the right of center.  I began to suspect that the gauge was defective and started distrusting it.</p>]]>
        <![CDATA[<p>After some research on the interweb, I learned that the temperature gauge on the Cobra (along with most other modern Ford vehicles) was, in fact, buffered to report 60% between Hot and Cold for a wide range of “normal” operating temperatures.  As long as the car was neither stone cold nor overheating, the temperature read just to the H side of center.  It seems the marketing geniuses at Ford got together with the engineers to produce a gauge that would give the “average driver” a warm, fuzzy feeling about the state of the vehicle.  However, this rendered the gauge unusable for detecting subtle trends in engine temperature, which might be used as an early warning of oncoming disaster.  Maybe the average driver is fine with this; and maybe I’m a freak who likes everything to be as complicated as possible, but I wanted a gauge that reported the precise temperature of the engine (in degrees Celsius, of course).</p>

<p>So now to the mac.  I recently acquired a <a href="http://www.apple.com/powerbook/index17.html">17" PowerBook G4</a>.  And while I have a lot of great things to say about this fine piece of hardware (which I’ll write about in a future blog), like any good relationship between a consultant and his laptop, I first focus on and overemphasize the negatives (no, not the slow hard drives and stupid pointing devices they put in laptops).  I have to say - some things about this machine remind me a lot of that temperature gauge.</p>

<p>First, the reporting of file size: it seems that <a href="http://www.apple.com/macosx/">OS X</a> frequently reports files or groups of files as drastically larger than they really are.  For example, my documents folder on my desktop contains 1.7 gigs of files (as reported by `du –h` in linux and confirmed by manually counting the number of bytes in each file:)  However, OS X reports my documents folder as 34 gigs.  And when I try to copy the folder to the PowerBook (which has 33 gigs of free space), OS X won’t even allow the copy to start because it thinks I don’t have enough free disk space.  After freeing a few extra gigs of space, I can copy the directory just fine, and it clearly takes up only 1.7 gigs of space.  What’s up with that!?  Maybe the geniuses at Apple want to prevent us from using up too much disk space thereby causing system difficulties.</p>

<p>Second, when OS X crashes (yes, I had a crash within the first week of using OS X) the desktop darkens to a shade of grey and you get a warm, fuzzy message indicating that a problem has occurred and you must turn off the computer.  I’m pretty sure this crash was caused by a faulty application (one of the apps provided by Apple that many of you probably use even if you are a PC user), but there was no option to ignore the warning and try to save any files or fix the problem without rebooting.  While this message is more graphically pleasing than the dreaded <a href="http://www.dognoodle99.cjb.net/bsod/compusa-bsod-xp.jpg">Windows BSOD</a>, it is still pretty worthless.  I would prefer to know in more detail what caused the mysterious “problem” so that I have the option of dealing with it in the future (again, I like things the hard way).</p>

<p>All the eye candy that comes with a Mac definitely gives the average user lots of warm fuzzies.  But for someone who wants to look at what’s happening under the hood and observe precisely the operating temperature of the computer, the buffering from details can be frustrating.  It can even cause the user to start distrusting the values they see.  Fortunately, since OS X is built on top of an open-source kernel, freaks like me can get their hands dirty and swap out some of those crappy temperature gauges with more accurate tools (that report in Celsius, of course).</p>

<p>If you are interested in additional bizarre analogies, the next time you see <a href="http://www.jandrconsult.com/blogs/brian/index.asp">Brian</a>, ask him, what “is like a report server”.</p>]]>
    </content>
</entry>
<entry>
    <title>Thoughts on Scientific Troubleshooting</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/04/thoughts_on_sci_1.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=41" title="Thoughts on Scientific Troubleshooting" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.41</id>

    <published>2005-04-18T13:42:31Z</published>
    <updated>2005-09-25T18:12:21Z</updated>

    <summary>I recently had a revealing experience that shed some light (in my psyche) on what troubleshooting really means....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="LIMS Consulting" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>I recently had a revealing experience that shed some light (in my psyche) on what troubleshooting really means.</p>]]>
        <![CDATA[<p>As a coder, it is easy to approach problems in a haphazard way.  Sometimes, when we encouter a bug in a piece of code we're working on, we use a trial-and-error method to attempt to shoo the bug away.  But as Brian described in <a href="http://www.jandrconsult.com/blogs/brian/archives/2005/03/zen_and_the_art.shtml">a recent blog</a>, good troubleshooting should follow the scientific method.</p>

<p>For simple problems, it may be possible to hunt-and-peck through inputs and scenarios until we see the results we expect.  But for complex issues, trial-and-error will usually be inefficient.  And more importantly, when troubleshooting issues in a production LIMS environment it is rarely even <em>possible</em> to perform trial-and-error tests.  Unless we are fortunate enough to have the production environment replicated to a testing platform, we are forced to use a more scientific method.</p>

<p>And this is exactly where I found myself recently.  While troubleshooting issues in a production LIMS system, I was forced to think through the problems and develop solutions without performing any actions that would modify the state of the system.  I walked away from that troubleshooting session with a very clear understanding of the issues and the neccessary solutions.  Although I had been through experiences like this many times before, this time it dawned on me just how superior this approach was to the trial-and-error techniques I would have been using had this been a development system.</p>

<p>A scientific troubleshooting technique may take a little extra time up front, but it will usually save time in the long run and will give the troubleshooter a more complete understanding of how a system works.  Although not always the easist path forward, troubleshooting issues in a scientific manner really pays off.  I, for one, need to become disciplined enough to use the technique all the time, not just when forced into it by circumstance.<br />
</p>]]>
    </content>
</entry>
<entry>
    <title>Extending Subversion with Properties (Part 2)</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/03/extending_subve_1.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=33" title="Extending Subversion with Properties (Part 2)" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.33</id>

    <published>2005-03-28T14:30:36Z</published>
    <updated>2005-09-25T18:12:21Z</updated>

    <summary>Last time, we looked at several questions that might be asked about the history of a deliverable. This time, we will explore how subversion parameters can be used to extend the functionality of a repository into a more robust lifecycle tracking tool....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="Technical Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>Last time, we looked at several questions that might be asked about the history of a deliverable.  This time, we will explore how subversion parameters can be used to extend the functionality of a repository into a more robust lifecycle tracking tool.</p>]]>
        <![CDATA[<p>Let's start by examining the information we would need regarding the unit testing phase of a deliverable.  Assume that we are about to perform a unit test on version 27 of our foo package.  As part of a standard procedure performed every time we start a unit test, we will add the following Subversion parameters and values to the file:</p>

<ul>
<li>Unit Test Document Name: Foo Package Unit Test.doc</li>
<li>Unit Test Document Version: 1.0</li>
<li>Unit Test Status: Approved</li>
<li>Unit Test Execution Number: 1</li>
<li>Unit Test Execution Date: 28-MAR-2005</li>
<li>Unit Test Executer: Rob Sullivan</li>
</ul>

<p>At any point in the future, we can examine the properties of the foo package and see that version 27 was unit tested on 28-MAR-2005. And if a subsequent version of the package is tested, a new set of properties can be added to that version to indicate a repeated test with the new unit test document information.</p>

<p>Also note that Subversion properties are versioned the same as the repository files themselves.  So, for example, a history of the lifecycle of the unit test document can be tracked - from creation through post-approval of the executed document.  </p>

<p>It is easy to see that the flexibility of Subversion properties allows for recording all the information we need in order to answer our version tracking questions.  But entering and retrieving the tracking information in a way that is useful to a development team requires some additional thought.</p>

<p>Frequently, a step in the lifecycle (say, an integration test) covers several (maybe hundreds) of files.  It would be tedious to enter the relevant information separately for each file.  And it would be even more tedious to search through the thousands of versioned files in a large repository for a particular piece of information.</p>

<p>Fortunately, Subversion has the ability to export its version information to XML, which allows for powerful organization of data.  And since Subversion is open source, it can be expanded to output properties in the precise layout we desire.  Once we have the data, a custom XML-based tool could be created that would allow the user to arbitrarily group files into modules and assign properties to the entire group.  Similarly, the tool could be used to retrieve and display the properties of a module in a user-friendly format.  If we wanted to find out what version of the foo package was most recently unit tested, we would simply query for its module and see the complete history contained in the Subversion properties.</p>

<p>Another exciting possibility that comes from storing our tracking data right in the repository is the ability to generate complex releases based on the lifecycle history of the files.  An interface could be created to automatically select and package the files that meet a set of release criteria.  This would help ensure, for example, that only formally tested files are delivered in a release.</p>

<p>Subversion's properties have the potential to turn a basic file repository into a powerful tracking system that meets the needs of complex projects - even validated LIMS projects!  I look forward to exploring Subversion's capabilities in more than just theory.<br />
</p>]]>
    </content>
</entry>
<entry>
    <title>Land of the Free Software</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/03/land_of_the_fre.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=21" title="Land of the Free Software" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.21</id>

    <published>2005-03-05T00:05:35Z</published>
    <updated>2005-09-25T18:12:20Z</updated>

    <summary>The terms &quot;free software&quot; and &quot;Open Source Software&quot; are commonly used interchangeably. I think the most common interpretation of the word &quot;free&quot; in free software is that the software was aquired without spending any money. At least that was my interpretation until recently....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="General Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>The terms "free software" and "Open Source Software" are commonly used interchangeably.  I think the most common interpretation of the word "free" in free software is that the software was aquired without spending any money.  At least that was my interpretation until recently.</p>]]>
        <![CDATA[<p>I was just introduced (in the latest issue of <a href="http://www.linux-mag.com/">Linux Magazine</a>) to a different interpretation based on a famous <a href="http://www.gnu.org/philosophy/free-sw.html">quote</a> by Richard Stallman.  Free, or open source software isn't just about getting something for nothing.  The more significant aspect of open source software is the "freedom" that comes with it:</p>

<ul>
<li>freedom to use it however you want</li>
<li>freedom to install it on ALL your computers (and your friends)</li>
<li>freedom to modify it to precisely meet your needs</li>
</ul>

<p>By some strange coincidence, this revelation came at an opportune time.  I recently purchased a <a href="http://www.logitech.com/index.cfm/products/details/US/EN,CRID=3,CONTENTID=8070">10-button Logitech mouse</a> but could only get 9 of the buttons to work in my <a href="http://www.fvwm.org/">favorite window manager</a>.  Excercising the freedoms of open source software, I checked out the window manager source code from CVS, modified the code, recompiled it and am now enjoying all 10 buttons of my mouse.  For years, I had been enjoying the no-cost benefits of open source software, but this was the first time I really took advantage of the fact that the source is "free".</p>

<p>So the next time you are smoking cigars and debating about open source software, remember this important aspect of "free" software.  In the open source world, we are living in the land of the free software.</p>]]>
    </content>
</entry>
<entry>
    <title>Extending Subversion with Properties (Part 1)</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/02/extending_subve.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=14" title="Extending Subversion with Properties (Part 1)" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.14</id>

    <published>2005-02-21T12:27:16Z</published>
    <updated>2005-09-25T18:12:20Z</updated>

    <summary>Last week, I gave a broad overview of Subversion. This week and next, we will explore in more detail how Subversion can be used to meet the deliverable tracking needs of a LIMS software development project....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="Technical Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>Last week, I gave a broad overview of <a href="http://subversion.tigris.org/">Subversion</a>.  This week and next, we will explore in more detail how Subversion can be used to meet the deliverable tracking needs of a LIMS software development project.</p>]]>
        <![CDATA[<p>But first, let's talk about the differences between developing software for a LIMS (Laboratory Information Management System) project compared to other types of software projects.  Because the software used in a pharmaceutical or chemical laboratories is heavily regulated and must be validated to strict standards, version control requirements are often multifarious.  It is not enough to simply know the latest stable and development versions of a file, as is acceptable in many projects.</p>

<p>Also, most LIMS projects use the <a href="http://www-db.stanford.edu/~burback/water_sluice/sluice6.25.97/ws/node50.html">waterfall methodology</a>.  In the waterfall methodology, each phase must generally be completed before the next one can begin.  While this can be much slower than a more modern or agile methodology, such as <a href="http://www.xprogramming.com/xpmag/whatisxp.htm">XP</a>, the checks and balances that come from one phase flowing into the next are, I assume, what cause the people who make big decisions at pharmaceutical companies to choose waterfalls (or maybe, like the author, they all just have a strange obsession with <a href="http://www.hawaiiphotoman.com/portfolio/portfolio.php?category_id=6&parent_id=0&photo_id=7&countdisplay=10&start=6">Hawaii</a>).</p>

<p>A software development project that follows the waterfall methodology may have the following lifecycle phases:</p>

<ul>
<li>User Requirements gathering</li>
<li>Functional Requirements gathering</li>
<li>Design</li>
<li>Development</li>
<li>Code Review</li>
<li>Unit Testing</li>
<li>Integration Testing</li>
<li>System Acceptance Testing</li>
</ul>

<p>It is worth noting that the testing phases are quite different from other methodologies.  For example, while many projects execute unit testing every day (maybe multiple times every day!), unit testing in a validated LIMS environment usually occurs officially only one time, at which point documentation is instantiated to prove the soundness of the code.  Once a file has passed unit testing, the test is not repeated unless the code is changed.</p>

<p>With all that said, all you really need to know is that a given file on a typical LIMS project has significant version tracking requirements at each phase of the development lifecycle.  Before we start exploring how Subversion can be extended to satisfy those requirements, let's materialize some of the requirements by looking at questions that might be asked regarding the deliverables of a LIMS project:</p>

<ul>
<li>At what stage in the development lifecycle is the deliverable?  For example, is foo.pkg currently in code review or unit testing?</li>

<p><li>What version of a given file was used for a particular development stage?  For example, what version of foo.pkg did we most recently unit test?</li></p>

<p><li>What is the name of the unit test execution document for the foo package?  What are all the files (and versions) that are tested in the foo unit test?</li></p>

<p><li>When was the unit test execution document for the foo package created/approved/executed?</li></p>

<p><li>What document version of the foo package unit test document was most recently executed?</li></p>

<p><li>For a given stage, how many deliverables are complete and how many still need to be completed?  For example, during a big unit testing effort, what percentage of deliverables have completed testing?</li></p>

<p><li>What documented requirement(s) does the foo package satisfy?</li></p>

<p><li>What project/sub-project/module does the foo package belong to?  What are all the files (and versions) that make up the foo project/sub-project/module?</li><br />
</ul></p>

<p>Someone unfamiliar with the inner workings of a LIMS project may consider this amount of versioning information excessive.  But I assure you, the data required to answer these questions is absolutely necessary to maintain control of a validated LIMS project.  Next week, we will explore how Subversion can be extended to answer these questions.<br />
</p>]]>
    </content>
</entry>
<entry>
    <title>Version Control with Subversion</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/02/version_control.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=10" title="Version Control with Subversion" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.10</id>

    <published>2005-02-13T14:53:29Z</published>
    <updated>2005-09-25T18:12:20Z</updated>

    <summary>As noted in recent blogs on this site, controlling code is an essential part of software development. One widely used version control tool is Concurrent Versions System. CVS is the de-facto standard version control system in the open-source software development world, managing large, global projects such as Linux, Apache and Mozilla....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="Technical Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>As noted in recent blogs on this site, controlling code is an essential part of software development.  One widely used version control tool is <a href="https://www.cvshome.org">Concurrent Versions System</a>.  CVS is the de-facto standard version control system in the open-source software development world, managing large, global projects such as <a href="http://www.linux.org/">Linux</a>, <a href="http://www.apache.org/">Apache</a> and <a href="http://www.mozilla.org/">Mozilla</a>.</p>]]>
        <![CDATA[<p>The team of developers at <a href="http://www.jandrconsult.com/">J&amp;R Consulting</a> has been using CVS for several years to meet the version control needs of our projects.  One of our repositories now contains over 2000 files.  I shudder to think what a mess the project would be without a tool to manage such large amounts of information.</p>

<p><strong>CVS Benefits</strong><br />
Three of the primary benefits of using CVS are:</p>

<p><em>1. Retrieval of historical files</em><br />
Every time a file is modified, CVS keeps track of the history of a file, including methods to reproduce any version of the file at any time.  So if a developer realizes that a recent modification they made has caused adverse affects in the system, a previous version of that code can be retrieved.</p>

<p><em>2. Software release</em><br />
CVS can be used to control the release of software.  A project can be tagged at a given point in time and delivered to the customer - for example as a prototype of a system being built or as an early phase of a multi-phase project.  At any point in the future, all the files that have made up that release can be retrieved.</p>

<p><em>3. Merging of simultaneous development efforts</em><br />
Many software development projects involve the efforts of multiple developers.  CVS can be used to automatically merge the contributions of more than one developer working on the same file.  Our project has used this feature several times, saving time that would have been spent manually merging contributions and decreasing the risk of mistakes.</p>

<p><strong>CVS Limitations</strong><br />
While CVS has served its purpose well, it has drawbacks that have been a source of frustration to members of our team.  The biggest complaint by team members has been the inability to rename files and directories.  We have encountered several situations where at some point into the development of a system, the folder names and or structures that were defined at the beginning of the project were inadequate.  CVS doesn't allow for the renaming of folders or moving files from one location to another.  Instead, CVS recommends that you delete the folder or file in question and re-add it to the desired place in the repository.  This has the dreadful side effect of losing all of the history of the moved files.</p>

<p>Another problem we've had with CVS is its inability to merge binary files.  When a change is made to a plain text file, only the changes are stored on the server.  Using diff algorithms, CVS can recreate any version of the file without needing to store every single version.  Further, file versions that have gone down diverging paths can be automatically merged back to a main trunk.</p>

<p>However, much of the code our team works with is binary, even in its "source" form.  For example, both the source file and compiled file of an Oracle Form or Oracle Report are binary.  Because of the limitations in the methods CVS uses to merge files, it can only store full copies of a binary file.  Every time we make even the simplest update to a form or report and commit the change to CVS, the entire new file must be uploaded and added to the server.  This is obviously a waste of space and bandwidth.  But what's worse is the need to manually make changes to a form or report that have already been made on a diverging branch.</p>

<p>The last complaint I will mention with CVS is the potential for selecting the incorrect version of a file for inclusion in a release.  Our team has used several documents and tools to record file version numbers for important lifecycle phases (for example to record versions of files that have undergone unit testing).  When it comes time to release files, it is a painstaking process to rectify the file versions in the repository with the tracking documents.  Because our repositories are disjointed from the rest of our tools, it is possible that an incorrect file version could be tagged and released from the repository.</p>

<p><strong>CVS Replacement</strong><br />
Fortunately, there is a team of developers out there who share these same frustrations and have chosen to take matters into their own hands.  Enter <a href="http://subversion.tigris.org/">Subversion</a>, whose goal is to be a "compelling replacement for CVS".  Subversion supports everything [good] that CVS supports and improves on the negative aspects of CVS.  From an end-user perspective, Subversion is very similar to CVS, and someone who is already familiar with CVS will feel right at home with Subversion.  Best of all, Subversion can be used to address each of the specific complaints that our team has had with CVS.</p>

<p>First, Subversion supports directory and file renaming.  And it not only supports the actions, it even versions the changes.  Gone are the days when we are forced to live with an awkward organization of our code.</p>

<p>Second, Subversion handles binary files just as easily as it handles text files.  It uses a binary diff algorithm, and is therefore much more efficient at transmitting and storing data.  We will evaluate whether binary merges can actually be used in practice once we begin using the tool.</p>

<p>Finally, Subversion may be useful in addressing the issues we've had with our version tracking tools being segregated from our repositories.  Subversion has great support of meta-data through "properties".  Properties can be attached to each file and folder in a repository, providing key-value pairs of information on that object.</p>

<p>The uses of this functionality are far-reaching but could be used, for example, to integrate our version tracking system with our repository.  The version tracking data could quite literally be stored right along side the actual files that make up the repository.  And the combined versioning and tracking data can be output to formats that allow for extended functionality - for example XML.  Someday, I would love to explore the implementation of an XML based tracking and release system that reduces the chances of deploying incorrect versions of a file.</p>

<p>I look forward to the coming days when our team evaluates Subversion and the ways that it strengthens our version control processes.</p>]]>
    </content>
</entry>
<entry>
    <title>Leveraging Computing Resources with Synergy</title>
    <link rel="alternate" type="text/html" href="http://www.jandrconsult.com/blogs/rob/archives/2005/02/leveraging_comp.shtml" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jandrconsult.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=5/entry_id=9" title="Leveraging Computing Resources with Synergy" />
    <id>tag:www.jandrconsult.com,2005:/blogs/rob//5.9</id>

    <published>2005-02-07T14:41:22Z</published>
    <updated>2005-09-25T18:12:20Z</updated>

    <summary>I recently found a cool piece of software called Synergy. The program can be used to significantly expand the physical power and size of your computing environment....</summary>
    <author>
        <name>Rob Sullivan</name>
        
    </author>
            <category term="General Computing" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jandrconsult.com/blogs/rob/">
        <![CDATA[<p>I recently found a cool piece of software called <a href="http://synergy2.sourceforge.net">Synergy</a>. The program can be used to significantly expand the physical power and size of your computing environment.</p>]]>
        <![CDATA[<p>Synergy is basically a software KVM (keyboard/video/mouse switcher) that allows a desktop environment to be expanded and shared across multiple computers - one keyboard and mouse can be used to control multiple computers. It is free, open source, cross-platform and supports all the operating systems represented by this group.</p>

<p>This software performs a similar function to <a href="http://www.realvnc.com">VNC</a>. Only, instead of streaming the video to the computer you are working on, synergy simply sends mouse and keyboard inputs to the remote computer and displays it on that computer's display. So obviously, Synergy doesn't suffer from the "lag" that makes VNC drag at times.</p>

<p>I am currently using Synergy to add a Windows computer to my Linux environment. I have my Windows laptop LCD sitting next to my Linux monitors, and when I move the mouse off the side of the Linux monitor, the cursor automatically starts moving on the laptop. I can do everything on the laptop as if I were actually interacting with its keyboard and touchpad. Synergy even allows me to cut and paste between these different environments.</p>

<p>For several years, I have been using <a href="http://www.vmware.com/">VMware</a> to run those critical applications that don't run in Linux (<a href="http://www.sqllims.com">SQL*LIMS</a> and <a href="http://www.groove.net">Groove</a>). I am considering replacing what I've been using VMware for with this configuration. This spreads my computing tasks over 6 GHz of CPU and 2 gigabytes of RAM, giving me another 1,920,000 pixels of desktop real estate (making my total desktop resolution 6400x1200:)</p>

<p>Note that synergy supports <a href="http://www.apple.com/macosx/">OS X</a>, so those of us using Macs can benefit from a single point of contact to a mixed Mac and Windows environment.</p>

<p>But even for those of us who exclusively use Windows, possible applications for Synergy still exist. We all have more than one computer (i.e. a laptop and desktop/portable server). Synergy can be used to expand the use we get from these computers for the same reasons listed above - namely more computing power and a larger environment.</p>

<p>I could ramble for hours about the benefits of increased desktop space, but for now I will offer only one example: consider the document review tasks we've been doing recently. It is awesome to be able to have the document being reviewed (OQ), a comments document, and the application where document steps are performed (SQL*LIMS) all open and visible simultaneously. There is no need to repetitively switch back and forth between documents and the application.</p>

<p>In the short time I've used Synergy, I have nothing bad to say about it. It is one more small advance in my never-ending search for the ultimate computing environment.  Synergy allows the software developer or power computer user to better leverage their computing resources and add more power and real estate to their desktop environment.</p>]]>
    </content>
</entry>

</feed>

