<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6701453</id><updated>2012-01-26T20:08:00.150-08:00</updated><title type='text'>Deep-blue</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>70</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6701453.post-8628232692869005486</id><published>2012-01-26T14:00:00.000-08:00</published><updated>2012-01-26T20:08:00.166-08:00</updated><title type='text'>Scala, Geotoolkit and UTM Zone 10N gridded data (Part 1)</title><content type='html'>&lt;h2&gt;


















Overview&lt;/h2&gt;
I am currently working on some detailed GIS analysis. It's very cool stuff; I'm analyzing about 4 million undersea video annotations collected using &lt;a href="http://vars.sourceforge.net/"&gt;VARS&lt;/a&gt;&amp;nbsp;(which I also wrote). The problem that I keep encountering again and again is&amp;nbsp;coordinate transforms and&amp;nbsp;data formats.&lt;br /&gt;
&lt;br /&gt;
Why are coordinate transforms a problem? Well, I like to analyze data using &lt;a href="http://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system"&gt;UTM&lt;/a&gt; grids. UTM has an advantage for analysis in that pixels represent a uniform area, for example, a single pixel might represent a &amp;nbsp;25mx25m area. Geographic grids do not usually have uniform pixel sizes, which makes inter-pixel comparisons difficult (e.g. I found 20 critters in pixel A and 20 in pixel B, but in geographic&amp;nbsp;coordinate&amp;nbsp;systems pixel A and B represent different surface areas, so I can't say that they have the same density of organisms). The problem is that all the positions of our ROVs and annotations are in geographic&amp;nbsp;coordinates&amp;nbsp;(i.e. latitude and longitude) so a transform from geographic coordinates to projected coordinates (UTM) is required. Since I'm writing automated software to generate thousands (actually hundreds of thousands) of data products, I need software libraries that I can use for the transforms. And since I'm doing a huge number of analysis the software has to be fast. The speed issue alone rules out ESRI products; they supply python as a scripting language. As great as python is, it just isn't fast enough for what I need. Instead, I'm working on the JVM (which is pretty darn fast). So in the examples below I'll be using Scala to illustrate how to do the analysis.&lt;br /&gt;
&lt;br /&gt;
The second issue, data formats, is one of those insidious&amp;nbsp;annoyances&amp;nbsp;that just pervades the GIS world. For one, there's a lot of different formats. For another, one format does not rule them all, so it's tough to find a grid format that's broadly usable in different software applications. For this analysis, I'll be using &lt;a href="http://gmt.soest.hawaii.edu/"&gt;GMT&lt;/a&gt;'s 'GRD' format. Why? For one, it's &lt;a href="http://www.unidata.ucar.edu/software/netcdf/"&gt;NetCDF&lt;/a&gt;, so there's a zillion libraries to read it in any number of a zillion programming languages. I do most of my analysis on the JVM, so I can use &lt;a href="http://www.unidata.ucar.edu/software/netcdf-java/"&gt;NetCDF-Java&lt;/a&gt;&amp;nbsp;there. In addition, I often do ad-hoc analysis in Matlab, so I can use &lt;a href="http://code.google.com/p/nctoolbox/"&gt;nctoolbox&lt;/a&gt; (which I also wrote) to work with NetCDF there. The other reason that GRD is nice is that the &lt;a href="http://www.unidata.ucar.edu/software/netcdf/docs/netcdf/CDL-Syntax.html"&gt;CDL&lt;/a&gt; is very simple to understand. Here's an example CDL:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:text"&gt;netcdf ETOPO1_Bed_g_gmt4 {
dimensions:
 x = 21601 ;
 y = 10801 ;
variables:
 double x(x) ;
  x:long_name = "Longitude" ;
  x:actual_range = -180., 180. ;
  x:units = "degrees" ;
 double y(y) ;
  y:long_name = "Latitude" ;
  y:actual_range = -90., 90. ;
  y:units = "degrees" ;
 int z(y, x) ;
  z:long_name = "z" ;
  z:_FillValue = -2147483648 ;
  z:actual_range = -10898., 8271. ;

// global attributes:
  :Conventions = "COARDS/CF-1.0" ;
  :title = "ETOPO1_Bed_g_gmt4.grd" ;
  :history = "grdreformat ETOPO1_Bed_g_gdal.grd ETOPO1_Bed_g_gmt4.grd=ni" ;
  :GMT_version = "4.4.0" ;
  :node_offset = 0 ;
}

&lt;/pre&gt;
&lt;h2&gt;
















The Setup&lt;/h2&gt;
&lt;div&gt;
For this analysis, I'll need to include the NetCDF-Java libraries as well as &lt;a href="http://www.geotoolkit.org/"&gt;Geotoolkit&lt;/a&gt; libraries. Geotoolkit is an open source Java library for developing geospatial applications. I use it because: I can actually get it to work, it's NetCDF support is decent, and the lead developer, &amp;nbsp;Martin Desruisseaux, is excellent about responding to questions. There are several Geotoolkit modules that need to be included, they're listed in the pom.xml example below. At the time of this writing, the most recent released version of Geotoolkit, 3.19, has a bug that prevents it from working with my grd files. However, the 3.x-SNAPSHOT release seems to work just fine.&lt;br /&gt;
&lt;br /&gt;
I'm using Maven for this project, so I thought it would be handy to post the pom.xml for reference. Yes, it's long. Yes, it's XML. Yes, I know you hate Maven and prefer Ant/Sbt/Gradle/Buildr/Make. Get over it. I'm posting the pom because it shows the dependencies needed to run the code samples below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;groupId&amp;gt;org.mbari&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;geotools&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;

    &amp;lt;name&amp;gt;geotools&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
        &amp;lt;geotoolkit.version&amp;gt;3.x-SNAPSHOT&amp;lt;/geotoolkit.version&amp;gt;
        &amp;lt;scala.version&amp;gt;2.9.1&amp;lt;/scala.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;dependencies&amp;gt;


        &amp;lt;!-- GIS Referencing libraries --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.geotoolkit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geotk-referencing&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${geotoolkit.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.geotoolkit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geotk-epsg&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${geotoolkit.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;

        &amp;lt;!-- JDBC Driver required for GIS referencing libraries --&amp;gt;
        &amp;lt;dependency&amp;gt;
         &amp;lt;groupId&amp;gt;org.apache.derby&amp;lt;/groupId&amp;gt;
         &amp;lt;artifactId&amp;gt;derbyclient&amp;lt;/artifactId&amp;gt;
         &amp;lt;version&amp;gt;10.8.2.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.apache.derby&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;derbynet&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;10.8.2.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;


        &amp;lt;!-- GIS Coverage --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.geotoolkit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geotk-coverage&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${geotoolkit.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.geotoolkit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geotk-coverageio&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${geotoolkit.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.geotoolkit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geotk-coverageio-netcdf&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${geotoolkit.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;

        &amp;lt;!-- Scala dependencies --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.scala-lang&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;scala-library&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${scala.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.scala-lang&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jline&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${scala.version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;

        &amp;lt;!-- Logger via SLF4J --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.6.4&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;

        &amp;lt;!-- Ubiquitous JUnit dependency --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;4.10&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

    &amp;lt;repositories&amp;gt;
        &amp;lt;repository&amp;gt;
            &amp;lt;id&amp;gt;maven.geotoolkit.org/&amp;lt;/id&amp;gt;
            &amp;lt;name&amp;gt;Geotoolkit repository&amp;lt;/name&amp;gt;
            &amp;lt;url&amp;gt;http://maven.geotoolkit.org/&amp;lt;/url&amp;gt;
        &amp;lt;/repository&amp;gt;
        &amp;lt;repository&amp;gt;
            &amp;lt;id&amp;gt;scala-tools.org&amp;lt;/id&amp;gt;
            &amp;lt;name&amp;gt;Scala-Tools Maven2 Repository&amp;lt;/name&amp;gt;
            &amp;lt;url&amp;gt;http://scala-tools.org/repo-releases&amp;lt;/url&amp;gt;
            &amp;lt;releases&amp;gt;
                &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;
            &amp;lt;/releases&amp;gt;
            &amp;lt;snapshots&amp;gt;
                &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;
            &amp;lt;/snapshots&amp;gt;
        &amp;lt;/repository&amp;gt;
    &amp;lt;/repositories&amp;gt;

    &amp;lt;pluginRepositories&amp;gt;
        &amp;lt;pluginRepository&amp;gt;
            &amp;lt;id&amp;gt;scala-tools.org&amp;lt;/id&amp;gt;
            &amp;lt;name&amp;gt;Scala-Tools Maven2 Repository&amp;lt;/name&amp;gt;
            &amp;lt;url&amp;gt;http://scala-tools.org/repo-releases&amp;lt;/url&amp;gt;
        &amp;lt;/pluginRepository&amp;gt;
    &amp;lt;/pluginRepositories&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;sourceDirectory&amp;gt;src/main/scala&amp;lt;/sourceDirectory&amp;gt;
        &amp;lt;testSourceDirectory&amp;gt;src/test/scala&amp;lt;/testSourceDirectory&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;encoding&amp;gt;${project.build.sourceEncoding}&amp;lt;/encoding&amp;gt;
                    &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;
                    &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;
                    &amp;lt;optimize&amp;gt;true&amp;lt;/optimize&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.scala-tools&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-scala-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;2.15.2&amp;lt;/version&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;
                            &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                        &amp;lt;configuration&amp;gt;
                            &amp;lt;scalaVersion&amp;gt;${scala.version}&amp;lt;/scalaVersion&amp;gt;
                            &amp;lt;encoding&amp;gt;${project.build.sourceEncoding}&amp;lt;/encoding&amp;gt;
                            &amp;lt;charset&amp;gt;${project.build.sourceEncoding}&amp;lt;/charset&amp;gt;
                            &amp;lt;args&amp;gt;
                                &amp;lt;arg&amp;gt;-optimise&amp;lt;/arg&amp;gt;
                                &amp;lt;arg&amp;gt;-unchecked&amp;lt;/arg&amp;gt;
                                &amp;lt;arg&amp;gt;-deprecation&amp;lt;/arg&amp;gt;
                                &amp;lt;arg&amp;gt;-dependencyfile&amp;lt;/arg&amp;gt;
                                &amp;lt;arg&amp;gt;${project.build.directory}/.scala_dependencies&amp;lt;/arg&amp;gt;
                            &amp;lt;/args&amp;gt;
                        &amp;lt;/configuration&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;2.9&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;parallel&amp;gt;classes&amp;lt;/parallel&amp;gt;
                    &amp;lt;argLine&amp;gt;-Xmx1024m&amp;lt;/argLine&amp;gt;
                    &amp;lt;encoding&amp;gt;${project.build.sourceEncoding}&amp;lt;/encoding&amp;gt;
                    &amp;lt;forkMode&amp;gt;once&amp;lt;/forkMode&amp;gt;
                    &amp;lt;useFile&amp;gt;false&amp;lt;/useFile&amp;gt;
                    &amp;lt;disableXmlReport&amp;gt;true&amp;lt;/disableXmlReport&amp;gt;
                    &amp;lt;!-- If you have classpath issue like NoDefClassError,... --&amp;gt;
                    &amp;lt;!-- useManifestOnlyJar&amp;gt;false&amp;lt;/useManifestOnlyJar --&amp;gt;
                    &amp;lt;includes&amp;gt;
                        &amp;lt;include&amp;gt;**/*Test.*&amp;lt;/include&amp;gt;
                        &amp;lt;include&amp;gt;**/*Suite.*&amp;lt;/include&amp;gt;
                    &amp;lt;/includes&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;h2&gt;









Reading a Grid&lt;/h2&gt;
First, I need to read the gridded data so I can work with it. The CDL for my dataset is:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:text"&gt;netcdf BIGGRID_UTM50 {
dimensions:
 x = 5083 ;
 y = 4067 ;
variables:
 double x(x) ;
  x:long_name = "Easting (meters)" ;
  x:actual_range = 422985.277598382, 677085.277598383 ;
 double y(y) ;
  y:long_name = "Northing (meters)" ;
  y:actual_range = 3915514.90677777, 4118814.90677777 ;
 float z(y, x) ;
  z:long_name = "Topography (m)" ;
  z:actual_range = -4032.438f, 964.f ;

// global attributes:
  :Conventions = "COARDS/CF-1.0" ;
  :description = "\tProjection: UTM10N\n",
   "\tGrid created by: GMTGridReader.scala" ;
  :CreationDate = "20110214T193537Z" ;
}
&lt;/pre&gt;
&lt;br /&gt;
The &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; code to read the file is:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:scala"&gt;import java.io.File
import org.geotoolkit.coverage.io.CoverageIO

val file = new File("BIGGRID_UTM50.grd")
// read returns GridCoverage, but really it's a GridCoverage2D
val coverage = CoverageIO.read(file).asInstanceOf[GridCoverage2D]
&lt;/pre&gt;
&lt;br /&gt;
Unfortunately, the coordinate reference system, or CRS, isn't correct. How do I know that? You can examine the CRS like so:

&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:scala"&gt;println(coverage.getCoordinateReferenceSystem)
// NetCDF:"x y"
&lt;/pre&gt;
&lt;br /&gt;
We need to force it to be UTM Zone 10N. If you're using a different zone, you can look up the CRS code at &lt;a href="http://www.epsg-registry.org/"&gt;http://www.epsg-registry.org/&lt;/a&gt;. Here's how I'm forcing the zone:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:scala"&gt;import org.geotoolkit.coverage.CoverageFactoryFinder
import org.geotoolkit.referencing.CRS


// Be warned. This fires up an Apache Derby database in the background
val utmZone10N = CRS.decode("EPSG:32610")
val gridCoverageFactory = CoverageFactoryFinder.getGridCoverageFactory(null)
val sourceGeometrey = coverage.getGridGeometry
val utmCoverage = gridCoverageFactory.create(
            coverage.getName,               // The grid coverage name
            coverage.getRenderedImage,      // The pixel values
            utmZone10N,                     // The coordinate reference system
            sourceGeometrey.getGridToCRS(), // The transform from pixel to geodetic coordinates
            coverage.getSampleDimensions,   // Information about each band
            null,                           // The sources (Not relevant here)
            null)                           // Optional properties


// View CRS
println(utmCoverage.getCoordinateReferenceSystem)

/*
PROJCS["WGS 84 / UTM zone 10N", 
  GEOGCS["WGS 84", 
    DATUM["WGS84", 
      SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
      AUTHORITY["EPSG","6326"]], 
    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
    UNIT["degree", 0.017453292519943295], 
    AXIS["Geodetic latitude", NORTH], 
    AXIS["Geodetic longitude", EAST], 
    AUTHORITY["EPSG","4326"]], 
  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
  PARAMETER["central_meridian", -123.0], 
  PARAMETER["latitude_of_origin", 0.0], 
  PARAMETER["scale_factor", 0.9996], 
  PARAMETER["false_easting", 500000.0], 
  PARAMETER["false_northing", 0.0], 
  UNIT["metre", 1.0], 
  AXIS["Easting", EAST], 
  AXIS["Northing", NORTH], 
  AUTHORITY["EPSG","32610"]]
*/
&lt;/pre&gt;
&lt;h2&gt;

Coming in Part 2&lt;/h2&gt;
In part 2, I'll walk through accessing data values from the grid.
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
 function loadScript(url, callback){
  var script = document.createElement("script")
  script.type = "text/javascript";
  if (script.readyState){  //IE
   script.onreadystatechange = function(){
    if (script.readyState == "loaded" ||
      script.readyState == "complete"){
     script.onreadystatechange = null;
     callback();
    }
   };
  } else {  //Others
   script.onload = function(){
    callback();
   };
  }
  script.src = url;
  document.getElementsByTagName("head")[0].appendChild(script);
 }
 loadScript("http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js", 
  function(){
   loadScript("http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js", 
    function(){
     SyntaxHighlighter.config.bloggerMode = true;
     SyntaxHighlighter.autoloader(
       'text plain http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shBrushPlain.js',
       'scala http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shBrushScala.js',
       'xml xhtml xslt html http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shBrushXml.js'      
     );     
     SyntaxHighlighter.all();
    }  
   );
  }
 );
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8628232692869005486?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8628232692869005486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8628232692869005486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8628232692869005486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8628232692869005486'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2012/01/scala-geotoolkit-and-utm-zone-10n-grd.html' title='Scala, Geotoolkit and UTM Zone 10N gridded data (Part 1)'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8382699928139819014</id><published>2012-01-05T16:51:00.000-08:00</published><updated>2012-01-26T20:06:04.285-08:00</updated><title type='text'>PartialFunction in Scala</title><content type='html'>&lt;span style="font-size: large;"&gt;From:&amp;nbsp;&lt;a href="http://www.artima.com/forums/flat.jsp?forum=106&amp;amp;thread=338796"&gt;Weblogs Forum - Scala, Patterns and The Perl Effect&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I came across this comment thread on Bruce Eckel's blog. Trond Olsen's comments provided an 'aha' moment that helped me understand &lt;a href="http://www.scala-lang.org/api/current/index.html#scala.PartialFunction"&gt;PartialFunctions&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: #eeeeee; font-family: tahoma, arial, sans-serif;"&gt;Partial functions are defined for specific value ranges. The example just showed how you can compose two partial functions, one on {"1","2","3"} and another on {1,2,3}, into one of the union of those. Partial functions gives a runtime error when you hit outside their defined value ranges.&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;And here's the code:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:scala"&gt;val f1: PartialFunction[Any,String] = {
  case "1" =&amp;gt; "One"
  case "2" =&amp;gt; "Two"
  case "3" =&amp;gt; "Three"
}

val f2: PartialFunction[Any,String] = {
  case 1 =&amp;gt; "One"
  case 2 =&amp;gt; "Two"
  case 3 =&amp;gt; "Three"
}

val f3 = f1 orElse f2

f3("1")
// res0: String = One

f3(1)
// res1: String = One

f3("3")
// res2: String = Three

f3("a")
// scala.MatchError: a (of class java.lang.String)

&lt;/pre&gt;
&lt;b&gt;And here's further extension of the example:
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:scala"&gt;val f4: PartialFunction[Any,String] = {
  case _ =&amp;gt; "undefined"
}

val f5 = f3 orElse f4

f5("a")
// res3: String = undefined

&lt;/pre&gt;
&lt;script type="text/javascript"&gt;
 function loadScript(url, callback){
  var script = document.createElement("script")
  script.type = "text/javascript";
  if (script.readyState){  //IE
   script.onreadystatechange = function(){
    if (script.readyState == "loaded" ||
      script.readyState == "complete"){
     script.onreadystatechange = null;
     callback();
    }
   };
  } else {  //Others
   script.onload = function(){
    callback();
   };
  }
  script.src = url;
  document.getElementsByTagName("head")[0].appendChild(script);
 }
 loadScript("http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js", 
  function(){
   loadScript("http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js", 
    function(){
     SyntaxHighlighter.config.bloggerMode = true;
     SyntaxHighlighter.autoloader(
       'text plain http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shBrushPlain.js',
       'scala  http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shBrushScala.js',
       'xml xhtml xslt html http://alexgorbatchev.com.s3.amazonaws.com/pub/sh/3.0.83/scripts/shBrushXml.js'      
     );     
     SyntaxHighlighter.all();
    }  
   );
  }
 );
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8382699928139819014?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8382699928139819014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8382699928139819014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8382699928139819014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8382699928139819014'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2012/01/partialfunction-in-scala.html' title='PartialFunction in Scala'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-7600950326938616344</id><published>2012-01-05T16:03:00.000-08:00</published><updated>2012-01-05T16:03:44.406-08:00</updated><title type='text'>Settings in Sublime Text 2 get Clobbered on Updates</title><content type='html'>I've been playing around with different text editors lately. Although&lt;a href="http://blog.macromates.com/2011/textmate-2-0-alpha/"&gt; TextMate 2 Alpha&lt;/a&gt; is finally out and is pretty nice, I've been playing around with &lt;a href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt;. I've kept my eye on it for a while now and it just wasn't quite there yet. However, in the last few weeks it's reached a state where it's gotten very usable. However, when it self-updates some of my settings get lost. So I thought, I'd write them down for future reference:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Base File.sublime-settings&lt;/h3&gt;
&lt;pre&gt;{
 "color_scheme": "Packages/Theme - Hohonuuli/Hohonuuli.tmTheme",
 "caret_style": "phase",
 "find_selected_text": true,
 "font_face": "Ubuntu Mono",
 "font_size": 14.0,
 "indent_guide_options": ["draw_normal", "draw_active"],
 "translate_tabs_to_spaces": false,
 "wide_caret": true, /* hidden option */
 "word_wrap": false
}
&lt;/pre&gt;
&lt;h3&gt;



Default (OSX).sublime-keymap&lt;/h3&gt;
&lt;pre&gt;[
 { "keys": ["ctrl+w"], "command": "expand_selection", "args": {"to": "word"} },
 { "keys": ["ctrl+l"], "command": "expand_selection", "args": {"to": "line"} },
 { "keys": ["ctrl+b"], "command": "expand_selection", "args": {"to": "scope"} },
 { "keys": ["super+d"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Line.sublime-macro"} },
 { "keys": ["super+shift+o"], "command": "prompt_add_folder"}
]
&lt;/pre&gt;
&lt;h3&gt;



Global.sublime-settings&lt;/h3&gt;
&lt;pre&gt;{
 "highlight_modified_tabs": true,
 "hot_exit": false,
 "ignored_packages":
 [
  "Vintage"
 ],
 "remember_open_files": true,
 "theme": "Soda Dark.sublime-theme",
 "word_wrap": false
}
&lt;/pre&gt;
&lt;h3&gt;



Word Highlight.sublime-settings&lt;/h3&gt;
&lt;pre&gt;{
 "color_scope_name" : "wordhighlight",
 "draw_outlined": true,
 "selection_delay": 0.04,
 "highlight_when_selection_is_empty": true,
 "highlight_word_under_cursor_when_selection_is_empty": false,
 "file_size_limit": 4194304
}
&lt;/pre&gt;
&lt;h3&gt;



BracketHighlighter.sublime-settings&lt;/h3&gt;
&lt;pre&gt;{
 //Enable bracket matching on type
 "quote_enable" : true,
 "curly_enable" : true,
 "round_enable" : true,
 "square_enable": true,
 "angle_enable" : true,
 //Higlight tags if tag is selected. angle_enable must be true for tags to work
 //if you would like to ignore non tags then set ignore_non_tags to true
 "tag_enable"   : true,

 //don't show non tag angle matches
 "ignore_non_tags" : false,

 //match brackets only when the cursor is adjacent to one
 "match_adjacent_only" : false,

 //exclude or include bracket by language type (example: C++ for C++.tmLanguage)
 //Note: this is particularly useful with Angle. Some languages do not attribute any special scope to angle brackets making it hard
 //to tell when the bracket is beign used in a valid scenario.  C++ is a perfect example.  It is better to disable completely than
 //to ignore angle.  Ignoring will not show angle matches, but will also interfere with other bracket matches.
 "angle_language_list" : ["HTML","HTML 5","XML","PHP"],
 "tag_language_list"   : ["HTML","HTML 5","XML","PHP"],
 "quote_language_list" : ["Plain text"],
 "curly_language_list" : ["Plain text"],
 "round_language_list" : ["Plain text"],
 "square_language_list": ["Plain text"],

 //filter type (whitelist|blacklist)
 "angle_language_filter" : "whitelist",
 "tag_language_filter"   : "whitelist",
 "quote_language_filter" : "blacklist",
 "curly_language_filter" : "blacklist",
 "round_language_filter" : "blacklist",
 "square_language_filter": "blacklist",

 //Scope? (Defined in theme files.) -&amp;gt;
 //Examples: (keyword/string/number)
 "quote_scope" : "entity.name.class",
 "curly_scope" : "curlybrackets",
 "round_scope" : "curlybrackets",
 "square_scope": "curlybrackets",
 "angle_scope" : "curlybrackets",
 "tag_scope"   : "entity.name.class",

 //Outline? (solid/outline/underline/none) -&amp;gt;
 "quote_style" : "solid",
 "curly_style" : "solid",
 "round_style" : "solid",
 "square_style": "solid",
 "angle_style" : "solid",
 "tag_style"   : "solid",

 //Icon? (dot/circle/bookmark/cross)
 "quote_icon" : "dot",
 "curly_icon" : "dot",
 "round_icon" : "dot",
 "square_icon": "dot",
 "angle_icon" : "dot",
 "tag_icon"   : "dot",

 //Higlight brackets of tag only instead of entire tag
 "tag_brackets_only" : false,

 //Type of tag selection? (html/xhtml)
 "tag_type" : "html",

 //threshold distance to search
 "search_threshold"     : 2000,
 "tag_search_threshold" : 2000,
 "use_search_threshold"     : true,
 "tag_use_search_threshold" : true,

 //Debounce delay in miliseconds
 "debounce_delay" : 100
}
&lt;/pre&gt;
&lt;h3&gt;

Screenshot&lt;/h3&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-cACqxHEu1oA/TwY6KGrMWiI/AAAAAAAAB5E/2BfTGxkjL-I/s1600/Point.scala-2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-cACqxHEu1oA/TwY6KGrMWiI/AAAAAAAAB5E/2BfTGxkjL-I/s400/Point.scala-2.jpg" width="313" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-7600950326938616344?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/7600950326938616344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=7600950326938616344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7600950326938616344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7600950326938616344'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2012/01/wordhighlight-settings-in-sublime-text.html' title='Settings in Sublime Text 2 get Clobbered on Updates'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-cACqxHEu1oA/TwY6KGrMWiI/AAAAAAAAB5E/2BfTGxkjL-I/s72-c/Point.scala-2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-7194335286952235338</id><published>2011-12-06T09:05:00.000-08:00</published><updated>2012-01-06T16:35:37.055-08:00</updated><title type='text'>Functor — incompatible types</title><content type='html'>Here's a handy tidbit for handling types in Functors. From:&amp;nbsp;&lt;a href="https://groups.google.com/forum/#!topic/scala-user/IiEzHT8yTHk/discussion"&gt;Functor — incompatible types - Google Groups&lt;/a&gt;: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;trait Functor[F[_],A] { 
  def map[B](f: A =&amp;gt; B): F[B] 
}
 
case class Box[T](val content: T) extends Functor[Box, T] {
  def map[B](f: T =&amp;gt; B): Box[B] = Box(f(content))
  override def toString = "Box(" + content + ")"
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-7194335286952235338?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/7194335286952235338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=7194335286952235338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7194335286952235338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7194335286952235338'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2011/12/functor-incompatible-types-google.html' title='Functor — incompatible types'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-3494927517268838235</id><published>2011-10-24T14:18:00.001-07:00</published><updated>2011-10-24T14:20:39.061-07:00</updated><title type='text'>Command line Twitter search in Groovy and Scala</title><content type='html'>I found a nice post about doing command line searches of Twitter using Groovy. In a nutshell the code was this:

&lt;b&gt;twitsearch.groovy&lt;/b&gt;
&lt;pre&gt;
#!/usr/bin/env groovy
/*
  From http://www.ibm.com/developerworks/java/library/j-groovy09299/
 */
 
if (args) {
    def queryterm = args[0]
    def q = "http://search.twitter.com/search.atom?q=${queryterm}"
    def feed = new XmlSlurper().parse(q)
    feed.entry.each { entry -&gt;
        println  """\
${entry.author.name} - ${entry.published}
\"${entry.title}\"
${'-' * 72}"""
    }
}
else {
    println  "USAGE: twitsearch.groovy &lt;query&gt;"
}
&lt;/pre&gt;

I tried the same thing in Scala:
&lt;b&gt;twitsearch.scala&lt;/b&gt;
&lt;pre&gt;
#!/bin/sh
exec scala -savecompiled "$0" "$@"
!#

if (args.size &gt; 0) {
    import java.net.{URLConnection, URL}
    import scala.xml._
    val queryterm = args(0)
    val q = "http://search.twitter.com/search.atom?q=" + queryterm
    val feed = XML.load(new URL(q))
    feed \ "entry" foreach { entry =&gt;
        println((entry \\ "author" \\ "name" text) + " - " + (entry \\ "published" text))
        println("\"" + (entry \\ "title" text) + "\"")
        println("-" * 72 )
    }
}
else {
    println("USAGE: twitsearch.scala &lt;query&gt;")
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-3494927517268838235?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/3494927517268838235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=3494927517268838235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/3494927517268838235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/3494927517268838235'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2011/10/command-line-twitter-search-in-groovy.html' title='Command line Twitter search in Groovy and Scala'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-6705719052799736176</id><published>2011-10-24T14:17:00.000-07:00</published><updated>2011-10-24T14:22:57.559-07:00</updated><title type='text'>Groovy Script for Dumping NCML</title><content type='html'>If you work with &lt;a href="http://www.unidata.ucar.edu/software/netcdf/"&gt;NetCDF&lt;/a&gt; and want to see the &lt;a href="http://www.unidata.ucar.edu/software/netcdf/ncml/"&gt;NcML&lt;/a&gt; you can create a &lt;a href="http://groovy.codehaus.org/"&gt;groovy script&lt;/a&gt; like:

&lt;pre&gt;
#!/usr/bin/env groovy

@Grab(group = 'edu.ucar.netcdf', module = 'netcdf-all', version = '4.0')
def nc = ucar.nc2.dataset.NetcdfDataset.openDataset(args[0])
nc.writeNcML(System.out, '')
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-6705719052799736176?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/6705719052799736176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=6705719052799736176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/6705719052799736176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/6705719052799736176'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2011/10/groovy-script-for-dumping-ncml.html' title='Groovy Script for Dumping NCML'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8863101289535072267</id><published>2010-10-07T12:57:00.000-07:00</published><updated>2011-05-18T13:27:16.786-07:00</updated><title type='text'>Extracting Image metadata using Java/Groovy</title><content type='html'>&lt;h1&gt;Extracting Image metadata using Java/Groovy&lt;/h1&gt;
I'm currently working on a project that wants to use lossless PNG images for an image archive format. The format has to be able to store metadata about the image. We've found that the EXIFTool will put the metadata in PNG's using XMP XML. The trick is trying to read that metadata back out. Using Sanselan, it's possible to access this metadata. The script below will dump out all the metadata I'm able to extract from the image:

&lt;b&gt;Note:&lt;/b&gt; The Grab annotation that's fetching Sanselan requires you to configure Grapes to pull from a repository that actually contains Sanselan. There's one such repo at &lt;a href="http://code.google.com/p/mbari-maven-repository/"&gt;http://code.google.com/p/mbari-maven-repository/&lt;/a&gt; 

&lt;pre&gt;
#!/usr/bin/env groovy 

@Grab(group='org.apache.commons', module='sanselan', version='0.97')
import javax.imageio.ImageIO
import javax.imageio.ImageReader
import javax.imageio.metadata.IIOMetadata
import javax.imageio.stream.ImageInputStream
import org.apache.sanselan.ImageReadException
import org.apache.sanselan.Sanselan
import org.apache.sanselan.common.IImageMetadata
import org.apache.sanselan.common.RationalNumber
import org.apache.sanselan.formats.jpeg.JpegImageMetadata
import org.apache.sanselan.formats.tiff.TiffField
import org.apache.sanselan.formats.tiff.TiffImageMetadata
import org.apache.sanselan.formats.tiff.constants.GPSTagConstants
import org.apache.sanselan.formats.tiff.constants.TagInfo
import org.apache.sanselan.formats.tiff.constants.TiffConstants
import org.w3c.dom.NamedNodeMap
import org.w3c.dom.Node

def file = new File(args[0])
println("file: ${file.getPath()}")
println("---- Extracting metadata using Sanselan")
printSanselan(file)
println("---- Extracting XMP XML using Sanselan")
printSanselanXMP(file)
println("---- Extracting metadata using Java ImageIO")
printImageIO(file)



void printImageIO(File file) {
    
    ImageInputStream input = ImageIO.createImageInputStream(file)
    Iterator&lt;ImageReader&gt; readers = ImageIO.getImageReaders(input)
    while (readers.hasNext()) {
        ImageReader reader = readers.next()
        reader.setInput(input, true)
        IIOMetadata metadata = reader.getImageMetadata(0)
        String[] names = metadata.metadataFormatNames
        for (name in names) {
            println("")
            println("-&gt; Format name: ${name}" )
            printImageIOMetadata(metadata.getAsTree(name))
        }
    }
    input.close()
}

void printImageIOMetadata(Node node, int level = 0) {
    print("    " * level)
    print("&lt;${node.nodeName}")
    NamedNodeMap map = node.attributes
    if (map) {
        for (i in 0..&lt;map.length) {
            Node a = map.item(i)
            print(" ${a.nodeName}=\"${a.nodeValue}\"")
        }
    }
    Node child = node.firstChild
    if (child) {
        println("&gt;")
        while(child) {
             printImageIOMetadata(child, level + 1)
             child = child.nextSibling
        }
        print("    " * level)
        println("&lt;/${node.nodeName}&gt;")
    }
    else {
        println(" /&gt;")
    }
    
}



// ---- Using Sanselan ------------------------------------------------
void printSanselan(File file) {
    //        get all metadata stored in EXIF format (ie. from JPEG or TIFF).
    //            org.w3c.dom.Node node = Sanselan.getMetadataObsolete(imageBytes);
    IImageMetadata metadata = Sanselan.getMetadata(file)
    if (!metadata) {
        println("\tNo image metadata was found")
        return
    }
    
    if (metadata instanceof JpegImageMetadata) {
        printSanselanJpegMetadata(metadata)
    }
    else {
        printSanselanOtherMetadata(metadata)
    }
}

void printSanselanJpegMetadata(JpegImageMetadata metadata) {
    JpegImageMetadata jpegMetadata = metadata

    // Jpeg EXIF metadata is stored in a TIFF-based directory structure
    // and is identified with TIFF tags.
    // Here we look for the "x resolution" tag, but
    // we could just as easily search for any other tag.
    //
    // see the TiffConstants file for a list of TIFF tags.

    // print out various interesting EXIF tags.
    println("  -- Standard EXIF Tags")
    printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_XRESOLUTION)
    printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_DATE_TIME)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_DATE_TIME_ORIGINAL)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_CREATE_DATE)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_ISO)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_SHUTTER_SPEED_VALUE)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_APERTURE_VALUE)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_BRIGHTNESS_VALUE)

    // simple interface to GPS data
    TiffImageMetadata exifMetadata = jpegMetadata.exif
    println("  -- GPS Info (using ${exifMetadata.getClass().getName()})")
    if (exifMetadata) {
        TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS()
        if (gpsInfo) {
            double longitude = gpsInfo.longitudeAsDegreesEast
            double latitude = gpsInfo.latitudeAsDegreesNorth

            println("        GPS Description: ${gpsInfo}")
            println("        GPS Longitude (Degrees East): ${longitude}")
            println("        GPS Latitude (Degrees North): ${latitude}")
            
        }
        def tags = GPSTagConstants.ALL_GPS_TAGS
        tags.each { tag -&gt;
            def field = exifMetadata.findField(tag)
            if (field) {
                def item = new TiffImageMetadata.Item(field)
                println("        ${tag.description}${item.text}")
            }
        }
        /*println("  -- All Tiff Info (using ${exifMetadata.getClass().getName()})")
        def directories = exifMetadata.directories.sort { it.toString() }
        directories.each { dir -&gt;
            def fields = dir.allFields.sort { it.tagInfo.description }
            fields.each { field -&gt;
                def item = new TiffImageMetadata.Item(field)
                println("        ${dir} -&gt; ${field.tagInfo.description}${item.text}") 
            }
        } */
    }

    println("  -- All EXIF info (using ${metadata.getClass().getName()})")
    def items = jpegMetadata.items.sort { it.keyword } // List&lt;ImageMetadata.Item&gt;
    items.each { item -&gt;
       println("        ${item}")   
    }
    println("")
}

void printSanselanOtherMetadata(IImageMetadata metadata) {
    println("  -- All image metadata info (using ${metadata.getClass().getName()})")
    def items = metadata.items.sort { it.keyword } // List&lt;ImageMetadata.Item&gt;
    items.each { item -&gt;
       println("        ${item}")   
    }
    println("")
}

void printSanselanXMP(File file) {
    String xml = Sanselan.getXmpXml(file)
    if (xml) {
        println(xml)
    }
    println("")
}

void printTagValue(JpegImageMetadata jpegMetadata, TagInfo tagInfo) {
    TiffField field = jpegMetadata.findEXIFValue(tagInfo);
    if (field == null) {
        println("        (${tagInfo.name} not found.)")
    }
    else {
        println("        ${tagInfo.name}: ${field.valueDescription}")
    }
}




&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8863101289535072267?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8863101289535072267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8863101289535072267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8863101289535072267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8863101289535072267'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/10/extracting-image-metadata-using.html' title='Extracting Image metadata using Java/Groovy'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-9008156679894889445</id><published>2010-08-20T09:03:00.000-07:00</published><updated>2011-07-25T13:29:28.744-07:00</updated><title type='text'>Maven Versions Plugin</title><content type='html'>&lt;h1&gt;
Maven Versions Plugin&lt;/h1&gt;
I came across this article (at &lt;a href="http://www.wakaleo.com/blog/281-managing-version-numbers-in-maven-with-the-maven-versions-plugin"&gt;http://www.wakaleo.com/blog/281-managing-version-numbers-in-maven-with-the-maven-versions-plugin&lt;/a&gt; that discusses a Maven plugin that can assist you with updating the dependencies in a Maven project to more recent versions. The short guide is:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;mvn versions:display-dependency-updates&lt;/b&gt;: Lists the dependencies you are using and which ones have an update available&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mvn versions:display-plugin-updates&lt;/b&gt;: Same as above but looks at the plugins that your project is using&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mvn versions:set -DnewVersion=1.0.2-SNAPSHOT&lt;/b&gt;: Changes your projects version number. Here we're setting it to 1.0.2-SNAPSHOT&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mvn versions:use-latest-versions&lt;/b&gt;: Updates all dependencies to the latest version
  &lt;ul&gt;
&lt;li&gt;&lt;b&gt;mvn versions:use-latest-releases&lt;/b&gt;: Replaces SNAPSHOT dependencies with latest release&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mvn versions:use-releases&lt;/b&gt;: Replaces SNAPSHOT dependencies with the corresponding release version&lt;/li&gt;
&lt;li&gt;&lt;b&gt;versions:use-next-snapshots&lt;/b&gt;: Use the next available SNAPSHOT release&lt;/li&gt;
&lt;li&gt;&lt;b&gt;versions:use-latest-snapshots&lt;/b&gt;: Use the bleeding edge (i.e. the latest SNAPSHOT release&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mvn versions:commit&lt;/b&gt;: Commits any changes you made with &lt;b&gt;mvn versions&lt;/b&gt; to your pom and removes the backup files that &lt;b&gt;mvn versions&lt;/b&gt; created.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mvn versions:revert&lt;/b&gt;: Rollback any changes you made with the &lt;b&gt;mvn versions&lt;/b&gt; to it's previous state.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-9008156679894889445?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/9008156679894889445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=9008156679894889445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/9008156679894889445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/9008156679894889445'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/08/maven-versions-plugin-i-came-across.html' title='Maven Versions Plugin'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-6960515419792892668</id><published>2010-07-15T11:48:00.000-07:00</published><updated>2012-01-06T09:13:51.618-08:00</updated><title type='text'>Safe-dereference operator in Scala</title><content type='html'>I've always loved &lt;a href="http://groovy.codehaus.org/Null+Object+Pattern"&gt;Groovy's null safe operators&lt;/a&gt; (i.e &lt;b&gt;?.&lt;/b&gt;) and wanted something similar in &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;. In keeping with Scala's preference of using &lt;a href="http://www.scala-lang.org/archives/rc-api/scala/Option$.html"&gt;Option&lt;/a&gt; for managing null's, this little object seems to do the trick:
&lt;br /&gt;
&lt;pre&gt;object SafeOption { 
    def apply[A](x: =&amp;gt; A):Option[A] = {
        try { 
            Option(x) 
        } 
        catch { 
            case _ =&amp;gt; None 
        }
    }
}
&lt;/pre&gt;
This allows me to try pretty much anything and have it safely handled. For example:
&lt;br /&gt;
&lt;pre&gt;// Straight Scala
scala&amp;gt; &lt;b&gt;val a = Option(Nil.head)&lt;/b&gt;
java.util.NoSuchElementException: head of empty list
 at scala.collection.immutable.Nil$.head(List.scala:386)
 at .&lt;init&gt;(&lt;console&gt;:5)
 at .&lt;clinit&gt;(&lt;console&gt;)
 at RequestResult$.&lt;init&gt;(&lt;console&gt;:9)
 at RequestResult$.&lt;clinit&gt;(&lt;console&gt;)
 at RequestResult$scala_repl_result(&lt;console&gt;)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981)
 at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981)
 at s...


// With 'safe-dereferencing'
scala&amp;gt; &lt;b&gt;val a = SafeOption(Nil.head)&lt;/b&gt;
a: Option[Nothing] = None
&lt;/console&gt;&lt;/console&gt;&lt;/clinit&gt;&lt;/console&gt;&lt;/init&gt;&lt;/console&gt;&lt;/clinit&gt;&lt;/console&gt;&lt;/init&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-6960515419792892668?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/6960515419792892668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=6960515419792892668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/6960515419792892668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/6960515419792892668'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/07/safe-dereference-operator-in-scala-ive.html' title='Safe-dereference operator in Scala'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-1056705150725060492</id><published>2010-06-16T19:11:00.000-07:00</published><updated>2011-07-25T13:28:58.019-07:00</updated><title type='text'>Calling Clojure from Java</title><content type='html'>&lt;h2&gt;
Calling Clojure from Java&lt;/h2&gt;
From &lt;b&gt;rzezeski&lt;/b&gt; on the clojure mailing list:

&lt;br /&gt;
&lt;pre&gt;------ CallClojure.java ------
import clojure.lang.RT;
import clojure.lang.Var;
import clojure.lang.PersistentVector;

public class CallClojure {

   static PersistentVector toVec(int[][] arr) {
       PersistentVector pv = PersistentVector.EMPTY;
       for (int[] a : arr) {
           PersistentVector temp = PersistentVector.EMPTY;
           for (int n : a) {
               temp = temp.cons(n);
           }
           pv = pv.cons(temp);
       }
       return pv;
   }

   public static void main(String[] args) throws Exception {
       RT.loadResourceScript("foo.clj");
       Var gimmie_vec = RT.var("foo", "gimmie-vec");
       int[][] ar = {{1, 2}, {3, 4}, {5, 6}};
       Object result = gimmie_vec.invoke(toVec(ar));
       System.out.println(result);
   }
}

------ foo.clj ------
(ns foo)

(defn gimmie-vec [v]
 (println "class:" (class v))
 (println "v:" v))
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-1056705150725060492?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/1056705150725060492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=1056705150725060492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/1056705150725060492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/1056705150725060492'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/06/calling-clojure-from-java-from-rzezeski.html' title='Calling Clojure from Java'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-19404276995362643</id><published>2010-04-05T16:32:00.000-07:00</published><updated>2011-07-25T13:28:48.581-07:00</updated><title type='text'>Dynamically Setting the Name of the output of a Maven build</title><content type='html'>&lt;h2&gt;
Dynamically Setting the Name of the output of a Maven build&lt;/h2&gt;
I came across &lt;a href="http://www.dzone.com/links/why_i_dont_use_maven_for_my_java_projects.html"&gt;this post at DZone&lt;/a&gt; where essential the author was complaining that he couldn't set the name of the build product in Maven without modifying the pom.xml file. In his case he wanted to pull the version number from Git. The solution was actually pretty straightforward with a little scripting help from &lt;a href="http://docs.codehaus.org/display/GMAVEN/Home"&gt;GMaven&lt;/a&gt;. Here's an example

&lt;br /&gt;
&lt;pre&gt;&lt;build&gt;
 &amp;lt;plugins&amp;gt;
   &amp;lt;plugin&amp;gt;
     &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;gmaven-plugin&amp;lt;/artifactId&amp;gt;
     &amp;lt;executions&amp;gt;
       &amp;lt;execution&amp;gt;
         &amp;lt;id&amp;gt;groovy-magic&amp;lt;/id&amp;gt;
         &amp;lt;phase&amp;gt;prepare-package&amp;lt;/phase&amp;gt;
         &amp;lt;goals&amp;gt;
           &amp;lt;goal&amp;gt;execute&amp;lt;/goal&amp;gt;
         &amp;lt;/goals&amp;gt;
         &amp;lt;configuration&amp;gt;
           &amp;lt;source&amp;gt;
             def scmversion = 'git describe'.execute().text.trim()
             project.build.finalName = "${project.artifactId}-${scmversion}"
           &amp;lt;/source&amp;gt;
         &amp;lt;/configuration&amp;gt;
       &amp;lt;/execution&amp;gt;
     &amp;lt;/executions&amp;gt;
   &amp;lt;/plugin&amp;gt;
 &amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;
&lt;/build&gt;&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-19404276995362643?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/19404276995362643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=19404276995362643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/19404276995362643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/19404276995362643'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/04/dynamically-setting-name-of-output-of.html' title='Dynamically Setting the Name of the output of a Maven build'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-4282305723716945850</id><published>2010-02-25T12:49:00.001-08:00</published><updated>2011-07-25T13:28:37.727-07:00</updated><title type='text'>Working as an Independant programmer</title><content type='html'>&lt;h2&gt;
Working as an Independant programmer&lt;/h2&gt;
Found the very informative response (below) to &lt;a href="http://developers.slashdot.org/story/10/02/25/1949223/Independent-Programmers-No-Win-Scenario?from=rss&amp;amp;utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+Slashdot/slashdot+(Slashdot)&amp;amp;utm_content=Google+Feedfetcher"&gt;this post on Slashdot&lt;/a&gt;:

&lt;br /&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Step 1. Form an LLC. It's not hard, you can do it yourself for under $100 in most cases&lt;/li&gt;
&lt;li&gt;Step 2. Get an EIN number from the feds. Free and easy&lt;/li&gt;
&lt;li&gt;Step 3. Open a checking account for your new LLC. might require a credit check.&lt;/li&gt;
&lt;li&gt;Step 4. Get a decent accounting package.&lt;/li&gt;
&lt;li&gt;Step 5. Keep track of EVERY business expense. Keep milage logs in your car. Keep receipts. What percentage of your utilities, etc are business related? Track it.&lt;/li&gt;
&lt;li&gt;Step 6. If you think you need the additional coverage get E&amp;amp;O Insurance. It can be pricey, true. On the other hand if you LLC doesn't have a lot of hard assets, why worry?&lt;/li&gt;
&lt;li&gt;Step 7. Get health coverage. We found insurance through a local trade group for $600 a month for my wife and I. Pay it out of the company, it's a write off.&lt;/li&gt;
&lt;li&gt;Step 8. Work your ass off and enjoy the benefits of being able to write-off things you probably would have purchased anyway.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
This should have been step 6 - get a good tax guy (or girl) to help you figure shit out.&lt;/div&gt;
&lt;div&gt;
Now get creative. Like to go to theme parks? Set up another LLC and create a website dedicated to reviewing them, talking about which ones have what etc. Now you get to write off trips to Six Flags and Cedar point as legitimate business research.&lt;/div&gt;
&lt;div&gt;
Life is far more enjoyable when you do what you want, when you want, for whom you want. All the accounting is a pain in the ass, yes, but not as big of a pain in the ass as working for Bill Lumberg the rest of your life.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-4282305723716945850?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/4282305723716945850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=4282305723716945850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4282305723716945850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4282305723716945850'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/02/working-as-independant-programmer-found.html' title='Working as an Independant programmer'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-2641414280100325291</id><published>2010-02-19T11:42:00.000-08:00</published><updated>2011-07-25T13:28:28.375-07:00</updated><title type='text'>Show HTTP Headers</title><content type='html'>&lt;h2&gt;
Show HTTP Headers&lt;/h2&gt;
Here's a little &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; script to show the HTTP headers from a URL.

&lt;br /&gt;
&lt;pre&gt;#!/usr/bin/env groovy

if (args.size() &amp;lt; 1) {
    println """
USAGE: 
  urlheaders.groovy &lt;url&gt; &lt;proxy:port&gt;
  
ARGS:
  url = The URL to fetch headers from
  proxy = The proxy to go through. In the form of a column name:port. 
          For example "amoeba.ucsd.edu:9001"
    """
    System.exit(-1)
}

def url =  new URL(args[0])

def proxy = Proxy.NO_PROXY
if (args.size() &amp;gt; 1) {
    def proxyparts = args[1].split(":")
    proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyparts[0], proxyparts[1] as int))
}

url.openConnection(proxy).headerFields.each {key, value -&amp;gt;
    if (key) {
        print("${key}: ")
    }
    println("${value.join(",\n ")}")
}

&lt;/proxy:port&gt;&lt;/url&gt;&lt;/pre&gt;
and a &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; version (for Scala 2.8+):

&lt;br /&gt;
&lt;pre&gt;#!/bin/sh
exec scala "$0" "$@"
!#

import java.net.{InetSocketAddress, Proxy, URL}
import scala.collection.JavaConversions._

def printer(key: String, value: Iterable[String]): Unit = {
    if (key != null) {
        print(key + ": ")
    }
    println(headers(key).reduceLeft(_ + ",\n " + _))
}

if (args.length &amp;lt; 1) {
    println("""
USAGE: 
  urlheaders.groovy &lt;url&gt; &lt;proxy:port&gt;
  
ARGS:
  url = The URL to fetch headers from
  proxy = The proxy to go through. In the form of a column name:port. 
          For example "amoeba.ucsd.edu:9001"
    """)
    System.exit(-1)
}

val url = new URL(args(0))

var proxy = Proxy.NO_PROXY
if (args.length &amp;gt; 1) {
    val proxyparts = args(1).split(":")
    proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyparts(0), proxyparts(1).toInt))
}
val connection = url.openConnection()
val headers = connection.getHeaderFields()

headers.keySet.foreach(key =&amp;gt; printer(key, headers(key)))&lt;/proxy:port&gt;&lt;/url&gt;&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-2641414280100325291?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/2641414280100325291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=2641414280100325291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2641414280100325291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2641414280100325291'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/02/show-http-headers-heres-little-groovy.html' title='Show HTTP Headers'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-5197371293453979178</id><published>2010-02-05T16:41:00.000-08:00</published><updated>2011-07-25T13:28:09.843-07:00</updated><title type='text'>Getting started with JEE 6, Glassfish and Maven</title><content type='html'>&lt;h2&gt;
Getting started with JEE 6, Glassfish and Maven&lt;/h2&gt;
I'm ramping back up on JEE development, so I'm catching up with the latest stuff in JEE 6. To get started I've created a basic Maven POM file for getting me going. The nice thing about this is that the POM will start the glassfish server to execute the tests and the shut it down when they are completed. It can also start up a glassfish instance on the command line with &lt;br /&gt;
&lt;pre&gt;mvn embedded-glassfish:run&lt;/pre&gt;
. 

&lt;br /&gt;
&lt;h3&gt;
pom.xml&lt;/h3&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;bms&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jee-testing&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;jee-testing Maven Webapp&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;
    &amp;lt;properties&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;/properties&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;javax&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javaee-web-api&amp;lt;/artifactId&amp;gt;
            &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
            &amp;lt;version&amp;gt;6.0&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
    &amp;lt;build&amp;gt;
        &amp;lt;finalName&amp;gt;${project.artifactId}&amp;lt;/finalName&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;
                    &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.glassfish&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-embedded-glassfish-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.0&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;goalPrefix&amp;gt;embedded-glassfish&amp;lt;/goalPrefix&amp;gt;
                    &amp;lt;app&amp;gt;${basedir}/target/${project.artifactId}&amp;lt;/app&amp;gt;
                    &amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;
                    &amp;lt;contextRoot&amp;gt;${project.artifactId}&amp;lt;/contextRoot&amp;gt;
                    &amp;lt;autoDelete&amp;gt;true&amp;lt;/autoDelete&amp;gt;
                &amp;lt;/configuration&amp;gt;
                &amp;lt;!-- Configure glassfish for executing tests --&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;id&amp;gt;start-glassfish&amp;lt;/id&amp;gt;
                        &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;start&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                    &amp;lt;/execution&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;id&amp;gt;glassfish-deploy&amp;lt;/id&amp;gt;
                        &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;deploy&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                    &amp;lt;/execution&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;id&amp;gt;glassfish-undeploy&amp;lt;/id&amp;gt;
                        &amp;lt;phase&amp;gt;post-integration-test&amp;lt;/phase&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;undeploy&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                    &amp;lt;/execution&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;id&amp;gt;stop-glassfish&amp;lt;/id&amp;gt;
                        &amp;lt;phase&amp;gt;post-integration-test&amp;lt;/phase&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;stop&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
    &amp;lt;pluginRepositories&amp;gt;
        &amp;lt;pluginRepository&amp;gt;
            &amp;lt;id&amp;gt;maven2.java.net&amp;lt;/id&amp;gt;
            &amp;lt;name&amp;gt;Java.net Repository for Maven 2&amp;lt;/name&amp;gt;
            &amp;lt;url&amp;gt;http://download.java.net/maven/glassfish&amp;lt;/url&amp;gt;
        &amp;lt;/pluginRepository&amp;gt;
    &amp;lt;/pluginRepositories&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-5197371293453979178?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/5197371293453979178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=5197371293453979178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5197371293453979178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5197371293453979178'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/02/getting-started-with-jee-6-glassfish.html' title='Getting started with JEE 6, Glassfish and Maven'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-1599777327583227113</id><published>2010-01-17T22:49:00.000-08:00</published><updated>2011-07-25T13:27:59.096-07:00</updated><title type='text'>Maven and Clojure</title><content type='html'>&lt;h2&gt;
Maven and Clojure&lt;/h2&gt;
I'm trying to setup a &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; build for a &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; project. I'm playing around with &lt;a href="http://incanter.org/"&gt;Incanter&lt;/a&gt; and need to a) package up the project and b) have easy REPL interaction. The following POM seems to be working so far:

&lt;br /&gt;
&lt;pre&gt;&amp;lt;project 
  xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;org.mbari&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;clojuretest&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;clojuretest [library]&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;
    
    &amp;lt;!-- 
        Combining info from:
            Packaging: http://pupeno.com/blog/how-to-create-a-clojure-application/
            Command line integration: http://github.com/talios/clojure-maven-plugin
    --&amp;gt;
            
    &amp;lt;build&amp;gt;
        &amp;lt;resources&amp;gt;
            &amp;lt;resource&amp;gt;
                &amp;lt;directory&amp;gt;src/main/clojure&amp;lt;/directory&amp;gt;
            &amp;lt;/resource&amp;gt;
        &amp;lt;/resources&amp;gt;

        &amp;lt;plugins&amp;gt;
            &amp;lt;!-- Filter resources using UTF-8 encoding --&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;!-- Creates executable jar --&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;appassembler-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;programs&amp;gt;
                        &amp;lt;program&amp;gt;
                            &amp;lt;mainclass&amp;gt;org.mbari.clojuretest.App&amp;lt;/mainclass&amp;gt;
                            &amp;lt;name&amp;gt;App&amp;lt;/name&amp;gt;
                        &amp;lt;/program&amp;gt;
                    &amp;lt;/programs&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;!--  Integrate Clojure command line tools --&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;com.theoryinpractise&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;clojure-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;clojureOptions&amp;gt;-Xmx512m&amp;lt;/clojureOptions&amp;gt;
                    &amp;lt;warnOnReflection&amp;gt;true&amp;lt;/warnOnReflection&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;


        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;incanter&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;incanter&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0-master-SNAPSHOT&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;

    &amp;lt;/dependencies&amp;gt;

    &amp;lt;repositories&amp;gt;
        &amp;lt;repository&amp;gt;
            &amp;lt;id&amp;gt;clojars.org&amp;lt;/id&amp;gt;
            &amp;lt;url&amp;gt;http://clojars.org/repo&amp;lt;/url&amp;gt;
        &amp;lt;/repository&amp;gt;
    &amp;lt;/repositories&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-1599777327583227113?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/1599777327583227113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=1599777327583227113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/1599777327583227113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/1599777327583227113'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/maven-and-clojure-im-trying-to-setup.html' title='Maven and Clojure'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-5323492096606022185</id><published>2010-01-11T08:51:00.000-08:00</published><updated>2011-07-25T13:29:47.836-07:00</updated><title type='text'>Viewing Groovy's Classpath</title><content type='html'>&lt;h2&gt;
Viewing Groovy's Classpath&lt;/h2&gt;
I came across this nice tip found &lt;a href="http://marxsoftware.blogspot.com/2010/01/viewing-groovy-applications-classpath.html"&gt;here&lt;/a&gt;. The tip is:

&lt;br /&gt;
&lt;pre&gt;this.class.classLoader.rootLoader.URLs.each{ println it }  
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-5323492096606022185?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/5323492096606022185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=5323492096606022185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5323492096606022185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5323492096606022185'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/viewing-groovys-classpath-i-came-across.html' title='Viewing Groovy&apos;s Classpath'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-4268977289227577233</id><published>2010-01-08T12:28:00.000-08:00</published><updated>2011-07-25T13:30:04.033-07:00</updated><title type='text'>EXIF Metadata Extraction in Clojure</title><content type='html'>&lt;h2&gt;
EXIF Metadata Extraction in Clojure&lt;/h2&gt;
Since I've been playing around with &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; lately, I thought I'd port the Groovy and Scala versions of the EXIF metadata extraction code to Clojure. Here's some things I ran into with Clojure:

&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Have to admit, although I'm very new at the Lisp syntax, Clojure is kinda fun to work with. As with both Groovy and Scala it's nice to have a REPL to test out new ideas out. The Clojure REPL's built in help (e.g. (doc instance?) and (find-doc "instance") is a very nice touch.&lt;/li&gt;
&lt;li&gt;I'm not a fan of the numerous parenthesis, I suppose I'm just used to the curly brackets. I find it's hard to visualize the scope of variables. A text editor with nice bracket matching helps though (Sorry &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;, I had to use &lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt; for Clojure work)&lt;/li&gt;
&lt;li&gt;Writing a script still left me &lt;a href="http://onlineslangdictionary.com/definition+of/jonesing"&gt;jonesing&lt;/a&gt; for an equivalent to &lt;a href="http://groovy.codehaus.org/Grape"&gt;Grape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;i&gt;clj&lt;/i&gt; script used in the shebang line, posted on &lt;a href="http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Create_clj_Script"&gt;Wikibooks&lt;/a&gt;, was wrong. Took me a little bit to figure out what was going on. I fixed the script on Wikibooks.&lt;/li&gt;
&lt;li&gt;I couldn't figure out how to neatly embed the classpath info, so I had to launch it with &lt;i&gt;clj -cp /path/to/sanselan-0.97.jar readexif.clj /path/to/image.jpg&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;I have absolutely no idea how to indent Clojure/Lisp code&lt;/li&gt;
&lt;/ul&gt;
And the code:
&lt;br /&gt;
&lt;pre&gt;#! /usr/bin/env clj

(import
  '(java.io File)
  '(org.apache.sanselan ImageReadException Sanselan)
  '(org.apache.sanselan.common IImageMetadata, RationalNumber)
  '(org.apache.sanselan.formats.jpeg JpegImageMetadata)
  '(org.apache.sanselan.formats.tiff TiffField TiffImageMetadata)
  '(org.apache.sanselan.formats.tiff.constants ExifTagConstants GPSTagConstants TagInfo TiffConstants TiffTagConstants))
  
(defn print-tag-value [metadata tagInfo]
  (let [field  (. metadata findEXIFValue tagInfo)]
    (if (nil? field) 
      (println (str "        (" (. tagInfo name) " not found.)"))
      (println (str "        (" (. tagInfo name) ": " (. field getValueDescription))))))
    
(defn readexif [file]
  (let [metadata (Sanselan/getMetadata file)]
    (if (nil? metadata) (println "\tNo EXIF metdata was found"))
    (if (instance? JpegImageMetadata metadata)
      (do 
        (println "  -- Standard EXIF Tags")
        (print-tag-value metadata (TiffTagConstants/TIFF_TAG_XRESOLUTION))
        (print-tag-value metadata (TiffTagConstants/TIFF_TAG_DATE_TIME))
        (print-tag-value metadata (ExifTagConstants/EXIF_TAG_DATE_TIME_ORIGINAL))
        (print-tag-value metadata (ExifTagConstants/EXIF_TAG_CREATE_DATE))
        (print-tag-value metadata (ExifTagConstants/EXIF_TAG_ISO))
        (print-tag-value metadata (ExifTagConstants/EXIF_TAG_SHUTTER_SPEED_VALUE))
        (print-tag-value metadata (ExifTagConstants/EXIF_TAG_APERTURE_VALUE))
        (print-tag-value metadata (ExifTagConstants/EXIF_TAG_BRIGHTNESS_VALUE))
        (print-tag-value metadata (GPSTagConstants/GPS_TAG_GPS_LATITUDE_REF))
        (print-tag-value metadata (GPSTagConstants/GPS_TAG_GPS_LATITUDE))
        (print-tag-value metadata (GPSTagConstants/GPS_TAG_GPS_LONGITUDE_REF))
        (print-tag-value metadata (GPSTagConstants/GPS_TAG_GPS_LONGITUDE_REF))
        
        ; simple interface to GPS data
        (println "  -- GPS Info")
        (let [exifMetadata (. metadata getExif)]
          (if (false? (nil? exifMetadata)) 
            (do 
              (let [gpsInfo (. exifMetadata getGPS)]
                (if (false? (nil? gpsInfo))
                  (let [longitude (. gpsInfo getLongitudeAsDegreesEast)
                        latitude (. gpsInfo getLatitudeAsDegreesNorth)]
                    (println (str "        GPS Description: " gpsInfo))
                    (println (str "        GPS Longitude (Degrees East):" longitude))
                    (println (str "        GPS Latitude (Degrees North):" latitude))))))))
                  
         ; Print all EXIF data
         (println "  -- All EXIF info")
         (doseq [item (. metadata getItems)]
           (println (str "        " item)))
         (println "")))))

;(readexif (new File (first *command-line-args*)))
(do
  (let [file (new File (first *command-line-args*))]
    (println (str "file: " (. file getPath)))
    (readexif file)))
   
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-4268977289227577233?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/4268977289227577233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=4268977289227577233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4268977289227577233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4268977289227577233'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/exif-metadata-extraction-in-clojure.html' title='EXIF Metadata Extraction in Clojure'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-5116575711020430000</id><published>2010-01-07T09:34:00.000-08:00</published><updated>2011-07-25T13:30:15.287-07:00</updated><title type='text'>EXIF Metadata Extraction in Scala</title><content type='html'>&lt;h2&gt;
EXIF Metadata Extraction in Scala&lt;/h2&gt;
Just for grins I ported the EXIF metadata extraction script in yesterdays post from Groovy to Scala. I ran into a few interesting gotchas while working with Scala. 
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The class &lt;a href="http://commons.apache.org/sanselan/api-release/org/apache/sanselan/formats/tiff/constants/TiffConstants.html"&gt;TiffConstants&lt;/a&gt; inherits a ton of constants (e.g. public static final ints) from other interfaces. However, in scala I had to explicitly use each interface where the constant was defined, using TiffConstants didn't work.&lt;/li&gt;
&lt;li&gt;There's no &lt;a href="http://groovy.codehaus.org/Grape"&gt;Grape&lt;/a&gt; for package management. Which is too bad, Scala would be far more useful if there was some equivalent; defining the classpath for a small script is annoying. My work around was just to embed the classpath in the shebang preamble.&lt;/li&gt;
&lt;li&gt;Got to remember to import implicit List conversions (i.e. &lt;a href="http://www.scala-lang.org/docu/files/api/scala/collection/jcl/Conversions$object.html"&gt;import scala.collection.jcl.Conversions._&lt;/a&gt;) in order to work with &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/List.html"&gt;Java Lists&lt;/a&gt; as &lt;a href="http://www.scala-lang.org/docu/files/api/scala/List.html"&gt;Scala Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Here's the code:
&lt;br /&gt;
&lt;pre&gt;#!/bin/sh
exec scala -cp $HOME/.groovy/grapes/org.apache.commons/sanselan/jars/sanselan-0.97.jar $0 $@
!#

import java.io.File
import org.apache.sanselan.{ImageReadException, Sanselan}
import org.apache.sanselan.common.{IImageMetadata, RationalNumber}
import org.apache.sanselan.formats.jpeg.JpegImageMetadata
import org.apache.sanselan.formats.tiff.{TiffField, TiffImageMetadata}
import org.apache.sanselan.formats.tiff.constants.{ExifTagConstants, GPSTagConstants, TagInfo, TiffConstants, TiffTagConstants}
import scala.collection.jcl.Conversions._

val file = new File(args(0))
val metadata = Sanselan.getMetadata(file)
def printTagValue(metadata: JpegImageMetadata, tagInfo: TagInfo): Unit = {
    val field = metadata.findEXIFValue(tagInfo)
    field match {
        case null =&amp;gt; println("        (" + tagInfo.name + " not found.)")
        case _ =&amp;gt; println("        " + tagInfo.name + ": " + field.getValueDescription())
    }
}

println("file:" + file.getPath())

if (metadata == null) {
    println("\tNo EXIF metadata was found")
}

if (metadata.isInstanceOf[JpegImageMetadata]) {
    val jpegMetadata = metadata.asInstanceOf[JpegImageMetadata]
    
    println("  -- Standard EXIF Tags")
    printTagValue(jpegMetadata,  TiffTagConstants.TIFF_TAG_XRESOLUTION)
    printTagValue(jpegMetadata,  TiffTagConstants.TIFF_TAG_DATE_TIME)
    printTagValue(jpegMetadata,  ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)
    printTagValue(jpegMetadata,  ExifTagConstants.EXIF_TAG_CREATE_DATE)
    printTagValue(jpegMetadata,  ExifTagConstants.EXIF_TAG_ISO)
    printTagValue(jpegMetadata,  ExifTagConstants.EXIF_TAG_SHUTTER_SPEED_VALUE)
    printTagValue(jpegMetadata,  ExifTagConstants.EXIF_TAG_APERTURE_VALUE)
    printTagValue(jpegMetadata,  ExifTagConstants.EXIF_TAG_BRIGHTNESS_VALUE)
    printTagValue(jpegMetadata,  GPSTagConstants.GPS_TAG_GPS_LATITUDE_REF)
    printTagValue(jpegMetadata,  GPSTagConstants.GPS_TAG_GPS_LATITUDE)
    printTagValue(jpegMetadata,  GPSTagConstants.GPS_TAG_GPS_LONGITUDE_REF)
    printTagValue(jpegMetadata,  GPSTagConstants.GPS_TAG_GPS_LONGITUDE) 
    
    // simple interface to GPS data
    println("  -- GPS Info")
    val exifMetadata = jpegMetadata.getExif()
    if (exifMetadata != null) {
        val gpsInfo = exifMetadata.getGPS()   
        if (gpsInfo != null) {
            val longitude = gpsInfo.getLongitudeAsDegreesEast()
            val latitude = gpsInfo.getLatitudeAsDegreesNorth()
            
            println("        GPS Description: " + gpsInfo)
            println("        GPS Longitude (Degrees East): " + longitude)
            println("        GPS Latitude (Degrees North): " + latitude)
        }
    }
    
    println("  -- All EXIF info")
    jpegMetadata.getItems().foreach(item =&amp;gt; println("        " + item))
    println("")
}

&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-5116575711020430000?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/5116575711020430000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=5116575711020430000' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5116575711020430000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5116575711020430000'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/exif-metadata-extraction-in-scala-just.html' title='EXIF Metadata Extraction in Scala'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-2704035799838616313</id><published>2010-01-06T16:47:00.000-08:00</published><updated>2011-07-25T13:30:27.919-07:00</updated><title type='text'>EXIF Metadata Extraction in Groovy</title><content type='html'>&lt;h2&gt;
EXIF Metadata Extraction in Groovy&lt;/h2&gt;
For a work project, I need to extract EXIF metadata from JPG's in Java code. The Apache &lt;a href="http://commons.apache.org/sanselan/"&gt;Sanselan&lt;/a&gt; project supports reading and writing of EXIF metadata. I wrote a &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; script as a test for extracting metadata. The script uses Grape to fetch the Sanselan dependency, however, Sanselan in not yet in one of the main &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; repos so I had to install it into our internal repository. (Just be aware that the script won't run 'out-of-the-box'). The code was just a quick port of &lt;a href="https://svn.apache.org/repos/asf/commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/sampleUsage/MetadataExample.java"&gt;this example&lt;/a&gt;:

&lt;br /&gt;
&lt;pre&gt;#!/usr/bin/env groovy 

@Grab(group='org.apache.commons', module='sanselan', version='0.97')
import org.apache.sanselan.ImageReadException
import org.apache.sanselan.Sanselan
import org.apache.sanselan.common.IImageMetadata
import org.apache.sanselan.common.RationalNumber
import org.apache.sanselan.formats.jpeg.JpegImageMetadata
import org.apache.sanselan.formats.tiff.TiffField
import org.apache.sanselan.formats.tiff.TiffImageMetadata
import org.apache.sanselan.formats.tiff.constants.TagInfo
import org.apache.sanselan.formats.tiff.constants.TiffConstants

def file = new File(args[0])

//        get all metadata stored in EXIF format (ie. from JPEG or TIFF).
//            org.w3c.dom.Node node = Sanselan.getMetadataObsolete(imageBytes);
IImageMetadata metadata = Sanselan.getMetadata(file)
println("file: ${file.getPath()}")

if (!metadata) {
    println("\tNo EXIF metadata was found")
}

if (metadata instanceof JpegImageMetadata) {
    JpegImageMetadata jpegMetadata = metadata

    // Jpeg EXIF metadata is stored in a TIFF-based directory structure
    // and is identified with TIFF tags.
    // Here we look for the "x resolution" tag, but
    // we could just as easily search for any other tag.
    //
    // see the TiffConstants file for a list of TIFF tags.

    

    // print out various interesting EXIF tags.
    println("  -- Standard EXIF Tags")
    printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_XRESOLUTION)
    printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_DATE_TIME)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_DATE_TIME_ORIGINAL)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_CREATE_DATE)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_ISO)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_SHUTTER_SPEED_VALUE)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_APERTURE_VALUE)
    printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_BRIGHTNESS_VALUE)
    printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LATITUDE_REF)
    printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LATITUDE)
    printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LONGITUDE_REF)
    printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LONGITUDE)
    


    // simple interface to GPS data
    println("  -- GPS Info")
    TiffImageMetadata exifMetadata = jpegMetadata.exif
    if (exifMetadata) {
        TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS()
        if (gpsInfo) {
            double longitude = gpsInfo.longitudeAsDegreesEast
            double latitude = gpsInfo.latitudeAsDegreesNorth

            println("        GPS Description: ${gpsInfo}")
            println("        GPS Longitude (Degrees East): ${longitude}")
            println("        GPS Latitude (Degrees North): ${latitude}")
        }
    }

    println("  -- All EXIF info")
    ArrayList items = jpegMetadata.items.each { item -&amp;gt;
       println("        ${item}")   
    }
    println("")
}

void printTagValue(JpegImageMetadata jpegMetadata, TagInfo tagInfo) {
    TiffField field = jpegMetadata.findEXIFValue(tagInfo);
    if (field == null) {
        println("        (" + tagInfo.name + " not found.)")
    }
    else {
        println("        " + tagInfo.name + ": " + field.valueDescription)
    }
}


&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-2704035799838616313?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/2704035799838616313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=2704035799838616313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2704035799838616313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2704035799838616313'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/exif-metadata-extraction-script-in.html' title='EXIF Metadata Extraction in Groovy'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-5008661309043533331</id><published>2010-01-06T12:48:00.000-08:00</published><updated>2011-07-25T13:30:40.357-07:00</updated><title type='text'>Examining architectures in a Fat-binary on Mac OS X</title><content type='html'>&lt;h2&gt;
Examining architectures in a Fat-binary on Mac OS X&lt;/h2&gt;
Apple's Mac OS X supports &lt;a href="http://en.wikipedia.org/wiki/Fat_binary"&gt;fat binaries&lt;/a&gt; (i.e. multi-architecture). I've been trying to debug a problem with bad kernel access using &lt;a href="http://users.frii.com/jarvi/rxtx/"&gt;RXTX&lt;/a&gt; and found &lt;a href="http://osxbook.com/book/bonus/ancient/whatismacosx/tools.html"&gt;this reference&lt;/a&gt; for the very useful tool &lt;b&gt;lipo&lt;/b&gt;

&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;lipo&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;/usr/bin/lipo&lt;/i&gt; creates or operates on multi-architecture ("fat") files. It can list the architecture types in a fat file, create a single fat file from one or more input files, thin out a single fat file to a specified architecture type, and extract, replace and/or remove architecture types from the input file.&lt;/blockquote&gt;
To see the architectures in a binary it's used like:
&lt;br /&gt;
&lt;blockquote&gt;
lipo -info librxtxSerial.jnilib&lt;/blockquote&gt;
Which returns output like:
&lt;br /&gt;
&lt;blockquote&gt;
Architectures in the fat file: librxtxSerial.jnilib are: x86_64 i386 ppc7400 &lt;/blockquote&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-5008661309043533331?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/5008661309043533331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=5008661309043533331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5008661309043533331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5008661309043533331'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/examining-architecutres-in-fat-binary.html' title='Examining architectures in a Fat-binary on Mac OS X'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-645774314940467132</id><published>2010-01-01T19:42:00.000-08:00</published><updated>2011-07-25T13:30:51.965-07:00</updated><title type='text'>Playing with JXLayer</title><content type='html'>&lt;h2&gt;
Playing with JXLayer&lt;/h2&gt;
I started using &lt;a href="https://jxlayer.dev.java.net/"&gt;JXLayer&lt;/a&gt; in a project. Here's a sample UI class that decorates a &lt;a href="http://en.wikipedia.org/wiki/Swing_(Java)"&gt;Swing&lt;/a&gt; componenet with an XOR'd cross that tracks the mouse:

&lt;br /&gt;
&lt;pre&gt;/*
 * @(#)CrossHairLayerUI.java   2009.12.29 at 03:21:13 PST
 *
 * Copyright 2009 MBARI
 *
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package vars.annotation.ui.imagepanel;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.geom.GeneralPath;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import org.jdesktop.jxlayer.JXLayer;
import org.jdesktop.jxlayer.plaf.AbstractLayerUI;

/**
 * Draws a crosshair over a JComponent. Use as:
 * {@code
 * JXLayer&lt;jcomponent&gt; layer = new JXLayer&lt;jcomponent&gt;(component);
 * layer.setUI(new CrossHairLayerUI());
 * }
 * @author brian
 */
public class CrossHairLayerUI&lt;t extends="" jcomponent=""&gt; extends AbstractLayerUI&lt;t&gt; {

    private GeneralPath crosshair = new GeneralPath();

    @Override
    protected void paintLayer(Graphics2D gd, JXLayer jxl) {
        super.paintLayer(gd, jxl);
        gd.setXORMode(Color.WHITE);
        gd.draw(crosshair);
        gd.setPaintMode();
    }

    @Override
    protected void processMouseMotionEvent(MouseEvent me, JXLayer jxl) {
        super.processMouseMotionEvent(me, jxl);

        if (me.getID() == MouseEvent.MOUSE_MOVED || me.getID() == MouseEvent.MOUSE_DRAGGED) {
            Point point = SwingUtilities.convertPoint(me.getComponent(), me.getPoint(), jxl);
            int w = jxl.getWidth();
            int h = jxl.getHeight();

            /*
             * Create crosshair
             */
            crosshair.reset();

            if (point.y &amp;lt;= h) {
                crosshair.moveTo(0, point.y);
                crosshair.lineTo(w, point.y);
            }

            if (point.x &amp;lt;= w) {
                crosshair.moveTo(point.x, 0);
                crosshair.lineTo(point.x, h);
            }

            // mark the ui as dirty and needed to be repainted
            setDirty(true);
        }
    }
}

&lt;/t&gt;&lt;/t&gt;&lt;/jcomponent&gt;&lt;/jcomponent&gt;&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-645774314940467132?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/645774314940467132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=645774314940467132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/645774314940467132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/645774314940467132'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2010/01/playing-with-jxlayer-i-started-using.html' title='Playing with JXLayer'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-6604154360244021328</id><published>2009-12-13T22:11:00.000-08:00</published><updated>2011-07-25T13:31:05.327-07:00</updated><title type='text'>My First Lisp Program</title><content type='html'>&lt;h2&gt;
My First Lisp Program&lt;/h2&gt;
I wrote a simple timecode generator for testing of the &lt;a href="http://vars.sourceforge.net/"&gt;Video Annotation and Reference System&lt;/a&gt; in &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;. The program listens for requests on a UDP port and responds with a String formated as a timecode. For grins, I converted the program to &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;

&lt;br /&gt;
&lt;h3&gt;

Groovy&lt;/h3&gt;
&lt;pre&gt;#!/usr/bin/env groovy

/**
 * Script for simulation of a udp VCR
 */

def port = (args.size() &amp;gt; 0) ? Integer.valueOf(args[0]) : 9000

println("Localtime timecode generator attached to port ${port}")

 
def socket = new DatagramSocket(port)
def buffer = (' ' * 4096) as byte[]
while(true) {
    def incoming = new DatagramPacket(buffer, buffer.length)
    socket.receive(incoming)
    def c = new GregorianCalendar()
    def f = c.get(Calendar.MILLISECOND) / 1000.0 * 29.97;
    String reply = String.format('%tT:%02d', c, Math.round(f))
    outgoing = new DatagramPacket(reply.bytes, reply.size(),
            incoming.address, incoming.port);
    socket.send(outgoing)
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;h3&gt;

Clojure&lt;/h3&gt;
&lt;pre&gt;(import 
  '(java.net DatagramPacket DatagramSocket)
  '(java.util GregorianCalendar Calendar))
  
(defn fmt-time 
  "Format a java Calendar as a timecode"
  [cal] 
  (let [frames (* (/ (. cal get (Calendar/MILLISECOND)) 1000) 29.97)]
    (format "%tT:%02d" cal (Math/round frames))))
  
(defn run-generator 
  "Function for simulation of a udp VCR"
  [port] 
  (println (str "Localtime timecode generator attached to port " port))
  (let [socket (new DatagramSocket port)
        buffer (make-array (Byte/TYPE) 4096)]
    (while true 
      (let [incoming (new DatagramPacket buffer 4096) 
            reply (fmt-time (new GregorianCalendar))]
         (. socket receive incoming)
         (let [outgoing (new DatagramPacket (. reply getBytes) (. reply length) (. incoming getAddress) (. incoming getPort))]
           (. socket send outgoing))))))
  
 (run-generator (Integer/parseInt (first *command-line-args*)))
&lt;/pre&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-6604154360244021328?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/6604154360244021328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=6604154360244021328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/6604154360244021328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/6604154360244021328'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2009/12/my-first-lisp-program-i-wrote-simple.html' title='My First Lisp Program'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-460542915758265898</id><published>2009-12-03T14:27:00.001-08:00</published><updated>2011-07-25T13:31:19.286-07:00</updated><title type='text'>Eclipse template for quickly inserting a SLF4J logging statement</title><content type='html'>&lt;h2&gt;
Eclipse template for quickly inserting a SLF4J logging statement&lt;/h2&gt;
&lt;pre&gt;${imp:import(org.slf4j.LoggerFactory)}
private final ${type:newType(org.slf4j.Logger)} ${log:newName(org.slf4j.Logger)} = LoggerFactory.getLogger(getClass());${cursor}

&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-460542915758265898?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/460542915758265898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=460542915758265898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/460542915758265898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/460542915758265898'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2009/12/eclipse-template-for-quickly-inserting.html' title='Eclipse template for quickly inserting a SLF4J logging statement'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8090410840069965296</id><published>2009-12-03T09:51:00.001-08:00</published><updated>2011-07-25T13:31:34.032-07:00</updated><title type='text'>Deleteing all the files Memeo scatters across my hard drive using Groovy</title><content type='html'>&lt;h2&gt;
Deleteing all the files Memeo scatters across my hard drive using Groovy&lt;/h2&gt;
&lt;code&gt;(new File('.')).eachFileRecurse { file -&amp;gt; if (file.isFile() &amp;amp;&amp;amp; file.name.startsWith('.Memeo ')) {file.delete()} }&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8090410840069965296?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8090410840069965296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8090410840069965296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8090410840069965296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8090410840069965296'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2009/12/deleteing-all-files-memeo-scatters.html' title='Deleteing all the files Memeo scatters across my hard drive using Groovy'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-4698099150388325275</id><published>2009-06-01T16:21:00.000-07:00</published><updated>2011-07-25T13:31:50.176-07:00</updated><title type='text'>Maven and Google Code</title><content type='html'>&lt;h2&gt;
Maven and Google Code&lt;/h2&gt;
I have a few projects I keep on &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt;. Since I do quite a bit of work using Maven and Java, it's nice to be able to use the subversion repo on Google Code to host my &lt;a href="http://maven.apache.org/"&gt;maven&lt;/a&gt; repo and my javadocs. Notes for hosting a Maven repo can be found at &lt;a href="http://www.jroller.com/mrdon/entry/find_of_the_day_wagon"&gt;http://www.jroller.com/mrdon/entry/find_of_the_day_wagon&lt;/a&gt; and Javadoc details are at &lt;a href="http://stuffthathappens.com/blog/2007/11/09/howto-publish-javadoc-on-google-code/"&gt;http://stuffthathappens.com/blog/2007/11/09/howto-publish-javadoc-on-google-code/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-4698099150388325275?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/4698099150388325275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=4698099150388325275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4698099150388325275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4698099150388325275'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2009/06/maven-and-google-code-i-have-few.html' title='Maven and Google Code'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-2769886054043234644</id><published>2009-03-05T09:17:00.000-08:00</published><updated>2009-03-05T09:20:09.333-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Adding Log4j DOCTYPE to log4j.xml&lt;/h2&gt;
If you're using an XML aware editor, it's nice to take advantage of built in XML validation when editing log4j.xml configuration files. Here's a DOCTYPE that works with these editors:

&lt;pre&gt;
&amp;lt;!DOCTYPE log4j:configuration PUBLIC 
        "-//LOG4J//DTD LOG4J 1.2//EN" 
        "http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/resources/org/apache/log4j/xml/log4j.dtd?view=co"&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-2769886054043234644?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/2769886054043234644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=2769886054043234644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2769886054043234644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2769886054043234644'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2009/03/adding-log4j-doctype-to-log4j.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-4152277369864235201</id><published>2008-12-02T14:07:00.000-08:00</published><updated>2011-07-25T13:32:06.400-07:00</updated><title type='text'>Generating a task list from JIRA issues using XML-RPC and Groovy</title><content type='html'>&lt;h2&gt;
Generating a task list from JIRA issues using XML-RPC and Groovy&lt;/h2&gt;
This is just a quick note demonstrating how to generate a task list from issues entered into &lt;a href="http://www.atlassian.com/software/jira/"&gt;JIRA&lt;/a&gt;. I use &lt;a href="http://www.hogbaysoftware.com/products/taskpaper"&gt;TaskPaper&lt;/a&gt; for creating GTD-style task lists for work and thought it might be handy to tack issues assigned to me in our JIRA issue tracker in the same way. To do so do the following:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download the &lt;a href="http://groovy.codehaus.org/XMLRPC"&gt;Groovy XML-RPC module&lt;/a&gt; and copy it to $HOME/.groovy/lib&lt;/li&gt;
&lt;li&gt;Create a filter in JIRA to return tasks that you're interested in. Make note of the &lt;strong&gt;filterId&lt;/strong&gt;for the filter you created.
&lt;/li&gt;
&lt;li&gt;Create a shell script, here I'll call it &lt;i&gt;jiratasks.groovy&lt;/i&gt;, and copy the following code into it:
  &lt;pre&gt;#!/usr/bin/env groovy
import groovy.net.xmlrpc.XMLRPCServerProxy
import java.text.SimpleDateFormat

// Included to make pretty dates
def dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
def dateFormat2 = new SimpleDateFormat("yyyy-MM-dd")

// Connect to your server
//Your URL may vary
def server = new XMLRPCServerProxy("https://your.jira.server.net/rpc/xmlrpc") 
def jira = server.jira1
// Subsitute your username and password here
def token = jira.login("your_username", "your_password")
// Replace "10021" with your filterId  
def issues = jira.getIssuesFromFilter(token, "10021")  

// Sort by priority
issues.sort { it.priority }

// Get a list of projects
def projects = issues.collect { it["project"]}
projects.unique().sort()

println "JIRA Issues:"
projects.each { project -&amp;gt;
  println("\t${project}:")
  issues.each { issue -&amp;gt;
    if (issue["project"] == project) {
      def creationDate = dateFormat2.format(dateFormat1.parse(issue.created))
      println("\t- ${issue.key}: ${issue.summary} @created(${creationDate})")
    }
  }
}

jira.logout(token)
  &lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt; Run it like: jiratasks.groovy &amp;gt; JIRATasks.taskpaper&lt;/li&gt;
&lt;li&gt;Voila. A GTD style tasks list that works with TaskPaper&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-4152277369864235201?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/4152277369864235201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=4152277369864235201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4152277369864235201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4152277369864235201'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2008/12/generating-task-list-from-jira-issues.html' title='Generating a task list from JIRA issues using XML-RPC and Groovy'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8302041610593801568</id><published>2008-06-04T09:27:00.000-07:00</published><updated>2011-07-25T13:32:18.409-07:00</updated><title type='text'>Spinning up on Google Guice</title><content type='html'>&lt;h2&gt;
Spinning up on Google Guice&lt;/h2&gt;
I'm spinning up on using dependency-injection for a new desktop app. Here's a few references to get me going:

&lt;embed allowfullscreen="true" flashvars="fs=true" id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=6068447410873108038&amp;amp;hl=en" style="height: 326px; width: 400px;" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;embed allowfullscreen="true" flashvars="fs=true" id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=121403207358911729&amp;amp;hl=en" style="height: 326px; width: 400px;" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 
more to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8302041610593801568?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8302041610593801568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8302041610593801568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8302041610593801568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8302041610593801568'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2008/06/spinning-up-on-google-guice-im-spinning.html' title='Spinning up on Google Guice'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-1014554961380637381</id><published>2008-02-21T09:06:00.001-08:00</published><updated>2008-02-21T09:06:57.838-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Peformance tip for SQL: If Exists Update Else Insert&lt;/h2&gt;

See &lt;a href="http://blogs.msdn.com/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx"&gt;http://blogs.msdn.com/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-1014554961380637381?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/1014554961380637381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=1014554961380637381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/1014554961380637381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/1014554961380637381'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2008/02/peformance-tip-for-sql-if-exists-update.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8873340803317297821</id><published>2008-02-20T14:52:00.000-08:00</published><updated>2008-02-20T15:51:17.833-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Learing Cocoa Notes&lt;/h2&gt;

I'm working through the tutorials on Cocoa at &lt;a href="http://www.macresearch.org/cocoa_for_scientists"&gt;MacResearch&lt;/a&gt;

&lt;h3&gt;Notes from '&lt;a href="http://www.macresearch.org/cocoa_for_scientists_part_iii_living_objects"&gt;Living Objects&lt;/a&gt;'&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cocoa is a framework built upon conventions. If you stick to the conventions, you will be fine; if you flout them, it will hurt.&lt;/li&gt;
&lt;li&gt;Typical init block: &lt;pre&gt;
-(id)initWithLeftValue:(double)lv andRightValue:(double)rv {
    if ( self = [super init] ) {
        leftValue = lv;
        rightValue = rv;
    }
    return self;
}
&lt;/pre&gt;
&lt;li&gt;&lt;b&gt;RULE:&lt;/b&gt; You should check the return value to see if it is nil after you call an initializer. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;RULE:&lt;/b&gt; Cocoa has the concept of a designated initializer, which is the initializer you should generally chain to from a subclass. There is no language support for the designated initializer; it is purely a convention, and, as such, typically involves no more than a statement to the effect in the comments or documentation.&lt;/li&gt;
&lt;li&gt;In Cocoa, when an object is ready to disappear, the method &lt;i&gt;dealloc&lt;/i&gt; gets called.&lt;/li&gt;
&lt;li&gt;Typical pattern:&lt;pre&gt;
-(id)init... {
    // Chain to designated initializer of superclass
    if ( self = [super init] ) {
        ...
    }
    return self;
}

-(void)dealloc {
    ...
    [super dealloc];
}
&lt;/pre&gt;
&lt;/ul&gt;

&lt;h3&gt;Notes from '&lt;a href="http://www.macresearch.org/cocoa_for_scientists_part_iv_good_references"&gt;Good References&lt;/a&gt;'&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt; Cocoa uses a system of memory management called &lt;i&gt;reference counting&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Whenever an object is allocated, it automatically has a retain count of one.&lt;/u&gt; If you do nothing more with that object, it will remain in existence until the program exits. Other methods for creating objects, such as copy and new, also leave the object with a retain count of one.&lt;/li&gt;
&lt;li&gt;Often, some part of your program will want to make use of an object that it did not create itself. In such cases, you want to ensure that the object in question does not disappear when it is still needed. &lt;u&gt;To achieve this, the object's &lt;i&gt;retain&lt;/i&gt; method can be called, which increases the retain count by one.&lt;/u&gt; &lt;/li&gt;
&lt;li&gt; &lt;u&gt;When an object is no longer needed, you call either the &lt;i&gt;release&lt;/i&gt; method, or the &lt;i&gt;autorelease&lt;/i&gt; method.&lt;/u&gt; Both methods decrease the retain count by one, but they differ in the timing of the change. &lt;i&gt;release&lt;/i&gt; decreases the count immediatly.&lt;/li&gt;
&lt;li&gt;When you use autorelease, you are saying you are finished with the object, but maybe some other part of the program would like to make use of it for a bit longer. An example of this is when you need to return an object from a method, and you don't need the object anymore. &lt;u&gt;If you call &lt;i&gt;release&lt;/i&gt;, it will disappear before you can return it; if you call &lt;i&gt;autorelease&lt;/i&gt;, you have time to return the object,&lt;/u&gt; and the calling code has a chance to retain it if it wants to keep it around.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RULE:&lt;/b&gt; Whenever you call one of the retain count increasing methods, like alloc, retain, or copy, you should balance that with a call to a retain count decreasing method like release or autorelease. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Notes from '&lt;a href="http://www.macresearch.org/cocoa_for_scientists_part_v_its_all_in_the_genes"&gt;All in the Genes&lt;/a&gt;'&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You can actually apply constraints on the accessibility of instance variables in Objective-C, as in most object-oriented programming languages. &lt;u&gt;The default, which we have been using to this point, is @protected,&lt;/u&gt; which means that an instance variable can be accessed from within the class in which it is defined, and from any descendent (eg subclass). The other two options are @private, which restricts access to the defining class, excluding its descendent classes, and @public, which allows free-for-all access from anywhere in the program. &lt;/li&gt;
&lt;li&gt; In Objective-C, all methods are effectively public&lt;/li&gt;
&lt;li&gt;You can fake a private method by declaring it not in the public header file, but in the .m implementation file.&lt;/li&gt;
&lt;li&gt;Objective-C does not support multiple inheritance. &lt;/li&gt;
&lt;li&gt;Protocols are blocks that declare one or methods that a class must implement. They are basically the same as interfaces in the Java language.&lt;/li&gt;
&lt;li&gt;Protcol syntax: &lt;pre&gt;
// Declaration
@protocol Add
-(id)add:(id)toAdd;
@end

// Inclusion
@interface AdditionOperator : Operator &amp;lt;Add&amp;gt; {
}
@end

// Implementation
@implementation AdditionOperator
-(id)add:(id)toAdd {
    // Implementation here
    ...
}
@end
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Objective-C allows overriding methods by using a method of the same name in a subclass&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8873340803317297821?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8873340803317297821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8873340803317297821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8873340803317297821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8873340803317297821'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2008/02/learing-cocoa-notes-im-working-through.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-3048680047361649812</id><published>2007-12-07T14:26:00.000-08:00</published><updated>2011-07-25T13:32:35.247-07:00</updated><title type='text'>Creating simple 'toString()' methods for Plain Old Groovy Beans (POGO's)</title><content type='html'>&lt;h2&gt;
Creating simple 'toString()' methods for Plain Old Groovy Beans (POGO's)&lt;/h2&gt;
Hate to write toString() methods? Me too. I created a simple Category for generating formatted strings for my beans. This is nothing fancy but it illustrates how simple it is.

First, I created a Category for dynamically adding methods to my classes. 
&lt;br /&gt;
&lt;pre&gt;package hohonuuli

class PropertyCategory {
    
    /**
     * List the property names of an object excluding class and metaClass
     */
    static List listKeys(Object self) {
        List keys = []
        self.properties.each {
            if (it.key != "metaClass" &amp;amp;&amp;amp; it.key != "class") {
                keys &amp;lt;&amp;lt; it.key
            }
        }
        return keys
    }  
    
    static String toXML(Object self) {
        def stringBuilder = new StringBuilder()
        stringBuilder.append("&amp;lt;${self.getClass().name}&amp;gt;")
        use (PropertyCategory) {
            List keys = listKeys(self)
            keys.sort().each { key -&amp;gt;
                stringBuilder.append("&amp;lt;${key}&amp;gt;").append(self."${key}".toString()).append("&amp;lt;/${key}&amp;gt;")
            }
        }
        stringBuilder.append("&amp;lt;/${self.getClass().name}&amp;gt;")
    }
    
}
&lt;/pre&gt;
Next, I create a bean and use the Cateogry in the toString method. In this case, I'm just dumping everything out as an XML fragment.
&lt;br /&gt;
&lt;pre&gt;import hohonuuli.PropertyCategory

class AncillaryDatum 

    Date date
    def block
    def mode
    def type
    def depthMeters
    def temperatureCelsius
    def salinity

 
    String toString() {
        def s = ""
        // Here's the magic
        use (PropertyCategory) {
            s = this.toXML()
        }
        return s
    }
}
&lt;/pre&gt;
The output looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;lt;AncillaryDatum&amp;gt;&amp;lt;block&amp;gt;2&amp;lt;/block&amp;gt;&amp;lt;date&amp;gt;Tue Jun 29 21:40:23 UTC&amp;lt;/date&amp;gt;&amp;lt;depthMeters&amp;gt;0.0050&amp;lt;/depthMeters&amp;gt;&amp;lt;mode&amp;gt;1&amp;lt;/mode&amp;gt;&amp;lt;salinity&amp;gt;0.0097&amp;lt;/salinity&amp;gt;&amp;lt;temperatureCelsius&amp;gt;19.1766&amp;lt;/temperatureCelsius&amp;gt;&amp;lt;type&amp;gt;18&amp;lt;/type&amp;gt;&amp;lt;/AncillaryDatum&amp;gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You can format the output however you like and control what properties are written out. For example, you might want to ignore transient and static fields in you output. 

Enjoy&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-3048680047361649812?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/3048680047361649812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=3048680047361649812' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/3048680047361649812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/3048680047361649812'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/12/h3.html' title='Creating simple &apos;toString()&apos; methods for Plain Old Groovy Beans (POGO&apos;s)'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-4032996175295522216</id><published>2007-11-17T14:06:00.000-08:00</published><updated>2011-07-25T13:32:48.572-07:00</updated><title type='text'>AppleScript for "Open Terminal Here" command.</title><content type='html'>&lt;h1&gt;
AppleScript for "Open Terminal Here" command.&lt;/h1&gt;
Variants of this are all over the place. I modified one to work with the new tabbed feature n Leopards Terminal.app. This applescript opens a &lt;b&gt;new tab&lt;/b&gt; in Terminal in the directory of the current Finder window. Open it in &lt;b&gt;Script Editor&lt;/b&gt;, compile, save as an application and then drag the application to the toolbar of a Finder window.
&lt;br /&gt;
&lt;pre&gt;(*

 Open Terminal Here
 
 A toolbar script for Mac OS X 10.3
 
 Written by Marc Liyanage

 
 See http://www.apple.com/applescript/macosx/toolbar_scripts/ for
 more information about toolbar scripts.
 
 See http://www.entropy.ch/software/applescript/ for the latest
 version of this script.
 
 
 History:
 17-NOV-2007: Modified by Brian Schlining to open in a new Tab in a terminal window
 18-AUG-2004: Version 2.0 by Allan Marcus. uses posix path 
 30-OCT-2001: Version 1.0, adapted from one of the example toolbar scripts
 30-OCT-2001: Now handles embedded single quote characters in file names
 30-OCT-2001: Now handles folders on volumes other than the startup volume
 30-OCT-2001: Now handles click on icon in top-level (machine) window
 31-OCT-2001: Now displays a nicer terminal window title, courtesy of Alain Content
 11-NOV-2001: Now folders within application packages (.app directories) and has a new icon
 12-NOV-2001: New properties to set terminal columns and rows as the Terminal does not use default settings
 14-NOV-2001: Major change, now handles 8-bit characters in all shells, and quotes and spaces in tcsh
 18-NOV-2001: Version 1.1: Rewrite, now uses a temporary file  ~/.OpenTerminalHere to communicate
 the directory name between AppleScript and the shell because this is much more reliable for 8-bit characters
 
*)

property terminal_rows : 24
property terminal_columns : 90
property debug : true

-- when the toolbar script icon is clicked
--
on run
 tell application "Finder"
  activate
  try
   set this_folder to (the target of the front window) as alias
  on error
   set this_folder to startup disk
  end try
  my process_item(this_folder)
 end tell
end run

-- This handler processes folders dropped onto the toolbar script icon
--
on open these_items
 repeat with i from 1 to the count of these_items
  set this_item to item i of these_items
  my process_item(this_item)
 end repeat
end open

-- this subroutine processes does the actual work
--
on process_item(this_item)
 tell application "Terminal"
  activate
  tell application "System Events" to tell process "Terminal" to keystroke "t" using command down
  do script with command "cd " &amp;amp; quoted form of POSIX path of this_item &amp;amp; ";clear" in selected tab of the front window
 end tell
end process_item
&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-4032996175295522216?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/4032996175295522216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=4032996175295522216' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4032996175295522216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4032996175295522216'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/11/applescript-for-open-terminal-here.html' title='AppleScript for &quot;Open Terminal Here&quot; command.'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-3921320663378906884</id><published>2007-11-04T15:10:00.000-08:00</published><updated>2007-11-04T15:13:11.551-08:00</updated><title type='text'></title><content type='html'>&lt;h1&gt;Hey Apple, bring Java 6 to Leopard!&lt;/h1&gt;

&lt;a href="http://www.javalobby.org/java/forums/t103042.html"&gt;13949712720901ForOSX&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-3921320663378906884?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/3921320663378906884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=3921320663378906884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/3921320663378906884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/3921320663378906884'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/11/hey-apple-bring-on-java-6-to-leopard.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-7515143736058627769</id><published>2007-09-18T21:22:00.000-07:00</published><updated>2011-07-25T13:33:06.794-07:00</updated><title type='text'>Icons hosted on Google for Google Earth, Google Maps and KML</title><content type='html'>&lt;h1&gt;
Icons hosted on Google for Google Earth, Google Maps and KML&lt;/h1&gt;
I did a little sleuthing to find out what paddles are available on Google for marking points in Google Earth. Here's a list of the icons that Google hosts. I don't know if this is complete or not (I suspect not) but it's a pretty handy reference for those working with KML. There's a few more listed &lt;a href="http://groups.google.com/group/Google-Maps-API/browse_thread/thread/da4dd3e61c08e429/063649623e8d491b?lnk=gst&amp;amp;q=icons&amp;amp;rnum=2#063649623e8d491b"&gt;here&lt;/a&gt;

&lt;br /&gt;
&lt;h2&gt;
Large Letters and Numbers&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/A.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/A.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/B.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/B.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/C.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/C.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/D.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/D.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/E.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/E.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/F.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/F.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/G.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/G.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/H.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/H.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/I.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/I.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/J.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/J.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/K.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/K.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/L.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/L.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/M.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/M.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/N.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/N.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/O.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/O.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/P.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/P.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Q.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Q.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/R.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/R.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/S.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/S.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/T.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/T.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/U.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/U.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/V.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/V.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/W.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/W.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/X.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/X.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Y.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Y.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Z.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Z.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/1.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/1.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/2.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/2.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/3.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/3.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/4.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/4.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/5.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/5.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/6.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/6.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/7.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/7.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/8.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/8.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/9.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/9.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/A-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/A-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/B-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/B-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/C-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/C-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/D-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/D-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/E-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/E-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/F-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/F-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/G-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/G-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/H-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/H-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/I-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/I-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/J-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/J-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/K-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/K-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/L-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/L-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/M-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/M-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/N-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/N-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/O-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/O-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/P-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/P-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Q-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Q-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/R-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/R-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/S-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/S-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/T-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/T-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/U-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/U-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/V-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/V-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/W-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/W-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/X-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/X-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Y-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Y-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Z-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Z-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/1-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/1-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/2-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/2-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/3-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/3-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/4-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/4-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/5-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/5-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/6-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/6-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/7-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/7-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/8-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/8-ugc.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/9-ugc.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/9-ugc.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Small Letters and Numbers&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/A-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/A-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/B-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/B-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/C-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/C-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/D-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/D-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/E-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/E-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/F-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/F-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/G-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/G-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/H-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/H-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/I-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/I-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/J-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/J-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/K-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/K-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/L-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/L-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/M-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/M-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/N-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/N-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/O-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/O-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/P-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/P-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Q-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Q-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/R-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/R-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/S-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/S-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/T-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/T-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/U-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/U-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/V-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/V-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/W-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/W-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/X-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/X-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Y-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Y-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Z-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Z-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/1-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/1-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/2-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/2-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/3-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/3-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/4-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/4-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/5-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/5-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/6-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/6-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/7-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/7-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/8-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/8-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/9-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/9-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/A-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/A-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/B-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/B-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/C-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/C-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/D-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/D-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/E-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/E-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/F-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/F-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/G-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/G-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/H-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/H-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/I-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/I-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/J-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/J-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/K-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/K-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/L-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/L-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/M-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/M-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/N-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/N-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/O-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/O-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/P-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/P-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Q-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Q-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/R-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/R-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/S-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/S-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/T-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/T-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/U-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/U-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/V-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/V-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/W-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/W-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/X-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/X-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Y-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Y-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/Z-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/Z-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/1-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/1-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/2-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/2-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/3-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/3-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/4-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/4-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/5-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/5-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/6-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/6-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/7-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/7-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/8-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/8-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/9-ugc-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/9-ugc-lv.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Icons&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon0.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon0.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon1.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon1.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon2.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon2.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon3.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon3.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon4.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon4.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon5.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon5.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon6.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon6.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon7.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon7.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon8.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon8.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon9.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon9.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon10.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon10.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon11.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon11.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon12.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon12.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon13.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon13.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon14.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon14.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon15.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon15.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon16.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon16.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon17.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon17.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon18.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon18.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon19.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon19.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon20.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon20.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon21.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon21.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon22.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon22.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon23.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon23.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon24.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon24.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon25.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon25.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon26.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon26.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon27.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon27.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon28.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon28.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon29.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon29.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon30.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon30.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon31.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon31.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon32.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon32.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon33.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon33.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon34.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon34.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon35.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon35.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon36.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon36.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon37.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon37.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon38.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon38.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon39.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon39.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon40.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon40.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon41.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon41.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon42.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon42.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon43.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon43.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon44.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon44.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon45.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon45.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon46.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon46.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon47.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon47.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon48.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon48.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon49.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon49.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon50.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon50.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon51.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon51.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon52.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon52.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon53.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon53.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon54.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon54.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon55.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon55.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon56.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon56.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon57.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon57.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon58.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon58.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon59.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon59.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon60.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon60.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon61.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon61.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon62.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon62.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon63.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon63.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon0.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon0.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon1.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon1.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon2.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon2.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon3.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon3.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon4.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon4.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon5.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon5.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon6.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon6.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon7.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon7.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon8.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon8.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon9.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon9.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon10.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon10.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon11.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon11.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon12.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon12.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon13.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon13.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon14.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon14.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon15.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon15.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon16.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon16.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon17.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon17.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon18.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon18.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon19.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon19.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon20.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon20.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon21.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon21.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon22.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon22.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon23.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon23.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon24.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon24.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon25.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon25.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon26.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon26.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon27.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon27.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon28.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon28.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon29.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon29.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon30.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon30.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon31.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon31.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon32.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon32.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon33.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon33.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon34.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon34.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon35.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon35.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon36.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon36.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon37.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon37.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon38.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon38.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon39.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon39.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon40.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon40.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon41.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon41.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon42.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon42.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon43.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon43.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon44.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon44.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon45.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon45.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon46.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon46.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon47.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon47.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon48.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon48.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon49.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon49.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon50.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon50.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon51.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon51.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon52.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon52.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon53.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon53.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon54.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon54.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon55.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon55.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon56.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon56.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon57.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon57.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon58.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon58.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon59.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon59.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon60.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon60.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon61.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon61.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon62.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon62.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon63.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon63.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon0.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon0.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon1.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon1.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon2.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon2.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon3.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon3.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon4.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon4.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon5.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon5.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon6.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon6.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon7.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon7.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon8.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon8.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon9.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon9.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon10.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon10.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon11.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon11.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon12.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon12.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon13.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon13.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon14.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon14.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon15.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon15.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon16.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon16.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon17.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon17.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon18.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon18.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon19.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon19.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon20.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon20.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon21.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon21.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon22.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon22.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon23.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon23.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon24.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon24.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon25.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon25.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon26.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon26.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon27.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon27.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon28.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon28.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon29.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon29.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon30.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon30.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon31.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon31.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon32.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon32.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon33.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon33.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon34.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon34.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon35.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon35.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon36.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon36.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon37.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon37.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon38.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon38.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon39.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon39.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon40.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon40.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon41.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon41.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon42.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon42.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon43.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon43.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon44.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon44.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon45.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon45.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon46.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon46.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon47.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon47.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon48.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon48.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon49.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon49.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon50.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon50.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon51.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon51.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon52.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon52.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon53.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon53.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon54.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon54.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon55.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon55.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon56.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon56.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon57.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon57.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon58.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon58.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon59.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon59.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon60.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon60.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon61.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon61.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon62.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon62.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon63.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon63.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon0.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon0.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon1.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon1.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon2.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon2.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon3.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon3.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon4.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon4.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon5.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon5.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon6.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon6.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon7.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon7.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon8.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon8.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon9.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon9.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon10.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon10.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon11.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon11.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon12.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon12.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon13.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon13.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon14.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon14.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon15.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon15.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon16.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon16.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon17.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon17.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon18.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon18.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon19.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon19.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon20.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon20.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon21.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon21.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon22.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon22.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon23.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon23.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon24.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon24.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon25.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon25.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon26.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon26.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon27.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon27.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon28.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon28.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon29.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon29.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon30.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon30.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon31.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon31.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon32.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon32.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon33.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon33.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon34.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon34.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon35.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon35.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon36.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon36.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon37.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon37.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon38.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon38.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon39.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon39.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon40.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon40.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon41.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon41.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon42.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon42.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon43.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon43.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon44.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon44.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon45.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon45.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon46.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon46.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon47.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon47.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon48.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon48.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon49.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon49.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon50.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon50.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon51.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon51.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon52.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon52.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon53.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon53.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon54.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon54.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon55.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon55.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon56.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon56.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon57.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon57.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon58.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon58.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon59.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon59.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon60.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon60.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon61.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon61.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon62.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon62.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon63.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon63.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Shadow Icons&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon0s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon0s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon1s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon1s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon2s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon2s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon3s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon3s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon4s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon4s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon5s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon5s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon6s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon6s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon7s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon7s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon8s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon8s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon9s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon9s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon10s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon10s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon11s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon11s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon12s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon12s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon13s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon13s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon14s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon14s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon15s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon15s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon16s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon16s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon17s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon17s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon18s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon18s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon19s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon19s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon20s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon20s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon21s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon21s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon22s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon22s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon23s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon23s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon24s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon24s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon25s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon25s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon26s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon26s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon27s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon27s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon28s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon28s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon29s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon29s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon30s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon30s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon31s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon31s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon32s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon32s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon33s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon33s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon34s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon34s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon35s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon35s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon36s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon36s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon37s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon37s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon38s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon38s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon39s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon39s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon40s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon40s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon41s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon41s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon42s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon42s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon43s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon43s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon44s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon44s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon45s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon45s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon46s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon46s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon47s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon47s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon48s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon48s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon49s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon49s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon50s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon50s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon51s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon51s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon52s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon52s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon53s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon53s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon54s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon54s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon55s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon55s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon56s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon56s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon57s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon57s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon58s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon58s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon59s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon59s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon60s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon60s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon61s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon61s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon62s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon62s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal2/icon63s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal2/icon63s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon0s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon0s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon1s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon1s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon2s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon2s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon3s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon3s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon4s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon4s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon5s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon5s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon6s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon6s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon7s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon7s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon8s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon8s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon9s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon9s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon10s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon10s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon11s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon11s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon12s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon12s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon13s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon13s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon14s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon14s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon15s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon15s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon16s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon16s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon17s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon17s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon18s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon18s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon19s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon19s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon20s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon20s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon21s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon21s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon22s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon22s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon23s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon23s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon24s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon24s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon25s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon25s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon26s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon26s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon27s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon27s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon28s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon28s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon29s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon29s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon30s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon30s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon31s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon31s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon32s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon32s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon33s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon33s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon34s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon34s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon35s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon35s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon36s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon36s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon37s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon37s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon38s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon38s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon39s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon39s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon40s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon40s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon41s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon41s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon42s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon42s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon43s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon43s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon44s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon44s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon45s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon45s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon46s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon46s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon47s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon47s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon48s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon48s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon49s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon49s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon50s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon50s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon51s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon51s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon52s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon52s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon53s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon53s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon54s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon54s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon55s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon55s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon56s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon56s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon57s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon57s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon58s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon58s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon59s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon59s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon60s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon60s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon61s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon61s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon62s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon62s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal3/icon63s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal3/icon63s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon0s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon0s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon1s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon1s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon2s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon2s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon3s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon3s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon4s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon4s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon5s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon5s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon6s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon6s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon7s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon7s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon8s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon8s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon9s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon9s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon10s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon10s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon11s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon11s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon12s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon12s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon13s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon13s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon14s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon14s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon15s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon15s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon16s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon16s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon17s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon17s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon18s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon18s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon19s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon19s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon20s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon20s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon21s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon21s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon22s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon22s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon23s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon23s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon24s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon24s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon25s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon25s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon26s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon26s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon27s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon27s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon28s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon28s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon29s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon29s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon30s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon30s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon31s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon31s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon32s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon32s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon33s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon33s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon34s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon34s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon35s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon35s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon36s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon36s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon37s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon37s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon38s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon38s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon39s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon39s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon40s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon40s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon41s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon41s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon42s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon42s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon43s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon43s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon44s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon44s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon45s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon45s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon46s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon46s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon47s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon47s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon48s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon48s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon49s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon49s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon50s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon50s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon51s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon51s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon52s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon52s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon53s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon53s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon54s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon54s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon55s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon55s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon56s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon56s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon57s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon57s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon58s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon58s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon59s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon59s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon60s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon60s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon61s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon61s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon62s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon62s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal4/icon63s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal4/icon63s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon0s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon0s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon1s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon1s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon2s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon2s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon3s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon3s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon4s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon4s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon5s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon5s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon6s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon6s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon7s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon7s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon8s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon8s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon9s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon9s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon10s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon10s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon11s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon11s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon12s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon12s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon13s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon13s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon14s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon14s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon15s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon15s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon16s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon16s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon17s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon17s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon18s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon18s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon19s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon19s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon20s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon20s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon21s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon21s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon22s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon22s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon23s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon23s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon24s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon24s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon25s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon25s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon26s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon26s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon27s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon27s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon28s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon28s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon29s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon29s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon30s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon30s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon31s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon31s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon32s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon32s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon33s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon33s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon34s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon34s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon35s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon35s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon36s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon36s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon37s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon37s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon38s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon38s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon39s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon39s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon40s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon40s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon41s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon41s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon42s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon42s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon43s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon43s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon44s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon44s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon45s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon45s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon46s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon46s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon47s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon47s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon48s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon48s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon49s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon49s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon50s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon50s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon51s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon51s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon52s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon52s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon53s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon53s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon54s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon54s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon55s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon55s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon56s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon56s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon57s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon57s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon58s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon58s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon59s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon59s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon60s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon60s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon61s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon61s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon62s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon62s.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/pal5/icon63s.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/pal5/icon63s.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Large Paddles&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-blank.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-blank.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-stars.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-stars.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-circle.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-circle.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-square.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-square.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-diamond.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-diamond.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-blank.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-blank.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-stars.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-stars.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-circle.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-circle.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-square.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-square.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-diamond.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-diamond.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-blank.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-blank.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-stars.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-stars.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-circle.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-circle.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-square.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-square.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-diamond.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-diamond.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-blank.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-blank.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-stars.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-stars.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-circle.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-circle.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-square.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-square.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-diamond.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-diamond.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-blank.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-blank.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-stars.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-stars.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-circle.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-circle.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-square.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-square.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-diamond.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-diamond.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-blank.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-blank.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-stars.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-stars.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-circle.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-circle.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-square.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-square.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-diamond.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-diamond.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Small Paddles&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-blank-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-blank-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-stars-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-stars-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-circle-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-circle-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-square-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-square-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/red-diamond-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/red-diamond-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-blank-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-blank-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-stars-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-stars-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-circle-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-circle-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-square-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-square-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/blu-diamond-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/blu-diamond-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-blank-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-blank-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-stars-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-stars-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-circle-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-circle-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-square-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-square-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pink-diamond-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pink-diamond-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-blank-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-blank-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-stars-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-stars-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-circle-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-circle-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-square-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-square-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/purple-diamond-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/purple-diamond-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-blank-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-blank-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-stars-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-stars-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-circle-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-circle-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-square-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-square-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/wht-diamond-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/wht-diamond-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-blank-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-blank-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-stars-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-stars-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-circle-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-circle-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-square-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-square-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/grn-diamond-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/grn-diamond-lv.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Miscellaneous&lt;/h2&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/go.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/go.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/stop.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/stop.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pause.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pause.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/go-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/go-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/stop-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/stop-lv.png" /&gt;&lt;/a&gt;
&lt;a href="http://maps.google.com/mapfiles/kml/paddle/pause-lv.png"&gt;&lt;img src="http://maps.google.com/mapfiles/kml/paddle/pause-lv.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-7515143736058627769?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/7515143736058627769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=7515143736058627769' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7515143736058627769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7515143736058627769'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/09/list-of-paddle-icons-for-kml-z-letters.html' title='Icons hosted on Google for Google Earth, Google Maps and KML'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-2291634819093998417</id><published>2007-04-24T09:32:00.000-07:00</published><updated>2011-07-25T13:33:22.270-07:00</updated><title type='text'>SLF4J Code Template for Netbeans</title><content type='html'>&lt;h1&gt;
SLF4J Code Template for Netbeans&lt;/h1&gt;
I use Netbeans alot for Java development. I also used Loggers a great deal and Netbeans Code Template feature is a quick an easy way to insert this boiler plate code. Here's an example code template for inserting the code for creating an &lt;a href="http://www.slf4j.org/"&gt;SLF4J&lt;/a&gt; logger [Note I've wrapped it in this blog, but it should all be on one line]:

&lt;br /&gt;
&lt;pre&gt;private static final 
   ${LOG_TYPE type="org.slf4j.Logger" default="Logger" editable=false} 
   log = ${LOG_FACT type="org.slf4j.LoggerFactory" 
   default="LoggerFactory" editable=false}.getLogger(${CLASS});&lt;/pre&gt;
I've added this tip to &lt;a href="http://wiki.netbeans.org/wiki/view/Main"&gt;Netbeans Community Docs&lt;/a&gt; at &lt;a href="http://wiki.netbeans.org/wiki/view/SLF4JCodeTemplate"&gt;http://wiki.netbeans.org/wiki/view/SLF4JCodeTemplate&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-2291634819093998417?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/2291634819093998417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=2291634819093998417' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2291634819093998417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2291634819093998417'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/04/sl4j-code-template-for-netbeans-i-use.html' title='SLF4J Code Template for Netbeans'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-9161302804799877424</id><published>2007-04-12T13:43:00.000-07:00</published><updated>2007-04-12T13:55:00.465-07:00</updated><title type='text'></title><content type='html'>&lt;h1&gt;Delete Line Macro in TextMate&lt;/h1&gt;

TextMate is a great text editor. One key command that I really miss in it is a 'Delete Line' command. It's pretty simple to implement though. Here's how:
&lt;ol&gt;
&lt;li&gt;Under the &lt;b&gt;Bundles&lt;/b&gt; menu select Macros-&gt;Start recording&lt;/li&gt;
&lt;li&gt;Select a line in an editor window([Option]+[Shift]+L)&lt;/li&gt;
&lt;li&gt;Delete the line ([Backspace])&lt;/li&gt;
&lt;li&gt;Under the &lt;b&gt;Bundles&lt;/b&gt; menu select Macros-&gt;Stop recording&lt;/li&gt;
&lt;li&gt;Under the &lt;b&gt;Bundles&lt;/b&gt; menu select Macros-&gt;Save last recording&lt;/li&gt;
&lt;li&gt;Give it a name; 'Delete Line' seems most appropriate&lt;/li&gt;
&lt;li&gt;Assign it a keystroke. I use [Option]+D.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-9161302804799877424?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/9161302804799877424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=9161302804799877424' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/9161302804799877424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/9161302804799877424'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/04/delete-line-macro-in-textmate-textmate.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-9105134740552059899</id><published>2007-03-30T09:04:00.001-07:00</published><updated>2011-07-25T13:33:39.655-07:00</updated><title type='text'>Scripting a Java Project with Groovy</title><content type='html'>&lt;h1&gt;
Scripting a Java Project with Groovy&lt;/h1&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
For java projects, after you've finished writing the the API, business logic, O/R mapping layer, etc, you have to get down to the nitty, gritty details of making the application actually run. I often find that I need to script together different API's to perform some task. For example, I might want to call some of my libraries that add a time-code track to a QuickTime movie. I could write a Java class to do this but generally this is cumbersome and creates a fairly heavy-weight development process (write-compile-test-deploy); and honestly, isn't really much fun. And even after I've written the class to do the particular task, I still need to write a shell script to execute the classes main method. For desktop applications this means creating a launcher, such as a JNLP file or shell script. &lt;br /&gt;
Recently, I've started poking around with &lt;a href="http://groovy.codehaus.org/"&gt;Groovy
&lt;/a&gt;. I've been very impressed with it's scripting ability. Here, I will present what I've done to script together different API's using Groovy. &lt;b&gt;Below, I present a technique that allows you to script a Java applications without requiring you to install anything outside of the project. (i.e. you don't need to install groovy on the system that's running your scripts.)&lt;/b&gt;  In order to build this project you will need to have the following installed: &lt;a href="http://java.com/"&gt;Java&lt;/a&gt;, &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;&lt;br /&gt;
First, I create an Ant build.xml file. This particular project doens't actually compile any code, the build file is just going to use Maven to fetch the dependencies I need for my project and store them in a lib directory. This technique is described &lt;a href="http://hohonuuli.blogspot.com/2007/03/boostrapping-mavens-antlib-maven.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
My project is set up like so:
&lt;br /&gt;
&lt;pre&gt;PRJ_HOME
|~~ bin         [Shell scripts]
|~~ conf        [Configuration - e.g. log4j.xml]
|~~ lib         [Java jars]
`~~ scripts    
    `~~ groovy  [Groovy scripts]
&lt;/pre&gt;
My build.xml looks like this:&lt;br /&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;!-- build file for eits-db program --&amp;gt;
&amp;lt;!-- Created by:  Brian Schlining --&amp;gt;

&amp;lt;project name="eits-db" default="init" basedir="." xmlns:artifact="antlib:org.apache.maven.artifact.ant"&amp;gt;
  &amp;lt;property name="lib" value="lib" /&amp;gt;
  &amp;lt;property name="groovy" value="scripts/groovy" /&amp;gt;
  
&amp;lt;!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
artifact.install
   this target is not necessary if you put ivy.jar in your ant lib directory
   if you already have ivy 1.4 in your ant lib, you can simply remove this
   target and the dependency the 'go' target has on it
--&amp;gt;

  &amp;lt;property name="artifact.jar.dir" value="${basedir}/.ant" /&amp;gt;
  &amp;lt;property name="artifact.jar.file" value="${artifact.jar.dir}/maven.artifact-ant-2.0.2-dep.jar" /&amp;gt;
  
  &amp;lt;target name="artifact.install" description="Install artifact lib"&amp;gt;
      &amp;lt;mkdir dir="${artifact.jar.dir}"/&amp;gt;
      &amp;lt;!--
         download maven antlib from web site so that it can be used even without any
         special installation
       --&amp;gt;
      &amp;lt;available file="${artifact.jar.file}" property="artifact.exists"/&amp;gt;
      &amp;lt;echo message="Installing Maven Antlib..."/&amp;gt;
      &amp;lt;get src="http://www.apache.org/dist/maven/binaries/maven-artifact-ant-2.0.2-dep.jar"
           dest="${artifact.jar.file}" usetimestamp="true" ignoreerrors="${artifact.exists}"/&amp;gt;
      
      &amp;lt;typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant"&amp;gt;
          &amp;lt;classpath&amp;gt;
              &amp;lt;pathelement location="${artifact.jar.file}" /&amp;gt;
          &amp;lt;/classpath&amp;gt;
      &amp;lt;/typedef&amp;gt;
      
  &amp;lt;/target&amp;gt;
  
  &amp;lt;target name="init" description="Setup project and fetch dependencies from internet" depends="artifact.install"&amp;gt;
      &amp;lt;mkdir dir="${lib}" /&amp;gt;
      &amp;lt;artifact:pom id="pom" file="pom.xml" /&amp;gt;
      &amp;lt;echo&amp;gt;Fetching dependencies for ${pom.artifactId}-${pom.version}&amp;lt;/echo&amp;gt;
      &amp;lt;artifact:dependencies filesetId="dependency.fileset" useScope="runtime"&amp;gt;
          &amp;lt;pom refid="pom"/&amp;gt;
      &amp;lt;/artifact:dependencies&amp;gt;
      &amp;lt;copy todir="${lib}" verbose="true"&amp;gt;
          &amp;lt;fileset refid="dependency.fileset" /&amp;gt;
          &amp;lt;mapper type="flatten" /&amp;gt;
      &amp;lt;/copy&amp;gt;
  &amp;lt;/target&amp;gt;
  
  &amp;lt;target name="clean" description="Cleanup the project" &amp;gt;
      &amp;lt;delete dir="${lib}" /&amp;gt;
  &amp;lt;/target&amp;gt;

&amp;lt;/project&amp;gt;
&lt;/pre&gt;
Next, I'll declare my dependencies in a Maven pom.xml file. For this example the 2 dependencies we really care about are groovy-all-1.0.jar and commons-cli-1.0.jar. Both of these are required in order to script from the command line with groovy.
&lt;br /&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;eits&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;eits-db&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;EITS Database Tools&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://foo.bar.org/projects/${project.name}&amp;lt;/url&amp;gt;
    &amp;lt;dependencies&amp;gt;
 &amp;lt;!-- Other dependencies not included for brevity --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;4.2&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;groovy&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;commons-cli&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;commons-cli&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;
Next, I'll need to create a launcher script to set up the environment and execute and of my Groovy scripts. I'm developing on Mac OS X, so I'll create a bash script. The script is pretty simple, it sets the application classpath to include all jars in PRJ_HOME/lib.  if your working on windows, setting up the classpath at runtime is a bit more of a pain; the details for it can be found &lt;a href="http://hohonuuli.blogspot.com/2007/02/creating-java-classpath-dynamically.html"&gt;here&lt;/a&gt;.

&lt;br /&gt;
&lt;pre&gt;#!/bin/sh
# GSH: Execute groovy script using the projects library directory.

PRJ_HOME=`dirname "$0"`/..

CP=${PRJ_HOME}/scripts/groovy:$PRJ_HOME/conf:$PRJ_HOME/lib
PRJ_LIB=$PRJ_HOME/lib
for jar in $(ls $PRJ_LIB/*.jar)
do
    CP=$CP:$jar
done

java -classpath "$CP" groovy.ui.GroovyMain "$@"
&lt;/pre&gt;
With this in place, all I need to do script any of my java apps is create a Groovy script in PRJ_HOME/scripts/groovy then run 'gsh myscript' on the command line. Groovy does allow for command line switches using a groovy builder called 'CliBuilder'. Discussion about CliBuilder is way beyond what I want to cover here, but there's and example of it's use in the script below.

And of course, the groovy script:
&lt;br /&gt;
&lt;pre&gt;/**
 * addtimecode.groovy 
 *
 * This script is used takes a QuickTime movie as input, adds a timecode track 
 * and saves it out to a different 'flattened' QuickTime movie file
 */
 
import org.mbari.movie.Timecode
import org.mbari.qt.FileExistsException
import org.mbari.qt.QT
import org.mbari.qt.TimeUtil
import org.mbari.qt.VideoStandard

/*
 * Setup command line interface
 */
def cli = new CliBuilder(usage: "run_groovy ../scripts/groovy/addtimecode -i [input move] -o [output movie] -t [hh:mm:ss:ff]")
cli.h(longOpt: "help", "usage information")
cli.i(argName: "input", longOpt: "input", args:1, required: true, "movie file to read")
cli.o(argName: "output", longOpt: "output", args:1, required: true, "movie file to write")
cli.t(argName: "timecode", longOpt: "timecode", args:1, required: true, "starting timecode (hh:mm:ss:ff) - assuming NTSC (29.97 fps)")

/*
 * Parse the command line options
 */
def options = cli.parse(args)
if (!options) {
    return
}
if (options.h) {
    println "Script for adding a time-code track to QuickTime movies"
    cli.usage()
}

// Create a file reference
def inputFile = new File(options.i)
URL inputUrl = inputFile.toURL()

// Add a timecode track
def timecode = new Timecode(options.t)

// Export to the output file
def exitCode = 0
try {
    def movie = QT.openMovieFromUrl(inputUrl)
    TimeUtil.addTimeCodeTrack(movie, timecode, VideoStandard.NTSC)
    QT.flattenMovie(movie, new File(options.o), false)
}
catch (FileExistsException e) {
    println "The file ${inputFile} already exists. You must delete it first or save to a different file."
    exitCode = 1
}
catch (Exception e) {
    println "An error occurred during processing. \n  ERROR: ${e.class} \n  MESSAGE:${e.message}"
    exitCode = 2
}

System.exit(exitCode)
&lt;/pre&gt;
To execute this script I would run the following on the command line: gsh addtimecode -i /Some/movie.mov -o /Some/newmovie.mov -t 00:12:34:01.&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-9105134740552059899?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/9105134740552059899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=9105134740552059899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/9105134740552059899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/9105134740552059899'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/03/scripting-java-project-with-groovy.html' title='Scripting a Java Project with Groovy'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8505487182534822643</id><published>2007-03-20T08:24:00.000-07:00</published><updated>2011-07-25T13:33:55.939-07:00</updated><title type='text'>Boostrapping Maven's Antlib</title><content type='html'>&lt;h1&gt;
Boostrapping Maven's Antlib&lt;/h1&gt;
Maven repositories can be used from Ant build scripts using &lt;a href="http://maven.apache.org/"&gt;Maven's&lt;/a&gt; &lt;a href="http://maven.apache.org/ant-tasks.html"&gt;antlib&lt;/a&gt;. To do this you must have &lt;del&gt;&lt;/del&gt;&lt;br /&gt;
both Maven and&lt;br /&gt;
 Ant installed. When using non-standard Ant extensions it's much easier on your fellow developers if you have your build script &lt;i&gt;bootstrap&lt;/i&gt; the use of the libraries so that they don't have to manually install the Ant extensions. Below is an example of how to bootstrap Maven's antlib and fetch all the dependencies, including transitive ones, declared in a Project Object Model (i.e. &lt;i&gt;pom.xml&lt;/i&gt;) and copy them to the projects lib directory.&lt;br /&gt;
For this example, in addition to your &lt;i&gt;build.xml&lt;/i&gt; file, you will need to create a simple &lt;i&gt;pom.xml&lt;/i&gt; that defines your dependencies. Here's an example &lt;i&gt;pom.xml&lt;/i&gt;:&lt;br /&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;project 
xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;eits&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;eits-db&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;EITS Database Tools&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://oceana.shore.mbari.org/projects/${project.name}&amp;lt;/url&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;4.2&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;5.0.4&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;
To bootstrap antlib into your projects (so users can build without having to install antlib) modify your build.xml file like so:
&lt;br /&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" ?&amp;gt;
&amp;lt;!-- $Id: build.xml,v 1.21 2007/01/05 01:04:43 brian Exp $ --&amp;gt;
&amp;lt;project 
    name="YourProjectName" 
    default="init" 
    basedir="." 
    xmlns:artifact="antlib:org.apache.maven.artifact.ant"&amp;gt;
    
    ... 

    &amp;lt;!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         Install the Maven artifact and configure project properties
    --&amp;gt;

    &amp;lt;property name="artifact.jar.dir" value="${basedir}/.ant" /&amp;gt;
    &amp;lt;property name="artifact.jar.file" value="${artifact.jar.dir}/maven.artifact-ant-2.0.2-dep.jar" /&amp;gt;
    &amp;lt;mkdir dir="${artifact.jar.dir}"/&amp;gt;
    &amp;lt;!--
       download maven antlib from web site so that it can be used even without any
       special installation
     --&amp;gt;
    &amp;lt;available file="${artifact.jar.file}" property="artifact.exists"/&amp;gt;
    &amp;lt;echo message="Installing Maven Antlib..."/&amp;gt;
    &amp;lt;get src="http://www.apache.org/dist/maven/binaries/maven-artifact-ant-2.0.2-dep.jar"
         dest="${artifact.jar.file}" usetimestamp="true" ignoreerrors="${artifact.exists}"/&amp;gt;

    &amp;lt;typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant"&amp;gt;
        &amp;lt;classpath&amp;gt;
            &amp;lt;pathelement location="${artifact.jar.file}" /&amp;gt;
        &amp;lt;/classpath&amp;gt;
    &amp;lt;/typedef&amp;gt;
    
    &amp;lt;!-- 
        Configure properties based on pom.xml and typical Maven build structure.
        Modify this for your own project structure
    --&amp;gt;
    &amp;lt;artifact:pom id="pom" file="pom.xml" /&amp;gt;
    &amp;lt;property name="version" value="${pom.version}" /&amp;gt;
    &amp;lt;property name="project" value="${pom.artifactId}" /&amp;gt;
    &amp;lt;property name="build" value="${pom.build.directory}" /&amp;gt;
    &amp;lt;property name="lib" value="${build}/lib" /&amp;gt;

    &amp;lt;!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    init
        Sets up the project for build

    --&amp;gt;
    &amp;lt;target name="init" description="Create the build directory structure"&amp;gt;
        &amp;lt;!-- Create the timestamp --&amp;gt;
        &amp;lt;tstamp/&amp;gt;
        
        &amp;lt;!-- Create the directory build structure used by compile --&amp;gt;
        &amp;lt;mkdir dir="${build}"/&amp;gt;
        &amp;lt;mkdir dir="${lib}"/&amp;gt;
        
        &amp;lt;!-- Copy dependencies to target/lib --&amp;gt;
        &amp;lt;echo&amp;gt;Finding dependencies of ${pom.artifactId}-${version}&amp;lt;/echo&amp;gt;
        &amp;lt;artifact:dependencies filesetId="dependency.fileset" useScope="runtime"&amp;gt;
            &amp;lt;pom refid="pom"/&amp;gt;
        &amp;lt;/artifact:dependencies&amp;gt;
        &amp;lt;copy todir="${lib}" verbose="true"&amp;gt;
            &amp;lt;fileset refid="dependency.fileset" /&amp;gt;
            &amp;lt;mapper type="flatten" /&amp;gt;
        &amp;lt;/copy&amp;gt;
            
        ...
    &amp;lt;/target&amp;gt;

&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8505487182534822643?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8505487182534822643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8505487182534822643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8505487182534822643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8505487182534822643'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/03/boostrapping-mavens-antlib-maven.html' title='Boostrapping Maven&apos;s Antlib'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-7496010356716238479</id><published>2007-02-01T14:46:00.000-08:00</published><updated>2007-03-30T09:15:31.925-07:00</updated><title type='text'></title><content type='html'>&lt;h1&gt;Creating a Java CLASSPATH dynamically from jars in a directory&lt;/h1&gt;
&lt;p&gt;When creating DOS batch file to launch a Java application, many people build the classpath by hand. For example:&lt;/p&gt;

&lt;pre&gt;APP_CLASSPATH=C:\APP\junit.jar;C:\APP\myapp.jar;C:\APP\commons-logging.jar&lt;/pre&gt;

&lt;p&gt;This is kind of a pain. Especially, when working on an evolving project where the jars change relatively frequently. It would be much easier if the batch file built the classpath dynamically based on the jars found in a directory. Here's how to do this:&lt;/p&gt;

&lt;p&gt;First, here's the directory layout for our imaginary application. I'm just explaing this so that you aware of how this example is structured.&lt;/p&gt;

&lt;pre&gt;
APP_HOME
|~~ bin (Batch files live here)
`~~ lib (Jars live here)
&lt;/pre&gt;

Next, create a batch file to launch your Java application or to setup your environment. It's contents will look something like:

&lt;pre&gt;@echo off
REM $Id:  $

REM Setup the APP environment
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM APP_HOME assumes that your batch file is in APP_HOME\bin.
REM If your batch file is in APP_HOME change the next line
REM to 'SET APP_HOME=%~dp0'
SET APP_HOME=%~dp0..
SET APP_LIB=%APP_HOME%\lib
SET APP_CLASSPATH=
FOR %%i IN ("%APP_LIB%\*.jar") DO CALL cpappend.bat %%i&lt;/pre&gt;

Notice the call to cpappend.bat. You need to create that batch file; it's contents are:

&lt;pre&gt;REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Append to APP_CLASSPATH
REM
REM $Id: $
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SET _TEMP=

REM Process the first argument
IF ""%1"" == """" GOTO end
SET _TEMP=%1
SHIFT

REM Process the remaining arguments.
REM Paths with spaces are handled here
:setArgs
IF ""%1"" == """" GOTO doneSetArgs
SET _TEMP=%_TEMP% %1
SHIFT
GOTO setArgs

REM Build the classpath
:doneSetArgs
SET APP_CLASSPATH=%APP_CLASSPATH%;"%_TEMP%"
GOTO end

:end
&lt;/pre&gt;

If you're working on Mac OS X, Linux, or UNIX setting the path dynamically is much simpler. Here's the equivalent shell scripting code:

&lt;pre&gt;
APP_HOME=`dirname "$0"`/..
APP_LIB= $APP_HOME/lib
APP_CLASSPATH=
for jar in $(ls $APP_LIB/*.jar)
do
    APP_CLASSPATH=$APP_CLASSPATH:$jar
done

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-7496010356716238479?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/7496010356716238479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=7496010356716238479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7496010356716238479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/7496010356716238479'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/02/creating-java-classpath-dynamically.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-4513579636949965837</id><published>2007-01-04T15:13:00.000-08:00</published><updated>2011-07-25T13:34:11.909-07:00</updated><title type='text'>Open an iTerm tab at the current Finder selection</title><content type='html'>&lt;h2&gt;
Open an iTerm tab at the current Finder selection&lt;/h2&gt;
For you do-it-yourselfers, Here's the Applescript for opening an &lt;a href="http://iterm.sourceforge.net/"&gt;iTerm&lt;/a&gt; tab for the current finder window. To use, open Apple's Script Editor, paste it in and press the compile button. Then 'Save As...' an application; I usually save it into ~/Library/Scripts as 'iTermHere'. Drag the saved application onto your finder toolbar and your ready to roll.&lt;br /&gt;
&lt;pre&gt;(* 

    Open Terminal Here 
     
    A toolbar script for Mac OS X 10.3/10.4
     
    Written by Marc Liyanage 

     
    See http://www.apple.com/applescript/macosx/toolbar_scripts/ for 
    more information about toolbar scripts. 
     
    See http://www.entropy.ch/software/applescript/ for the latest 
    version of this script. 
     
     
    History: 
    04-Jan-2007: Version 2.2.1 by Brian Schlining. Modified to work with iterm
    11-AUG-2005: Version 2.1.1 by magnamous. minor changes to process_item(this_item)
    21-MAR-2005: Version 2.1 by Will Norris. code cleanup and minor additions 
    18-AUG-2004: Version 2.0 by Allan Marcus. uses posix path    
    30-OCT-2001: Version 1.0, adapted from one of the example toolbar scripts 
    30-OCT-2001: Now handles embedded single quote characters in file names 
    30-OCT-2001: Now handles folders on volumes other than the startup volume 
    30-OCT-2001: Now handles click on icon in top-level (machine) window 
    31-OCT-2001: Now displays a nicer terminal window title, courtesy of Alain Content 
    11-NOV-2001: Now folders within application packages (.app directories) and has a new icon 
    12-NOV-2001: New properties to set terminal columns and rows as the Terminal does not use default settings 
    14-NOV-2001: Major change, now handles 8-bit characters in all shells, and quotes and spaces in tcsh 
    18-NOV-2001: Version 1.1: Rewrite, now uses a temporary file  ~/.OpenTerminalHere to communicate 
    the directory name between AppleScript and the shell because this is much more reliable for 8-bit characters 
     
 *)


property debug : false

-- when the toolbar script icon is clicked 
-- 
on run
 tell application "Finder"
  try
   set this_folder to (the target of the front window) as alias
  on error
   set this_folder to startup disk
  end try
  
  my process_item(this_folder)
  
 end tell
end run


-- This handler processes folders dropped onto the toolbar script icon 
-- 
on open these_items
 repeat with i from 1 to the count of these_items
  set this_item to item i of these_items
  my process_item(this_item)
 end repeat
end open


-- this subroutine processes does the actual work 
-- this version can handle this weirdo case: a folder named "te'st"ö te%s`t"

on process_item(this_item)
 
 set thePath to quoted form of POSIX path of this_item
 
 tell application "iTerm"
  activate
  -- just open a terminal and cd to thePath
  make new terminal
  tell the first terminal
   activate current session
   launch session "Default Session"
   tell the last session
    write text "cd '" &amp;amp; thePath &amp;amp; "'; clear"
   end tell
  end tell
 end tell
 
 
end process_item
&lt;/pre&gt;
This script is based on one that's been circulated around for a while. I found the original script &lt;a href="http://www.macosxhints.com/article.php?story=20020426093503563&amp;amp;query=terminal%2Bapplescript%2Bopen%2Bfinder"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-4513579636949965837?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/4513579636949965837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=4513579636949965837' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4513579636949965837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/4513579636949965837'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2007/01/open-iterm-tab-at-current-finder.html' title='Open an iTerm tab at the current Finder selection'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8201364628791784171</id><published>2006-12-27T13:58:00.000-08:00</published><updated>2007-01-05T12:52:05.430-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;How to use Google to search for a movie&lt;/h2&gt;
Here's an example that finds Battlestar Galactica AVI's &lt;br/&gt;
&lt;pre&gt;
-inurl:htm -inurl:html intitle:”index of” “Last modified” avi “battlestar”
&lt;/pre&gt;

This valid Google search returns music files of certain types with the word Nirvana in the link from certain pages all over the web:

&lt;pre&gt;
-inurl:(htm|html|php) intitle:"index of" +"last modified" +"parent directory" 
+description +size +(wma|mp3) "Nirvana" 
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8201364628791784171?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8201364628791784171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8201364628791784171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8201364628791784171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8201364628791784171'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/12/how-to-use-google-to-search-for-movie.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-2368929121286684675</id><published>2006-11-27T08:45:00.000-08:00</published><updated>2006-11-27T08:46:16.771-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Blame Canada&lt;/h2&gt;
&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="430" height="313"&gt;
  &lt;param name="movie" value="http://www.greenpeace.org/international/assets/binaries/blamecanadaswf.swf"&gt;
  &lt;param name="quality" value="high"&gt;
  &lt;embed src="http://www.greenpeace.org/international/assets/binaries/blamecanadaswf.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="430" height="313"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-2368929121286684675?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/2368929121286684675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=2368929121286684675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2368929121286684675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/2368929121286684675'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/11/blame-canada.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-5637760638941834426</id><published>2006-11-20T08:43:00.000-08:00</published><updated>2006-11-20T08:45:55.816-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Los Gringos Salvajes&lt;/h2&gt;
This is my brother-in-laws band. They're hard to describe in words; but they sound great. You can take a listen at &lt;a href="http://www.myspace.com/gringossalvajes"&gt;http://www.myspace.com/gringossalvajes&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-5637760638941834426?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/5637760638941834426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=5637760638941834426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5637760638941834426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5637760638941834426'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/11/los-gringos-salvajes-this-is-my-brother.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-8030553128326502909</id><published>2006-11-20T08:41:00.000-08:00</published><updated>2006-11-20T08:46:21.839-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;The McDonalds Order Song...&lt;/h2&gt;
&lt;embed src='http://us.i1.yimg.com/cosmos.bcst.yahoo.com/player/media/swf/FLVVideoSolo.swf' flashvars='id=1139731&amp;emailUrl=http%3A%2F%2Fvideo.yahoo.com%2Futil%2Fmail%3Fei%3DUTF-8%26vid%3D4b044928311930a6d234f535674e6dd4.1139731%26cache%3D1&amp;imUrl=http%253A%252F%252Fvideo.yahoo.com%252Fvideo%252Fplay%253F%2526ei%253DUTF-8%2526vid%253D4b044928311930a6d234f535674e6dd4.1139731%2526cache%253D1&amp;imTitle=McDonalds%2BDrive%2BThru%2BSong&amp;searchUrl=http://video.yahoo.com/video/search?p=&amp;profileUrl=http://video.yahoo.com/video/profile?yid=&amp;creatorValue=amZyb3ZpY2gyMDAx&amp;vid=4b044928311930a6d234f535674e6dd4.1139731' type='application/x-shockwave-flash' width='425' height='350'&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-8030553128326502909?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/8030553128326502909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=8030553128326502909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8030553128326502909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/8030553128326502909'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/11/mcdonalds-order-song.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-5581301479059314969</id><published>2006-11-16T23:44:00.000-08:00</published><updated>2006-11-20T08:47:06.737-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Now this is the right way to sing Hey-ya!&lt;/h2&gt;
&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8-8nkkOA_AM"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/8-8nkkOA_AM" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-5581301479059314969?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/5581301479059314969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=5581301479059314969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5581301479059314969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/5581301479059314969'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/11/now-this-is-right-way-to-sing-hey-ya.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-116006423611933484</id><published>2006-10-05T09:03:00.000-07:00</published><updated>2006-10-05T09:03:56.253-07:00</updated><title type='text'>macosxhints.com - Use Quicksilver for quick timed reminders</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;This is a great hint for using Quicksilver (for Mac OS X) to do timed reminders or actions.&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.macosxhints.com/article.php?story=20060826104706258"&gt;www.macosxhints.com/art...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-116006423611933484?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/116006423611933484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=116006423611933484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/116006423611933484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/116006423611933484'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/10/macosxhintscom-use-quicksilver-for.html' title='macosxhints.com - Use Quicksilver for quick timed reminders'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-115496766616307721</id><published>2006-08-07T09:21:00.000-07:00</published><updated>2006-08-07T09:21:09.486-07:00</updated><title type='text'>QuickTime for Java: Threading issue</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;        QTJ's capture manager,        &lt;span&gt;SequenceGrabber,&lt;/span&gt;        periodically needs some CPU time or it will crash on Intel Macs. A solution was posted on java.net.      &lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://weblogs.java.net/blog/editors/archives/2006/08/superdeformed.html"&gt;weblogs.java.net/blog/e...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-115496766616307721?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/115496766616307721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=115496766616307721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/115496766616307721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/115496766616307721'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/08/quicktime-for-java-threading-issue.html' title='QuickTime for Java: Threading issue'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-115143346712592819</id><published>2006-06-27T11:37:00.000-07:00</published><updated>2006-06-27T11:40:34.436-07:00</updated><title type='text'>Mark Occurrences for IntelliJ IDEA</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;I've been using IntelliJ IDEA for some development lately. It's a great IDE but one thing that I've missed is the 'Mark Occurences' feature available in Eclipse and as a plugin in Netbeans. Fortunatly, it is available in IntelliJ, it's just a bit hidden. To activate it, use [CTRL]+[SHIFT]+[F7] (for Mac folks that's [META]+[SHIFT]+[F7]). Pressing [ESC] disables it.&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.javalobby.org/java/forums/t19240.html"&gt;www.javalobby.org/java/...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-115143346712592819?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/115143346712592819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=115143346712592819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/115143346712592819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/115143346712592819'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/06/mark-occurrences-for-intellij-idea.html' title='Mark Occurrences for IntelliJ IDEA'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-114227524965801992</id><published>2006-03-13T10:36:00.000-08:00</published><updated>2011-07-25T13:34:35.856-07:00</updated><title type='text'>Using Runtime.getRuntime().exec() in java</title><content type='html'>&lt;h2&gt;
Using Runtime.getRuntime().exec() in java&lt;/h2&gt;
This is not well documented by Sun but if you make a call using Runtime.getRuntime().exec() you should always get a reference to the Process object that's returned. When you're done with the Process you should either:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Explicitly get and close the input, output and error streams for the Process, whether you've used them or not&lt;/li&gt;
or
&lt;li&gt;Call Process.destroy()
&lt;/li&gt;
&lt;/ul&gt;
If you don't make these calls you will leak resources. Once you start leaking resources you may start to see "IOException: Broken Pipe" errors
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-114227524965801992?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/114227524965801992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=114227524965801992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114227524965801992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114227524965801992'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/03/using-runtime.html' title='Using Runtime.getRuntime().exec() in java'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-114063344716526285</id><published>2006-02-22T10:26:00.000-08:00</published><updated>2006-03-13T10:36:12.640-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Enabling readline support with Jython 2.2a on Mac OS X&lt;/h2&gt;
&lt;p&gt;If you do much work using &lt;a href="http://java.sun.com"&gt;Java&lt;/a&gt;, you're eventually going to try a scripting language that runs on the JVM. My personal favorite is &lt;a href="http://www.jython.org"&gt;Jython&lt;/a&gt;. The only problem is that Jython doesn't have &lt;a href="http://cnswww.cns.cwru.edu/~chet/readline/rltop.html"&gt;readline&lt;/a&gt; support right out of the box. This makes command line usage very frustrating since all the shortcuts that command line users love are missing. Fortunatly, it's relatively easy to enable readline support. Here's the steps for setting jython up with it on Mac OS X:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="http://fink.sourceforge.net/"&gt;Fink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use fink to install 'readline-java'&lt;/li&gt;
&lt;li&gt;Edit the Jython registry file. Normally, this is located in the same directory that the jython.jar file is in. In case you're wondering, it's named 'registry'. You'll want to add the following lines:
&lt;pre&gt;
python.console=org.python.util.ReadlineConsole
python.console.readlinelib=GnuReadline
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;The last step is to add 'libJavaReadline.jnilib' to the java.library.path. An easy way to do this is to edit your script that launches Jython and add the line:
&lt;pre&gt;
DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/sw/lib
&lt;/pre&gt;
or you can just copy libJavaReadline.jnilib and java-readline.jar to /Library/Java/Extensions&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-114063344716526285?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/114063344716526285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=114063344716526285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114063344716526285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114063344716526285'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/02/enabling-readline-support-with-jython.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-114021380046337077</id><published>2006-02-17T14:03:00.000-08:00</published><updated>2006-02-17T14:03:20.516-08:00</updated><title type='text'>SVN Client for the Mac</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;Here's the details on how to install SCPlugin which adds SVN context to Mac OS X's Finder application&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.web-relevant.com/blogs/cfobjective/index.cfm?mode=entry&amp;amp;entry=127EB70D-BDB9-5320-EB12984E12A81198"&gt;www.web-relevant.com/bl...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-114021380046337077?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/114021380046337077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=114021380046337077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114021380046337077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114021380046337077'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/02/svn-client-for-mac.html' title='SVN Client for the Mac'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-114002744933700252</id><published>2006-02-15T10:17:00.000-08:00</published><updated>2006-02-15T10:17:29.373-08:00</updated><title type='text'>LearningCommons/Documentation/Subversion - Wiki.ucalgary.ca</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;Handy tips for using Subversion...&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://wiki.ucalgary.ca/page/LearningCommons/Documentation/Subversion"&gt;wiki.ucalgary.ca/page/L...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-114002744933700252?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/114002744933700252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=114002744933700252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114002744933700252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/114002744933700252'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/02/learningcommonsdocumentationsubversion.html' title='LearningCommons/Documentation/Subversion - Wiki.ucalgary.ca'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-113998050306628366</id><published>2006-02-14T21:14:00.000-08:00</published><updated>2006-02-14T21:15:03.076-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Cross Fade images using javaScript&lt;/h2&gt;

http://slayeroffice.com/code/imageCrossFade/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-113998050306628366?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/113998050306628366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=113998050306628366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113998050306628366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113998050306628366'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/02/cross-fade-images-using-javascript.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-113790201336063025</id><published>2006-01-21T19:53:00.000-08:00</published><updated>2006-01-21T19:53:33.440-08:00</updated><title type='text'></title><content type='html'>&lt;a href="http://topix.net/r/05M1cA6r=2Fgr2qozeoKTsPulBXlS9B6nW47tmzVySii9sum5pqc5svO18hof6Eq3aQ9YKoL6KYk1xNa2FmQa3ou8mAsmhe6aI0rY9FX4dBAcMXUYErZDT1VUVxHkbeCQ8dGTrzxiyQmzdsb8AaNfQWX6h=2BRaOQlAstAJg2D5WZM4Q=3D"&gt;Marina hosts first debate on general plan&lt;/a&gt;: "Saying it wants to demystify the Monterey County general plan initiative, a Marina-based organization has scheduled a debate so leaders on both sides of the issue can hash out the ballot measure's finer points."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-113790201336063025?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/113790201336063025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=113790201336063025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113790201336063025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113790201336063025'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/01/marina-hosts-first-debate-on-general.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-113771059502604457</id><published>2006-01-19T14:41:00.000-08:00</published><updated>2006-01-19T14:43:56.203-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Invert the Screen on Mac OS X&lt;/h2&gt;
From &lt;a href="http://www.patriceschneider.com/apple-osx/blog/?p=8"&gt;http://www.patriceschneider.com/apple-osx/blog/?p=8&lt;/a&gt;

&lt;p&gt;&lt;i&gt;Another pretty cool one is to hit the keyboard combination “Control ALT Apple 8″ which will invert the colours on your screen. (Hitting the same combination will change it back to the standard setting.) This can at times also give you an extra 30 minutes or more. It can under certain bright lights also make it easier to read text, btw. Give it a try!&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-113771059502604457?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/113771059502604457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=113771059502604457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113771059502604457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113771059502604457'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/01/invert-screen-on-mac-os-x-from-httpwww.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-113708458625635919</id><published>2006-01-12T08:48:00.000-08:00</published><updated>2011-07-25T13:36:24.515-07:00</updated><title type='text'>Make a Remote Mac Sing</title><content type='html'>&lt;h2&gt;
Make a Remote Mac Sing&lt;/h2&gt;
I found this at &lt;a href="http://lowendmac.com/crews/06/0110.html"&gt;http://lowendmac.com/crews/06/0110.html&lt;/a&gt;

&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;This one requires you to have a administrative login account on a remote Mac that has Remote Login (SSH) enabled. Assuming your friend or co-worker's Mac meets these requirements, you can play a heck of a April fool's joke.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;

In the Terminal, first remotely login to the system by using ssh &amp;lt;username&amp;gt;@&amp;lt;remote Mac's IP address or hostname&amp;gt;.&lt;br /&gt;


Once logged in, enter this command:&lt;br /&gt;


&lt;pre&gt;sudo osascript -e "set Volume 20"&lt;/pre&gt;
And then press return. This sends an AppleScript to set the volume to an audible level. Then enter the following command:&lt;br /&gt;


sudo osascript -e 'say "Dum dum dum dum dum dum dum he he he ho ho ho fa lah lah lah lah lah lah fa lah full hoo hoo hoo" using "Cellos"'&lt;br /&gt;


This sends an AppleScript to say the phrase using the Cellos voice. The results are quite humorous. You can try it out on your own system to hear what it sounds like.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-113708458625635919?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/113708458625635919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=113708458625635919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113708458625635919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113708458625635919'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2006/01/make-remote-mac-sing-i-found-this-at.html' title='Make a Remote Mac Sing'/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-113468764673667470</id><published>2005-12-15T14:59:00.000-08:00</published><updated>2005-12-15T15:01:18.656-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Handy commands for interacting between Finder and Terminal on Mac OS X&lt;/h2&gt;

&lt;a href="http://pdb.finkproject.org/pdb/package.php/pos"&gt;http://pdb.finkproject.org/pdb/package.php/pos&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-113468764673667470?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/113468764673667470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=113468764673667470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113468764673667470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113468764673667470'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/12/handy-commands-for-interacting-between.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-113276393060933608</id><published>2005-11-23T08:35:00.000-08:00</published><updated>2005-11-23T08:39:16.986-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Runing Java SE 5 on Panther&lt;/h2&gt;
http://www.macosxhints.com/article.php?story=20051117173104762&amp;lsrc=osxh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-113276393060933608?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/113276393060933608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=113276393060933608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113276393060933608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/113276393060933608'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/11/runing-java-se-5-on-panther-httpwww.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-112558913081970338</id><published>2005-09-01T08:35:00.000-07:00</published><updated>2005-09-01T08:38:50.826-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Setting system properties in Java Web Start&lt;/h2&gt;
This is a .jnlp snippet for setting a system property;here we set the timezone:
&lt;pre&gt;
  &amp;lt;resources&amp;gt;
    &amp;lt;j2se version="1.5+"/&amp;gt;
    &amp;lt;jar href="dist/hooves-prey.jar"/&amp;gt;
    &amp;lt;property name="user.timezone" value="UTC"/&amp;gt;
  &amp;lt;/resources&amp;gt;
&lt;/pre&gt;

The property *does* get set, but j2see 1.4.2 ignores it. It works fine with Java 5 though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-112558913081970338?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/112558913081970338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=112558913081970338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/112558913081970338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/112558913081970338'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/09/setting-system-properties-in-java-web.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-112440906840229042</id><published>2005-08-18T16:47:00.000-07:00</published><updated>2005-08-18T16:52:13.536-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Efficient String Concatenation in Python&lt;/h2&gt;
If you've ever created long strings in Python, you may have noticed that string concatenation is slow. There's a great site that tries out the different methods for concatenating strings in python at &lt;a href="http://www.skymind.com/~ocrow/python_string/"&gt;http://www.skymind.com/~ocrow/python_string/&lt;/a&gt;. In a nutshell, I've found this one works best for my operations:
&lt;pre&gt;
def method5():
  # Example that concatenates numbers
  from cStringIO import StringIO
  file_str = StringIO()
  for num in xrange(loop_count):
    file_str.write(`num`)

  return file_str.getvalue()

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-112440906840229042?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/112440906840229042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=112440906840229042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/112440906840229042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/112440906840229042'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/08/efficient-string-concatenation-in.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-112239821626701407</id><published>2005-07-26T10:16:00.000-07:00</published><updated>2005-07-26T10:19:54.203-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;See complete output of 'ps' command on Mac OS X&lt;/h2&gt;

This is a tip from macosxhints.com

The output of 'ps' is only as wide as there are columns in the current terminal. Needless to say this gets very annoying since one rarely can read the entire output.

According to the man file for ps, using the w option forces the output to use 132 columns, which helps little. But if you specify it twice, it forces ps to use as many columns as necessary. Thus long lines are displayed wrapping to the the next line. So if you are looking for lines that you think may be longer than the Terminal's width, use:
&lt;pre&gt;
$ ps -auxww | grep stringToSearchFor
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-112239821626701407?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/112239821626701407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=112239821626701407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/112239821626701407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/112239821626701407'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/07/see-complete-output-of-ps-command-on.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-111703867287349965</id><published>2005-05-25T09:26:00.000-07:00</published><updated>2005-05-25T10:34:37.306-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Music of the week&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Anna Ternheim - Better Be&lt;/li&gt;
&lt;li&gt;Venus Hum - Soul Sloshing&lt;/li&gt;
&lt;li&gt;Vinylshakerz - One Night in Bangkok&lt;/li&gt;
&lt;li&gt;Jem - Just a Ride&lt;/li&gt;
&lt;li&gt;Filter - Take a Picture&lt;/li&gt;
&lt;li&gt;Jimmy Buffett - Mademoiselle (Voulez-vous Danser)&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-111703867287349965?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/111703867287349965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=111703867287349965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111703867287349965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111703867287349965'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/05/music-of-week-anna-ternheim-better-be.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-111592787175894204</id><published>2005-05-12T12:49:00.000-07:00</published><updated>2005-05-12T12:57:51.763-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Generating epoch seconds in python&lt;/h2&gt;

I often need to convert a specific time to epoch seconds in various languages. Here's a python way:

&lt;pre&gt;
# A date string to epoch seconds
epoch = time.mktime(time.strptime('1982-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'))

# Epoch seconds to a date string
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(epoch))
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-111592787175894204?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/111592787175894204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=111592787175894204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111592787175894204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111592787175894204'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/05/generating-epoch-seconds-in-python-i.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-111565875188820135</id><published>2005-05-09T10:11:00.000-07:00</published><updated>2005-05-09T10:12:31.893-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;A simple Linux bash script for reading from a serial port&lt;/h2&gt;

&lt;pre&gt;
#/bin/bash
while true
do
  read LINE &lt; /dev/tty0S
  echo $LINE
done
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-111565875188820135?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/111565875188820135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=111565875188820135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111565875188820135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111565875188820135'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/05/simple-linux-bash-script-for-reading.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-111540284121627987</id><published>2005-05-06T10:53:00.000-07:00</published><updated>2005-05-06T11:07:21.226-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Here's what I'm listening to today&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;u&gt;Artist&lt;/u&gt;&lt;/td&gt;&lt;td&gt;&lt;u&gt;Song&lt;/u&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Relient K&lt;/td&gt;&lt;td&gt;Be My Escape&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Olu Dara&lt;/td&gt;&lt;td&gt;Zora&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Massive Attack&lt;/td&gt;&lt;td&gt;Teardrop&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Eminem&lt;/td&gt;&lt;td&gt;Lose Yourself&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ani DiFranco&lt;/td&gt;&lt;td&gt;The Arrivals Gate&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Outkast&lt;/td&gt;&lt;td&gt;Hey Ya!&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Beth Orton&lt;/td&gt;&lt;td&gt;Stolen Car&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Darude vs. Robert Miles&lt;/td&gt;&lt;td&gt;Children of the Sandstorm&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Eddi Reader&lt;/td&gt;&lt;td&gt;Simple Soul&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Israel Kamakawiwo'ole&lt;/td&gt;&lt;td&gt;Somewhere Over The Rainbow&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-111540284121627987?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/111540284121627987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=111540284121627987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111540284121627987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111540284121627987'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/05/heres-what-im-listening-to-today.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-111055820060375263</id><published>2005-03-11T08:16:00.000-08:00</published><updated>2005-03-11T08:24:21.333-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Integrating JProfiler 3.3 into Eclipse on Mac OS X&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Start Jprofiler&lt;/li&gt;
&lt;li&gt;From the file menu select 'IDE Integration'. Follow the steps in the wizard. This will install the plugin. However, it won't run because eclipse tries to run it using a 2.x compatiblility layer.&lt;/li&gt;
&lt;li&gt;Edit the file $ECLIPSE_HOME/plugins/com.jprofiler.integrations.eclipse/plugin.xml. Change the line &amp;lt?eclipse version="3.0"?&amp;gt to &amp;lt?eclipse version="3.0.1"?&amp;gt . This will take care of the compatibility layer&lt;/li&gt;
&lt;li&gt;Go to Windows-&gt;Customize Perspective-&gt;Commands and activate "Profile".
The "Run" menu will then have "Profile" entries and the toolbar will have an
additional button.&lt;/li&gt;


&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-111055820060375263?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/111055820060375263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=111055820060375263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111055820060375263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/111055820060375263'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/03/integrating-jprofiler-3.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-110814266211968680</id><published>2005-02-11T09:19:00.000-08:00</published><updated>2005-02-11T13:18:05.230-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Enable readline support for Python on Mac OS X&lt;/h2&gt;

&lt;p&gt;
To enable readline for python on Mac OS X:&lt;br/&gt;
&lt;code&gt;sudo python `python -c "import pimp; print pimp.__file__"` -i readline&lt;/code&gt;&lt;/br&gt;
&lt;/p&gt;

&lt;p&gt;This hint was found &lt;a href="http://www.macosxhints.com/article.php?story=20050107140338573"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div&gt;
A couple of other useful python links are:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ipython.scipy.org/"&gt;IPython&lt;/a&gt; - An enhancement to the python interactive shell&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.python.org/doc/tut/"&gt;Python Tutorial&lt;/a&gt; - Written by the man himself&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.astro.washington.edu/owen/PythonOnMacOSX.html"&gt;Installing TKinter on MacOS X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-110814266211968680?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/110814266211968680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=110814266211968680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/110814266211968680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/110814266211968680'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/02/enable-readline-support-for-python-on.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-110738674845164279</id><published>2005-02-02T15:19:00.000-08:00</published><updated>2005-02-03T09:03:48.073-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;New Matlab featues&lt;/h2&gt;
There are 2 handy new features in Matlab 7.0. The first is mlint, an m-file similar to C's lint that checks the code for style, language usage and portability. Mathworks has an article about it at http://www.mathworks.com/company/newsletters/news_notes/dec04/cleanup.html. The second handy feature is the new textscan function which really simplifies access to data in arbirarily formatted text files. Here's some info from an article on 
&lt;a href="http://www.mathworks.com/company/newsletters/digest/nov04/newfeatures.html?mld_na_tech2"&gt;http://www.mathworks.com/company/newsletters/digest/nov04/newfeatures.html?mld_na_tech2&lt;/a&gt;.
&lt;h3&gt;Text File Reading&lt;/h3&gt;
The new textscan function enables you to access very large text files that have arbitrary format. This function is similar to textread but adds the ability to specify a file identifier so that a file pointer can be tracked and traversed through the file. The file can therefore be read a block at a time, changing the format on each occasion.
For example, suppose we have a text file, test12_80211b.txt, which contains multiple different-sized blocks of data, each with the following format:

   &lt;ul&gt; &lt;li&gt;Two headerlines of description&lt;/li&gt;
   &lt;li&gt;A parameter m&lt;/li&gt;
   &lt;li&gt;A p x m table of data&lt;/li&gt;

   &lt;/ul&gt;

Here is how test12_80211b.txt looks:

&lt;pre&gt;
*       Mobile1
*       SNR Vs test No
Num tests=19
,-5.00E+00,-4.00E+00,-3.00E+00,-2.00E+00,...
1.00E+00,6.19E-07,8.63E-07,6.43E-07,1.84E-07,...
2.00E+00,2.88E-07,4.71E-07,6.92E-07,1.43E-07,...
3.00E+00,2.52E-07,8.11E-07,4.74E-07,8.48E-07,...
4.00E+00,...
...

*       Mobile2
*       SNR Vs test No
Num tests=20
,-5.00E+00,-4.00E+00,-3.00E+00,-2.00E+00,-1.00E+00,0.00E+00,...
1.00E+00,6.19E-07,8.63E-07,6.43E-07,1.84E-07,6.86E-07,3.73E-,...
2.00E+00,...&lt;/pre&gt;

You could use the following MATLAB commands to read it in: 
&lt;pre&gt;
fid = fopen('test12_80211b.txt', 'r'); % Open text file
InputText = textscan(fid, '%s', 2, 'delimiter', '\n'); % Read header lines
HeaderLines = InputText{1} HeaderLines =
'* Mobile1'
'* SNR Vs test No'

InputText = textscan(fid, 'Num tests=%f'); % Read parameter value
NumCols=InputText{1} NumCols =
19

InputText=textscan(fid, '%f', 'delimiter', ','); % Read data block
Data=reshape(InputText{1},[],NumCols)';
format short g
Section=Data(1:5,1:5) Section =
NaN 	-5 	-4 	-3 	-2
1 	6.19e-007 	8.63e-007 	6.43e-007 	1.84e-007
2 	2.88e-007 	4.71e-007 	6.92e-007 	1.43e-007
3 	2.52e-007 	8.11e-007 	4.74e-007 	8.48e-007
4 	1.97e-007 	1.64e-007 	1.38e-007 	6.17e-007
&lt;/pre&gt;
For improved data access speed, in this release of MATLAB the reading of comma-separated-value (CSV) files is an order of magnitude faster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-110738674845164279?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/110738674845164279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=110738674845164279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/110738674845164279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/110738674845164279'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/02/new-matlab-featues-there-are-2-handy.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-110738631080355508</id><published>2005-02-02T15:15:00.000-08:00</published><updated>2005-02-02T15:18:30.803-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Burning ISO images to CD on Mac OS X&lt;/h2&gt;
&lt;p&gt;To burn ISOs use fink to install cdrecord. Then use the command (here it's burning Ubuntu linux to CD):  &lt;/p&gt; &lt;pre&gt;sudo cdrecord -v speed=24 dev=IODVDServices warty-release-install-i386.iso
&lt;/pre&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-110738631080355508?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hohonuuli.blogspot.com/feeds/110738631080355508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701453&amp;postID=110738631080355508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/110738631080355508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/110738631080355508'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2005/02/burning-iso-images-to-cd-on-mac-os-x.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701453.post-108215204345854010</id><published>2004-04-16T14:38:00.000-07:00</published><updated>2005-02-03T09:00:56.630-08:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Creating an image from &lt;a href="http://www.epic.noaa.gov/java/sgt/index.html"&gt;SGT&lt;/a&gt; in java&lt;/h2&gt;
&lt;pre&gt;
JPlotLayout jpl; 
// initialize and add plots to jpl ... ommitted here.

// Get graphic
int width = jpl.getWidth();
int height = jpl.getHeight();
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
jpl.paint(g);

// Save to a file
try {
    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("some.jpg"));
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    JPEGEncoderParam param = encoder.getDefaultJPEGEncoderParam(img);
    int quality = 100;
    quality = Math.max(0, Math.min(quality, 100));
    param.setQuality((float) quality/100F, false);
    encoder.setJPEGEncoderParam(param);
    encoder.encode(img);
    out.close();
}
catch (IOException e) {
    // Log or deai with exception
}


&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701453-108215204345854010?l=hohonuuli.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/108215204345854010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701453/posts/default/108215204345854010'/><link rel='alternate' type='text/html' href='http://hohonuuli.blogspot.com/2004/04/creating-image-from-sgt-in-java.html' title=''/><author><name>Brian Schlining</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-_j0CtIC6ynU/AAAAAAAAAAI/AAAAAAAAB4U/gJEw-t9t5oU/s512-c/photo.jpg'/></author></entry></feed>
