<?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-6192914801419860742</id><updated>2012-02-17T10:20:16.873-05:00</updated><category term='ui'/><category term='visualization'/><category term='south-kingstown'/><category term='people'/><category term='tools'/><category term='engineering'/><category term='collaboration'/><category term='politics'/><category term='governance'/><category term='performance'/><category term='tagging'/><category term='projects'/><category term='instant messaging'/><category term='learning'/><category term='diary'/><category term='kids'/><title type='text'>Calliope Sounds</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://calliopesounds.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default?start-index=101&amp;max-results=100'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>362</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1572689838117757873</id><published>2012-02-17T10:20:00.000-05:00</published><updated>2012-02-17T10:20:16.882-05:00</updated><title type='text'>Lawrence Lessig: How Money Corrupts Congress and a Plan to Stop It - The Long Now</title><content type='html'>I have mentioned before Lawrence Lessig's work to remove the inequitable distribution of power through money and the dependency corruption that is pervasive in US politics, esp. at the federal level. His book &lt;i&gt;Republic, Lost&lt;/i&gt; is a challenging read. He recently gave a talk at the Long Now Foundation that I &lt;b&gt;highly&lt;/b&gt; recommend. Please do listen to it. Well worth an hour of your time.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://longnow.org/seminars/02012/jan/17/how-money-corrupts-congress-and-plan-stop-it/"&gt;Lawrence Lessig: How Money Corrupts Congress and a Plan to Stop It - The Long Now&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1572689838117757873?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1572689838117757873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1572689838117757873'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2012/02/lawrence-lessig-how-money-corrupts.html' title='Lawrence Lessig: How Money Corrupts Congress and a Plan to Stop It - The Long Now'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-6776341694660953913</id><published>2012-02-13T11:37:00.000-05:00</published><updated>2012-02-13T11:37:55.048-05:00</updated><title type='text'>Rants (aka Tweets) on resumes</title><content type='html'>Rants (aka Tweets) on resumes:&lt;br /&gt;&lt;br /&gt;A resume should not be a ouija board. Your mother might not need to understand it but I do. Make your work clear.&lt;br /&gt;&lt;br /&gt;Your resume should tell me about the teams you were on; team size; team duration; role(s) you played; tools you used. Everything else is BS.&lt;br /&gt;&lt;br /&gt;If your resume can't hook me on the first page the following pages are doing nothing more than annoying me.&lt;br /&gt;&lt;br /&gt;I hope to god that I never see a 3 page resume again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-6776341694660953913?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6776341694660953913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6776341694660953913'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2012/02/rants-aka-tweets-on-resumes.html' title='Rants (aka Tweets) on resumes'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-147598284358348698</id><published>2012-02-12T10:58:00.000-05:00</published><updated>2012-02-12T10:58:19.076-05:00</updated><title type='text'>Apple had just one customer</title><content type='html'>“Apple had just one customer. He passed away last year.” - Seth Godin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-147598284358348698?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/147598284358348698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/147598284358348698'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2012/02/apple-had-just-one-customer.html' title='Apple had just one customer'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1068540659368779761</id><published>2012-02-08T09:17:00.007-05:00</published><updated>2012-02-08T09:18:15.667-05:00</updated><title type='text'>The realpath command line utility</title><content type='html'>I seem to use my command line utility &lt;i&gt;realpath&lt;/i&gt; all the time. All it does it take a relative path and return its absolute path. It is very useful. So useful that I can't believe all systems don't have one in &lt;i&gt;/usr/bin/.&lt;/i&gt; If you are missing this functionality too then here is source&lt;pre&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;limits.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main( int argc, char** argv ) {&lt;br /&gt;&lt;br /&gt;        int i;&lt;br /&gt;        char _realpath[ PATH_MAX ];&lt;br /&gt;&lt;br /&gt;        for ( i = 1; i &amp;lt; argc; i++ ) {&lt;br /&gt;                if ( realpath( argv[i], _realpath ) != NULL ) {&lt;br /&gt;                        printf( &amp;quot;%s\n&amp;quot;, _realpath );&lt;br /&gt;                }&lt;br /&gt;                else {&lt;br /&gt;                        exit( 1 );&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        exit( 0 );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Save this to the file &lt;i&gt;realpath.c&lt;/i&gt; and then build with &lt;tt&gt;make realpath&lt;/tt&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1068540659368779761?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1068540659368779761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1068540659368779761'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2012/02/realpath-command-line-utility.html' title='The realpath command line utility'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3116629305928743676</id><published>2012-02-08T06:03:00.000-05:00</published><updated>2012-02-08T09:19:57.025-05:00</updated><title type='text'>Cloning a Subversion repository</title><content type='html'>If you are following the explanation in &lt;i&gt;Version Control with Subversion&lt;/i&gt;, "Repository Replication", page 177, of how to clone a Subversion repository and want a working example then here it is as a &lt;i&gt;Makefile&lt;/i&gt;&lt;pre&gt;# NOTE ROOT must be an absolute path&lt;br /&gt;ROOT=/tmp&lt;br /&gt;CLONE=$(ROOT)/clone&lt;br /&gt;SANDBOX=$(ROOT)/sandbox&lt;br /&gt;SOURCE=http://css-boilerplate.googlecode.com/svn/&lt;br /&gt;&lt;br /&gt;all: &lt;br /&gt;    svnadmin create $(CLONE)&lt;br /&gt;    ln -s /usr/bin/true $(CLONE)/hooks/pre-revprop-change&lt;br /&gt;    ln -s /usr/bin/true $(CLONE)/hooks/start-commit&lt;br /&gt;    svnsync init file://$(CLONE) $(SOURCE)&lt;br /&gt;    svn co file://$(CLONE) $(SANDBOX)&lt;br /&gt;    svnsync sync file://$(CLONE)&lt;br /&gt;    ( cd $(SANDBOX) ; svn update ; ls -l )&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;    rm -rf $(CLONE) $(SANDBOX)&lt;br /&gt;&lt;br /&gt;# END&lt;br /&gt;&lt;/pre&gt;Replace &lt;i&gt;SOURCE&lt;/i&gt; with a value appropriate to you. (Here I am using a convenient, small, public repository.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3116629305928743676?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3116629305928743676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3116629305928743676'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2012/02/cloning-subversion-repository.html' title='Cloning a Subversion repository'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1878064548203537710</id><published>2011-12-19T21:13:00.000-05:00</published><updated>2011-12-19T21:13:06.824-05:00</updated><title type='text'>A comment on "So which IDE is the best and why?"</title><content type='html'>My comment to &lt;a href="http://www.reddit.com/r/java/comments/nc4qn/so_which_ide_is_the_best_and_why_im_a_beginner/"&gt;So which IDE is the best and why? Im a beginner and only know of a few I prefer Eclipse : java&lt;/a&gt;: &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An IDE gives you three very useful tools. Code editing. Code navigation. And code debugging. Each of the commenters, I am sure, have different needs and styles of these tools. You will also.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;All the IDEs tend to have very aggressive code editing help. This is great when you are working with new packages but the help gets tiresome as your packages familiarity increases and yet the IDE continues to make suggestions when you know full well what you want. Code navigation in modern IDEs is a godsend. To be able to move easily between classes, up and down the inheritance hierarchy, and around usages. Code debugging is less about the source and more about the data and the threads. The better the tools are at showing data structures -- the plural is important! -- and visually connecting threads w/ stack traces the easier your job becomes.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have not answered your question because there is no answer. We shape our tools and our tools shape us. It almost does not matter which you pick -- Eclipse, IntelliJ, NetBeans, Emacs w/ JDEE, Vim w/ JDE, .... What matters is that using the IDE becomes second nature.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And don't fool yourself that you will fix the IDE's problems. You don't have that much free time.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1878064548203537710?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1878064548203537710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1878064548203537710'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/comment-on-so-which-ide-is-best-and-why.html' title='A comment on &quot;So which IDE is the best and why?&quot;'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4999355786014148632</id><published>2011-12-17T17:33:00.003-05:00</published><updated>2011-12-17T17:33:44.497-05:00</updated><title type='text'>Code now on GitHub</title><content type='html'>I have started to move and/or clone my code to &lt;a href="https://github.com/andrewgilmartin"&gt;GitHub&lt;/a&gt; -- like everyone else....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4999355786014148632?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4999355786014148632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4999355786014148632'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/code-now-on-github.html' title='Code now on GitHub'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3769979630118175057</id><published>2011-12-16T14:11:00.000-05:00</published><updated>2011-12-16T14:11:26.515-05:00</updated><title type='text'>Calliope Sounds has an ISSN</title><content type='html'>I work for a small publisher intermediary and while working with our data recently I needed an testing ISSN. It got me thinking about the work involved with getting an ISSN for my blog -- an online serial publication. There is &lt;a href="http://www.loc.gov/issn/form/"&gt;one form&lt;/a&gt; to complete and that is then mailed to the Library of Congress along with the "front page" of the publication. I did this about two weeks ago and today the &lt;i&gt;Library of Congress, United States, ISSN Center&lt;/i&gt; delivered my new ISSN. In all its glory, here it is&lt;blockquote style="font-size: 200%"&gt;ISSN 2165-0861&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3769979630118175057?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3769979630118175057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3769979630118175057'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/calliope-sounds-has-issn.html' title='Calliope Sounds has an ISSN'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2084545192456935457</id><published>2011-12-15T20:36:00.001-05:00</published><updated>2012-01-13T07:54:20.293-05:00</updated><title type='text'>Using reflection for command line option parsing</title><content type='html'>Over the last few days I have needed a few command line tools -- mostly for data cleanup. I got tired of manually parsing command line arguments. I wanted something more automated. My first thought was to design a data-structure that expressed the command lines arguments then write an interpreter that would parse the arguments with its guidance. I spent an hour doing this only to realize that preparing the data-structure was almost as much work as manual parsing. Then I remembered that Ant has a simple facility that uses reflection to execute a task expressed in XML against an object. This is what I wanted. So, for example, the command line tool &lt;pre&gt;java ... Sum --multiplier 25 --verbose 1 2 3 4&lt;/pre&gt; would be implemented as &lt;pre&gt;&lt;br /&gt;public class Sum implements Runnable {&lt;br /&gt;&lt;br /&gt;   public void setVerbose() {&lt;br /&gt;      this.verbose = true;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setMultiplier( Long multiplier ) {&lt;br /&gt;      this.multiplier = multiplier;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void addPositional( Long number ) {&lt;br /&gt;      this.numbers.add(number);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void run() {&lt;br /&gt;      long sum = 0;&lt;br /&gt;      for ( Number number : this.numbers } {&lt;br /&gt;         if ( verbose ) {&lt;br /&gt;            System.out.printf("%d + %d= %d\n", &lt;br /&gt;               sum, &lt;br /&gt;               number.longValue(), &lt;br /&gt;               sum + number.longValue() );&lt;br /&gt;         }&lt;br /&gt;         sum += number.longValue();&lt;br /&gt;      }&lt;br /&gt;      if ( this.multiplier != null ) {&lt;br /&gt;         if ( verbose ) { ... }&lt;br /&gt;         sum *= multiplier;&lt;br /&gt;      }&lt;br /&gt;      System.out.println(sum);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/p&gt;The magic, of course, is reflection. The reflection-based parser sees "--verbose" and matches it against setVerbose(), "--multiplier" matches against setMultiplier() and that it takes one numeric option. The remaining positional arguments are passed to addPositional() as numbers. Once parsed run() is called. The &lt;a href="https://github.com/andrewgilmartin/com.andrewgilmartin.common/blob/master/src/com/andrewgilmartin/common/util/ReflectiveCommandLineParser.java"&gt;ReflectiveCommandLineParser&lt;/a&gt; is used to handle the magic within the main()&lt;pre&gt;   public static void main( String[] args ) {&lt;br /&gt;      Sum sum = new Sum();&lt;br /&gt;      ReflectiveCommandLineParser.run(sum,args);&lt;br /&gt;   }&lt;/pre&gt;See &lt;a href="https://github.com/andrewgilmartin/com.andrewgilmartin.common/blob/master/src/com/andrewgilmartin/examples/ListFiles.java"&gt;ListFiles&lt;/a&gt; implementation for another example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2084545192456935457?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2084545192456935457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2084545192456935457'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/over-last-few-days-i-have-needed-few.html' title='Using reflection for command line option parsing'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2757983660637837425</id><published>2011-12-15T09:44:00.000-05:00</published><updated>2011-12-15T09:46:16.937-05:00</updated><title type='text'>How MySql loads result sets</title><content type='html'>I was having a devil of a time yesterday with the simple task of using a Java program to copy records as objects from one MySql database to another &lt;a href="#[1]"&gt;[1]&lt;/a&gt;. I kept running out of memory. While the root problem had to do with creating 2M objects in memory it did lead to a better understanding of how MySql loads result sets. In short, it loads the &lt;b&gt;whole&lt;/b&gt; result set into memory in one shot. So, if you have 1M records at 1K each in the result set you will need at least 1G of memory to hold them. If you then build 1M objects from these records you will need an additional 1M * object size of memory. In other words, a lot of memory.&lt;/p&gt;You can have the MySql JDBC driver "stream" the result set, however. That is, read the records row by row from the database. It is less efficient for the driver -- multiple trips back and forth between the server --  but doing so requires far less memory. You can turn on streaming at the statement level or at the datasource level.&lt;/p&gt;&lt;b&gt;Statement Level&lt;/b&gt;&lt;br/&gt;To turn on streaming at the statement level you need to use a set of common JDBC settings that, when used together, inform the driver to stream. When you create or prepare a statement you &lt;b&gt;must&lt;/b&gt; define how the result will be used and what is the fetch size. For example,&lt;pre&gt;Statement statement = connection.createStatement(&lt;br /&gt; ResultSet.TYPE_FORWARD_ONLY, &lt;br /&gt; ResultSet.CONCUR_READ_ONLY);&lt;br /&gt;statement.setFetchSize(Integer.MIN_VALUE);&lt;/pre&gt;and&lt;pre&gt;PreparedStatement statement = connection.prepareStatement(&lt;br /&gt; "select ... from ... where ...",&lt;br /&gt; ResultSet.TYPE_FORWARD_ONLY,&lt;br /&gt; ResultSet.CONCUR_UPDATABLE);&lt;br /&gt;statement.setFetchSize(Integer.MIN_VALUE);&lt;/pre&gt;For more information see section Result Set in &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html"&gt;JDBC API Implementation Notes&lt;/a&gt;.&lt;/p&gt;&lt;b&gt;DataSource Level&lt;/b&gt;&lt;br/&gt;To turn on streaming at the statement level you need to add a property to the JDBC uri. For example, Integer. MIN_VALUE is -2^31 and so use &lt;pre&gt;jdbc:mysql://localhost/?defaultFetchSize=-2147483648&lt;/pre&gt;&lt;/p&gt;For more information see &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html"&gt;Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J&lt;/a&gt;.&lt;/p&gt;&lt;a name="[1]"&gt;[1]&lt;/a&gt; I could not use the MySql tools for dumping and loading the table data because I used an auto_increment column in one of the related tables, the target database was active with data, and so could not reset the target's auto_increment column to an appropriate value.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2757983660637837425?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2757983660637837425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2757983660637837425'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/how-mysql-loads-result-sets.html' title='How MySql loads result sets'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1947449606461760290</id><published>2011-12-11T11:47:00.000-05:00</published><updated>2011-12-11T11:56:16.161-05:00</updated><title type='text'>Response to "EasyMX - An alternative to JMX"</title><content type='html'>A response to &lt;a href="http://java.dzone.com/articles/easymx-alternative-jmx"&gt;EasyMX - An alternative to JMX | Javalobby&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;An advantages to using JMX is that the JMX client gets to the service via a different network path than the service's users. When the service is running well the path taken does not matter much. It is often the case, however, that the main service path becomes inaccessible under adverse conditions. Your HTTP requests are not being serviced before timeouts kick in, for example. And, consequently, your monitoring is also inaccessible. JMX clients use RMI or direct socket pathways to connect to the service and so the JMX client can continue to monitor and manage the service.&lt;br /&gt;&lt;br /&gt;As Mr Fisher says (first comment to the posting), JMX is one of the "golden parts" of the Java ecosystem. (JBose was built on top of it.) Current JMX coding practices are more sophisticated than in the early days. The "MBean" and "MXBean" interface suffix continue to support quick and dirty monitoring and publishing. And for those with lots of monitoring and management touchpoints we too use sophisticated Java annotations processing to turn existing code into touchpoints.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1947449606461760290?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1947449606461760290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1947449606461760290'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/response-to-easymx-alternative-to-jmx.html' title='Response to &quot;EasyMX - An alternative to JMX&quot;'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1789091739864245252</id><published>2011-12-09T08:32:00.000-05:00</published><updated>2011-12-09T08:34:45.894-05:00</updated><title type='text'>Revised log levels proposal</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/-XedB2jzWjC4/TuIN8g8IbLI/AAAAAAAAAc0/_32cSys089I/s1600/FYI-WTF-OMG.png" imageanchor="1" &gt;&lt;img border="0" height="106" width="200" src="http://3.bp.blogspot.com/-XedB2jzWjC4/TuIN8g8IbLI/AAAAAAAAAc0/_32cSys089I/s200/FYI-WTF-OMG.png" align="left" style="margin-right:1em; margin-bottom:1em"/&gt;&lt;/a&gt;&lt;a href="http://twitter.com/#!/jbarnette/status/144791640589078530"&gt;@jbarnette&lt;/a&gt;: Revised log levels proposal: "fyi," "wtf," and "omg."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1789091739864245252?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1789091739864245252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1789091739864245252'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/revised-log-levels-proposal.html' title='Revised log levels proposal'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-XedB2jzWjC4/TuIN8g8IbLI/AAAAAAAAAc0/_32cSys089I/s72-c/FYI-WTF-OMG.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8016918289310909118</id><published>2011-12-03T10:03:00.001-05:00</published><updated>2011-12-12T13:42:59.917-05:00</updated><title type='text'>In praise of gnuplot's dumb terminal support</title><content type='html'>I have to say, &lt;a href="/2010/11/using-gnuplot-to-plot-time-series-in.html"&gt;again&lt;/a&gt;, I find gnuplot's dumb terminal support is so useful when you are at the command line and need to see a plot of some data. The plot is very rough but this is usually enough to give you enough insight into the data as to whether or not to continue to exploring it. The script I am using now is &lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;function show_usage {&lt;br /&gt; echo \&lt;br /&gt;  usage: $(basename $0) \&lt;br /&gt;  [-x label] \&lt;br /&gt;  [-y label] \&lt;br /&gt;  [-t title] \&lt;br /&gt;  [-s width:height] \&lt;br /&gt;  [-f time-format-strftime] \&lt;br /&gt;  timeseries-input ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function swap {&lt;br /&gt; echo $2 $1&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function parse_size {&lt;br /&gt; W=$(expr $1 : &amp;quot;\\([0-9]*\\):[0-9]*&amp;quot;)&lt;br /&gt; H=$(expr $1 : &amp;quot;[0-9]*:\\([0-9]*\\)&amp;quot;)&lt;br /&gt; echo &amp;quot;$W $H&amp;quot;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;TIMEFMT=&amp;quot;%Y-%m-%dT%H:%M:%S&amp;quot;&lt;br /&gt;XLABEL=&amp;quot;Time&amp;quot;&lt;br /&gt;YLABEL=&amp;quot;Units&amp;quot;&lt;br /&gt;TITLE=&amp;quot;Timeseries&amp;quot;&lt;br /&gt;SIZE=$(swap $(stty size))&lt;br /&gt;&lt;br /&gt;while getopts &amp;quot;x:y:t:f:s:h&amp;quot; opt&lt;br /&gt;do&lt;br /&gt; case $opt in&lt;br /&gt;  x) XLABEL=$OPTARG ;;&lt;br /&gt;  y) YLABEL=$OPTARG ;;&lt;br /&gt;  t) TITLE=$OPTARG ;;&lt;br /&gt;  f) TIMEFMT=$OPTARG ;;&lt;br /&gt;  s) SIZE=$(parse_size $OPTARG) ;;&lt;br /&gt;  h) show_usage ; exit 0 ;;&lt;br /&gt;  *) show_usage ; exit 1 ;;&lt;br /&gt; esac&lt;br /&gt;done&lt;br /&gt;shift $(expr $OPTIND - 1)&lt;br /&gt;&lt;br /&gt;for INPUT in $*&lt;br /&gt;do&lt;br /&gt; if [ &amp;quot;$INPUT&amp;quot; = &amp;quot;-&amp;quot; ]&lt;br /&gt; then&lt;br /&gt;  INPUT=$(mktemp /tmp/timeplot.XXXXXXXXXX)&lt;br /&gt;  cat &amp;gt; $INPUT&lt;br /&gt; fi&lt;br /&gt;&lt;br /&gt; gnuplot &amp;lt;&amp;lt;EOH&lt;br /&gt;  set terminal dumb $SIZE&lt;br /&gt;  set autoscale&lt;br /&gt;  set xdata time&lt;br /&gt;  set timefmt &amp;quot;$TIMEFMT&amp;quot;&lt;br /&gt;  set xlabel &amp;quot;$XLABEL&amp;quot;&lt;br /&gt;  set ylabel &amp;quot;$YLABEL&amp;quot;&lt;br /&gt;  set title &amp;quot;$TITLE&amp;quot;&lt;br /&gt;  plot &amp;quot;$INPUT&amp;quot; using 1:2 with lines&lt;br /&gt;EOH&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;# END&lt;/pre&gt;For example, if the data in &lt;i&gt;/tmp/data&lt;/i&gt; is &lt;pre&gt;2011 34&lt;br /&gt;2012 34&lt;br /&gt;2013 56&lt;br /&gt;2014 24&lt;/pre&gt; then this can be quickly plotted using&lt;pre&gt;timeplot -f %Y /tmp/data&lt;/pre&gt; and get &lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-QUyBfNX5Rng/Tto-hQ4qlOI/AAAAAAAAAco/qGeli4ek5hU/s1600/Screen%2BShot%2B2011-12-03%2Bat%2B10.20.23%2BAM.png" imageanchor="1" style=""&gt;&lt;img border="0" height="400" width="393" src="http://4.bp.blogspot.com/-QUyBfNX5Rng/Tto-hQ4qlOI/AAAAAAAAAco/qGeli4ek5hU/s400/Screen%2BShot%2B2011-12-03%2Bat%2B10.20.23%2BAM.png" /&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/6192914801419860742-8016918289310909118?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8016918289310909118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8016918289310909118'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/12/i-have-to-say-again-i-find-gnuplots.html' title='In praise of gnuplot&apos;s dumb terminal support'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-QUyBfNX5Rng/Tto-hQ4qlOI/AAAAAAAAAco/qGeli4ek5hU/s72-c/Screen%2BShot%2B2011-12-03%2Bat%2B10.20.23%2BAM.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-377422808379839595</id><published>2011-11-29T10:23:00.000-05:00</published><updated>2011-11-29T10:23:20.285-05:00</updated><title type='text'>Under glass they can have it all</title><content type='html'>I have been deeply troubled more recently by having been given a name to what I/we see happening. Our world's experiences are rapidly being shared "under glass" &lt;a href="http://worrydream.com/ABriefRantOnTheFutureOfInteractionDesign/"&gt;[1]&lt;/a&gt;. Be it phones, tablets, desktops, etc. We photograph our children and show the image under glass and not on paper. We hear a poet not in person but from under glass. The Call of Duty gets adrenaline rushing with only the risk of spilling your soda. Ever more of our worlds experiences are under glass. For kids under glass has become their first experience. For some it will be there only experience. You can look and listen but you can not touch. Experience as diorama. The outside framed. Technology advances and so we might just be at a low point in the development of experience+technology. I don't think this is the case. The soma of instant gratification to even the artificial is too strong a force. Umberto Eco talked about American's allure of hyper-reality. Under glass they can have it all.&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://worrydream.com/ABriefRantOnTheFutureOfInteractionDesign/"&gt;A Brief Rant on the Future of Interaction Design&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-377422808379839595?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/377422808379839595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/377422808379839595'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/11/under-glass-they-can-have-it-all.html' title='Under glass they can have it all'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1379130707559981158</id><published>2011-10-31T10:15:00.001-04:00</published><updated>2011-10-31T11:54:05.254-04:00</updated><title type='text'>Genevieve Bell</title><content type='html'>Enjoyed Genevieve Bell's presentation about the lives of data: &lt;iframe width="560" height="315" src="http://www.youtube.com/embed/Nvn_l_Vh3hw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;Genevieve Bell's presentation on bordom:&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/Ps_YUElM2EQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1379130707559981158?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1379130707559981158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1379130707559981158'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/10/genevieve-bell.html' title='Genevieve Bell'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Nvn_l_Vh3hw/default.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7131700028872428009</id><published>2011-10-17T17:12:00.000-04:00</published><updated>2011-10-17T22:03:06.407-04:00</updated><title type='text'>An ode to Dennis Ritchie</title><content type='html'>An ode to &lt;a href="http://www.technologyreview.com/blog/helloworld/27265/"&gt;Dennis Ritchie&lt;/a&gt;, of C and Unix fame, who died this week. A Unix command that echos the input characters and swaps the foreground and background colors after every 7th line break&lt;pre&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;void main() {&lt;br /&gt;  int l = 0;&lt;br /&gt;  int c = 0;&lt;br /&gt;  char** f = malloc(sizeof (char*) * 2);&lt;br /&gt;  f[0] = "\033[0;7m";&lt;br /&gt;  f[1] = "\033[7;0m";&lt;br /&gt;  while ( ( c = getchar() ) != EOF ) {&lt;br /&gt;    if ( c == '\n' ) {&lt;br /&gt;      if ( l % 7 == 0 ) {&lt;br /&gt;        printf(f[l%2]);&lt;br /&gt;      }&lt;br /&gt;      l++;&lt;br /&gt;    }&lt;br /&gt;    putchar(c);&lt;br /&gt;  }&lt;br /&gt;  printf("\033[0m");&lt;br /&gt;}&lt;/pre&gt; Unfortunately, with all candor, I am glad I don't code in C anymore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7131700028872428009?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7131700028872428009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7131700028872428009'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/10/ode-to-dennis-ritchie-of-c-and-unix.html' title='An ode to Dennis Ritchie'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5996527915646350877</id><published>2011-09-30T13:05:00.000-04:00</published><updated>2011-09-30T13:06:51.030-04:00</updated><title type='text'>Re: Cloud-Powered Facial Recognition Is Terrifying</title><content type='html'>In the posting &lt;a href="http://yro.slashdot.org/story/11/09/30/1422217/Cloud-Powered-Facial-Recognition-Is-Terrifying?utm_source=slashdot&amp;amp;utm_medium=twitter"&gt;Cloud-Powered Facial Recognition Is Terrifying&lt;/a&gt; a commentator noted that at 98% accuracy the facial recognition software would have 200,000 false positives per year for a typical airport. This is an inconvenience. The terrifying part is that you also have to consider the false negatives. Assume (for ease of calculation) that 1% of the population are terrorists. Within a population of 1,000,000 there are 10,000 terrorists. Within that, 2% of terrorists will not be recognized and 200 of them will be allowed to fly. Boom! It really doesn't matter what the real ratio of terrorists to non-terrorists is. What matters is the human costs of a false negative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5996527915646350877?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5996527915646350877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5996527915646350877'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/re-cloud-powered-facial-recognition-is.html' title='Re: Cloud-Powered Facial Recognition Is Terrifying'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3638156017944991291</id><published>2011-09-29T10:23:00.000-04:00</published><updated>2011-09-29T10:23:14.806-04:00</updated><title type='text'>Comment on David Ascher's posting "Am I reading these trends right?"</title><content type='html'>My comment on David Ascher's posting is &lt;a href="http://blog.ascher.ca/2011/09/28/am-i-reading-these-trends-right/#comment-1584"&gt;Am I reading these trends right?&lt;/a&gt;&lt;div&gt;&lt;br /&gt;What if the big 5 are perceived as "magazines." That is, if you look at what the big 5 are doing it is little more than gaining an audience by offering remarkable content. When you buy a magazine you don't think about the conveyance, the staples or glue bound, high-resolution images on paper. The same will happen with tablets and other hardware. You pickup the "Vogue tablet" to read its curated content. And "Maker tablet" to read its. I am sure there will be national and international standards shaping a convergence of software and hardware as these "magazines" accumulate. Just as there is, today, an international standard for shower-curtain rings.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3638156017944991291?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3638156017944991291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3638156017944991291'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/comment-on-david-aschers-posting-am-i.html' title='Comment on David Ascher&apos;s posting &quot;Am I reading these trends right?&quot;'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8604712642894225255</id><published>2011-09-29T06:29:00.003-04:00</published><updated>2011-09-29T06:30:01.479-04:00</updated><title type='text'>What if the singularity is not centered on intelligence but instead on population</title><content type='html'>I attending Verner Vinge's lecture at URI on Tuesday night. He talked mostly about the art and mechanics of writing science fiction and a little about the "singularity." Like Ray Kurzweil, he sees the singularity as the appearance of super-human&amp;nbsp;intelligence. He is a little more open, it seems to me, as to whether this is&amp;nbsp;embodied&amp;nbsp;within humans or&amp;nbsp;wholly&amp;nbsp;non-human. (As a side note, I like Jessie Schell's definition where the singularity is the point at which the future is unpredictable because the future changes come, to human perception,&amp;nbsp;instantaneously.) My question to Vinge was&lt;br /&gt;&lt;blockquote&gt;"What if the singularity is not centered on intelligence but instead on population. Nano beings that's population grows (near instantaneously) to consume all the planets resources."&lt;/blockquote&gt;Unfortunately, it was not one picked by the moderator and so I will have to answer this myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8604712642894225255?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8604712642894225255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8604712642894225255'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/what-if-singularity-is-not-centered-on.html' title='What if the singularity is not centered on intelligence but instead on population'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1825037120404644611</id><published>2011-09-22T10:03:00.000-04:00</published><updated>2011-09-22T10:04:18.344-04:00</updated><title type='text'>Act locally</title><content type='html'>The following is a comment made within Facebook's walls that I want to share further.&lt;br /&gt;&lt;br /&gt;At heart I am a socialist. I live in the USA but was raised in the UK. I firmly believe that it is our government's only obligation to protect its citizens, culture, and environment. To that end, education should always be available to all. Health care should be available to all. A functioning natural environment should be available to all. A robust and varied culture should be available to all. Everything else is a means to these ends.&lt;br /&gt;&lt;br /&gt;But this is not the country we live in. Since the 1970's we have had a government ever more focused on "job creation". And this has been expressed time and time again as enabling corporate growth and capital gains growth. We have have 40 years of this messaging. That is 2 generations. The message is firmly planted in the citizen's psyche. The problem is that this is a lie. And worse, a bold faced lie if you just open your eyes and look beyond our territorial boarders. We are a insular people.&lt;br /&gt;&lt;br /&gt;Since the height of US world dominance in the 1950s the US population has doubled. We had 150M citizens then and now we have 300M. Our focus has also changed from local solutions/problems to national solutions/problems. (We do, after all, have a national, homogenizing media.) A solution for 300M people is more than twice as difficult than one for 150M people. And, generally, whatever the solution is it is likely wrong. As Henry David Thoreau (kind'a) said "why do I care about the weather in Texas when I live in Rhode Island."&lt;br /&gt;&lt;br /&gt;So, this is a long aside to my belief that we should not focus on solving our local problem at the national level. We can solve them locally for RI. There is no reason why RI can not have universal health care. There is no reason why RI can not have free higher education. There is no reason why RI can not give economic aid. RI has to make sure that this is all accumulated in an equitable way to past, present, and future citizens. But I feel this can be done.&lt;br /&gt;&lt;br /&gt;To do it, however, we have to take action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1825037120404644611?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1825037120404644611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1825037120404644611'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/act-locally_22.html' title='Act locally'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3211085046270823745</id><published>2011-09-16T13:50:00.000-04:00</published><updated>2011-09-16T13:50:52.652-04:00</updated><title type='text'>Video-game studies have serious flaws : Nature News</title><content type='html'>&lt;a href="http://www.nature.com/news/2011/110916/full/news.2011.543.html?utm_source=feedburner&amp;amp;utm_medium=twitter&amp;amp;utm_campaign=Feed%3A+news%2Frss%2Fmost_recent+%28NatureNews+-+Most+recent+articles%29"&gt;Video-game studies have serious flaws : Nature News&lt;/a&gt; is a good review of of the studies of video game effects on children &amp;amp; young adults.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Boot and his colleagues say that none of the studies they examined avoided all of the methodological pitfalls, and that this raises doubts about the cumulative evidence that action video games enhance cognition. Boot stresses that the studies' claims are not necessarily wrong — but although the available evidence is promising, it is not compelling enough for researchers to draw strong conclusions legitimately."&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3211085046270823745?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3211085046270823745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3211085046270823745'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/video-game-studies-have-serious-flaws.html' title='Video-game studies have serious flaws : Nature News'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7744257492940953767</id><published>2011-09-15T09:00:00.000-04:00</published><updated>2011-09-15T09:02:53.180-04:00</updated><title type='text'>Programming options for kids – Boing Boing</title><content type='html'>Here is my comment &lt;a href="http://boingboing.net/2011/09/14/programming-options-for-kids.html?dlvrit=36761"&gt;Programming options for kids – Boing Boing&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To some degree the language does not matter. What matters is that the kid is ready for the abstract thinking required for programming and that he or she wants to program. My son, then 10, spent a week programming w/ &lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;. He enjoyed it but then abandoned it because there was no relationship between his life and what he could do within Scratch. If Scratch connected to the outside world (think &lt;a href="http://makezine.com/"&gt;Maker&lt;/a&gt; and &lt;a href="http://www.instructables.com/"&gt;Instructables&lt;/a&gt; here) he would have continued further (I think). Kids think of programming like drawing a specific picture or building a play structure. I do it now and I am done. For them, it is not an intellectual journey.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7744257492940953767?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7744257492940953767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7744257492940953767'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/programming-options-for-kids-boing.html' title='Programming options for kids – Boing Boing'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4565606947645626042</id><published>2011-09-12T13:57:00.000-04:00</published><updated>2011-09-12T13:58:07.135-04:00</updated><title type='text'>Basecamp and linking to Google Docs content</title><content type='html'>&lt;a href="http://basecamphq.com"&gt;Basecamp&lt;/a&gt; does not have a means of listing links to external content. It does allow for uploading and so you can use this facility to have links to external content. I needed this for a small project that uses Basecamp to coordinate activities and Google Docs to hold content. The "link" to external content is encoded in an HTML document. For example,&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;TITLE&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;script&amp;gt;&lt;br /&gt;      var url = &amp;quot;URL&amp;quot;;&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body onload=&amp;quot;window.location.href=url&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;Automatically redirecting the browser to &amp;lt;script&amp;gt;document.write(&amp;quot;&amp;lt;a href=\&amp;quot;&amp;quot;+url+&amp;quot;\&amp;quot;&amp;gt;&amp;quot;+xml_encode(url)+&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;)&amp;lt;/script&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;Replace TITLE with the title of the content and URL with the URL to the content. (Don't forget to XML encode any HTML entities in the title and JavaScript escape any special characters in the URL.)  Save this document to a file and then upload this file to Basecamp. When a user selects the uploaded file in Basecamp the user's browser will be redirected to the content at the URL.A lighter weight version of the HTML content is simply&lt;pre&gt;&amp;lt;body onload=&amp;quot;window.location.href=&amp;apos;URL&amp;apos;&amp;quot;/&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4565606947645626042?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4565606947645626042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4565606947645626042'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/basecamp-does-not-have-means-of-listing.html' title='Basecamp and linking to Google Docs content'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4623374764661023809</id><published>2011-09-08T07:47:00.000-04:00</published><updated>2011-09-08T07:48:08.341-04:00</updated><title type='text'>Why do many programmers insist that non-graphical tools are superior to GUIs?</title><content type='html'>The Quora question is &lt;a href="http://www.quora.com/Why-do-many-programmers-insist-that-non-graphical-tools-are-superior-to-GUIs"&gt;Why do many programmers insist that non-graphical tools are superior to GUIs?&lt;/a&gt; and the simple answer is that &lt;b&gt;programmers work extensively with the names of things &lt;/b&gt;-- machines, directories, files, packages, classes, methods, functions, variables, language statements, fields, tables, actions, commands, etc. And so any tool that that lets me use names as navigation to the named thing or things related to the named thing is preferable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4623374764661023809?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4623374764661023809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4623374764661023809'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/09/why-do-many-programmers-insist-that-non.html' title='Why do many programmers insist that non-graphical tools are superior to GUIs?'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7167743839305873979</id><published>2011-08-19T09:11:00.005-04:00</published><updated>2011-08-19T09:19:54.998-04:00</updated><title type='text'>Designing command-line interfaces</title><content type='html'>I like the posting &lt;a href="http://www.antoarts.com/designing-command-line-interfaces/"&gt;Designing command-line interfaces&lt;/a&gt;. Being a CLI type developer I have implemented most CLIs with Anders' recommendations in my tools. Points I would like to emphases are&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) For long running commands make them verbose by default. For short running commands, like &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mv&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cp&lt;/span&gt;, make them quiet by default.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) While I like &lt;a href="http://www.gnu.org/s/autoconf/"&gt;autoconf's&lt;/a&gt; use of "no" to turn off an option, eg &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--no-foos&lt;/span&gt;, and "=" to provide an option's optional value, eg &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--debug&lt;/span&gt; on default port or &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--debug=&lt;i&gt;port&lt;/i&gt;&lt;/span&gt; for a specific port&lt;i&gt;,&lt;/i&gt; it is not used enough elsewhere and so is too unexpected. Don't use them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) Always use a non-zero exit if you find an unknown option or an unknown positional parameter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Use one-dash for one-letter options and two-dashes for multiple-letter options. Eg, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-v&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--version&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-h&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--help&lt;/span&gt;. There are many libraries available that help parse options. I tend to only use two-dash options and so hand code the parsing.&lt;br /&gt;&lt;br /&gt;5) If you don't use one-dash options make sure to reject all positional parameters that start with a dash as this is mostly a user error. If you want to allow positional parameters that start with a dash then use the common "--"&amp;nbsp;parameter&amp;nbsp;to indicate that the remaining parameters are all positional parameters.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6) An option can have multiple arguments. For example, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--database &lt;i&gt;url user&lt;/i&gt; &lt;i&gt;password&lt;/i&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7) Always have the options &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--help&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-h&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--version&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-v&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--quiet&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-q&lt;/span&gt;, and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--verbose&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;8) If a command can run without options make sure the command's results are harmless. Nothing worse than incorrectly using a command and having it destroy data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will, perhaps, add other points for emphases at a later date. For now, do read Anders' posting.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7167743839305873979?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7167743839305873979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7167743839305873979'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/designing-command-line-interfaces.html' title='Designing command-line interfaces'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1882491866362194657</id><published>2011-08-16T19:41:00.000-04:00</published><updated>2011-08-16T19:41:35.766-04:00</updated><title type='text'>FYI: Kanban for Software Development</title><content type='html'>The posting &lt;a href="http://social-biz.org/2009/11/22/kanban-for-software-development/"&gt;Kanban for Software Development&lt;/a&gt; is one of the clearest introductory explanations of kanban that I have read. For example,&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;This is where the somewhat brilliant key idea behind KSDM comes to play.  The completed job does NOT free the person for working on another job, until that job is pulled into the following phase and work is started there.  If work is piling up at a particular phase, those people are NOT ALLOWED to work ahead.  As Taiichi Ohno makes so clear, that working ahead is waste.  Instead of working ahead, they can look around to see what is wrong.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To put this in concrete terms, consider a process which involves (1) detailed design, (2) coding, (3) testing, and (4) documenting.  Each of these stages you place a limit on the number of jobs, and for the sake of example lets say that limit is 4.  Say for example that the coders have finished coding on their four job units, and are ready to take a new one.  But the testing is backed up for some reason, still working on the last four job units, and are not ready to take a new job.  The developers are not allowed to pull in a fifth job unit.  There is no point in coding up more features when the earlier features are not getting tested or documented.  It is also possible that because the developers are not pulling jobs from design, that the design phase becomes filled up with completed tasks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When work backs up in this way, one should go and figure out why testing is stuck.  Maybe the real problem is that the documentation is blocking test.  Whatever it is, the primary job of the entire team is to identify the problem with the flow, and fix it.  Do not simply work ahead accumulating a huge pile of work for “someone else”.  Instead, focus on the big goal, which is to get features completed to a customer ready state as quickly as possible.&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1882491866362194657?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://social-biz.org/2009/11/22/kanban-for-software-development/' title='FYI: Kanban for Software Development'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1882491866362194657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1882491866362194657'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/fyi-kanban-for-software-development.html' title='FYI: Kanban for Software Development'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1026223076938697405</id><published>2011-08-14T08:29:00.000-04:00</published><updated>2011-08-14T08:29:26.476-04:00</updated><title type='text'>The Problem with Kanban</title><content type='html'>Comment on &lt;a href="http://java.dzone.com/articles/problem-kanban#comment-54539"&gt;The Problem with Kanban | Javalobby&lt;/a&gt;:&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;The biggest problem with Kanban is that it‘s designed for a world where things go through the line once (e.g. a carmaker).&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;This got me thinking about whether the problem is generally with Kanban's use in software or instead the kinds of software development Kanban that is more useful in. A service firm builds a single use or single customer tool while a product firm builds a multiple use or multiple customer tool. A service firm tends to have more tasks around the missing parts of the software while a product firm tends to more tasks around the bugs in the software. For a service firm the factory is the assembling of the parts. For a product firm the factory is perfecting the assembly. I am mostly thinking aloud here but I think it is a useful train of thought as to why Kanban works for some firms better than for others.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1026223076938697405?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.dzone.com/articles/problem-kanban#comment-54539' title='The Problem with Kanban'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1026223076938697405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1026223076938697405'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/problem-with-kanban.html' title='The Problem with Kanban'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8072868093211080493</id><published>2011-08-09T09:41:00.004-04:00</published><updated>2011-08-09T09:54:12.886-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>Long Now seminars</title><content type='html'>The whole Long Now &lt;a href="http://longnow.org/seminars"&gt;seminar series&lt;/a&gt; is very good. If you have iTunes and an iPod just add their &lt;a href="http://longnow.org/projects/seminars/SALT.xml"&gt;pod cast&lt;/a&gt; to your iTunes library. Note that the lecture's audio is free but video requires membership. Here are specific lectures I keep coming back to&lt;br /&gt;&lt;br /&gt;Mary Catherine Bateson&lt;br /&gt;&lt;a href="http://longnow.org/seminars/02011/feb/09/live-longer-think-longer/"&gt;Live Longer, Think Longer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jesse Schell&lt;br /&gt;&lt;a href="http://longnow.org/seminars/02010/jul/27/visions-gamepocalypse/"&gt;Visions of the Gamepocalypse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Geoffrey West&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://longnow.org/seminars/02011/jul/25/why-cities-keep-growing-corporations-always-die-and-life-gets-faster/"&gt;Why Cities Keep on Growing, Corporations Always Die, and Life Gets Faster&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/6192914801419860742-8072868093211080493?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8072868093211080493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8072868093211080493'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/long-now-seminars.html' title='Long Now seminars'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1011143795348478566</id><published>2011-08-08T20:36:00.000-04:00</published><updated>2011-08-08T20:36:57.545-04:00</updated><title type='text'>"What's with the moribund twitter bio?"</title><content type='html'>Eliel asked "What's with the moribund &lt;a href="http://twitter.com/andrewgilmartin"&gt;twitter bio&lt;/a&gt;?"&amp;nbsp;I am thinking that it must have been a "can't get anything right" kind of a day when I wrote&amp;nbsp;that. But in all honesty, I am not a natural father and so find myself&amp;nbsp;consciously working at it everyday and the same for marriage (perhaps&amp;nbsp;every other day here). And, how many times have I been granted but&amp;nbsp;never exercised stock options? I am a very optimistic guy. While&amp;nbsp;everyone else (ok, many) are grasping for success I am happy working&amp;nbsp;at being a little more whole one day at a time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1011143795348478566?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1011143795348478566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1011143795348478566'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/whats-with-moribund-twitter-bio.html' title='&quot;What&apos;s with the moribund twitter bio?&quot;'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1122800398624088542</id><published>2011-08-03T15:17:00.002-04:00</published><updated>2011-08-09T09:53:50.371-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='governance'/><title type='text'>Keeping power and maximizing shareholder value</title><content type='html'>In the 1970s our US government representatives stopped caring about their constituents and started caring only about keeping their own job and its access to power. The corporations didn't initiate this change. They are, however,&amp;nbsp;proficient&amp;nbsp;at using the change.&amp;nbsp;Corporations&amp;nbsp;are just doing what corporations always have done and that is to maximize shareholder value by aiding&amp;nbsp;representatives to keep their jobs. I hate to deliver bad news but y'all are the shareholders -- via pensions and other retirement vehicles -- and so are benefiting.&lt;br /&gt;&lt;br /&gt;If you want to help take away the power of money in politics then support (Lawrence Lessig’s)&amp;nbsp;&lt;a href="http://fixcongressfirst.org/"&gt;Fix Congress First&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1122800398624088542?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1122800398624088542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1122800398624088542'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/keeping-power-and-maximizing.html' title='Keeping power and maximizing shareholder value'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8827256746954653499</id><published>2011-08-01T14:58:00.001-04:00</published><updated>2011-08-01T14:59:08.370-04:00</updated><title type='text'>Please support the petition to Save RIPTA</title><content type='html'>Please support the petition to &lt;a href="http://www.change.org/petitions/save-ripta"&gt;Save RIPTA&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ripta.com/"&gt;RIPTA&lt;/a&gt; is a service for the common good. Just as the roads are subsidized by the state for users of private vehicles so should RIPTA be subsidized for users of public vehicles. It has been demonstrated time and time again that broad availablity of public transit -- especially buses -- is beneficial to the economy and to the environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8827256746954653499?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8827256746954653499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8827256746954653499'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/please-support-petition-to-save-ripta.html' title='Please support the petition to Save RIPTA'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1888070959046614214</id><published>2011-08-01T12:09:00.007-04:00</published><updated>2011-08-01T16:52:27.221-04:00</updated><title type='text'>Building an Atlassian Confluence plugin without Atlas, et al</title><content type='html'>I spent several semi-productive hours this weekend writing a plugin for &lt;a href="http://www.atlassian.com/software/confluence/"&gt;Atlassian's Confluence&lt;/a&gt; wiki. The plugin enables the running of JavaScript on the server and placing the result into the page displayed. I have found that using a wiki to intermix static content and dynamic content makes for a great reporting and situation-awareness tool kit (see &lt;a href="http://www.jspwiki.org/wiki/JSPlugin"&gt;JSPWiki&lt;/a&gt;). I wanted to do the same again within the confines of Confluence 2.10 (the older version we are running).&lt;br /&gt;&lt;br /&gt;Confluence has a really good plugin manager webapp. You can search a repository for existing plugins for immediate inclusion. And you can also upload the plugin from your desktop. I gave the plugin manager a work out getting my plugin to work and can attest to its stability.&lt;br /&gt;&lt;br /&gt;And here is the rub, Atlassian has made including and using plugins simple but has made creating a simple plugin almost impossible. My plugin's actual logic is very simple&lt;br /&gt;&lt;pre&gt;private static final ScriptEngineManager factory = new ScriptEngineManager();&lt;br /&gt;...&lt;br /&gt;ScriptEngine engine = factory.getEngineByName("JavaScript");&lt;br /&gt;Object result = engine.eval(script);&lt;br /&gt;return result.toString();&lt;br /&gt;&lt;/pre&gt;To make this happen, however, Atlassian wants me to use &lt;a href="http://confluence.atlassian.com/display/DEVNET/Step+1.+Create+a+Plugin+Skeleton"&gt;Atlas&lt;/a&gt;. Atlas, as a far as I can tell, is much like Ruby on Rails and Spring Roo where the tool lays out a directory structure with files that together are the parts of and tools for building an "Hello World" application/plugin. In addition to Atlas, Maven and (perhaps) Eclipse are also needed. If my occupation was building whole applications on top of the Atlassian products and their APIs I could understand the logic of this tool chain. But I have a 4 line (!) plugin.&lt;br /&gt;&lt;br /&gt;Confluence has been around for a long time and I guessed that the pre-Atlas way of building plugins was documented and with code examples. As far as I can tell, and this is after much searching, this is not the case. I was not able to find a single example of a basic plugin built with, for example, Ant. Since, in the end, a plugin is nothing more than a jar containing code and configuration I was shocked that this was missing from the mass of other documentation Atlassian provides. A whole population of, mostly in-house, programmers are being ignored. These are the programmers that are going to build plugins, i.e. small extensions to big tools that aid the better match between Confluence and the users needs.&lt;br /&gt;&lt;br /&gt;To this end, here is how I build a basic macro plugin. (Note that the plugin documented here is not what I finally created. In the process of using the JDK's implementation of JavaScript I discovered that it is a old version of Mozilla's Rhino that does not support &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-357.htm"&gt;E4x&lt;/a&gt;, the XML language extensions. E4X makes XML a first class data type within JavaScript. Even the JavaScript syntax has been extends to allow for XML constants, for example &lt;tt&gt;x = &amp;lt;a/&amp;gt;&lt;/tt&gt;. And so the final plugin uses Rhino 1.7R3 which does support E4X and JavaScript 1.8.)&lt;br /&gt;&lt;br /&gt;The plugin's jar needs a minimum of two files. The Java class and the atlassian-plugin.xml configuration file. The development directory tree is&lt;br /&gt;&lt;pre&gt;.&lt;br /&gt;./build.xml&lt;br /&gt;./src/atlassian-plugin.xml&lt;br /&gt;./src/com/andrewgilmartin/confluence/plugins/script/JavaScriptPlugin.java&lt;br /&gt;&lt;/pre&gt;The JavaScriptPlugin class extends BasicMacro and must override the methods isInline(), hasBody(), getBodyRenderMode() and execute(). The isInline method specifies if the output of the plugin is suitable for an HTML span or block. The hasBody method specifies if the plugin has content, for example, as does the &lt;tt&gt;{code}&lt;/tt&gt; macro. The getBodyRenderMode() specifies how Confluence is to handle the macro's output. Returning null specifies that the output is &lt;a href="http://confluence.atlassian.com/renderer/notationhelp.action?section=all"&gt;wiki text&lt;/a&gt; to be rendered as HTML. And, finally, execute does the work of the plugin.&lt;br /&gt;&lt;pre&gt;package com.andrewgilmartin.confluence.plugins.script;&lt;br /&gt;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import com.atlassian.renderer.RenderContext;&lt;br /&gt;import com.atlassian.renderer.v2.macro.BaseMacro;&lt;br /&gt;import com.atlassian.renderer.v2.macro.MacroException;&lt;br /&gt;import com.atlassian.renderer.v2.RenderMode;&lt;br /&gt;import javax.script.ScriptEngine;&lt;br /&gt;import javax.script.ScriptEngineManager;&lt;br /&gt;import javax.script.ScriptException;&lt;br /&gt;&lt;br /&gt;public class JavaScriptPlugin extends BaseMacro {&lt;br /&gt;&lt;br /&gt;    private static ScriptEngineManager factory = new ScriptEngineManager();&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean isInline() {&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean hasBody() {&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public RenderMode getBodyRenderMode() {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String execute(Map params, String body, RenderContext renderContext) throws MacroException {&lt;br /&gt;        try {&lt;br /&gt;            ScriptEngine engine = factory.getEngineByName("JavaScript");&lt;br /&gt;            engine.put("params", params);&lt;br /&gt;            Object evalResult = engine.eval(body);&lt;br /&gt;            String result = evalResult.toString();&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;        catch (ScriptException e) {&lt;br /&gt;            throw new MacroException(e);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// END&lt;br /&gt;&lt;/pre&gt;The atlassian-plugin.xml is an XML declaration of the plugin. It must be in the root of the plugin's jar file. The file contains two main sections. The first is plugin-info which declares the plugin as a whole. The second is the (repeatable) macro which declares the specific plugin. The atlassian-plugin.xml has several further refinements of these sections. I was not able to find an XML schema for this file type. What I have discovered about it is from reviewing Atlassian's own plugins. The atlassian-plugin element's key attribute seems to be a unique identifier but does not have a prescribed structure: I am here just using the JavaScritMacro class's package name. The macro element's name attribute is the name of the macro as used by the user. For example &lt;tt&gt;{javascript}1+2+3{javascript}&lt;/tt&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;atlassian-plugin&lt;br /&gt; name="JavaScript Macro Plugin"&lt;br /&gt; key="com.andrewgilmartin.confluence.plugins.script"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;plugin-info&amp;gt;&lt;br /&gt;        &amp;lt;description&amp;gt;A JavaScript macro plugin&amp;lt;/description&amp;gt;&lt;br /&gt;        &amp;lt;vendor name="Andrew Gilmartin" url="http://www.andrewgilmartin.com" /&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/plugin-info&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;macro&lt;br /&gt; name="javascript"&lt;br /&gt; class="com.andrewgilmartin.confluence.plugins.script.JavaScriptPlugin"&lt;br /&gt; key="com.andrewgilmartin.confluence.plugins.script.javascript"&amp;gt;&lt;br /&gt;        &amp;lt;description&amp;gt;A JavaScript macro plugin. Place the script to execute within the body of the macro.&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;/macro&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/atlassian-plugin&amp;gt;&lt;/pre&gt;The build script is&lt;br /&gt;&lt;pre&gt;&amp;lt;project name="com.andrewgilmartin.confluence.plugins.script" default="dist"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;property environment="env" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;path id="build.classpath"&amp;gt;&lt;br /&gt;        &amp;lt;fileset dir="${env.HOME}/src/confluence-2.10.4-std/confluence/WEB-INF/lib/"&amp;gt;&lt;br /&gt;            &amp;lt;include name="**/*.jar"/&amp;gt;&lt;br /&gt;        &amp;lt;/fileset&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="${basedir}"/&amp;gt;&lt;br /&gt;    &amp;lt;/path&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;target name="dist"&amp;gt;&lt;br /&gt;        &amp;lt;javac&lt;br /&gt;            classpathref="build.classpath"&lt;br /&gt;            srcdir="${basedir}/src"&lt;br /&gt;            destdir="${basedir}/src"&lt;br /&gt;            source="1.5"&lt;br /&gt;            target="1.5"/&amp;gt;&lt;br /&gt;        &amp;lt;jar&lt;br /&gt;            destfile="${basedir}/confluence-plugins-script.jar"&lt;br /&gt;            basedir="${basedir}/src"/&amp;gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;target name="clean"&amp;gt;&lt;br /&gt;        &amp;lt;delete&amp;gt;&lt;br /&gt;            &amp;lt;fileset dir="${basedir}" includes="**/*.class"/&amp;gt;&lt;br /&gt;            &amp;lt;fileset dir="${basedir}" includes="**/*.jar"/&amp;gt;&lt;br /&gt;        &amp;lt;/delete&amp;gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;Replace ${env.HOME}/src/confluence-2.10.4-std/confluence/WEB-INF/lib/ with the location of your Confluence jar files.&lt;br /&gt;&lt;br /&gt;For more information about building out your plugin do read the &lt;a href="http://docs.atlassian.com/atlassian-confluence/2.10/index.html"&gt;documentation&lt;/a&gt; and review the code for Atlassian's own &lt;a href="https://studio.plugins.atlassian.com/wiki/dashboard.action"&gt;plugins&lt;/a&gt;, for example &lt;a href="https://studio.plugins.atlassian.com/svn/BASICMACROS/"&gt;Confluence Basic Macros&lt;/a&gt;, &lt;a href="https://studio.plugins.atlassian.com/svn/ADVMACROS/"&gt;Confluence Advanced Macros&lt;/a&gt;,&amp;nbsp;&lt;a href="https://studio.plugins.atlassian.com/svn/INFOMACROS/"&gt;Confluence Information Macros&lt;/a&gt;&amp;nbsp;and &lt;a href="https://studio.plugins.atlassian.com/svn/CHRT/"&gt;Chart Macro&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Atlassian uses the &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt; toolkit in their development. Since Spring performs dependency-injection of objects matching the results of using Java reflection to find "bean" names, a lot of Atlassian's code looks like magic is happening. That is, there is no visible configuration or other assignment of object to values and yet the assignments have to made for the code to work. Spring is the magician.&lt;br /&gt;&lt;br /&gt;And that is it. The built jar file is a valid Confluence 2.10.4 plugin. Happy wiki scripting.&lt;br /&gt;&lt;br /&gt;&lt;a href="data:application/x-gtar;base64,H4sIAJjSNk4AA+1ZX3PiNhDPa/gUGk8fIBNkGzDMNJDppc2115kknbuHPgt7AeWM7JFl/kwm372yZBvbIQESyk2n3gdsS7ur1f5WWq2AFZmHPrTdgE38GJgL7dCPp5SZZ0cjy7IGjoPUs6+fVqennykh2+7bjtOze04fWXbf6llnyDmeCa9THAnCpSnkcfomn2SbTN7oT+eRP/8jBK/iP46p7+HV3P/wGNIf/V7vVfwl2nYFf8k2OEPWEea3k/7n+A9DHjyCKxAjcxgZbjDHhHkcllPqzwkXlOFNaGAdGhGOXE5DYSAPJiT2xcjwaCSM60YDSUpUhsDFGgFbUB6wOTDJIj8MZOY8RMwQ9UaGDjPXJ1GUtEklKKXhhPoQgUAe5SPjpyepAP/xcHf7bEbcNQsB28G2hXvtSHiFVvPv25v2l/vPpk/HZkGr0kyZ68cepJO+uDAv8CPhhlkY3ExHLzQl9oEPyXSQH7hE0IAlho1JBNLG50x+aCac2UxleE0h82/qp1zlI1kQt2Rb7gkOk5feKbFKN6SuySxIPFPm8UC6ZRdTFMTcldbZ2Cl3aNt1h1kym78YJfFXaZgXW0rU1nGjfF2ST2VeWJk7VBuy1aWuD4QVfepJjARUEK/EUg4ZSkMhSsNAubo414OkXwRR0ZbCLGSE6GV33fjB6//1/T9ZZMcZ45D873SdJP/3O06d/09Bb+NPRLIcKGFp4/uOA7vyvz3olfHvdBT+df7/92lYhbhxrrfVP2Vm+qa2a3RHXB6gv1S30Tj/DutDDwp51lfNbcomQWnD1mwynV5/QoWB52pgLZTspRu2jfACmBfwNBd8Uhah3zOTDBRzf2TMhAh/Ns3lcrnF5rk6lRT08SgZwcbW0Mw+srReNF+3KRMznyXZPJ1x41xlkgMdhTeT/4C7ccGOQ92MJc7EBSRPOkizIxEgWIEbC0BLKmaUqc5x4K1RMFHvSgHegtDQVF0q41UD7YenvprOdu3/MuyOcAbYP/93HUvl/0HPsuv8fwrajX9l23lHPByMf6fjDOr7n5PQ4fgXSuw9xzgc/97Artf/SehD+KfHjl1xcDj+/e6gU+N/CjoK/vrU92oYHFL/d7tdif+gP+jV+J+Cjol/tXhRdcjZzvq/0+3k9b8lf5HV7coAqOv/U1BI3O9kCuigAvOq0aDzMOACJQjjWFAf35HwKmtVyrJyD3NZoQMHjr+ql18DJmAldjEvOliXlTckAnUDsbeE4r5duaAq0T3EtGF3gQdXxYmtsnpaB/Utky7Yg+OOMOlR/ibjxrhGGI996up7f1RdQrLyFtK4COVeQE/65iHkdEFkSS7jUkjxLQagCXFFwNdohBgst3E0W1da2S8PC+CceqBVa4vGQZBcrSMafWG+FGq25NjZbQIHEXOGBI+lR5KG5z00zUh0E3jr9yvaAIWmIBJdm5ZtWlns+7u1fhOcsml2ydGUkYxCwsk8usy6ksuOS1SKX8SLXy0kZjxYRqgcewWLhATiqfSvQhEQBPoxykDDcn6662Z9T+bQLFzIGa2rkiIti8NYNA1tuHGZzqDC+TBW//XBgvhfIYp9IQdMpZO2ZjLPikjqAZ6z57JYBLqzWRFJna9FNl3P+ZtLhDtDzcpaQNCqeEj5VAVv2a1NaFXVPjckwqaJbu9/q++VaqqppppqqmkH/QNVSIqPACgAAA=="&gt;Download an archive of the development tree&lt;/a&gt; (Thanks to David Wilkinson for the &lt;a href="http://www.dopiaza.org/tools/datauri/"&gt;tool to create this data URI&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; I was asked why I created my own scripting plugin when two already exist in Atlassian's plugin repository. The initial reason was that our MySql 5.0 installation has too small a &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/packet-too-large.html"&gt;max_allowed_packet&lt;/a&gt; size and so Confluence was not able to install the existing script plugins into the database. The ultimate reason was that I knew what I wanted from the plugin and said to myself "how hard can it be?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1888070959046614214?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1888070959046614214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1888070959046614214'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/08/building-atlassians-confluence-plugin.html' title='Building an Atlassian Confluence plugin without Atlas, et al'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5565957063597514103</id><published>2011-07-09T11:40:00.002-04:00</published><updated>2011-10-17T22:12:21.089-04:00</updated><title type='text'>Facebook trapped in MySQL ‘fate worse than death’ — Cloud Computing News</title><content type='html'>&lt;a href="http://gigaom.com/cloud/facebook-trapped-in-mysql-fate-worse-than-death/?go_commented=1#comment-637949"&gt;Facebook trapped in MySQL ‘fate worse than death’ — Cloud Computing News&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mr Harris: When you attribute statements like&lt;br /&gt;&lt;blockquote&gt;"Stonebraker said the problem with MySQL and other SQL databases is that they consume too many resources for overhead tasks (e.g., maintaining ACID compliance and handling multithreading) and relatively few on actually finding and serving data."&lt;/blockquote&gt;include references to the hard proof. Pushing logic from the repository to the application does not make anything faster or slower. Cumulative work is just shuffled around. Moving logic from server to client can improve the perceived speed as you have effectively added massively to CPU and RAM capacity. So, if you have a relational data model then use SQL and a relational repository. If your data model is different then use a custom repository. The different NoSQL repositories fill this custom need. Just as, for example, &lt;a href="http://en.wikipedia.org/wiki/FOCUS"&gt;FOCUS&lt;/a&gt; fitted the custom need for hierarchical data in the 80s! As to web scale issues, the solutions are all the same no matter how your repository models data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5565957063597514103?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5565957063597514103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5565957063597514103'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/07/facebook-trapped-in-mysql-fate-worse.html' title='Facebook trapped in MySQL ‘fate worse than death’ — Cloud Computing News'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-6356567299057883205</id><published>2011-07-05T09:44:00.003-04:00</published><updated>2011-07-05T09:49:47.358-04:00</updated><title type='text'>I need to improve my writing</title><content type='html'>I need to improve my writing. I have much to say but find myself inarticulate at the keyboard or pad of paper. What I write unfolds from sentence to sentence. There is much backtracking to apply structure afterwards. Time to read some good, short journalism and advocacy pieces and digram them. I will start with Ellen Liberman's &lt;a href="http://www.rimonthly.com/Rhode-Island-Monthly/Department-Archive/index.php?tagID=266"&gt;The Reporter&lt;/a&gt; column.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-6356567299057883205?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6356567299057883205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6356567299057883205'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/07/i-need-to-improve-my-writing.html' title='I need to improve my writing'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-87320642758180516</id><published>2011-06-30T14:18:00.000-04:00</published><updated>2011-06-30T14:18:39.137-04:00</updated><title type='text'>How to Rethrow an Exception Without Wrapping them - Java Wiki</title><content type='html'>Nicely said at &lt;a href="http://robaustin.wikidot.com/rethrow-exceptions"&gt;How to Rethrow an Exception Without Wrapping them&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some do's and don't's with exceptions&lt;br /&gt;&lt;br /&gt;1. Unless you have a very good reason to catch an exception, don't catch it.&lt;br /&gt;&lt;br /&gt;2. If you can correct the problem implied by the exception. eat the exception, because you fixed it. However there are some exceptions that it is unwise to catch.&lt;br /&gt;&lt;br /&gt;3. If you can provide additional information about the exception. catch the exception, and re-throw it as an inner exception with more information. This is a very good reason to catch an exception, but note that we are still re-throwing it.&lt;br /&gt;&lt;br /&gt;4. Always try to catch specific exceptions. Avoid catching System.Exception whenever possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-87320642758180516?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://robaustin.wikidot.com/rethrow-exceptions' title='How to Rethrow an Exception Without Wrapping them - Java Wiki'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/87320642758180516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/87320642758180516'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/06/how-to-rethrow-exception-without.html' title='How to Rethrow an Exception Without Wrapping them - Java Wiki'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8081263804411818633</id><published>2011-06-23T09:19:00.005-04:00</published><updated>2011-08-01T11:00:29.152-04:00</updated><title type='text'>Comment regards to "An importance of wrapping variables"</title><content type='html'>The comment was made regards to the blog posting &lt;a href="http://java.dzone.com/articles/importance-wrapping-variables?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+javalobby/frontpage+(Javalobby+/+Java+Zone)&amp;amp;utm_content=Google+Reader"&gt;An importance of wrapping variables&lt;/a&gt;. A useful feature to add to any logging tool is to allow the formatting of the log message. For example,&lt;br /&gt;&lt;pre&gt;File file = ...&lt;br /&gt;...&lt;br /&gt;logger.info( &amp;quot;unable to open file: file-name={0}&amp;quot;, file );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Doing this has three key advantages. The first is that the ease of adding relevant data to the message is trivial. This then encourages messages that truly aid monitoring and debugging. The second is that there is a very low performance cost to logging in that if the message is never used (due to the log level) then the only cost to making the call is loading and unloading the stack.&lt;br /&gt;&lt;br /&gt;The second advantage becomes significant for debugging messages. For example, the debug logger call&lt;br /&gt;&lt;pre&gt;logger.debug(&amp;quot;{0} moving towards {1}&amp;quot;, a, b );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;is a far less costly to ignore than is&lt;br /&gt;&lt;pre&gt;logger.debug( a + &amp;quot; moving towards &amp;quot; + b );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And especially so in a tight loop. One can argue that you can always check the debug level before making a debug call. In practice, however, this tends to not to be done and instead the useful debug message is never written.&lt;br /&gt;&lt;br /&gt;The third advantage is that it is trivial in the logger implementation to both quote and escape the message's parameters. My implementation passes them through a JSON converter so that I can also see the internals of the parameter's values.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8081263804411818633?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8081263804411818633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8081263804411818633'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/06/comment-regards-to-importance-of.html' title='Comment regards to &quot;An importance of wrapping variables&quot;'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-6330762868471481800</id><published>2011-03-05T14:02:00.001-05:00</published><updated>2011-03-05T14:03:47.865-05:00</updated><title type='text'>SaaS + Java + Exchange ideas &amp; tools</title><content type='html'>I currently work for small shop where we run a number of middleware services for publishers. We build services in the traditional style of Java servlets, Spring dependency injection, Tomcat deployments, ActiveMQ message bus, MySql for transient data, and Oracle or permanent data. The engineering of this style is well known to the team. But the consequence are that: Our deployments are manual; Startup times too long; Spring has driven us to a monolithic implementation. We are servicing our customer's needs. But we need to do better. How do we get better?&lt;br /&gt;&lt;br /&gt;If you are a SaaS + Java shop in RI, MA, or eastern CT and would like to talk about tools and processes please contact me at &lt;a href="mailto:andrew@andrewgilmartin.com?subject=[SaaS]"&gt;andrew@andrewgilmartin.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-6330762868471481800?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6330762868471481800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6330762868471481800'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/03/saas-java-exchange-ideas-tools.html' title='SaaS + Java + Exchange ideas &amp; tools'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8339996310536162161</id><published>2011-03-02T08:47:00.005-05:00</published><updated>2011-06-24T10:06:35.067-04:00</updated><title type='text'>Co-working in South Kingstown, RI</title><content type='html'>The summer is approaching and the kids will be home. Yet I need to get work done and I suspect you do too. I would like to create a co-working space here in South Kingstown. A co-working space is a space to work from without the distractions that come with home, family, and coffee shops. It has desks, chairs, wireless, lockers, air conditioning and great lighting. And, with luck, a great location. I am looking to keep the membership costs at no more than $100/month.&lt;br /&gt;&lt;br /&gt;If you would like to discuss this further please contact me at &lt;a href="mailto:andrew@andrewgilmartin.com?subject=[co-working]"&gt;andrew@andrewgilmartin.com&lt;/a&gt; and we can organize a meeting where the first half is informational and the second is planning.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Everyone likes the idea but I was not able to get anyone to commit. When you work for "free" from home, at cafes and at libraries, paying a $100/month is lot less appetizing. It will happen one day. Just not for me this summer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8339996310536162161?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8339996310536162161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8339996310536162161'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/03/co-working-in-south-kingstown-ri.html' title='Co-working in South Kingstown, RI'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1528065073837043940</id><published>2011-01-03T14:39:00.002-05:00</published><updated>2011-01-03T14:43:09.163-05:00</updated><title type='text'>Apple's Java source and javadoc</title><content type='html'>Apple's Java installation does not include the source or javadoc api. Apple does have a developer download at X which does contain these files at &amp;lt;&lt;a href="http://developer.apple.com/java/download/"&gt;http://developer.apple.com/java/download/&lt;/a&gt;&amp;gt;. On my machine the package in "javadeveloper_10.6_10m3261.dmg" is installed at&lt;pre&gt;/Library/Java/JavaVirtualMachines/1.6.0_22-b04-307.jdk/Contents/Home/&lt;/pre&gt;If you are using NetBeans you will need to add this as a new "Java Platform". This posting assumes you called the platform "JDK_1.6". Once you have created the platform you will need to manually fix how javadoc is used. To do this, in the file&lt;pre &gt;~/.netbeans/6.9/config/Services/Platforms/org-netbeans-api-java-Platform/JDK_1.6.xml&lt;/pre&gt;edit the &lt;tt&gt;//javadoc/resource element&lt;/tt&gt; so that "!/docs/api/" is appended. For example,&lt;pre&gt;&amp;lt;javadoc&amp;gt;&lt;br /&gt;  &amp;lt;resource&amp;gt;jar:file:/Library/Java/JavaVirtualMachines/1.6.0_22-b04-307.jdk/Contents/Home/docs.jar!/docs/api/&amp;lt;/resource&amp;gt;&lt;br /&gt;&amp;lt;/javadoc&amp;gt;&lt;/pre&gt;For some reason, Netbeans emends the source resource with "!/src/" but not the javadoc resource.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1528065073837043940?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1528065073837043940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1528065073837043940'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2011/01/apples-java-source-and-javadoc.html' title='Apple&apos;s Java source and javadoc'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7499054890891172503</id><published>2010-12-28T11:15:00.003-05:00</published><updated>2010-12-28T11:16:49.415-05:00</updated><title type='text'>Commutative data types and their operations is a powerful idea.</title><content type='html'>Somewhere this fortnight I read that I should read &amp;quot;CRDTs: Consistency without concurrency control&amp;quot; &amp;lt;&lt;a href="http://hal.inria.fr/inria-00397981/en/"&gt;http://hal.inria.fr/inria-00397981/en/&lt;/a&gt;&amp;gt;. The basic idea is to have a data structure where for the same set of operations applied in any order will lead to the same state. If I have a number of replicants of this data structure then as long as all the operations are applied to each replicant -- in any order -- then the replicants will have the same end state. With concurrent replicants then all replicants will eventually have the same state. Commutative data types and their operations is a powerful idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7499054890891172503?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7499054890891172503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7499054890891172503'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/12/commutative-data-types-their-operations.html' title='Commutative data types and their operations is a powerful idea.'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-6622753127486529404</id><published>2010-12-08T10:13:00.004-05:00</published><updated>2010-12-08T11:21:36.089-05:00</updated><title type='text'>Downgrading my iPhone to iOS 3</title><content type='html'>I finally took the steps to downgrade my iPhone 3G from iOS 4 to iOS 3. The lose of responsiveness of basic features in iOS 4 is in no way made up by the new features, especially as few of them work with the 3G hardware. I followed the directions on the Lifehacker page at &lt;a href="http://lifehacker.com/5572003/how-to-downgrade-your-iphone-3g[s]-from-ios-4-to-ios-313"&gt;How to Downgrade Your iPhone 3G[S] from iOS 4 to iOS 3.1.3&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-6622753127486529404?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6622753127486529404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6622753127486529404'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/12/downgrading-my-iphone-to-ios-3.html' title='Downgrading my iPhone to iOS 3'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-762123903835260386</id><published>2010-12-07T08:39:00.003-05:00</published><updated>2010-12-07T08:44:38.151-05:00</updated><title type='text'>One-liner to find all occurrences of property names within a stream of text</title><content type='html'>One-liner to find all occurrences of property names within a stream of text:&lt;pre&gt;cat * | perl -ne 'while ( /\G.*?([-a-z\.]+\.enabled)/gi ) { print "$1=x\n"; }' | sort -u &gt; /tmp/enabled&lt;/pre&gt;This posting is mostly to remind me that 1) &lt;tt&gt;print "..." while /.../&lt;/tt&gt; does not work and 2) to use &lt;tt&gt;\G&lt;/tt&gt; to anchor the regular expression to the first and/or last match.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-762123903835260386?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/762123903835260386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/762123903835260386'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/12/one-liner-to-find-all-occurrences-of.html' title='One-liner to find all occurrences of property names within a stream of text'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4423751201493764404</id><published>2010-11-24T10:27:00.006-05:00</published><updated>2010-12-28T11:27:54.289-05:00</updated><title type='text'>Having a Java generic class return a type reference to its specialized class. Aka, using the self-type.</title><content type='html'>&lt;a href="http://passion.forco.de/content/emulating-self-types-using-java-generics-simplify-fluent-api-implementation"&gt;Emulating "self types" using Java Generics to simplify fluent API implementation&lt;/a&gt; is a very good example of how to more effectively use Java's generics and inheritance. The "self type" solution is something I would not have imagined. Further, it is motivating to see what other effects can be achieved through Java's generics. Read the article for a compete understanding of self types and a use of them. For those wishing to skip to the conclusion, if you need a generic class instance to return a typed reference to the specialized class then it is coded&lt;br /&gt;&lt;pre class="nowrap"&gt;public class GenericsTest {&lt;br /&gt;    // We have a generic type here that needs to return from its check method&lt;br /&gt;    // a reference to the specialized type (that is, the generic&amp;apos;s sub-class).&lt;br /&gt;    static class Common&amp;lt;SelfType extends Common&amp;lt;SelfType,ElementType&amp;gt;,ElementType&amp;gt; {&lt;br /&gt;&lt;br /&gt;        protected SelfType self() {&lt;br /&gt;            return (SelfType) this;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public SelfType check( ElementType e ) {&lt;br /&gt;             // do something here that is general to all sub-classes&lt;br /&gt;             return self();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // ...&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;    static class Foo extends Common&amp;lt;Foo,Integer&amp;gt; {&lt;br /&gt;&lt;br /&gt;        public Foo doFoo() {&lt;br /&gt;            // do something here is is specific to Foos&lt;br /&gt;            return this;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    static class Bar extends Common&amp;lt;Bar,String&amp;gt; {&lt;br /&gt;        public Bar doBar() {&lt;br /&gt;            // do something here is is specific to Bars&lt;br /&gt;            return this;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main( String[] args ) throws Exception {&lt;br /&gt;        Foo foo = new Foo();&lt;br /&gt;        Bar bar = new Bar();&lt;br /&gt;        foo.check(1).doFoo();&lt;br /&gt;        bar.check(&amp;quot;a&amp;quot;).doBar();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// END&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4423751201493764404?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4423751201493764404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4423751201493764404'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/having-java-generic-class-return-type.html' title='Having a Java generic class return a type reference to its specialized class. Aka, using the self-type.'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3755400635748831904</id><published>2010-11-22T09:39:00.002-05:00</published><updated>2010-11-22T09:58:40.320-05:00</updated><title type='text'>Tools needed to support a simple content organization and workflow</title><content type='html'>I like to use the file system. And I like to use the file system's default explorer: On the Mac this is the Finder, on Windows this is the Windows Explorer, and on Gnome it is/was Nautilus. I much prefer to have other tools integrate into the file system explorer than for the tool to have its own explorer. When this happens, it is then possible to create your own tools that support your workflows. (Note that in this posting I am concerned with explorer integration and not command line integration.)&lt;p&gt;Unfortunately, this has not been the norm and so we have iPhoto, iTunes, etc, having there own content organization that is independent of the file system. These content specific explorers are often created due to the weaknesses in extending the system's explorer but mostly it is because creating another explorer is just easier to both imagine and code. The up-shot is that we have organizational silos with little integration between them. And, worse, the inability to create your own specialized tools from the integrations.&lt;/p&gt;&lt;p&gt;This Sunday I spent far too much time tracking down tools that would allow me to use the file system to collect and organize content as follows:&lt;/p&gt;&lt;p&gt;1. Each content collection is a folder. I am comfortable with using the file system hierarchy for organizing and I am aware of the weaknesses of hierarchical organization. However, most collections can be organized into a primary hierarchy and augmented either by search or linking (aliases on the Mac and shortcuts on Windows).&lt;/p&gt;&lt;p&gt;2. Each folder will have, at least, one plain text file of dated notes. Each note is separated by a simple delimiter, for example, a row of dashes. My experience is that this one file of notes is much easier to review and keep updated than to place notes into individual files. With that said, a good tool that can hide the file-ness of the notes would be acceptable too. Until then, one file of notes and using Merlin Man's tip for adding content to it &amp;lt;&lt;a href="http://bit.ly/a1kfV6"&gt;http://bit.ly/a1kfV6&lt;/a&gt;&amp;gt; will do fine.&lt;/p&gt;&lt;p&gt;3. The primary hierarchy needs to be supplemented with full text search. Tagging is not enough and, moreover, tagging can be achieved via search by using specialized tokens: For example, in normal English typography a colon is always followed by a space and so the expression ":foo" distinguishes the tag "foo" from the rest of the text. Spotlight on the Mac is the system's full text searching facility. It is extendable so that other content types can be incorporated. The plugin I am looking for would index the dated notes in a file as collection of "records". (This Spotlight feature was introduced in OS X 10.6.)&lt;/p&gt;&lt;p&gt;The Spotlight plugin is the most specific tool that I need. While it is a Mac only indexing solution it is based on plain text content and so could be indexed easily under other operating systems. Unfortunately, as far as I can tell, and I spent a good amount of time looking, there is no plugin for indexing delimited content as records. There are plugins for content types that somewhat match, for example mailboxes, but there is no documentation on how to use them outside of their intended application. The up-shot that that for this very simple workflow I can not compose a supporting tool from existing parts. Looks like I am going to have to write my own Spotlight plugin: If anyone has skeleton code I can build upon please drop me a note.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3755400635748831904?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3755400635748831904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3755400635748831904'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/tools-needed-to-support-simple-content.html' title='Tools needed to support a simple content organization and workflow'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8971889244514698670</id><published>2010-11-19T09:25:00.002-05:00</published><updated>2010-11-19T09:28:22.570-05:00</updated><title type='text'>Changing Education Paradigms by Sir Ken Robinson</title><content type='html'>&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zDZFcDGpL4U?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zDZFcDGpL4U?fs=1&amp;amp;hl=en_US&amp;amp;rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&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/6192914801419860742-8971889244514698670?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8971889244514698670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8971889244514698670'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/changing-education-paradigms-by-sir-ken.html' title='Changing Education Paradigms by Sir Ken Robinson'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2450423036826831727</id><published>2010-11-19T09:20:00.000-05:00</published><updated>2010-11-19T09:21:41.671-05:00</updated><title type='text'>Denis Dutton: A Darwinian theory of beauty</title><content type='html'>&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PktUzdnBqWI?fs=1&amp;amp;hl=en_US&amp;amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PktUzdnBqWI?fs=1&amp;amp;hl=en_US&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&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/6192914801419860742-2450423036826831727?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2450423036826831727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2450423036826831727'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/denis-dutton-darwinian-theory-of-beauty.html' title='Denis Dutton: A Darwinian theory of beauty'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3197177846885771644</id><published>2010-11-08T16:09:00.003-05:00</published><updated>2010-11-08T16:19:31.997-05:00</updated><title type='text'>Cat &amp; tail</title><content type='html'>I needed to count the open and close events in an active log file. Since I needed to start the count at zero I needed to start counting at the first line of the log and continue as the log grew. I needed both &lt;i&gt;cat&lt;/i&gt; and &lt;i&gt;tail -f&lt;/i&gt;. Turns out that &lt;i&gt;tail&lt;/i&gt; can do both using &lt;tt&gt;tail -c +0 -f events.log&lt;/tt&gt;. And so all I needed to do was to pipe the output to the counting script. The script took several minutes to catch up from processing previous events to current events but the counts it displays are accurate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3197177846885771644?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3197177846885771644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3197177846885771644'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/cat-tail.html' title='Cat &amp; tail'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2264206136050712419</id><published>2010-11-06T19:35:00.009-04:00</published><updated>2011-12-01T15:43:28.183-05:00</updated><title type='text'>Using gnuplot to plot a time-series in text</title><content type='html'>I needed to review a sizable time-series on a remote host. Since I work at the command-line here having the plot displayed in text would be very helpful. To do this I used &lt;i&gt;gnuplot&lt;/i&gt;. The data has the form&lt;pre&gt;2010-11-06T00:00:01  35&lt;br /&gt;2010-11-06T00:05:01  38&lt;br /&gt;2010-11-06T00:10:02  45&lt;br /&gt;2010-11-06T00:15:01  38&lt;br /&gt;2010-11-06T00:20:02  38&lt;br /&gt;2010-11-06T00:25:01  38&lt;br /&gt;...&lt;/pre&gt;Note the two spaces between the data columns. The command line &amp; script to plot this data is&lt;pre&gt;gnuplot &amp;lt;&amp;lt;EOH&lt;br /&gt;set terminal dumb&lt;br /&gt;set autoscale&lt;br /&gt;set xdata time&lt;br /&gt;set timefmt "%Y-%m-%dT%H:%M:%S"&lt;br /&gt;set xlabel "Date &amp; Time"&lt;br /&gt;set ylabel "Count"&lt;br /&gt;set title "Requests waiting on connection"&lt;br /&gt;plot "data" using 1:2 with lines&lt;br /&gt;EOH&lt;/pre&gt; which outputs&lt;pre style="white-space: pre; overflow-x: auto;"&gt;&lt;br /&gt;                          Requests waiting on connection&lt;br /&gt;Count&lt;br /&gt;  160 ++--+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+-++&lt;br /&gt;      +      +      +      +      +      +      +   "data" using 1:2 ****** +&lt;br /&gt;      |                         *****                                       |&lt;br /&gt;  140 ++                  ******    *                                      ++&lt;br /&gt;      |                  **         *                                       |&lt;br /&gt;  120 ++                 **         *                                      ++&lt;br /&gt;      |                 *           *                                       |&lt;br /&gt;      |               * *           *                                       |&lt;br /&gt;  100 ++              * *           *                                      ++&lt;br /&gt;      |               ***           *                                       |&lt;br /&gt;   80 ++              ***           *                                      ++&lt;br /&gt;      |            *  **            *                                       |&lt;br /&gt;      |            * **             *                                       |&lt;br /&gt;   60 ++           ****             *                                      ++&lt;br /&gt;      | *        ******             *                                       |&lt;br /&gt;   40 +***************              *      ***************************     ++&lt;br /&gt;      ***                           ********                                |&lt;br /&gt;      +      +      +      +      +      +      +      +      +      +      +&lt;br /&gt;   20 ++--+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+-++&lt;br /&gt;    00:00  02:00  04:00  06:00  08:00  10:00  12:00  14:00  16:00  18:00  20:00&lt;br /&gt;                                    Date &amp; Time&lt;/pre&gt;Must easier to see the trend in the data.&lt;br /&gt;&lt;br /&gt;I found the following helpful in figuring this out &lt;a href="http://linuxgazette.net/126/peterson.html"&gt;http://linuxgazette.net/126/peterson.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Use the &lt;i&gt;watch&lt;/i&gt; command to turn the graph generation into a dynamic visualization. For example &lt;tt&gt;watch -n 60 bash plotting_script&lt;/tt&gt; will run the &lt;i&gt;plotting_script&lt;/i&gt; every minute and update the terminal.&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; See the bash script &lt;a href="http://www.pastie.org/2951426"&gt;timeplot&lt;/a&gt; for a useful expression of this posting.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2264206136050712419?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2264206136050712419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2264206136050712419'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/using-gnuplot-to-plot-time-series-in.html' title='Using gnuplot to plot a time-series in text'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-801428019091080676</id><published>2010-11-06T19:25:00.007-04:00</published><updated>2010-11-06T19:34:52.008-04:00</updated><title type='text'>Vi and a little macro to step through a file of data</title><content type='html'>I needed to review a large number of data in a file each of which had a variable number of lines. Luckily, each datum started with the pattern &lt;tt&gt;^"http-&lt;/tt&gt; and so using &lt;i&gt;vi&lt;/i&gt; I was able to quickly review the data by&lt;br /&gt;&lt;br /&gt;1) creating a macro to find the next datum and move it's line to the top of the screen &lt;pre&gt;qn&lt;br /&gt;/^"http-&lt;br /&gt;zt&lt;br /&gt;q&lt;/pre&gt;2) use the macro to move from datum to datum &lt;pre&gt;@n&lt;/pre&gt;I found the following helpful in figuring this out &lt;a href="http://www.pixelbeat.org/vim.tips.html"&gt;http://www.pixelbeat.org/vim.tips.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-801428019091080676?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/801428019091080676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/801428019091080676'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/11/vi-and-little-macro-to-step-through.html' title='Vi and a little macro to step through a file of data'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-6763013702643872280</id><published>2010-10-31T07:49:00.001-04:00</published><updated>2010-10-31T07:49:40.447-04:00</updated><title type='text'>If you want to change the schools RUN FOR SCHOOL COMMITTEE</title><content type='html'>Do the candidates for South Kingstown Town Council understand that the TC and the School Committee are separate municipal bodies? The TC can only make SC budget recommendations. Legally it must transfer the money requested by the SC. Re-read those letters to the editor and the full page advertisements and note how many start with school issues and not town issues. If you want to change the schools RUN FOR SCHOOL COMMITTEE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-6763013702643872280?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6763013702643872280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6763013702643872280'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/if-you-want-to-change-schools-run-for.html' title='If you want to change the schools RUN FOR SCHOOL COMMITTEE'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-6732640393419797101</id><published>2010-10-26T22:20:00.001-04:00</published><updated>2010-10-26T22:20:49.806-04:00</updated><title type='text'>Windows Phone 7 is worthy addition to smartphone market</title><content type='html'>A useful review of Microsoft&amp;#39;s new Windows Phone 7 user interface. Glade to see some good news about an MS product. Generalizing on two data points -- Office&amp;#39;s &amp;quot;ribbon&amp;quot; and now Windows Phone 7 -- it seems MS is making good usability observations and providing good solutions to, as said below, the 10- to 30-second needs.&lt;p&gt;&amp;quot;Nobody seems to be committing themselves to optimizing those 10- to 30-second phone experiences. Everyone is focused on building phones that you can stare at for thirty minutes. If this is truly the path Microsoft has followed, then they&amp;#39;ve made strong and brave choices.&amp;quot;&lt;p&gt;&lt;a href="http://www.suntimes.com/technology/ihnatko/2829294,ihnatko-windows-iphone-android-phone-102310.article"&gt;http://www.suntimes.com/technology/ihnatko/2829294,ihnatko-windows-iphone-android-phone-102310.article&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-6732640393419797101?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6732640393419797101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/6732640393419797101'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/windows-phone-7-is-worthy-addition-to.html' title='Windows Phone 7 is worthy addition to smartphone market'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1317506922931008498</id><published>2010-10-25T15:29:00.002-04:00</published><updated>2010-10-25T15:31:42.815-04:00</updated><title type='text'>Welcome to Code City!</title><content type='html'>Why are city and municipal codes not public domain? Why, in fact, are copyrighted by private companies? It is a $10B industry.&lt;div&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fht7mujzeC8?fs=1&amp;amp;hl=en_US&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/fht7mujzeC8?fs=1&amp;amp;hl=en_US&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Also see &lt;a href="http://www.boingboing.net/2010/10/24/why-building-codes-s.html"&gt;http://www.boingboing.net/2010/10/24/why-building-codes-s.html&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/6192914801419860742-1317506922931008498?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1317506922931008498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1317506922931008498'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/welcome-to-code-city.html' title='Welcome to Code City!'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4610045842953118695</id><published>2010-10-22T09:03:00.002-04:00</published><updated>2010-10-22T09:22:11.690-04:00</updated><title type='text'>Prototype of an Open Web App Ecosystem</title><content type='html'>Mozilla is prototyping an "open" application ecosystem. App store + installation + upgrades + payments. Nothing really new here except the "open" part. What really bothers me is that this really isn't going to help most people any time soon and, worse, when it is done it will be outdated. &lt;p&gt;&lt;a href="http://blog.mozilla.com/blog/2010/10/19/prototype-of-an-open-web-app-ecosystem/"&gt;http://blog.mozilla.com/blog/2010/10/19/prototype-of-an-open-web-app-ecosystem/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The premise of Open Web App that I WANT to install and application in my browser. I don't want to do this because this ties me and the application to the browser I am CURRENTLY using. I don't use one browser. I don't use one machine. Today I regularly use three machines -- one MacBook, one iPhone, and one Windows laptop -- and four browser instances -- two of FireFox, one of Safari, and one of Internet Explorer. Tomorrow I expect to be using even more machines -- iPads, Android pads, setup boxes, Wii, etc.  I don't want to be tied to one machine and one browser -- even if I can choose which ones. I want to be free to sit at any browser on any machine and just use an application and my data.&lt;/p&gt;&lt;p&gt;What I really want is for applications and data to be separated so that I can pick which application I want to use today to surface (visualize) a data repository. More on that another day.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4610045842953118695?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4610045842953118695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4610045842953118695'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/prototype-of-open-web-app-ecosystem.html' title='Prototype of an Open Web App Ecosystem'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7841116374793216842</id><published>2010-10-21T07:13:00.000-04:00</published><updated>2010-10-21T07:14:01.187-04:00</updated><title type='text'>Jim O'Neill must not be reelected to the South Kingstown Town Council</title><content type='html'>Jim O'Neill must not be reelected to the South Kingstown Town Council. His campaign placards speak to his "Thinking Ahead", [speaking] "Truth to Power", etc. But O'Neill lacks the basic skills needed to bring synergy with others' ideas and to build coalitions that move their ideas into actions. Spend a few evenings at Council meetings and especially at joint workshops with the School Committee and you will hear the authentic O'Neill. He is belligerent. He is divisive. He is dismissive. In, short, he is a bully. O'Neill has had many terms in office to bring action on the issues he raises and yet he has not succeeded. Nor has he learned from these failures. &lt;br /&gt; &lt;br /&gt;A new independence is needed at Town Hall. One that will work with other councilors and interested parties in moving ideas to action. Do not vote for O'Neill this November.&lt;br /&gt; &lt;br /&gt;Please share this note with others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7841116374793216842?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7841116374793216842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7841116374793216842'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/jim-oneill-must-not-be-reelected-to.html' title='Jim O&apos;Neill must not be reelected to the South Kingstown Town Council'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7566309756404755762</id><published>2010-10-08T20:05:00.003-04:00</published><updated>2010-10-08T20:08:32.722-04:00</updated><title type='text'>New Commons office space</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Pv06kDVcWvY/TK-yaP8svvI/AAAAAAAAAXQ/hZ6t1Nu0UR4/s1600/New+Commons+Work+Space.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 97px;" src="http://2.bp.blogspot.com/_Pv06kDVcWvY/TK-yaP8svvI/AAAAAAAAAXQ/hZ6t1Nu0UR4/s320/New+Commons+Work+Space.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5525831431834353394" /&gt;&lt;/a&gt;Digging through some old folders I found the following sketch of the New Commons office space in Providence. I really liked the ideas in this space. The hallway that connects the open offices. The french doors into the meeting space. Etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7566309756404755762?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7566309756404755762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7566309756404755762'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/new-commons-office-space.html' title='New Commons office space'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pv06kDVcWvY/TK-yaP8svvI/AAAAAAAAAXQ/hZ6t1Nu0UR4/s72-c/New+Commons+Work+Space.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2333811545504096962</id><published>2010-10-08T11:13:00.001-04:00</published><updated>2010-10-08T11:13:30.064-04:00</updated><title type='text'>Safari and accessing an HTTPS site behind a web proxy</title><content type='html'>Safari, unlike FireFox and Chrome, will not let you access a web site behind a proxy server if that site has an untrusted SSL certificate. Safari will ask you to login into the proxy server and then, after some time, tell you it can&amp;#39;t access the site. The way I found around this to to import the untrusted certificate directly into the OS X&amp;#39;s keychain using Keychain Access. The steps I used are&lt;p&gt;1. Use FireFox to initially access the site and to accept the untrusted certificate.&lt;p&gt;2. Use FireFox&amp;#39;s certificate manager at ForeFox / Preferences... / Advanced / Encryption / View Certificates to export the certificate. Use the PEM encoding and make sure to name the file with a &amp;quot;.pem&amp;quot; extension.&lt;p&gt;3. Use Keychain Access to import the certificate&lt;p&gt;You should now be able to access the web site from within Safari.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2333811545504096962?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2333811545504096962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2333811545504096962'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/safari-and-accessing-https-site-behind.html' title='Safari and accessing an HTTPS site behind a web proxy'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1589263297606379845</id><published>2010-10-01T15:35:00.000-04:00</published><updated>2010-10-02T06:48:27.543-04:00</updated><title type='text'>A Gentle Introduction to CouchDB for Relational Practitioners</title><content type='html'>"CouchDB is a document-oriented database written in Erlang that addresses a particular "sweet spot" in data storage and retrieval needs. This blog post is an introduction to CouchDB for those of us who have a relational database background."&lt;br&gt;&lt;br&gt;The short introduction to CouchDB at&amp;nbsp;&lt;br&gt;&lt;br&gt;http://blog.couchone.com/post/1167966323/a-gentle-introduction-to-couchdb-for-relational&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;is a fantastic writing example. Within a few paragraphs the author has conveyed the essence of the tool and for an experience tools user/evaluator the set of next questions that must be answered before it can be put to use -- security, contention, document size boundaries, etc -- can now all be asked discerningly.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1589263297606379845?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1589263297606379845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1589263297606379845'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/10/gentle-introduction-to-couchdb-for.html' title='A Gentle Introduction to CouchDB for Relational Practitioners'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-792530184926729904</id><published>2010-09-30T09:20:00.001-04:00</published><updated>2010-09-30T09:20:27.871-04:00</updated><title type='text'>How to add commands to the OS X "right-click" menu – Simple Help</title><content type='html'>&amp;quot;This tutorial will show you how to use OnMyCommand to create customized &amp;quot;right-click&amp;quot; (contextual) menus in OS X. If you&amp;#39;re a recent Windows &amp;#39;switcher&amp;#39;, you might have noticed that the right-click options lack some of the commonly used tasks (move-to, copy-to etc). OnMyCommand allows you to add these, and hundreds of other commands, back to your contextual menu.&amp;quot;&lt;p&gt;&lt;a href="http://www.simplehelp.net/2007/06/12/how-to-add-commands-to-the-os-x-right-click-menu/"&gt;http://www.simplehelp.net/2007/06/12/how-to-add-commands-to-the-os-x-right-click-menu/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-792530184926729904?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/792530184926729904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/792530184926729904'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/09/how-to-add-commands-to-os-x-right-click.html' title='How to add commands to the OS X &quot;right-click&quot; menu – Simple Help'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8152632830835426125</id><published>2010-09-29T13:24:00.001-04:00</published><updated>2010-09-29T13:24:58.384-04:00</updated><title type='text'>MongoDB is Web Scale</title><content type='html'>&lt;base href="data:"&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;A very funny rant on no-sql repository advocates&lt;/div&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;a href="http://nosql.mypopescu.com/post/1016320617/mongodb-is-web-scale"&gt;http://nosql.mypopescu.com/post/1016320617/mongodb-is-web-scale&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt; I too have also been in favor or using /dev/null for document storage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8152632830835426125?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8152632830835426125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8152632830835426125'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/09/mongodb-is-web-scale.html' title='MongoDB is Web Scale'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3768215854584600728</id><published>2010-09-28T19:39:00.000-04:00</published><updated>2010-09-28T19:40:12.448-04:00</updated><title type='text'>Promote JS! Better Docs For Us, By Us!</title><content type='html'>&lt;div&gt;&lt;a href="'https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function'" title="'JavaScript"&gt;&lt;img src="'http://static.jsconf.us/promotejshs.png'" height="'150'" width="'180'" alt="'JavaScript" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3768215854584600728?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3768215854584600728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3768215854584600728'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/09/promote-js-better-docs-for-us-by-us.html' title='Promote JS! Better Docs For Us, By Us!'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2949026167333068355</id><published>2010-09-14T12:47:00.004-04:00</published><updated>2010-09-14T12:54:46.580-04:00</updated><title type='text'>What is your toolset?</title><content type='html'>After quitting all the non-development tools running on my MacBook I realized this is another kind of &lt;a href="http://minimalmac.com/"&gt;Minimal Mac&lt;/a&gt;. &lt;a href="http://1.bp.blogspot.com/_Pv06kDVcWvY/TI-nqC8_9gI/AAAAAAAAAXI/19PAP4Z2wh0/s1600/Minimal+Mac.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_Pv06kDVcWvY/TI-nqC8_9gI/AAAAAAAAAXI/19PAP4Z2wh0/s200/Minimal+Mac.jpg" valign="center" alt="" id="BLOGGER_PHOTO_ID_5516812409341212162" align="left" border="0" /&gt;&lt;/a&gt;This minimalism has little to do with a tidy surface but instead a tidy toolset. Apart from the Drag application used to take the screen shot these applications -- iTunes, NetBeans, Screen Sharing, FireFox, Skype, and Terminal -- are my toolset. What is your toolset?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2949026167333068355?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2949026167333068355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2949026167333068355'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/09/what-is-your-toolset.html' title='What is your toolset?'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pv06kDVcWvY/TI-nqC8_9gI/AAAAAAAAAXI/19PAP4Z2wh0/s72-c/Minimal+Mac.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5809947689116877544</id><published>2010-08-25T11:43:00.001-04:00</published><updated>2010-08-25T11:43:09.537-04:00</updated><title type='text'>Halo around the foremost window</title><content type='html'>I want to stop closing the wrong window in Mac OS X. This error is caused, in part, by OS X&amp;#39;s poor contract between active and inactive window framing. So, when I bring an application to the front I want the front-most window to be quickly haloed and then not. This would greatly help the user to know which of the several application&amp;#39;s windows is actually the foremost.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5809947689116877544?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5809947689116877544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5809947689116877544'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/08/halo-around-foremost-window.html' title='Halo around the foremost window'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2839597297669830618</id><published>2010-08-09T11:10:00.001-04:00</published><updated>2010-08-09T11:10:28.146-04:00</updated><title type='text'>16 months is too short a time to adopt Wave</title><content type='html'>Google recently announced that it discontinuing its Wave communications tool [1,2]. Wave was announced in May 2009 and discontinued in Aug 2010. Wave existed for 16 months. Google states &amp;quot;Wave has not seen the user adoption we would have liked.&amp;quot; The rate of user adoption for such a radical change in communication is not going to happen in 16 months. Facebook took many years and its services are based on existing means of communication. Skype and Twitter also took years and they too offer services based on existing means of communication. Wave has little precedent in the wild (although many academic ancestors). Only now is the company I am working for considering moving to Google Apps and that has been out for years. Change happens slowly. The time of rapid internet tools adoption is over. We are returning to a new normal.&lt;p&gt;Every group establishes the tools and protocols of communication very early in its formation. Only new groups -- and perhaps only new groups in new situations -- have the chance to immediately adopt new forms of communication. For every other group, the group needs a lot of time to 1) recognize what is being lost in the current means of communication, 2) understand the loss&amp;#39;s cost to the group, 3) set out to discovered tools and/or protocols that enables both to continue the successful communication and to reduce/eliminate the recognized lose, and, finally, 4) adopt the change with planning for the concomitant communications turbulence. 16 months is far too short a time to adopt Wave. For those that have adopted Wave within those 16, the time since adoption has been far too short to understood Wave effectiveness.&lt;p&gt;Google pulled the plug on Wave too soon.&lt;p&gt;[1] &lt;a href="http://googleblog.blogspot.com/2010/08/update-on-google-wave.html"&gt;http://googleblog.blogspot.com/2010/08/update-on-google-wave.html&lt;/a&gt;&lt;br&gt;[2] &lt;a href="http://wave.google.com/about.html"&gt;http://wave.google.com/about.html&lt;/a&gt;&lt;br&gt;[3] &lt;a href="http://googleblog.blogspot.com/2009/05/went-walkabout-brought-back-google-wave.html"&gt;http://googleblog.blogspot.com/2009/05/went-walkabout-brought-back-google-wave.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2839597297669830618?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2839597297669830618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2839597297669830618'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/08/16-months-is-too-short-time-to-adopt.html' title='16 months is too short a time to adopt Wave'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4564204852484268754</id><published>2010-08-09T10:42:00.000-04:00</published><updated>2010-08-09T10:43:01.813-04:00</updated><title type='text'>Corporate Blogs: Front Page Structure (Jakob Nielsen's Alertbox)</title><content type='html'>Jakob Nielsen has a useful posting today about how to organize a corporate blog&amp;#39;s front page: &amp;quot;Showing summaries of many articles is more likely to draw in users than providing full articles, which can quickly exhaust reader interest.&amp;quot; I agree. See the fully posting at&lt;p&gt;Corporate Blogs: Front Page Structure &lt;br&gt;&lt;a href="http://www.useit.com/alertbox/blog-front-pages.html"&gt;http://www.useit.com/alertbox/blog-front-pages.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4564204852484268754?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4564204852484268754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4564204852484268754'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/08/corporate-blogs-front-page-structure.html' title='Corporate Blogs: Front Page Structure (Jakob Nielsen&apos;s Alertbox)'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3956167656432263031</id><published>2010-07-29T11:33:00.001-04:00</published><updated>2010-07-29T11:33:15.070-04:00</updated><title type='text'>Sounds in presentations</title><content type='html'>I am sitting at my studio desk now wondering where the wireless phone is. I can hear its ring and it sounds like it is coming from the house. Did Chris take the studio phone into the house? She says no. Then what the hell is happening? I have never been able to hear the neighbors&amp;#39; phones. It turns out that the sound is background noise in a video interview I am listening to! I have had the same experience when listening to pod-casts: I hear an email arrive and so I check my mail; I hear a text message arrive and I check my phone; while driving I hear an ambulance and I pull over. Perhaps these are just signs of my declining mental health or perhaps there is just too much directionless noise in our lives. Our physicality did not evolve for this.&lt;p&gt;My very first posting to this blog was about sound &amp;lt;&lt;a href="http://calliopesounds.blogspot.com/2007/07/i-had-weird-moment-today.html"&gt;http://calliopesounds.blogspot.com/2007/07/i-had-weird-moment-today.html&lt;/a&gt;&amp;gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3956167656432263031?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3956167656432263031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3956167656432263031'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/sounds-in-presentations.html' title='Sounds in presentations'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7974871674887696874</id><published>2010-07-29T09:53:00.002-04:00</published><updated>2010-07-29T10:01:53.659-04:00</updated><title type='text'>Gobby and reviewing some source code</title><content type='html'>Evans Lin and I used Gobby &amp;lt;&lt;a href="http://gobby.0x539.de/trac/"&gt;http://gobby.0x539.de/trac/&lt;/a&gt;&amp;gt; last night to review a sub-system that he is implementing. It worked but was less useful than anticipated.&lt;p&gt;1. Gobby is a peer-to-peer networked application and so your application is both a server and a client. This kind of networking does not play well between corporate and ISP firewalls. The only way we were able to communicate was to have three instances of Gobby running: One for me, One for Evans, and one running on my home Linux box acting as a server. And even then, Evans needed to ssh tunnel to the Linux box. To effectively use Gobby in a WAN much consideration needs to be given to network connectivity.&lt;p&gt;2. As anticipated, Gobby&amp;#39;s document management is very weak. The documents are listed alphabetically with no meta-data about ownership, modification time, directory path, revision number, etc. I also found the floating document list to get in the way more time than not.&lt;p&gt;3. When Evans and I were discussing our first document Evans asked if I was seeing his highlighting. I was not. We both assumed that not only would you see other&amp;#39;s changes but you would also see other&amp;#39;s highlighting. This is a good example of not knowing what you want until to actually trial your tools.&lt;p&gt;4. Gobby knows almost nothing about the documents it is presenting and editing. It does highlight the syntax of the document based to the document&amp;#39;s file name extension. However, our experience with IDEs is that we want really good navigation between source code elements. For example, with Java source code we want, at a minimum, 1) class name to definition source file, 2) method name use to definition location in source file, and 3) method name definition to locations of use.&lt;p&gt;5. Gooby has a instant-messaging feature but we used Skype&amp;#39;s voice chat. Gobby as an extension to Skype would be more useful.&lt;p&gt;Overall, Gobby has too many network connectivity issues and not enough document navigation features. If Gobby were to be implemented today then it should be a web application built using the Etherpad &amp;lt;&lt;a href="http://etherpad.com/"&gt;http://etherpad.com/&lt;/a&gt;&amp;gt; and Bespin &amp;lt;&lt;a href="https://bespin.mozillalabs.com/"&gt;https://bespin.mozillalabs.com/&lt;/a&gt;&amp;gt; toolkits with a little of the Nautilus file manager &amp;lt;&lt;a href="http://live.gnome.org/Nautilus"&gt;http://live.gnome.org/Nautilus&lt;/a&gt;&amp;gt;. &lt;p&gt;A tool for informal review of a tree of documents is needed. (As opposed to a set of patches for which there are great tools. For example, Rietveld &amp;lt;&lt;a href="http://codereview.appspot.com/"&gt;http://codereview.appspot.com/&lt;/a&gt;&amp;gt;.) So, I will keep looking. Tell me if you find something good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7974871674887696874?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7974871674887696874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7974871674887696874'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/gobby-and-reviewing-some-source-code.html' title='Gobby and reviewing some source code'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8270278552084420773</id><published>2010-07-16T10:57:00.002-04:00</published><updated>2010-07-16T12:23:00.252-04:00</updated><title type='text'>Streaming content for non-media applications</title><content type='html'>The vast majority of web app and mobile app use JSON or XML on the wire to transfer data. It is relatively easy to design a utility schema and textual data on the wire is easier to debug. The schema designs, however, tend to emphasize an analytical perspective rather than a performance one. For example, the schema for hierarchal data will typically look like this&lt;br /&gt;&lt;br /&gt;node      := data children&lt;br /&gt;children := node*&lt;br /&gt;data       := field+&lt;br /&gt;field       := name value&lt;br /&gt;name     := string&lt;br /&gt;value     := string&lt;br /&gt;&lt;br /&gt;The problem with this design is that it you can only know about the structure of the data only after reading the whole document. You can not do anything for the user between making the request for data and getting the last byte of the response.&lt;br /&gt;&lt;br /&gt;I don't know about you, but I hate waiting for all the data when I don't want it. When I am in browsing mode or manual indexing mode [1] I only want to get the gist and move along quickly. For example, if I am flipping through a list of the movies playing at the local cinema I don't need an image of the movie's poster. What I do need is to know that there are 6 movies, the 6 titles, and the next two showings of each movie. When I settle on a movie then I might be interested in seeing the promotional poster, trailer, and reviews and so am willing to wait for this data to fill-into the UI. (Don't have me press a "more details" button, please!)&lt;br /&gt;&lt;br /&gt;Most schema designers will create something like this&lt;br /&gt;&lt;br /&gt;movies   := (movie)*&lt;br /&gt;movie     := title rating director casting poster-url trailer-url movie-reviews showtimes&lt;br /&gt;movie-reviews := star-rating reviews&lt;br /&gt;director := person&lt;br /&gt;casting    := person part&lt;br /&gt;person    := string&lt;br /&gt;part        := string&lt;br /&gt;showtimes := showtime+&lt;br /&gt;showtime   := start-time end-time&lt;br /&gt;start-time  := number ':' number&lt;br /&gt;reviews       := review*&lt;br /&gt;review        := person star-rating comment-string&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;You get the idea: A straight forward and clear hierarchical organization of the data. The problem with this design is that for web apps or mobile apps the app needs to read far more bytes than it needs to enable browsing and manual indexing. It needs to read all the bytes up to the last movie's node first byte just to know that there are 6 movies. That could be several thousand bytes of data just to know the number 6.&lt;br /&gt;&lt;br /&gt;Network performance is not instantaneous. Cell network performance is worse than network performance. Schema designers need to stop designing data structures as though the data will be instantaneously transferred from the host to the client. We don't do this for audio or video and we should not do it with other data either. Data on the wire should be designed more as packets to be explicitly organized. And it should be ordered so as to ensure the application's usability remains high even under poor network throughput conditions. &lt;br /&gt;&lt;br /&gt;In the case of the movie listings, the following is a better data structure&lt;br /&gt;&lt;br /&gt;movies := count id* ( title | showtime | poster-url | trailer-url | .. )*&lt;br /&gt;title := id 'title' string&lt;br /&gt;showtime := id 'showtime' number number number number&lt;br /&gt;poster-url := id 'poster-url' url&lt;br /&gt;trailer-url := id 'trailer-url' url&lt;br /&gt;review := ...&lt;br /&gt;&lt;br /&gt;You get the idea: Link the related data explicitly with ids, tags, and data rather than implicitly by position in the hierarchy. Next, order the transfer of data to the client such that the client can use &lt;a hef="http://en.wikipedia.org/wiki/Progressive_disclosure"&gt;progressive disclosure&lt;/a&gt;. The user will now be able to see some structure and and some content and perform some interaction with the application before the whole structure and all the content is delivered. &lt;br /&gt;&lt;br /&gt;In the case of the movie listings it might look like&lt;br /&gt;&lt;br /&gt;6 m1 m2 m3 m4 m5 m6 ;&lt;br /&gt;# now get the titles and next showtimes for the movies&lt;br /&gt;m1 title Inception ;&lt;br /&gt;m1 showtime 6:30 ; &lt;br /&gt;m1 showtime 3:10 ; &lt;br /&gt;m2 title The Sorcerer's Apprentice ;&lt;br /&gt;m2 showtime  4:50 PM ;&lt;br /&gt;m2 showtime  7:20 PM ;&lt;br /&gt;m3 title Despicable Me ;&lt;br /&gt;m3 showtime ... &lt;br /&gt;m3 showtime ...&lt;br /&gt;m4 title ... ;&lt;br /&gt;m3 showtime ... &lt;br /&gt;m3 showtime ...&lt;br /&gt;m5 title ... ;&lt;br /&gt;m3 showtime ... &lt;br /&gt;m3 showtime ...&lt;br /&gt;m6 title The Last Airbender  ;&lt;br /&gt;m3 showtime ... &lt;br /&gt;m3 showtime ...&lt;br /&gt;# now get the remaining showtimes&lt;br /&gt;m1 showtime 12:00 ; &lt;br /&gt;m1 showtime 9:40 ;&lt;br /&gt;m2 showtime 11:45 AM ;&lt;br /&gt;m2 showtime 2:15 PM ;&lt;br /&gt;m2 showtime 10:00 PM ;&lt;br /&gt;...&lt;br /&gt;# now get the star-ratings for the movies&lt;br /&gt;...&lt;br /&gt;# etc&lt;br /&gt;&lt;br /&gt;I am just using semi-colon delimited encoding simplify the example. There is no reason to abandon using JSON or XML as the encoding. You must, however, use a streaming JSON or XML parser so that the application client is able to get at the data as soon as it arrives.&lt;br /&gt;&lt;br /&gt;This lesson was taught to me by David Durand when we were working on &lt;a href="http://www.kahnplus.com/download/pdf/mapaht98.pdf"&gt;MAPA&lt;/a&gt; at Dynamic Diagrams. Part of MAPA was a Java applet that displayed a map of a location within a web site. The maps needed to display the canonical path to the location, the local structure of the site around the location, and the kinds of pages there. The data structure we used to communicate the data needed to display the map had the structural data up front so the applet could start rendering the map (in another thread). Meanwhile, the details about each page came trickling in and could be rendered piecemeal as it arrived.&lt;br /&gt;&lt;br /&gt;It is only now that I more regularly use mobile apps that I really want his lesson to be spread as far as possible because mobile app usability in conjunction with cell network activity just plain sucks. I don't think the primary reason for this condition has to do with hardware, or the network, and, probably, not the algorithms. That leaves the data. &lt;br /&gt;&lt;br /&gt;[1] Manual indexing is when you have a list of 10 items and you flip through them until you find the one item that you want. I am sure there is a interaction-design term for this but I don't know what it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8270278552084420773?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8270278552084420773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8270278552084420773'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/streaming-content-for-non-media.html' title='Streaming content for non-media applications'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-577365391690501614</id><published>2010-07-13T11:22:00.003-04:00</published><updated>2010-07-13T11:34:43.298-04:00</updated><title type='text'>RFPs that discourage response</title><content type='html'>&lt;a href="http://com.andrewgilmartin.blogger.s3.amazonaws.com/10RT101030579.pdf"&gt;Integrated Computer File Integrity Monitoring Infrastructure&lt;/a&gt; via &lt;a href="ttp://www.transitchicago.com/"&gt;http://www.transitchicago.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow! It is not until page 48 that you finally get some detail on what this RFP is asking for. And, of the 61 pages only 2 are about the work. I thought (mostly in passing) I might submit a proposal regards this request but the effort to complete the submission is by far more time consuming than the completion of the work itself. No wonder government costs are so high and RFPs are submitted by companies filled by mid-level employees.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-577365391690501614?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/577365391690501614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/577365391690501614'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/httpwwwtransitchicagocomassets1solicita.html' title='RFPs that discourage response'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8442178530004203160</id><published>2010-07-13T10:48:00.001-04:00</published><updated>2010-07-13T10:48:28.594-04:00</updated><title type='text'>Best jig ever: McDonald's Bun Troubleshooting Tool</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/_Pv06kDVcWvY/TDx8vKeHSXI/AAAAAAAAAWk/qdzfwamkeH0/s1600/0_36167_e4fd827f_XL-708595.jpeg"&gt;&lt;img src="http://2.bp.blogspot.com/_Pv06kDVcWvY/TDx8vKeHSXI/AAAAAAAAAWk/qdzfwamkeH0/s320/0_36167_e4fd827f_XL-708595.jpeg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5493402795191519602" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://englishrussia.com/index.php/2010/07/06/mcdonalds-how-it-works/"&gt;http://englishrussia.com/index.php/2010/07/06/mcdonalds-how-it-works/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8442178530004203160?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8442178530004203160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8442178530004203160'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/best-jig-ever-mcdonalds-bun.html' title='Best jig ever: McDonald&apos;s Bun Troubleshooting Tool'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Pv06kDVcWvY/TDx8vKeHSXI/AAAAAAAAAWk/qdzfwamkeH0/s72-c/0_36167_e4fd827f_XL-708595.jpeg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5817670644409657687</id><published>2010-07-13T09:44:00.003-04:00</published><updated>2010-07-15T16:43:02.673-04:00</updated><title type='text'>Animag Photo Stands</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/_Pv06kDVcWvY/TDxtySCkhPI/AAAAAAAAAWc/R8PhyRh9cCY/s1600/53b89af.0000001278983231-781114.jpeg"&gt;&lt;img src="http://4.bp.blogspot.com/_Pv06kDVcWvY/TDxtySCkhPI/AAAAAAAAAWc/R8PhyRh9cCY/s320/53b89af.0000001278983231-781114.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5493386356088669426" /&gt;&lt;/a&gt;&lt;/p&gt;I love these photo stands. The price is high, but this does inspire me (the good Scott that I am) to make them myself. All you need is to pickup plastic animals (or other things you can cut in half!) from the yard sales (25 cents each), a hack saw (1 dollar), some epoxy glue, and two neodymium magnets per photo stand (50 cents each). Total cost for 4 photo stands is $6 and a lot of fun.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I bought a big box of these magnets for some LED throwies but do you think I can find them now? No.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5817670644409657687?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5817670644409657687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5817670644409657687'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/animag-photo-stands.html' title='Animag Photo Stands'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Pv06kDVcWvY/TDxtySCkhPI/AAAAAAAAAWc/R8PhyRh9cCY/s72-c/53b89af.0000001278983231-781114.jpeg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-284658216051469613</id><published>2010-07-13T08:33:00.002-04:00</published><updated>2010-07-13T08:44:48.474-04:00</updated><title type='text'>Using logrotate to manage Apache Tomcat's catalina.out log file</title><content type='html'>Apache Tomcat does not roll its catalina.out log each day (or after a given size). It is a small annoyance but nevertheless it is an annoyance. The solution is to have logrotate do for you. Add the following to the crontab&lt;pre&gt;0 0 * * * /usr/sbin/logrotate -v --state $HOME/var/logrotate.status $HOME/etc/logrotate.conf&lt;/pre&gt;Set the logrotate.conf to&lt;pre&gt;$HOME/lib/apache-tomcat-5.5.28/logs/catalina.out {&lt;br /&gt;  daily&lt;br /&gt;  rotate 10&lt;br /&gt;  copytruncate&lt;br /&gt;  compress&lt;br /&gt;  missingok&lt;br /&gt;}&lt;br /&gt;# END&lt;/pre&gt;Notes: I run Tomcat from within its own user directory and so all paths are relative to $HOME. Logroate does not perform environment variable substitution on the configuration and so replace $HOME in logrotate.conf with the actual path.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-284658216051469613?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/284658216051469613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/284658216051469613'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/using-logrotate-to-manage-apache.html' title='Using logrotate to manage Apache Tomcat&apos;s catalina.out log file'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2322420775710516356</id><published>2010-07-07T16:04:00.002-04:00</published><updated>2010-07-08T11:21:30.192-04:00</updated><title type='text'>Manual duplex printing with OSX presets</title><content type='html'>I have wanted to be able to manually print duplex for sometime but never scratched the itch until today. With a quick Google search and I discovered&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.maclovin.de/2009/03/manual-duplex-printing-with-osx-presets/"&gt;http://www.maclovin.de/2009/03/manual-duplex-printing-with-osx-presets/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The basic plan is to print the document twice. The first print prints only the odd pages. The second print prints only the even pages and (very importantly) with a reverse page orientation. So, print the document using the first settings. Next, take the stack of pages from the output tray and place them in the input tray as is, that is, don't flip them or turn them in anyway. Lastly, print the again document using the second settings. The result is a duplex document with the pages in the correct order in the output tray.&lt;br /&gt;&lt;br /&gt;Max OS X allows for creating printing presets and so I have created a "Duplex Pass 1" and a "Duplex Pass 2" presets. The only bug is that the "Reverse page orientation" setting (aka checkbox) seems to be independent of the preset so be sure to make sure it is unchecked for pass 1 and checked for pass 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2322420775710516356?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2322420775710516356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2322420775710516356'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/07/manual-duplex-printing-with-osx-presets.html' title='Manual duplex printing with OSX presets'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3699084747966395229</id><published>2010-06-25T10:03:00.001-04:00</published><updated>2010-06-25T10:03:31.896-04:00</updated><title type='text'>Sidewalk Graffiti Provides Navigational Assistance For Subway Commuters</title><content type='html'>&amp;quot;A considerate cartographer wielding a stencil and a can of spray paint has left a helpful navigational compass at the top of the stairs outside the NRW train at Prince Street for commuters exiting the station. As even native New Yorkers cant attest, everyone has exited a subway station and needed a moment to reorient themselves; a directional compass will make it that much easier. The unknown compass crusader stenciled the sidewalk at the uptown 6 train station on Spring Street as well. &amp;quot;&lt;p&gt;&lt;a href="http://nyctheblog.blogspot.com/2010/06/sidewalk-graffiti-provides-navigational.html"&gt;http://nyctheblog.blogspot.com/2010/06/sidewalk-graffiti-provides-navigational.html&lt;/a&gt;&lt;p&gt;I love simple, unobtrusive signage. It can be used in physical space and virtual space. Brainstorming on this example from NYC that painted a compare rose at the exit of subway stations you could use the same technique too&lt;p&gt;* point to bathrooms near parking&lt;p&gt;* point to information booths&lt;p&gt;* point to insert-your-favoriate-coffee-franchise-here&lt;p&gt;What would you point too?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3699084747966395229?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3699084747966395229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3699084747966395229'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/06/sidewalk-graffiti-provides-navigational.html' title='Sidewalk Graffiti Provides Navigational Assistance For Subway Commuters'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1910230415063459598</id><published>2010-06-24T11:13:00.002-04:00</published><updated>2010-06-24T11:21:17.768-04:00</updated><title type='text'>Helping out Instapaper</title><content type='html'>The &lt;a href="http://www.instapaper.com/iphone"&gt;Instapaper iPhone app&lt;/a&gt; is wonderful for reading web pages later. Some web site's content does not show up very well because the Instapaper parser can't determine which HTML elements contain the content and what is ephemera. To help it, web sites can add CSS classes that point directly at content and non-content. Add the "instapaper_body" class to the parent content element and "instapaper_ignore" to non-content within the content element. See &lt;a href="http://blog.instapaper.com/post/730281947"&gt;Preview: Community text-parser configuration&lt;/a&gt; for more detail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1910230415063459598?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1910230415063459598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1910230415063459598'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/06/helping-out-instapaper.html' title='Helping out Instapaper'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8243511229680059597</id><published>2010-06-17T09:59:00.003-04:00</published><updated>2010-06-17T10:27:11.630-04:00</updated><title type='text'>I can't swipe horizontally to read email</title><content type='html'>Yesterday I walked into the Burlington Mall's Apple Store and tried out the iPad for the first time. (I have decided to buy the new iPhone 4 rather than an iPad and so the impulse to have one has waned.) It was much smaller than I expected but this does make it more book-bag friendly. I was very impressed with its speed especially compared to my iPhone 3G. I really wanted it to have a cover. The screen just screams at you "Please take care of me! I am going to be scratched." I don't want a sleeve: Where would I put it when it is not in use? I want a cover that works something like a triptych that folds flat into the back of the iPad or can be folded for use as a stand.&lt;br /&gt;&lt;br /&gt;I have been thinking about interface design for the iPhone and iPad for a while now. I have been working through ideas with the design of an issue tracking application as this is a tool I will use every day. (I am a software developer, after all.) I am greatly inspired by &lt;a href="http://berglondon.com/blog/2009/12/17/magplus/"&gt;Mag+&lt;/a&gt; design. It is such a deep source of ideas. The Mag+ magazine is virtually laid out in a very strong 2d space: The horizontal is used to hold the articles side by side and the vertical is used to hold the article's content. This is a very easy visual model to internalize and it can be used for lots of different kinds of content with strong peer relationships and long content. I had assumed that Apple had this idea too. You see it in their photograph applications, but I was wrong. When reviewing the iPad's email application I was shocked that I could not swipe to view the next or the previous email. This was such a natural gesture that I assumed I did something wrong. As far as I can tell, I did not. Afterwards I realized that I can't swipe horizontally with the iPhone either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8243511229680059597?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8243511229680059597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8243511229680059597'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/06/i-cant-swipe-horizontally-to-read-email.html' title='I can&apos;t swipe horizontally to read email'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5642967042440550839</id><published>2010-05-12T09:21:00.004-04:00</published><updated>2010-05-12T09:36:25.607-04:00</updated><title type='text'>The A Future of Information Interfaces for Emergency Management</title><content type='html'>&lt;img src="http://infosthetics.com/archives/precision_information_management.jpg" width="300" align="right"/&gt;The video &lt;a href="http://infosthetics.com/archives/2010/05/the_future_of_information_interfaces_for_emergency_management.html"&gt;The Future of Information Interfaces for Emergency Management&lt;/a&gt; is a good envisioning of the very possible with the possible exception of the "grab and drop" transfer of visualizations between physical machines. The front line responders all have head mounted video and, I would assume, other environmental sensors. The amount of information given to the front line was less than what I would have expected. That is, there was too much emphasis on centralized management and control when distributed management and localized control is a better approach. Other interesting features in the video include&lt;br /&gt;&lt;br /&gt;* big displays with three-heads being common&lt;br /&gt;* virtual whiteboard+touch screen that shows the distant participant as if on the other side of the device.&lt;br /&gt;* pie menus are finally (!) showing their strengths in a touch-screen world.&lt;br /&gt;* more direct touch interaction with specialized virtualized controls.&lt;br /&gt;* heads-up display on the truck's windshield.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5642967042440550839?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5642967042440550839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5642967042440550839'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/05/a-future-of-information-interfaces-for.html' title='&lt;strike&gt;The&lt;/strike&gt; A Future of Information Interfaces for Emergency Management'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8370941167843711278</id><published>2010-05-05T09:31:00.001-04:00</published><updated>2010-05-05T09:37:58.136-04:00</updated><title type='text'>MonoTouch and Apple's Section 3.3.1: Two Theories</title><content type='html'>&lt;p&gt;I do believe that Mono has meaning for developers. Everytime I listen to the Mono folks I hear them saying the right things. Here is another one of the right things:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tirania.org/blog/archive/2010/Apr-28.html"&gt;MonoTouch and Apple&amp;#39;s Section 3.3.1: Two Theories&lt;/a&gt;&lt;p&gt;"[...] &lt;a href="http://monotouch.net"&gt;MonoTouch&lt;/a&gt; has been misrepresented, initially by Gruber and by most people covering the debate over section 3.3.1.  Probably because few of them have actually used MonoTouch or because they are not familiar with .NET.  Probably folks think that MonoTouch is .NET, and .NET is Microsoft's Java and draw their own conclusions.&lt;br /&gt; &lt;p&gt;MonoTouch brings the C# language and the core of .NET to the iPhone, but does nothing to provide a cross-platform UI experience or for that matter any sort of mobile device cross-platform APIs.&lt;br /&gt; &lt;p&gt;We bring the C# language, garbage collection, a type safe system that help reduce errors, make programmers happier and more productive on the iPhone while getting access to every single iPhoneOS API that they want to.&lt;br /&gt; &lt;p&gt;We have also been able to expose new APIs that Apple has exposed in record time thanks to the fact that we are not really an abstraction layer over the iPhoneOS, but merely a compiler that talks to the native APIs. [...]"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8370941167843711278?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8370941167843711278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8370941167843711278'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/05/monotouch-and-apples-section-331-two.html' title='MonoTouch and Apple&apos;s Section 3.3.1: Two Theories'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-694380519630191513</id><published>2010-04-28T16:15:00.002-04:00</published><updated>2010-04-28T16:20:07.429-04:00</updated><title type='text'>JConsole and JMXMP</title><content type='html'>For the record, if you want to use jconsole with an MBean server using &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr160/index.html"&gt;JMXMP&lt;/a&gt; you need to run it using&lt;pre&gt;java \&lt;br /&gt;  -classpath $JAVA_HOME/lib/jconsole.jar:$JAVA_LOCAL_LIBS/jmxremote_optional.jar \&lt;br /&gt;  sun.tools.jconsole.JConsole \&lt;br /&gt;  &amp;quot;service:jmx:jmxmp://$JMXMP_HOST:$JMXMP_PORT&amp;quot;&lt;/pre&gt;Other incantations just don&amp;#39;t work. Define JAVA_HOME, JAVA_LOCAL_LIBS, JMXMP_HOST and JMXMP_PORT appropriately. Now, back to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-694380519630191513?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/694380519630191513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/694380519630191513'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/jconsole-and-jmxmp.html' title='JConsole and JMXMP'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3524629378370787147</id><published>2010-04-27T10:15:00.001-04:00</published><updated>2010-04-27T10:15:55.677-04:00</updated><title type='text'>Network activity records and the common good</title><content type='html'>The record of activities of users of Google, Facebook, Twitter, etc have enormous use in the service of the common good [1]. Google shows us how searching on flu and flu related terms bests the CDC&amp;#39;s reportage on outbreaks by two weeks. Facebook&amp;#39;s shear population size and its tools for instant affinity groups sees people helping people under good and adverse circumstances. And lack of Twitter activity is the same warning signal grasshoppers give [2]. The upshot of this is that in our current networked world these private institutions need to start making this activity record public.&lt;p&gt;At one time most decent roadways were private enterprises. They supported commerce and so tolls were used to support them. At some point, roads were seen as too valuable to be held in private hands and government took over the task of building and maintaining decent roadways. The same story can be told about potable water. But why did this not happen to the electric grid or the telephone infrastructure? I don&amp;#39;t have an answer today but I do want to find out. I think the answer will lead to a better understanding as to our rights as citizens to having the activity records available for the common good.&lt;p&gt;[1] &lt;a href="http://en.wikipedia.org/wiki/Common_good"&gt;http://en.wikipedia.org/wiki/Common_good&lt;/a&gt;&lt;br&gt;[2] The Origins of Knowledge and Imagination. Jacob Bronowski. &lt;a href="http://bit.ly/akd0gR"&gt;http://bit.ly/akd0gR&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3524629378370787147?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3524629378370787147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3524629378370787147'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/network-activity-records-and-common.html' title='Network activity records and the common good'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3915255802359367174</id><published>2010-04-27T09:35:00.001-04:00</published><updated>2010-04-27T09:35:58.882-04:00</updated><title type='text'>Whitelines Hard Bound A5 Squared Notebook</title><content type='html'>&lt;base href="data:"&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;Oo, these are lovely.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;a href="http://www.amazon.com/dp/9186177257/ref=pe_606_15192560_pe_ar_t8"&gt;http://www.amazon.com/dp/9186177257/ref=pe_606_15192560_pe_ar_t8&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3915255802359367174?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3915255802359367174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3915255802359367174'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/whitelines-hard-bound-a5-squared.html' title='Whitelines Hard Bound A5 Squared Notebook'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4206464458909839044</id><published>2010-04-27T08:53:00.001-04:00</published><updated>2010-04-27T08:53:13.167-04:00</updated><title type='text'>Varanasi has an almost perfect web site</title><content type='html'>Varanasi, &lt;a href="http://www.varanasi-indian.com/"&gt;http://www.varanasi-indian.com/&lt;/a&gt;, has an almost perfect restaurant web site. Just one page containing the menu, hours of operation, and location. And one page that works with a mobile browsers as well as a desktop browsers. No Flash. No extra navigation. No big pictures. No complex layout. It was a pleasure to use. &lt;p&gt;The food, by the way, is fantastic. I really enjoyed the Punjabi Eggplant with spice level 4.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4206464458909839044?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4206464458909839044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4206464458909839044'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/varanasi-has-almost-perfect-web-site.html' title='Varanasi has an almost perfect web site'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7051383270684852697</id><published>2010-04-26T09:40:00.003-04:00</published><updated>2010-05-06T12:16:07.412-04:00</updated><title type='text'>Ranks and snap lines in Instaviz</title><content type='html'>A Graphviz features is the abilty to align nodes using &amp;quot;ranks&amp;quot; [1]. Does Instaviz [2] offer a means of using ranks? If not, I imagine a means of dragging a node to &amp;quot;snap&amp;quot; to one of several equidistant lines drawn on the canvas. In this way, the user is able to specify some node organization and still allow Instaviz to automatically layout the graph as a whole. (I think it is reasonable to limit the snap lines to be in one direction only per graph.)&lt;p&gt;[1] &lt;a href="http://www.graphviz.org/pdf/dotguide.pdf"&gt;http://www.graphviz.org/pdf/dotguide.pdf&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://itunes.apple.com/us/app/instaviz/id299022481?mt=8"&gt;http://itunes.apple.com/us/app/instaviz/id299022481?mt=8&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;For example, I want a graph to have have three ranks: The first rank contains the nodes A, C, and E; The second contains B, D, F; And the third contains X. Without ranks the following definition&lt;br /&gt;&lt;p&gt;&lt;pre&gt;digraph rankexample {&lt;br /&gt; A -&gt; B -&gt; X;&lt;br /&gt; C -&gt; D -&gt; X;&lt;br /&gt; E -&gt; F -&gt; X;&lt;br /&gt; C -&gt; X;&lt;br /&gt; X -&gt; C;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Creates this graph: &lt;img src="http://4.bp.blogspot.com/_Pv06kDVcWvY/S-LqSKbvmeI/AAAAAAAAAWM/cdmIv-coZQI/s400/rank-example-0.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5468190495340468706" /&gt;&lt;br /&gt;&lt;p&gt;However, adding ranks (i.e. the "snap lines") to the definition&lt;br /&gt;&lt;p&gt;&lt;pre&gt;digraph rankexample {&lt;br /&gt; { rank = same; A; C; E; }&lt;br /&gt; { rank = same; B; D; F; }&lt;br /&gt; { rank = same; X; }&lt;br /&gt; A -&gt; B -&gt; X;&lt;br /&gt; C -&gt; D -&gt; X;&lt;br /&gt; E -&gt; F -&gt; X;&lt;br /&gt; C -&gt; X;&lt;br /&gt; X -&gt; C;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I get the layout I was looking for:&lt;img align="right" src="http://4.bp.blogspot.com/_Pv06kDVcWvY/S-LqenwhHzI/AAAAAAAAAWU/IZ6AeNRmKec/s400/rank-example-1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5468190709370658610" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7051383270684852697?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7051383270684852697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7051383270684852697'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/ranks-and-snap-lines-in-instaviz.html' title='Ranks and snap lines in Instaviz'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Pv06kDVcWvY/S-LqSKbvmeI/AAAAAAAAAWM/cdmIv-coZQI/s72-c/rank-example-0.gif' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3569975666751519816</id><published>2010-04-24T08:56:00.002-04:00</published><updated>2010-04-25T14:44:28.779-04:00</updated><title type='text'>Addressing the needs of individual and groups with predictability</title><content type='html'>There has been some good observations of failures to help customers affected by Iceland&amp;#39;s volcano eruption. David Weinberger&amp;#39;s blog has a typical posting &lt;a href="http://www.hyperorg.com/blogger/2010/04/18/volcano-1-internet-0-01/"&gt;http://www.hyperorg.com/blogger/2010/04/18/volcano-1-internet-0-01/&lt;/a&gt;. I think the roots to this problem are that money and effort is being spent on&lt;p&gt;1. style over substance, and&lt;br /&gt;2. individual-casting over broad-casting.&lt;p&gt;The style over substance argument is very easy to see. Every travel website that I have used obscures the process&amp;#39;s workflow (and the broader information architecture) with abusive Web 2.0 techniques. Most of these techniques require an inordinate number of communications between the browser and the server. The upshot is that under moderate load the website fails to respond with predictable timing. Without this predictability customers are greatly frustrated and this leads them to use a telephone where they can at least know what their predicted wait time is!&lt;p&gt;The casting issue is more difficult to see. There are more casting groups then just &amp;quot;me&amp;quot; and &amp;quot;everyone else&amp;quot;. Depending on your service, customers can be group into multiple and overlaps groups. For example, specific airport groups, country groups, traveling with children groups, etc. Each of these groups have common and unique information and advice needs in times of emergency (and times of calm!). The general public group is, generally, the most useless group unless there is system-wide failure. Without addressing the needs of affinity groups you are not truly servicing the needs of your customers.&lt;p&gt;The upshot is, let&amp;#39;s spend less money and effort on individual-casting with technical acrobatics and instead balance the money and effort on addressing the needs of individual and groups with predictability.&lt;p&gt;This posting was inspired by Mark Bernstein&amp;#39;s posting &lt;a href="http://www.markbernstein.org/Apr10/InternetFailure.html"&gt;http://www.markbernstein.org/Apr10/InternetFailure.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3569975666751519816?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3569975666751519816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3569975666751519816'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/addressing-needs-of-individual-and.html' title='Addressing the needs of individual and groups with predictability'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5538174640178283094</id><published>2010-04-23T18:18:00.001-04:00</published><updated>2010-04-23T18:18:09.158-04:00</updated><title type='text'>Always include a telephone number</title><content type='html'>Whenever you find yourself typing or saying &amp;quot;call me&amp;quot; ALWAYS include a telephone number. It it only 7 numbers locally and 10 nationally. Obviously, this is a pet peeve of mine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5538174640178283094?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5538174640178283094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5538174640178283094'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/always-include-telephone-number.html' title='Always include a telephone number'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-707955982117356331</id><published>2010-04-22T10:35:00.002-04:00</published><updated>2010-04-22T14:13:28.146-04:00</updated><title type='text'>Tomcat, JMX and working at the local library</title><content type='html'>When working within a restricted IP network -- like those found at libraries, cafes, and other hot-spots -- make sure you run services on 127.0.0.1 and not &amp;quot;localhost&amp;quot;. This will ensure that all network services you are working with -- and, in my case, developing for -- do not need to access the restricted network. For Tomcat 5.5.x you will need to edit ./conf/server.xml and add the attribute &amp;quot;address=&amp;quot;127.0.0.1&amp;quot; to each &amp;lt;Connector&amp;gt; element. For example,&lt;pre&gt;    &amp;lt;Connector&lt;br /&gt;        address=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;        port=&amp;quot;8080&amp;quot;&lt;br /&gt;        redirectPort=&amp;quot;8443&amp;quot;&lt;br /&gt;        minSpareThreads=&amp;quot;25&amp;quot;&lt;br /&gt;        connectionTimeout=&amp;quot;20000&amp;quot;&lt;br /&gt;        maxSpareThreads=&amp;quot;75&amp;quot;&lt;br /&gt;        maxThreads=&amp;quot;150&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;/Connector&amp;gt;&lt;p&gt;    &amp;lt;Connector&lt;br /&gt;        address=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;        port=&amp;quot;8009&amp;quot;&lt;br /&gt;        redirectPort=&amp;quot;8443&amp;quot;&lt;br /&gt;        protocol=&amp;quot;AJP/1.3&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;/Connector&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-707955982117356331?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/707955982117356331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/707955982117356331'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/tomcat-jmx-and-working-at-local-library.html' title='Tomcat, JMX and working at the local library'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1009880884137703798</id><published>2010-04-18T19:35:00.001-04:00</published><updated>2010-04-18T19:35:50.117-04:00</updated><title type='text'>Atul Gawande: The Checklist Manifesto | Free Lecture | Forum Network from PBS and NPR</title><content type='html'>&lt;base href="data:"&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;Brilliant man. Well worth listening to.&lt;/div&gt;&lt;div style="font-family: Menlo; font-size: 12px; color: black; text-align: left; "&gt;&lt;br&gt;&lt;/div&gt;&lt;a href="http://forum-network.org/lecture/atul-gawande-checklist-manifesto"&gt;http://forum-network.org/lecture/atul-gawande-checklist-manifesto&lt;/a&gt;&lt;div&gt; &lt;/div&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1009880884137703798?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1009880884137703798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1009880884137703798'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/atul-gawande-checklist-manifesto-free.html' title='Atul Gawande: The Checklist Manifesto | Free Lecture | Forum Network from PBS and NPR'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3484152327240503189</id><published>2010-04-12T09:35:00.001-04:00</published><updated>2010-04-12T09:35:44.303-04:00</updated><title type='text'>Looking for webapp suitable for community garden hub</title><content type='html'>I am looking for a webapp that combines&lt;p&gt;* Wiki&lt;br&gt;* Issue Tracking&lt;br&gt;* CRM&lt;p&gt;All of these can be -- and, perhaps, should be -- feature-light. This will be used by members of a community garden. Anyone know of a turn-key solution for this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3484152327240503189?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3484152327240503189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3484152327240503189'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/looking-for-webapp-suitable-for.html' title='Looking for webapp suitable for community garden hub'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-5875866480804501550</id><published>2010-04-09T08:04:00.004-04:00</published><updated>2010-04-09T09:55:23.647-04:00</updated><title type='text'>Using a proxy &amp; reflection to access a JMX Standard MBean</title><content type='html'>A current project uses JMX to monitor the application. Using JMX's Standard MBeans makes publishing an application's health, for example, very easy. This is the "server" side of the story. The "client" side of the story is not so satisfying. The JMX API is designed to support a highly dynamic management environment. To this end, the API uses an indirect access to the data. The client uses textual, untyped descriptors to get, set, and invoke methods on mbeans. Unless you are building a general purpose client this leads to lots of code and mental overhead. For example, if this is your Standard MBean&lt;br /&gt;&lt;pre&gt;public interface HugsMBean {&lt;br /&gt;   boolean isHappy();&lt;br /&gt;   int getHugs();&lt;br /&gt;   void addHugs( int hugCount );&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;To use the isHappy() method requires the code&lt;br /&gt;&lt;pre&gt;MBeanServerConnection mbeanServerConnection  = ...&lt;br /&gt;&lt;br /&gt;ObjectName happyMBeanName = new ObjectName( "com.andrewgilmartin.hugs:name=hugs");&lt;br /&gt;Boolean isHappy = (Boolean) mbeanServerConnection.invoke( happyMBeanName, "isHappy", null, null );&lt;br /&gt;if ( isHappy ) { &lt;br /&gt;   ...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;If you are using Standard MBeans to publish data it would be great for your client to also use the Standard MBean to access the data. For example,&lt;pre&gt;&lt;br /&gt;MBeanServerConnection mbeanServerConnection  = ...&lt;br /&gt;&lt;br /&gt;HugsMBean hugs = ... // i.e. associate with com.andrewgilmartin.hugs:name=hugs&lt;br /&gt;if ( hugs.isHappy() ) {&lt;br /&gt;   ...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;To this end, below is a little set of helper classes that use Java's reflection and proxy facilities to do just this. The first code we need is an invocation handler that will send attribute and invocation mbean requests between the proxy and the mbean server:&lt;br /&gt;&lt;pre&gt;package com.andrewgilmartin.common.management;&lt;br /&gt;&lt;br /&gt;import java.lang.reflect.InvocationHandler;&lt;br /&gt;import java.lang.reflect.Method;&lt;br /&gt;import javax.management.Attribute;&lt;br /&gt;import javax.management.JMException;&lt;br /&gt;import javax.management.MBeanServerConnection;&lt;br /&gt;import javax.management.ObjectName;&lt;br /&gt;&lt;br /&gt;public class MBeanClient implements InvocationHandler {&lt;br /&gt;&lt;br /&gt;    private MBeanServerConnection mbeanServerConnection;&lt;br /&gt;    private ObjectName mbeanName;&lt;br /&gt;    &lt;br /&gt;    public MBeanClient( MBeanServerConnection mbeanServerConnection, String mbeanName ) throws JMException {&lt;br /&gt;        this.mbeanServerConnection = mbeanServerConnection;&lt;br /&gt;        this.mbeanName = new ObjectName( mbeanName );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;br /&gt;        if ( method.getName().startsWith("get") &amp;&amp; method.getParameterTypes().length == 0) {&lt;br /&gt;            String attributeName = method.getName().substring(3);&lt;br /&gt;            return mbeanServerConnection.getAttribute( mbeanName, attributeName);&lt;br /&gt;        }&lt;br /&gt;        else if ( method.getName().startsWith("set") &amp;&amp; method.getParameterTypes().length == 1) {&lt;br /&gt;            String attributeName = method.getName().substring(3);&lt;br /&gt;            Attribute attribute = new Attribute( attributeName, args[0] );&lt;br /&gt;            mbeanServerConnection.setAttribute(mbeanName, attribute);&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            return mbeanServerConnection.invoke(mbeanName, method.getName(), args, null);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt; &lt;br /&gt;And now we need a factory (or perhaps just a static creator method somewhere) to tie together the Standard MBean interface, the MBeanClient helper, and the proxy:&lt;br /&gt;&lt;pre&gt;package com.andrewgilmartin.common.management;&lt;br /&gt;&lt;br /&gt;import java.lang.reflect.Proxy;&lt;br /&gt;import javax.management.JMException;&lt;br /&gt;import javax.management.MBeanServerConnection;&lt;br /&gt;&lt;br /&gt;public class MBeanClientFactory {&lt;br /&gt;&lt;br /&gt;    private MBeanServerConnection mbeanServerConnection;&lt;br /&gt;&lt;br /&gt;    public MBeanClientFactory( MBeanServerConnection mbeanServerConnection ) {&lt;br /&gt;        this.mbeanServerConnection = mbeanServerConnection;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public &lt;T&gt; T create( String objectName, Class... mbeanInterfaces ) throws JMException {&lt;br /&gt;        T mbeanClient = (T) Proxy.newProxyInstance(&lt;br /&gt;         this.getClass().getClassLoader(),&lt;br /&gt;         mbeanInterfaces,&lt;br /&gt;         new MBeanClient( mbeanServerConnection, objectName ) );&lt;br /&gt;        return mbeanClient;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Now, connect the client and create the proxy&lt;br /&gt;&lt;pre&gt;// connect to the mbean server&lt;br /&gt;MBeanServerConnection mbeanServerConnection = ...&lt;br /&gt;&lt;br /&gt;// create the mbean client factory&lt;br /&gt;MBeanClientFactory clientFactory = new MBeanClientFactory(mbeanServerConnection);&lt;br /&gt;&lt;br /&gt;// create the mbean client for the server's mbean&lt;br /&gt;HugsMBean hugs = clientFactory.create("com.andrewgilmartin.hugs:name=hugs",HugsMBean.class);&lt;br /&gt;&lt;br /&gt;// use the mbean client&lt;br /&gt;while ( ! hugs.isHappy() ) {&lt;br /&gt;  hugs.addHugs( 27 );&lt;br /&gt;}&lt;br /&gt;System.out.println( "happy with " + hugs.getHugs() + " hugs");&lt;/pre&gt;&lt;br /&gt;Post script: Here is how to connect to a JMX server running on localhost at port 9999 using RMI: &lt;br /&gt;&lt;pre&gt;JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");&lt;br /&gt;JMXConnector jmxc = JMXConnectorFactory.connect(url, null);&lt;br /&gt;MBeanServerConnection mbeanServerConnection = jmxc.getMBeanServerConnection();&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-5875866480804501550?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5875866480804501550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/5875866480804501550'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/using-proxy-reflection-to-access-jmx.html' title='Using a proxy &amp; reflection to access a JMX Standard MBean'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-8020695427729084226</id><published>2010-04-02T09:52:00.002-04:00</published><updated>2010-04-02T09:56:17.769-04:00</updated><title type='text'>A vi command line helper</title><content type='html'>A great command line file editing helper is to combine find and vi so that you can skip specifying paths. For example, the command&lt;br /&gt;&lt;pre&gt;vif IndexerTool.java&lt;/pre&gt;effectively is the same command line as &lt;br /&gt;&lt;pre&gt;vi ./java/org/crossref/qs/citationdocument/index/IndexerTool.java&lt;/pre&gt;(for a current project.) The script is&lt;br /&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;[ -z "$1" ] || vi $(find . -name $1 -type f)&lt;/pre&gt;You can use wild cards too. For example, this will edit ALL your java files&lt;br /&gt;&lt;pre&gt;vif \*.java&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-8020695427729084226?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8020695427729084226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/8020695427729084226'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/04/command-line-helper.html' title='A vi command line helper'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4072325299930788170</id><published>2010-03-26T15:55:00.001-04:00</published><updated>2010-04-09T10:05:02.375-04:00</updated><title type='text'>Blogger and Twitter link</title><content type='html'>This tip is a reworking of the tip given in &lt;a href="http://www.bloggerbuster.com/2009/08/16-useful-twitter-tools-for-blogger.html"&gt;Blogger Buster: 16 Useful Twitter Tools for Blogger&lt;/a&gt; &lt;i&gt;Add a simple "Tweet This" link.&lt;/i&gt; Since Blogger's links can be long, the code uses bit.ly to shorten the link. The code to use is&lt;pre&gt;&amp;lt;!-- TWITTER --&amp;gt;&lt;br /&gt;&amp;lt;a&amp;nbsp;expr:href='&amp;amp;quot;http://bit.ly/?u=&amp;amp;quot; + data:post.url + &amp;amp;quot;&amp;amp;amp;s=&amp;amp;quot; + data:post.title + &amp;amp;quot; (via @YOUR-TWITTER-USERNAME)&amp;amp;quot;'&amp;nbsp;target='_new'&amp;nbsp;title='Tweet via bit.ly'&amp;gt;Tweet This&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;br /&gt;somewhere within the DIV element&lt;br /&gt;&lt;pre&gt;&amp;lt;div class='post-footer-line post-footer-line-1'&amp;gt;&lt;/pre&gt;&lt;br /&gt;Replace YOUR-TWITTER-USERNAME with your Twitter user name. See the original tip for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4072325299930788170?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4072325299930788170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4072325299930788170'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/03/blogger-and-twitter-link.html' title='Blogger and Twitter link'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2711890605586152450</id><published>2010-03-26T15:19:00.004-04:00</published><updated>2010-04-09T10:06:21.443-04:00</updated><title type='text'>Blogger and conditional widgets</title><content type='html'>Quick note that to make a widget/gadget conditional in Blogger you need to edit the template's HTML and add a &amp;lt;b:if cond=&amp;apos;... tag. For example, the following makes the given HTML widget only display on the index page (the main page).&lt;pre&gt;&amp;lt;b:widget id=&amp;apos;HTML1&amp;apos; locked=&amp;apos;false&amp;apos; title=&amp;apos;&amp;apos; type=&amp;apos;HTML&amp;apos;&amp;gt;&lt;br /&gt;&amp;lt;b:includable id=&amp;apos;main&amp;apos;&amp;gt;&lt;br /&gt;&amp;lt;b:if cond=&amp;apos;data:blog.pageType == &amp;amp;quot;index&amp;amp;quot;&amp;apos;&amp;gt;&lt;br /&gt;&amp;lt;!-- only display title if it&amp;apos;s non-empty --&amp;gt;&lt;br /&gt;&amp;lt;b:if cond=&amp;apos;data:title != &amp;amp;quot;&amp;amp;quot;&amp;apos;&amp;gt;&lt;br /&gt;&amp;lt;h2 class=&amp;apos;title&amp;apos;&amp;gt;&amp;lt;data:title/&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;/b:if&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;apos;widget-content&amp;apos;&amp;gt;&lt;br /&gt;&amp;lt;data:content/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;b:include name=&amp;apos;quickedit&amp;apos;/&amp;gt;&lt;br /&gt;&amp;lt;/b:if&amp;gt;&lt;br /&gt;&amp;lt;/b:includable&amp;gt;&lt;br /&gt;&amp;lt;/b:widget&amp;gt;&lt;/pre&gt;&lt;br /&gt;This can be useful if you want some introductory content to be displayed to the viewers of the home page but not to viewers of of the specific posting pages.&lt;br /&gt;&lt;br /&gt;Also, a new feature of Blogger is "Pages". Pages are named postings that can be listed and accessed by direct links. There is also a widget for showing the pages as a list or as tabs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2711890605586152450?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2711890605586152450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2711890605586152450'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/03/blogger-and-conditional-widgets.html' title='Blogger and conditional widgets'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-2124023827727639505</id><published>2010-03-11T15:42:00.001-05:00</published><updated>2010-03-11T15:43:53.266-05:00</updated><title type='text'>2010 South County Coop Tour</title><content type='html'>The &lt;a href="http://habitatforhens.org/"&gt;2010 South County Coop Tour&lt;/a&gt; preparation is well underway!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-2124023827727639505?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2124023827727639505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/2124023827727639505'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/03/2010-south-county-coop-tour.html' title='2010 South County Coop Tour'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3515445801868554249</id><published>2010-02-06T06:40:00.006-05:00</published><updated>2010-02-06T06:52:32.443-05:00</updated><title type='text'>Shell enhancement to round-robin through list of directories</title><content type='html'>When working at the command line (Unix mostly) I am often working with files in several directories at once. The pushd and popd commands are useful but require a strict stacked directory use and require too much planning for me to use efficiently. (Clearly, self actualization has reached a new level of specificity.) What would be better would be a way to change directories by rotating through a list of directories. Much as is done today with applications vis Cmd-Tab under Mac OS X and Alt-Tab under Windows. Configuring the list of directories should be via a hot-key. The hot-key should work not only when in the current working directory but also when using filename completion. Often, the directories I want to return to are discovered during filename completion. So, one hot-key is used to add and remove directories from the list and another hot-key to change directories to the next directory in the list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3515445801868554249?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3515445801868554249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3515445801868554249'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/02/shell-enhancement-to-round-robin.html' title='Shell enhancement to round-robin through list of directories'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1629616501995775164</id><published>2010-02-03T11:21:00.002-05:00</published><updated>2010-02-03T11:28:16.684-05:00</updated><title type='text'>Re: What the iPad Means for the Future of Computing</title><content type='html'>Comment regards Wired's &lt;a href="http://www.wired.com/gadgetlab/2010/02/ipad-future"&gt;What the iPad Means for the Future of Computing&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;What the iPhone did (and iPad will do) is to bring back sanity to interface design. For decades UI vendors — Microsoft, Apple, HP, Sun, etc — brought to tool/application front-end development well considered and consistent structural and visual interface elements. The tool’s new users needed only to learn how these elements were applied to the business function to use the tool. The value of this UI work was, some how, lost during the rise of the web.&lt;br /&gt;&lt;br /&gt;The other element of the iPhone’s success is single user focus. The iPhone becomes the tool/application in use. User multi-tasking is not a requirement to productivity. &lt;a href="http://www.folklore.org/StoryView.py?project=Macintosh&amp;story=Switcher.txt&amp;sortOrder=Sort+by+Date"&gt;Switcher&lt;/a&gt; was one of Apple’s greatest productivity successes. It was ahead of its time and ahead of the capabilities of the hardware. The hardware in the iPhone and the iPad make switching to another application fast and into the same context you were when you left.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1629616501995775164?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1629616501995775164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1629616501995775164'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/02/re-what-ipad-means-for-future-of.html' title='Re: What the iPad Means for the Future of Computing'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-4202799767907292667</id><published>2010-01-08T10:07:00.007-05:00</published><updated>2010-01-08T10:22:36.182-05:00</updated><title type='text'>Microsoft's Our Productivity Future Vision</title><content type='html'>&lt;a href="http://bit.ly/6tvWuT"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 500px;" src="http://1.bp.blogspot.com/_Pv06kDVcWvY/S0dK95SQkMI/AAAAAAAAAU0/QAnEt8dDiH8/s320/Our+Productivity+Future.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5424386703400931522" /&gt;&lt;/a&gt;&lt;br /&gt;Genuinely enthralled with Microsoft's &lt;a href="http://bit.ly/6tvWuT"&gt;Our Productivity Future Vision&lt;/a&gt;. Lots of reviewing stuff and not enough creating stuff, however.&lt;br /&gt;&lt;br /&gt;Update: When I worked for Mesa Systems Guild (10 years ago) the data point that drove the product was that for every 1 creator there there 40 users of the creation. I wonder what the ratio is today?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-4202799767907292667?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4202799767907292667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/4202799767907292667'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/01/microsofts-our-productivity-future.html' title='Microsoft&apos;s Our Productivity Future Vision'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Pv06kDVcWvY/S0dK95SQkMI/AAAAAAAAAU0/QAnEt8dDiH8/s72-c/Our+Productivity+Future.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-7525365088340975506</id><published>2010-01-04T09:14:00.004-05:00</published><updated>2010-01-05T10:35:50.078-05:00</updated><title type='text'>National Geographic visualization of national health care costs</title><content type='html'>&lt;a href="http://blogs.ngm.com/.a/6a00e0098226918833012876674340970c-800wi" target="_blank"&gt;&lt;img src="http://blogs.ngm.com/.a/6a00e0098226918833012876674340970c-800wi" width="600" /&gt;&lt;/a&gt; See &lt;a href="http://blogs.ngm.com/blog_central/2009/12/the-cost-of-care.html"&gt;The Cost of Care&lt;/a&gt; and &lt;a href="http://www.fastcompany.com/blog/cliff-kuang/design-innovation/infographic-day-how-bad-us-healthcare"&gt;Infographic of the Day: How Bad Is U.S. Health Care?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-7525365088340975506?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7525365088340975506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/7525365088340975506'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2010/01/national-geographic-visualization-of.html' title='National Geographic visualization of national health care costs'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3009519325094328693</id><published>2009-12-17T19:01:00.001-05:00</published><updated>2009-12-17T19:03:34.928-05:00</updated><title type='text'>Mag+</title><content type='html'>This posting about &lt;a href="http://www.core77.com/blog/technology/mag_the_magazines_digital_future_15528.asp?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+core77%2Fblog+%28Core77.com%27s+design+blog%29&amp;utm_content=Google+Reader"&gt;Mag+&lt;/a&gt;, a possible future digital magazine, is a very well considered design. The short video is well worth watching.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3009519325094328693?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3009519325094328693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3009519325094328693'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2009/12/mag.html' title='Mag+'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-3182330747648109269</id><published>2009-12-17T09:37:00.000-05:00</published><updated>2009-12-17T09:38:54.101-05:00</updated><title type='text'>Google Street View for meetings?</title><content type='html'>I had this device idea for meetings and was wondering if you have seen anything like this. The core of the idea is Google Street View technology but applied to meetings. One (portable) device is setup in the middle of a meeting space (room or table). The device has enough cameras and directional microphones to gather 360 degrees of visual and audio input. The output of the device is, for example, a 360 degree QuickTime movie with 360 degree audio (if there is such a thing). As you reviewed the movie and moved its directional focus around the room you would more clearly hear the voices of those in foreground of the camera. This would be a great device for all kinds of public and private meetings.&lt;br /&gt;&lt;br /&gt;Feel free to steal the idea if you can make it happen! Just keep me informed. Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-3182330747648109269?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3182330747648109269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/3182330747648109269'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2009/12/google-street-view-for-meetings.html' title='Google Street View for meetings?'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-1982497787721370912</id><published>2009-11-19T20:51:00.002-05:00</published><updated>2009-11-19T20:56:24.329-05:00</updated><title type='text'>Mangle-wheel and pinion</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Pv06kDVcWvY/SwX2k_B4HWI/AAAAAAAAAUo/ys9FIgZH3NM/s1600/Mangle-wheel+and+pinion.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 238px; height: 228px;" src="http://3.bp.blogspot.com/_Pv06kDVcWvY/SwX2k_B4HWI/AAAAAAAAAUo/ys9FIgZH3NM/s320/Mangle-wheel+and+pinion.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405998042983177570" /&gt;&lt;/a&gt; "36. Mangle-wheel and pinion -- so called from their application to mangles -- converts continous rotary motion of pinion into reciprocating rotary motion of wheel." Found in &lt;a href="http://www.archive.org/details/fivehundredseven00browiala"&gt;Five hundred and seven mechanical movements&lt;/a&gt;. I wonder what proportion of technical people in the past were expected to know this stuff cold compared with those today? Then again, they didn't know about mathematical programming either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-1982497787721370912?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1982497787721370912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/1982497787721370912'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2009/11/mangle-wheel-and-pinion.html' title='Mangle-wheel and pinion'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Pv06kDVcWvY/SwX2k_B4HWI/AAAAAAAAAUo/ys9FIgZH3NM/s72-c/Mangle-wheel+and+pinion.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6192914801419860742.post-537255632400281246</id><published>2009-11-19T11:32:00.002-05:00</published><updated>2009-11-19T11:35:32.956-05:00</updated><title type='text'>A Congressman was seated next to a little girl on the airplane...</title><content type='html'>Today's email contained this:&lt;br /&gt;&lt;br /&gt;A Congressman was seated next to a little girl on the airplane. He turned to her and said, 'Let's talk. I've heard that flights go quicker if you strike up a conversation with a fellow passenger.'&lt;br /&gt;&lt;br /&gt;The little girl, who had just opened her book, closed it slowly and said to the total stranger, 'What would you like to talk about?'&lt;br /&gt;&lt;br /&gt;'Oh, I don't know,' said the congressman. 'How about global warming or universal health care?' and he smiles smugly.&lt;br /&gt;&lt;br /&gt;'OK,' she said. 'Those could be interesting topics. But let me ask you a question first. A horse, a cow, and a deer all eat the same stuff - grass. Yet a deer excretes little pellets, while a cow turns out a flat patty, and a horse produces clumps of dried grass. Why do you suppose that is?'&lt;br /&gt;&lt;br /&gt;The California legislator, visibly surprised by the little girl's intelligence, thinks about it for a minute and says, 'Hmmm, I have no idea.'&lt;br /&gt;&lt;br /&gt;To which the little girl replies, 'Do you really feel qualified to discuss global warming or universal health care when you don't know shit?'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6192914801419860742-537255632400281246?l=calliopesounds.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/537255632400281246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6192914801419860742/posts/default/537255632400281246'/><link rel='alternate' type='text/html' href='http://calliopesounds.blogspot.com/2009/11/congressman-was-seated-next-to-little.html' title='A Congressman was seated next to a little girl on the airplane...'/><author><name>Andrew Gilmartin</name><uri>http://www.blogger.com/profile/02023827660057425536</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-nKHpUUNIH9E/To9jogBhQ8I/AAAAAAAAAa4/t6NIPXgY_4I/s220/AJGHead-3.jpg'/></author></entry></feed>
