Archive for the ‘Uncategorized’ Category

Things I Learned About Last Week

Posted Tuesday, March 9th, 2010 by Eric Pugh

Last week was the crucial week on my current Lucene -> Solr project for making our goals.  A lot of work the previous couple of weeks came together.  I wanted to take a couple of minutes and just record some of the little things that I’ve been learning about:

Solr

Sunspot is the up and coming solution for integrating Solr into Ruby on Rails, and fortunately enough, the 1.0 release (followed quickly by 1.0.1!) has just come out last week.  Between acts_as_solr and Sunspot, Sunspot wins hands down for it’s support of a master/slave Solr configurations, embedded Solr for testing, richer indexing semantics, and not being tied to ActiveRecord.  The companion sunspot_rails gem does give wonderful ActiveRecord integration however.

Solr cores are the bees knees!  We’ve built a simple RoR webapp using HTTParty and the Solr API that allows you to perform all the admin functions for cores, and allows you to quickly clone a core for your own nefarious purposes!  Simplifies hacking around with a new schema or configuration without having a local copy of Solr running.  Allows multiple QA environments to potentially share a single Solr infrastructure.

Solr master and slave setup in a single VM.  While pointless from a scaling perspective, it’s a really great way to work out the kinks!  It’s funny to see a slave core polling the same Solr VM its in for updated segments!

JRuby

Doesn’t suck after all.  Actually, maybe I should say that JBoss, when combined with JRuby, means that JBoss doesn’t suck so much.  I had the aforementioned Solr core admin tool bundled up as a WAR file with JRuby, and was able to deploy it to an existing environment that had JBoss installed!  I didn’t have to install ruby on the box, (or JRuby for that matter!)  I just deployed the WAR file and bamn, off to the races.  Ops folks get the JBoss they love, I get the Ruby on Rails that I love.

And on a related note, Warbler was the key to thinking JRuby is cool.  I’d never actually had to package up a RoR app, so Warbler came to the rescue.  And you know what?  It was nice to build a single file that I knew had everything that I needed in it that could be scp’ed around!  And thanks to some cool code in the environment.rb, my app was able to load up the right configuration file for the environment based on an environmental variable set in JBoss.

Virtual Machines

I recently migrated a Linux VPS based RoR + Solr app (see a trend in tech choices ;-) )  to a Windows environment.  And to deliever the new Windows environment, I used VirtualBox to host the Windows Vista environment on my Mac laptop.

A couple of notes:

  • VirtualBox may not have all the snazzy integration points of Parallels with the host computer like seamless application sharing, but it seems to be much lighter weight.  Starts up quicker, and I don’t get the spinning beach ball of death as much.
  • If you are shipping a 11 GB file, you can’t use a 16 GB USB Memory Stick…  Turns out the biggest file is 4 GB.  (Although I never tried formatting the stick as NTFS, maybe that would have allowed a single 11 GB file???)
  • Uploading 11 GB to a remote out on the internet server will take a long long long time.  Even on a really fast network. connection.
  • If you need to format an external USB hard drive as NTFS on a Mac, it is possible!  Just fire up your trusty Windows Vista image in Parallels, plug the USB drive in, download and install the correct USB drivers so the drive doesn’t show up as a network share mapped to the Mac, and then use the built in reformatting tools!  Warning: This will take a loooong time!
  • Lastly, if you are using VirtualBox, and you attempt to create a Windows XP machine, and attach a Windows Vista hard disk image to it, VirtualBox will let you!  And then Windows won’t start.  sigh.

Microsoft Abandons FAST On Linux and Unix and Opens the Door For Solr

Posted Monday, February 8th, 2010 by Jason Hull

Today, Microsoft announced that it was abandoning development of the FAST search engine for Linux and Unix.  Given that Microsoft paid $1.2 billion for FAST, the move is an apparent revelation of a strategy to get non-Windows based users to move to an enterprise Windows platform rather than to continue to support FAST.

This move seems to be risky.  The Microsoft bet is that its FAST customers are more loyal to FAST than they are the operating platform, and the perception of switching costs are higher for moving from FAST to another enterprise search engine rather than the opposite–a loyalty to the operating system and a perception that search engines are interchangeable.

Microsoft might be right for most of its customers, but this announcement will certainly be grist for the mill in IT departments over the coming weeks.  Many companies built their IT infrastructure around a Linux-based platform, and being forced to change to a Windows environment may be a pill that is too hard to swallow.  The alternative will be to look to other search engines, which can do nothing but help Solr and Lucene.  With an established user base, enterprise grade support packages from companies like Lucid Imagination, and a significantly lower total cost of ownership than the FAST + Windows package, Solr will appeal to many a CTO who might otherwise have continued to gladly pay the licensing costs for FAST but is now forced to reconsider his or her decision.

Rather than supporting FAST on both platforms at the cost of a few developers, Microsoft may lose many more customers and revenues because of its insistence on one platform.  It will be interesting to see how companies like Lucid respond to the new opportunity.

Working with Groovy and Grails: The Funnies!

Posted Saturday, January 30th, 2010 by Youssef Chaker

1. Documentation

Have you ever wished that you could take Google with you on the road when you don’t have access to the INTRANET? or at least the documentation for whatever programming language you are currently using?

Groovy provides you with the option to download the documentation:

or does it?

2. Installation

So lets try installing Groovy on a Mac OS X:

  • Download the source
  • cd into the directory and run ‘ant install’
  • simple right? not until you get this lovely message:
youssef-chakers-macbook:groovy-1-1.7.0 youssefchaker$ ant install
Buildfile: build.xml
Trying to override old definition of task javac

-excludeLegacyAntVersion:

-checkAntVersion:

-banner:
     [echo] Java Runtime Environment version: 1.5.0_22
     [echo] Java Runtime Environment vendor: Apple Inc.
     [echo] Ant version: Apache Ant version 1.7.1 compiled on June 27 2008
     [echo] Operating system name: Mac OS X
     [echo] Operating system architecture: i386
     [echo] Operating system version: 10.5.8
     [echo] Base directory: /opt/local/src/groovy-1-1.7.0
     [echo] Java Home: /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home

-initializeReports:
    [mkdir] Created dir: /opt/local/src/groovy-1-1.7.0/target/reports

-mavenTaskdef:

-mavenPomDefinitions:
     Processing /opt/local/src/groovy-1-1.7.0/pom.xml to /opt/local/src/groovy-1-1.7.0/target/groovy-all.pom
     Loading stylesheet /opt/local/src/groovy-1-1.7.0/config/maven/groovy-all.xsl

-mavenInit:

-mavenFetchAllModules:
[artifact:dependencies] Downloading: asm/asm/3.2/asm-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm/3.2/asm-3.2.pom from central
[artifact:dependencies] Downloading: junit/junit/4.7/junit-4.7.pom from central
[artifact:dependencies] Downloading: junit/junit/4.7/junit-4.7.pom from central
[artifact:dependencies] Downloading: asm/asm-commons/3.2/asm-commons-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-commons/3.2/asm-commons-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-util/3.2/asm-util-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-util/3.2/asm-util-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-analysis/3.2/asm-analysis-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-analysis/3.2/asm-analysis-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-tree/3.2/asm-tree-3.2.pom from central
[artifact:dependencies] Downloading: asm/asm-tree/3.2/asm-tree-3.2.pom from central
[artifact:dependencies] Downloading: commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom from central
[artifact:dependencies] Downloading: commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.pom from central
[artifact:dependencies] Downloading: org/livetribe/livetribe-jsr223/2.0.6/livetribe-jsr223-2.0.6.pom from central
[artifact:dependencies] Downloading: org/livetribe/livetribe-jsr223/2.0.6/livetribe-jsr223-2.0.6.pom from central
[artifact:dependencies] Downloading: xmlunit/xmlunit/1.3/xmlunit-1.3.pom from central
[artifact:dependencies] Downloading: xmlunit/xmlunit/1.3/xmlunit-1.3.pom from central
[artifact:dependencies] Downloading: hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.pom from central
[artifact:dependencies] Downloading: hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.pom from central
[artifact:dependencies] Downloading: com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.pom from central
[artifact:dependencies] Downloading: com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.pom from central
[artifact:dependencies] Downloading: org/apache/ivy/ivy/2.1.0/ivy-2.1.0.pom from central
[artifact:dependencies] Downloading: org/apache/ivy/ivy/2.1.0/ivy-2.1.0.pom from central
[artifact:dependencies] Downloading: asm/asm/3.2/asm-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm/3.2/asm-3.2.jar from central
[artifact:dependencies] Downloading: junit/junit/4.7/junit-4.7.jar from central
[artifact:dependencies] Downloading: junit/junit/4.7/junit-4.7.jar from central
[artifact:dependencies] Downloading: asm/asm-commons/3.2/asm-commons-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-commons/3.2/asm-commons-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-util/3.2/asm-util-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-util/3.2/asm-util-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-analysis/3.2/asm-analysis-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-analysis/3.2/asm-analysis-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-tree/3.2/asm-tree-3.2.jar from central
[artifact:dependencies] Downloading: asm/asm-tree/3.2/asm-tree-3.2.jar from central
[artifact:dependencies] Downloading: org/livetribe/livetribe-jsr223/2.0.6/livetribe-jsr223-2.0.6.jar from central
[artifact:dependencies] Downloading: org/livetribe/livetribe-jsr223/2.0.6/livetribe-jsr223-2.0.6.jar from central
[artifact:dependencies] Downloading: com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar from central
[artifact:dependencies] Downloading: com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar from central
[artifact:dependencies] Downloading: org/apache/ivy/ivy/2.1.0/ivy-2.1.0.jar from central
[artifact:dependencies] Downloading: org/apache/ivy/ivy/2.1.0/ivy-2.1.0.jar from central
[artifact:dependencies] An error has occurred while processing the Maven artifact tasks.
[artifact:dependencies]  Diagnosis:
[artifact:dependencies]
[artifact:dependencies] Unable to resolve artifact: Missing:
[artifact:dependencies] ----------
[artifact:dependencies] 1) asm:asm:jar:3.2
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=asm -DartifactId=asm -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) asm:asm:jar:3.2
[artifact:dependencies]
[artifact:dependencies] 2) junit:junit:jar:4.7
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=junit -DartifactId=junit -Dversion=4.7 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=junit -DartifactId=junit -Dversion=4.7 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) junit:junit:jar:4.7
[artifact:dependencies]
[artifact:dependencies] 3) asm:asm-commons:jar:3.2
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=asm -DartifactId=asm-commons -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-commons -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) asm:asm-commons:jar:3.2
[artifact:dependencies]
[artifact:dependencies] 4) asm:asm-util:jar:3.2
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=asm -DartifactId=asm-util -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-util -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) asm:asm-util:jar:3.2
[artifact:dependencies]
[artifact:dependencies] 5) asm:asm-analysis:jar:3.2
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=asm -DartifactId=asm-analysis -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-analysis -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) asm:asm-analysis:jar:3.2
[artifact:dependencies]
[artifact:dependencies] 6) asm:asm-tree:jar:3.2
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=asm -DartifactId=asm-tree -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-tree -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) asm:asm-tree:jar:3.2
[artifact:dependencies]
[artifact:dependencies] 7) org.livetribe:livetribe-jsr223:jar:2.0.6
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=org.livetribe -DartifactId=livetribe-jsr223 -Dversion=2.0.6 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=org.livetribe -DartifactId=livetribe-jsr223 -Dversion=2.0.6 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) org.livetribe:livetribe-jsr223:jar:2.0.6
[artifact:dependencies]
[artifact:dependencies] 8 ) com.thoughtworks.xstream:xstream:jar:1.3.1
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=com.thoughtworks.xstream -DartifactId=xstream -Dversion=1.3.1 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=com.thoughtworks.xstream -DartifactId=xstream -Dversion=1.3.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) com.thoughtworks.xstream:xstream:jar:1.3.1
[artifact:dependencies]
[artifact:dependencies] 9) org.apache.ivy:ivy:jar:2.1.0
[artifact:dependencies]
[artifact:dependencies]   Try downloading the file manually from the project website.
[artifact:dependencies]
[artifact:dependencies]   Then, install it using the command:
[artifact:dependencies]       mvn install:install-file -DgroupId=org.apache.ivy -DartifactId=ivy -Dversion=2.1.0 -Dpackaging=jar -Dfile=/path/to/file
[artifact:dependencies]
[artifact:dependencies]   Alternatively, if you host your own repository you can deploy the file there:
[artifact:dependencies]       mvn deploy:deploy-file -DgroupId=org.apache.ivy -DartifactId=ivy -Dversion=2.1.0 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
[artifact:dependencies]
[artifact:dependencies]   Path to dependency:
[artifact:dependencies]         1) org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]         2) org.apache.ivy:ivy:jar:2.1.0
[artifact:dependencies]
[artifact:dependencies] ----------
[artifact:dependencies] 9 required artifacts are missing.
[artifact:dependencies]
[artifact:dependencies] for artifact:
[artifact:dependencies]   org.codehaus.groovy:groovy:jar:1.7.0
[artifact:dependencies]
[artifact:dependencies] from the specified remote repositories:
[artifact:dependencies]   central (http://repo1.maven.org/maven2)
[artifact:dependencies]
[artifact:dependencies] 

BUILD FAILED
/opt/local/src/groovy-1-1.7.0/config/ant/build-maven.xml:79: The following error occurred while executing this line:
/opt/local/src/groovy-1-1.7.0/config/ant/build-maven.xml:52: The following error occurred while executing this line:
/opt/local/src/groovy-1-1.7.0/config/ant/build-maven.xml:44: The following error occurred while executing this line:
/opt/local/src/groovy-1-1.7.0/config/ant/build-maven.xml:29: Unable to resolve artifact: Missing:
----------
1) asm:asm:jar:3.2

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=asm -DartifactId=asm -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) asm:asm:jar:3.2

2) junit:junit:jar:4.7

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=junit -DartifactId=junit -Dversion=4.7 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=junit -DartifactId=junit -Dversion=4.7 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) junit:junit:jar:4.7

3) asm:asm-commons:jar:3.2

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=asm -DartifactId=asm-commons -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-commons -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) asm:asm-commons:jar:3.2

4) asm:asm-util:jar:3.2

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=asm -DartifactId=asm-util -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-util -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) asm:asm-util:jar:3.2

5) asm:asm-analysis:jar:3.2

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=asm -DartifactId=asm-analysis -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-analysis -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) asm:asm-analysis:jar:3.2

6) asm:asm-tree:jar:3.2

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=asm -DartifactId=asm-tree -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=asm -DartifactId=asm-tree -Dversion=3.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) asm:asm-tree:jar:3.2

7) org.livetribe:livetribe-jsr223:jar:2.0.6

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=org.livetribe -DartifactId=livetribe-jsr223 -Dversion=2.0.6 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=org.livetribe -DartifactId=livetribe-jsr223 -Dversion=2.0.6 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) org.livetribe:livetribe-jsr223:jar:2.0.6

8 ) com.thoughtworks.xstream:xstream:jar:1.3.1

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=com.thoughtworks.xstream -DartifactId=xstream -Dversion=1.3.1 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=com.thoughtworks.xstream -DartifactId=xstream -Dversion=1.3.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) com.thoughtworks.xstream:xstream:jar:1.3.1

9) org.apache.ivy:ivy:jar:2.1.0

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=org.apache.ivy -DartifactId=ivy -Dversion=2.1.0 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=org.apache.ivy -DartifactId=ivy -Dversion=2.1.0 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) org.codehaus.groovy:groovy:jar:1.7.0
        2) org.apache.ivy:ivy:jar:2.1.0

----------
9 required artifacts are missing.

for artifact:
  org.codehaus.groovy:groovy:jar:1.7.0

from the specified remote repositories:
  central (http://repo1.maven.org/maven2)

Total time: 18 seconds

Ok, how about we try MacPorts?

youssef-chakers-macbook:~ youssefchaker$ sudo port install groovyPassword:--->  Fetching apache-ant--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://www.ibiblio.org/pub/mirrors/apache/ant/binaries--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.mirror.rafal.ca/ant/binaries--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.adcserver.com.ar/ant/binaries--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://www.mirrorservice.org/sites/ftp.apache.org/ant/binaries--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.mirroring.de/ant/binaries--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.multidist.com/ant/binaries--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from ftp://ftp.infoscience.co.jp/pub/net/apache/dist/ant/binaries--->  Verifying checksum(s) for apache-ant--->  Extracting apache-ant--->  Configuring apache-ant--->  Building apache-ant--->  Staging apache-ant into destroot--->  Installing apache-ant @1.7.1_0--->  Activating apache-ant @1.7.1_0--->  Cleaning apache-ant--->  Fetching groovy--->  Attempting to fetch groovy-src-1.6.3.zip from http://distfiles.macports.org/groovy--->  Verifying checksum(s) for groovy--->  Extracting groovy--->  Configuring groovy--->  Building groovyError: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3" && ant install -DskipTests=true " returned error 1Command output: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3/config/ant/build-maven.xml:90: The following error occurred while executing this line:/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3/config/ant/build-maven.xml:54: The following error occurred while executing this line:/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3/config/ant/build-maven.xml:29: Unable to resolve artifact: Missing:----------1) biz.aQute:bnd:jar:0.0.258Try downloading the file manually from the project website.Then, install it using the command:mvn install:install-file -DgroupId=biz.aQute -DartifactId=bnd -Dversion=0.0.258 -Dpackaging=jar -Dfile=/path/to/fileAlternatively, if you host your own repository you can deploy the file there:mvn deploy:deploy-file -DgroupId=biz.aQute -DartifactId=bnd -Dversion=0.0.258 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]Path to dependency:1) groovy:groovy-tools:jar:internal2) biz.aQute:bnd:jar:0.0.258----------1 required artifact is missing.for artifact:groovy:groovy-tools:jar:internalfrom the specified remote repositories:central (http://repo1.maven.org/maven2),aQute (http://www.aQute.biz/repo)Total time: 2 minutes 51 secondsError: Status 1 encountered during processing.
youssef-chakers-macbook:~ youssefchaker$ sudo port install groovy

Password:

--->  Fetching apache-ant

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://www.ibiblio.org/pub/mirrors/apache/ant/binaries

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.mirror.rafal.ca/ant/binaries

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.adcserver.com.ar/ant/binaries

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://www.mirrorservice.org/sites/ftp.apache.org/ant/binaries

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.mirroring.de/ant/binaries

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from http://apache.multidist.com/ant/binaries

--->  Attempting to fetch apache-ant-1.7.1-bin.tar.bz2 from ftp://ftp.infoscience.co.jp/pub/net/apache/dist/ant/binaries

--->  Verifying checksum(s) for apache-ant

--->  Extracting apache-ant

--->  Configuring apache-ant

--->  Building apache-ant

--->  Staging apache-ant into destroot

--->  Installing apache-ant @1.7.1_0

--->  Activating apache-ant @1.7.1_0

--->  Cleaning apache-ant

--->  Fetching groovy

--->  Attempting to fetch groovy-src-1.6.3.zip from http://distfiles.macports.org/groovy

--->  Verifying checksum(s) for groovy

--->  Extracting groovy

--->  Configuring groovy

--->  Building groovy

Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3" && ant install -DskipTests=true " returned error 1

Command output: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3/config/ant/build-maven.xml:90: The following error occurred while executing this line:

/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3/config/ant/build-maven.xml:54: The following error occurred while executing this line:

/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_groovy/work/groovy-1.6.3/config/ant/build-maven.xml:29: Unable to resolve artifact: Missing:

----------

1) biz.aQute:bnd:jar:0.0.258

Try downloading the file manually from the project website.

Then, install it using the command:

mvn install:install-file -DgroupId=biz.aQute -DartifactId=bnd -Dversion=0.0.258 -Dpackaging=jar -Dfile=/path/to/file

Alternatively, if you host your own repository you can deploy the file there:

mvn deploy:deploy-file -DgroupId=biz.aQute -DartifactId=bnd -Dversion=0.0.258 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

Path to dependency:

1) groovy:groovy-tools:jar:internal

2) biz.aQute:bnd:jar:0.0.258

----------

1 required artifact is missing.

for artifact:

groovy:groovy-tools:jar:internal

from the specified remote repositories:

central (http://repo1.maven.org/maven2),

aQute (http://www.aQute.biz/repo)

Total time: 2 minutes 51 seconds

Error: Status 1 encountered during processing.

meh!

sudo apt-get install groovy

to the rescue : D

3. Compiling!

I attended a presentation by Andy Hunt, he was talking about some of the stuff that he wrote in his book “Pragmatic Thinking & Leaning”, which is very good by the way, and he mentioned context switching a few times. Naturally, that came up in often afterwards, specially on twitter and I brushed it off mostly. I did some context switching but only when taking breaks and I didn’t think it was a big deal. Not until I saw this line:

“[groovyc] Compiling 1 source file …”

and it hit me. Most people are tempted to do some context switching when they are dealing with time wasting tasks such as compiling! I had completely forgotten how it felt like. I was so immersed in the Ruby/Python/PHP world that I totally erased the memories of “It’s compiling…” from my brain!!!

But in all seriousness, if you like Java but also appreciate what a language like Ruby provides and what a framework like Ruby on Rails adds to the table, Groovy and Grails are worth a shot. And if you want a quick overview and introduction to both, check out my friend, Mohamed Seifeddine’s thesis:

This document is written as my Masters’ thesis and is based on a long individual learning period of Groovy and Grails through the developement of what later became SoukLubnan.com. A Website in its younger days that allows people in Lebanon to Buy & Sell products online.

and here’s the link: Introduction to Groovy and Grails

The White House’s Open Government Directive: Still a Long Way From Reality

Posted Friday, December 11th, 2009 by Jason Hull

On December 8, 2009, the Executive Office of the President of the United States issued a memorandum providing guidance and directives for implementing the Open Government policy.  While the directive from Mr. Peter Orszag did direct some clear action to be taken in the immediate future, much of the directive simply instructed agencies on providing future guidance on how to implement the Open Government policy.  Given that 11 months has passed since the initial Presidential directive, it seems optimistic to expect much movement in the next 90 days on implementing the policy.

There are some clear deliverables for agencies to meet:

  • Websites which publish usable information to the public.  Generally, this will follow the www.agency.gov/open format.  Agencies will be required to provide a feedback mechanism for the public to interact with the agencies regarding what information is published.  Agencies are also required to publish 3 “high value” data sets which have not been previously viewable to the public.
    • What I expect.  This is the clearest specific deliverable set forth in the entire memorandum.  I expect varying levels of compliance, but I do think that most agencies will have pages up in differing states of completion.  I also expect pretty serious data integrity issues.  Recovery.gov had noteworthy data integrity issues, as documented in this Government Accounting Office report, and I anticipate similar issues within the agencies.
  • Publication in open formats.  While not directing what formats are required, the directive does specify that information must be published in open, searchable, parsable formats.  The publication requirement is subject to “valid privacy, confidentiality, security, or other restrictions.”
    • What I expect.  The “other restrictions” requirement leaves a very large loophole for interpretation, so until more specification is given, I do not anticipate a flood of information flowing from agencies.  There will also be a debate on the interpretation of open formats, so I expect publication in a wide variety for formats including, among others, XML, XBRL, PDF, and Microsoft Office formats.
  • Integration with existing dashboards and reporting mechanisms.  Agencies must publish information in a way that is integrable with dashboards such as Data.gov, the IT Dashboard, Recovery.gov, and USASpending.gov.
    • What I expect.  Until more specific guidance comes out, this may be a hand-waved requirement, particularly given the existing data integrity problems previously mentioned.  The memorandum identifies information quality as a concern, but provides no concrete information on how to address the issue.  Until there is a mechanism for vetting and validating information publication, this process will be subject to gaming.
  • A presumption of openness.  While this presumption is specifically laid out in covering FOIA issues, the theme runs throughout the directive – be more open.  For the smaller agencies, this might not be as difficult to execute as for the larger agencies.
    • What I expect.  This will be a long slow road to go down.  The technology exists today to make publication (and validation) of information viable.  It’s existed for quite some time.  Technology is not the hurdle to overcome; culture is.  The attitude of the administration is laudable – they are trying to bring transparency, accountability, and collaboration to the government for the people whom the government serves.  Penetrating the entrenched layers of inertia and process will take more than speeches and broad, limited specification memoranda.

The effort towards more open government is a signal of the right things coming from the administration.  However, particularly in understaffed agencies, this directive may create more wheel-spinning than action, or, as my old Ethics professor Ed Freeman would say, more heat than light.

Given the short timelines involved for some of the deliverables, I expect systems which can rapidly stand up and rapidly scale to gain ascendancy.  This means, in my mind, either Microsoft Sharepoint portals will pop up everywhere (a real possibility given the conversion of recovery.gov to Sharepoint and the citation of a Microsoft executive in Washington Technology), or open source proponents Kundra and Chopra will get their way, and a system such as Drupal will appear in many .gov domains.  Regardless, I do not see this as a great entry point for new services to the government.

There is also an opportunity for a data aggregation service to appear from the publication of previously unpublished information.  Solr would be a great engine for finding  information across agencies, and performing analytics against that information is only a step further.  I expect lobbyists to demand value-added analytics of what comes out of the agencies as a result of this directive, and if the information is truly published in an open format, then providing the technology to meet the demand is not difficult.  I do not anticipate a long wait for K Street to begin using agencies’ information to its advantage, if and when we truly start seeing accurate information published as per the intent of this directive.

A Random Walk Down Web Street: Can We Predict Trends for 2010?

Posted Monday, December 7th, 2009 by Jason Hull

The exponential growth of technology makes me think of Burton Malkiel’s book A Random Walk Down Wall Street, whose main thesis was that the average investor cannot beat the market because without perfect information, it is impossible – or nearly so – to predict future asset prices.

Thus, when I read the 2010 predictions of Mashable’s Peter Cashmore, my gut reaction was to at least somewhat discount the predictions, since, after all, who can tell what’s going to be hot one year from now?  After introspection,  I realized the analogies to Malkiel’s book still apply, except people like Cashmore play the Peter Lynch and Warren Buffet roles to my average investor role.

While I will get to my thoughts on Cashman’s predictions, I should first actually answer the question posed in the title: can we predict trends for 2010?  I think that we can predict the trends that will be forthcoming, but we cannot predict how those trends will come to fruition.  Those of us who are on the cutting, but not bleeding edge of technology can generally see where there are market needs, but are far less successful at identifying which of a handful of nascent technologies will be the final answer to meet the market need.  It’s why venture capitalists have portfolios of investments rather than betting the farm on one investment; they diversify risk because they can only imperfectly predict the future.

I often get posed the question “What’s going to be the next [Twitter/Facebook/YouNameIt].”  Often , the answer is exactly the same application.  First mover advantage yields a pretty strongly defensible market position.  Even successful technologies don’t die overnight.  They usually face a long, slow, steady decline.   The decline of MySpace is a good example.

As Facebook as grown, it has both gained new users and cannibalized MySpace users.

Compare both of these to the almost overnight growth of a popular, rapidly growing, and, mostly, virally spread website, PeopleofWalmart.

In the first two, the trends were predictable at the beginning of 2009, but NOBODY could have predicted the third site because it didn’t even come out until August, developed nearly overnight by a group of friends.  What could have been predicted, though, was that virally spread socially edgy websites would gain more traction, due to the success of LOLcats, FailBlog, and others.

Thus, predicting the “next” Twitter or Facebook is a nearly impossible task, but predicting that there will be a new website or application which consumes more than 10 minutes of your time daily that currently doesn’t exist is a pretty easy one.  I know.  I’m going out on a limb.

Now, let me give my thoughts on Cashmore’s projections.  I’ll categorize them into three buckets: the read-write-share web (a definition of semantic web), the cannibalization of devices and providers by subsuming technologies, and the online socialization of free time.

  • The read-write-share web.  The growth in the use of Twitter means that more users of technology are expecting real-time responses rather than delayed, or even near real-time responses.  As more information becomes available, the need for filters of that information grows.   Users want to know that not only is the information they search for relevant in both content AND time, but that the source of the information is trustworthy.  I expect recency to become more of a factor in search content and identify verification services will grow into a sustainable niche industry, rather than having to trust that @iamtherealbrettfarve is actually Brett Favre’s Twitter account.  I also expect the growth of myopenid as a centralized arbiter of identity across multiple applications.
  • Cannibalization. The Holy Grail of personal devices is a usable phone cum music player cum GPS cum book cum computer cum entertainment station cum television cum [every other piece of technology you could imagine].   The iPhone and Kindle have started this collapsing chain.  The iPhone has cannibalized iPod sales, since the iPod also is contained within the iPhone.  The Google Android offers turn-by-turn directions, eliminating the need for a GPS device.  The list goes on.  Consumers will expect their portable technologies to do more and cost less and could signal a decline in specialized devices.
  • The online socialization of free time.  Who was playing Farmville this time last year?  Nobody.  It didn’t even start until June of 2009.   How many play now?  63.7 million as of November, 2009. (Information cited here.)  The kids of 40 years ago got all of the kids in the neighborhood to play football or baseball.  The kids of 20 years ago got their friends over to play Atari or computer games.  Now, people play games online with all of their friends.  We couldn’t have predicted FarmVille specifically, but the growth of multiplayer online roleplaying games such as World of Warcraft and the strength of fantasy sports leagues pointed to the trend.  I predict not only new games, but also the socialized attempts to corral free time for good – solving difficult problems, organizing for causes, and trying to make the world a better place.

There is one prediction that Cashmore doesn’t appear to make which I will – the appearance of the app which manages the work/personal life identity divide.  Since many people now use social media for professional purposes just as much as for personal purposes, they get overwhelmed with the notion of separating work from personal life.  It blends into one amorphous existence where someone can never quite get away from work.  I predict that by January 1, 2011, when someone asks me how they can separate their personal and professional social media use, I can answer confidently, “There’s an app for that!”

OSC Appearances in December, 2009

Posted Thursday, December 3rd, 2009 by Jason Hull

Here are the places where you can find OpenSource Connections in the next month:

December 3: Company of Friends holiday party, Siips Wine Bar

December 7: Charlottesville Social Media Club Steering Committee Meeting

December 8: Charlottesville CxO Round Table

December 8: Jason Hull presents the CBS19 Blog of the Week, CBS19, 6:45 PM

December 9: CBIC Holiday Party

December 18: OSC Holiday Party

December 24-25: Company holidays

We look forward to seeing you out and about this December!

Software Estimation: The Cone of Uncertainty vs The Wormhole of Reality

Posted Wednesday, November 4th, 2009 by Arin Sime

Earlier this year in my MSMIT classes at UVa, we talked about software estimation techniques, which was a very interesting topic.

One thing we talked about was the “Cone of Uncertainty”, as described in Steve McConnell’s book “Rapid Development.”  You can read the full description of the cone of uncertainty on the Construx website.  Here is a drawing of it as depicted on that website.

ConeOfUncertainty


The Cone of Uncertainty is a convenient way to think of how software estimation works.  When a project is first beginning, you know very little about it and so you should never give customers a single point estimate.  A single point estimate just means that you supply one number, like saying “this project will take 6 months.”

Giving estimates in ranges instead is much more valuable and realistic.  This more accurately conveys to your customer the uncertainty of an estimate, and therefore the risk.  For example, if I give you a wide estimate like “this will take 3-12 months”, that is a very clear way to communicate that we don’t know enough yet to give a firm estimate.

The Cone of Uncertainty shows that the more you know about a project, the more you can narrow that range.  So while I might initially think it’s 3-12 months, after spending time analyzing the project, I can revise that to a more narrow range, like 6-8 months perhaps, or 10-12 months.

But what about the end of a project?  The Cone of Uncertainty says that the closer you get to the end of a project, the more likely you are to know exactly when it ends.  That makes sense in theory, but is it realistic?

I would suggest that many times, there is a large amount of uncertainty at the end of a project, even if it’s well run.  Imagine that you are two weeks away launching a new site, and you are still working out some bugs that your testers have found.  You know you only have a few bugs left, so you confidently assert to your boss or customer that you’ll be ready to launch in two weeks.  Each day you are fixing bugs, but the testers keep finding new bugs.  Perhaps they are even finding new bugs faster than you are fixing them, or their rate of finding bugs is not decreasing.

When you had a short bug list in front of you, you felt very confident about two weeks, but now you are less certain.  How many more bugs will testing uncover?  Your confidence about the time left to launch is now decreasing, and you have to go back to your boss or client and ask for additional time.

The Cone of Uncertainty captures risk at the front end of a project very well, but it doesn’t capture the risk and uncertainty at the back end of a project.

There’s one other thing that also makes me feel like the Cone of Uncertainty is perhaps a bit simplistic.  In my classes, we discussed using the Cone of Uncertainty as a way to educate our bosses and clients about why estimates are inaccurate.  The idea was to sketch it out on a napkin or whiteboard, and use it to convince them why you can’t give them a set estimate up front (”6 months”), but instead need to estimate in a range (”3 – 9 months”).

However, I believe the problem is that the Cone of Uncertainty implies that you will converge on a middle point most of the time.   While that is not the intention of the cone, it still can appear that way because of the way the cone is drawn.  So if your boss wants to be tricky, he can play games with the numbers.  If you tell him that a project will take 3-9 months, then he may just translate that to mean 6 months (the midpoint of your range.)

But how often have your range estimates actually converged on the midpoint?  I would speculate that most of the time, they actually converge on something above the midpoint.  That’s because our initial reactions are almost always optimistic, so as we learn more about the project’s complexity which we had not originally anticipated, then we are likely to settle on a point higher in our initial range estimate.

So I would further suggest that it’s better to draw the cone as not converging on a midpoint.  At some point in time, your estimates are likely to converge on an estimate that is higher than your original midpoint.  This leads me to my humbly suggested variation of the cone of uncertainty, which I like to call “The Wormhole of Reality.”

WormholeOfReality

Why the wormhole of reality?  When the cone is redrawn like I’ve done above, it just looks more like a wormhole than a cone. I’m referring to the wormholes of physics and astronomy, where it is a shortcut through space and time. There’s no correlation between the meanings of wormholes in space and my estimation wormhole, it’s just that they look similar.  Plus I think it’s a cool name.

But more importantly, how do we avoid getting sucked into “The Wormhole of Reality”? If the Cone of Uncertainty is ideally the way we want our estimates to work, then we want to avoid the “fuzzy back end” of a project.  As I already suggested, the fuzzy back end is driven by continual bug reports that seem like they may never end.  Here are some tips to try and close out your projects more predictably:

  • Use test driven development to write your unit tests early.
  • Use browser based automated testing tools like Selenium to automate user level testing.
  • Keep your continuous integration server happy and well-fed with frequent code check ins, so it can feed you bug information earlier rather than later.
  • Engage users in your system testing early on.  Make sure that you deliver incremental releases of your code, at least to internal users and testers, well before the final weeks of your project.
  • Engage customers in those incremental releases too.  If your internal users are not an accurate representation of external users to your code, then identify some beta customers who would be willing to try out future versions of your product.
  • Consider incorporating regular user-experience testing with beta releases of your product, on a feature by feature basis.  This is another way to get additional feedback about the code you are going to deploy.
  • Use agile methodologies to drive all of the above recommendations.

While the “Cone of Uncertainty” is an easy way to explain to managers and clients how to estimate software development, too often we fall into development traps and end up in dangerous territory like “The Wormhole of Reality.”  But by following best practices, and clearly communicating to customers the risk at the front and back end of a project, you will be more likely to avoid these pitfalls and deliver your software on time, on scope, and on budget.

Eric Pugh to speak on Solr at Shenandoah Ruby Users Group October 27th

Posted Tuesday, October 20th, 2009 by Eric Pugh

From the Meetup site:

We’ll look at the thriving Ruby ecosystem that has grown up around integrating with Solr. From Ruby gems that integrate with Solr like solrb and rsolr, to general search solutions like acts_as_solr and sunspot. We’ll also look at a complete “shrink wrapped” catalog solution for Solr using BlacklightOPAC.

You’ll lean the basics of getting started with Solr, and an understanding of what Ruby solutions are available to simplifying adding great search to your site!

As usual, food and beverages will be provided.


Click here to check out
The Shenandoah Ruby Users Group!