<?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-5430164083972077839</id><updated>2011-12-20T01:56:10.712-07:00</updated><category term='quotation'/><category term='nexus'/><category term='mirc'/><category term='javascript'/><category term='dynamic'/><category term='maven'/><category term='pidgin'/><category term='tomcat'/><category term='sonatype'/><category term='mapreduce'/><category term='hadoop'/><category term='chrome'/><category term='firefox'/><category term='internationalization'/><category term='bigtable'/><category term='opensource'/><category term='python'/><category term='findbugs'/><category term='pidginsnarl'/><category term='hotkey'/><category term='windows'/><category term='hql'/><category term='nosql'/><category term='irc'/><category term='eclipse'/><category term='productivity'/><category term='repository'/><category term='prism'/><category term='database'/><category term='colloquy'/><category term='snarl'/><category term='linux'/><category term='growl'/><category term='ssb'/><category term='i18n'/><category term='hibernate'/><category term='virtualbox'/><category term='cassandra'/><category term='idea'/><category term='java'/><category term='vmware'/><category term='sqlalchemy'/><category term='fluid'/><category term='jdk6'/><category term='intellij'/><category term='book'/><category term='bubbles'/><category term='parallels'/><category term='build'/><category term='jpa'/><category term='mibbit'/><category term='lucid lynx'/><category term='mozilla'/><category term='version control'/><category term='ubuntu'/><category term='gnarly'/><category term='freenode'/><category term='fusion'/><category term='subversion'/><category term='google'/><title type='text'>jeromatron - dev lux</title><subtitle type='html'>Jeremy Hanna's tech blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-2991746234249096222</id><published>2011-01-26T09:41:00.001-07:00</published><updated>2011-01-26T09:50:47.794-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Simple python script for generating Cassandra initial tokens</title><content type='html'>When using a RandomPartitioner, it is recommended that you specify the initial tokens.  On the Cassandra Operations wiki page, it &lt;a href="http://wiki.apache.org/cassandra/Operations#Token_selection"&gt;says&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Using a strong hash function means RandomPartitioner keys will, on average, be evenly spread across the Token space, but you can still have imbalances if your Tokens do not divide up the range evenly, so you should specify InitialToken to your first nodes as &lt;code&gt;i * (2**127 / N) for i = 0 .. N-1&lt;/code&gt;. In Cassandra 0.7, you should specify &lt;code&gt;initial_token&lt;/code&gt; in &lt;code&gt;cassandra.yaml&lt;/code&gt;.&lt;/blockquote&gt;Here is a simple python script for generating them:&lt;br /&gt;&lt;pre&gt;#! /usr/bin/python&lt;br /&gt;import sys&lt;br /&gt;if (len(sys.argv) &gt; 1):&lt;br /&gt;    num=int(sys.argv[1])&lt;br /&gt;else:&lt;br /&gt;    num=int(raw_input("How many nodes are in your cluster? "))&lt;br /&gt;for i in range(0, num):&lt;br /&gt;    print 'node %d: %d' % (i, (i*(2**127)/num))&lt;br /&gt;&lt;/pre&gt;So it will take either a command-line arg for the number of nodes or will ask if none is given.  For three nodes, it will give the following output:&lt;br /&gt;&lt;pre&gt;node 0: 0&lt;br /&gt;node 1: 56713727820156410577229101238628035242&lt;br /&gt;node 2: 113427455640312821154458202477256070485&lt;br /&gt;&lt;/pre&gt;This post was adapted from &lt;a href="http://palominodb.com/blog/2010/11/02/cassandra-randompartitioner-tokenizing"&gt;this&lt;/a&gt;, just updated the script and corrected the formula.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-2991746234249096222?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/2991746234249096222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=2991746234249096222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/2991746234249096222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/2991746234249096222'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2011/01/simple-python-script-for-generating.html' title='Simple python script for generating Cassandra initial tokens'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-9080176755911636209</id><published>2010-06-16T14:57:00.002-06:00</published><updated>2010-06-16T15:03:56.082-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='lucid lynx'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Installing Sun Java on Lucid Lynx</title><content type='html'>First I had to install python-software-properties to be able to run add-apt-repository:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo apt-get install python-software-properties&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then I add the repo that has Sun's jdk:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo add-apt-repository "deb http://archive.canonical.com/ lucid  partner"&lt;br /&gt;sudo aptitude update&lt;br /&gt;sudo aptitude install sun-java6-jdk&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Then, if there are multiple jdk alternatives on the system, choose which one you want with:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo update-alternatives --config java&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-9080176755911636209?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/9080176755911636209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=9080176755911636209' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/9080176755911636209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/9080176755911636209'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/06/installing-sun-java-on-lucid-lynx.html' title='Installing Sun Java on Lucid Lynx'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-3023814759808432214</id><published>2010-06-10T14:43:00.008-06:00</published><updated>2010-06-10T15:03:42.366-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bigtable'/><category scheme='http://www.blogger.com/atom/ns#' term='mapreduce'/><category scheme='http://www.blogger.com/atom/ns#' term='cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Large-scale Storage/Computation at Google</title><content type='html'>Stu Hood pointed me to an interesting keynote today done by &lt;a href="http://research.google.com/people/jeff/index.html"&gt;Jeffrey Dean&lt;/a&gt;, a Fellow at Google.   It's part of the ACM &lt;a href="http://research.microsoft.com/en-us/um/redmond/events/socc2010/index.htm"&gt;Symposium on Cloud Computing&lt;/a&gt;. In it, he talks about the current large scale storage and computation infrastructure used at Google.  It starts off kind of slow but picks up (for me) after he talks a bit about MapReduce.&lt;br /&gt;&lt;br /&gt;The presentation with slides is available &lt;a href="http://hosted.mediasite.com/mediasite/Viewer/?peid=1330ca0a008f4394917c2b7eb3163f1b1d"&gt;here&lt;/a&gt; (silverlight required)&lt;br /&gt;&lt;br /&gt;Some interesting bits to me:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;He talked about several patterns for distributed systems that they have found useful.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google currently MapReduces through about an exabyte of data per month&lt;/li&gt;&lt;li&gt;Interesting example of how they use MapReduce - to return the relevant map tiles in Google Maps for a given query&lt;/li&gt;&lt;li&gt;He pointed out that they have Service Clusters of BigTable so that each group doesn't have to maintain their own - this relates to what Stu and I are doing at Rackspace - creating multi-tenant Hadoop and Cassandra clusters for similar reasons&lt;/li&gt;&lt;li&gt;They use ranged distribution of keys for BigTable, saying that consistent hashing is good in some ways, but they wanted to be able to have locality of key sequences.&lt;/li&gt;&lt;li&gt;He talked about something I've been looking at recently - how to do custom multi-datacenter replication by table (or for Cassandra by keyspace).&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-3023814759808432214?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/3023814759808432214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=3023814759808432214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3023814759808432214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3023814759808432214'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/06/large-scale-storagecomputation-at.html' title='Large-scale Storage/Computation at Google'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-7245737049503517481</id><published>2010-06-02T11:44:00.007-06:00</published><updated>2010-06-03T12:05:12.231-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Presentation on Cassandra+Hadoop</title><content type='html'>Last night I gave a presentation at the &lt;a href="http://austinhug.blogspot.com/"&gt;Austin Hadoop User Group&lt;/a&gt; about Cassandra + Hadoop.  It was a great group of people in this relatively new user group here, probably around 20-30 people were there.&lt;br /&gt;&lt;br /&gt;My slides are available in keynote form on slideshare - linked here:&lt;br /&gt;&lt;div style="width:425px" id="__ss_4399672"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jeromatron/cassandrahadoop-4399672" title="Cassandra+Hadoop"&gt;Cassandra+Hadoop&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4399672" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cassandrahadoop-100603080029-phpapp02&amp;stripped_title=cassandrahadoop-4399672" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4399672" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cassandrahadoop-100603080029-phpapp02&amp;stripped_title=cassandrahadoop-4399672" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeromatron"&gt;Jeremy Hanna&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Steve Watt from IBM's BigSheets and Emerging Technologies team pointed out that Cassandra has an edge over the native Hadoop technologies in that you can query output in Cassandra immediately.  Using just Hadoop, especially HDFS for the output, you have to export the MapReduce output to another system if you want to do any kind of reporting.  That can be a significant extra step.&lt;br /&gt;&lt;br /&gt;Stu Hood also pointed out that even though it is possible to run MapReduce over data in Cassandra, HDFS and HBase are built to stream large chunks of data.  So Cassandra will be slower from that perspective at this point.  Work can be done to optimize that though.  I think no matter what, you're choosing your data store for a variety of reasons - if your data fits better in Cassandra, now you have an option of running MapReduce directly over it.  I think that's a significant advance.&lt;br /&gt;&lt;br /&gt;Lots of thanks to Stu Hood as well as Jeff Hammerbacher (on &lt;a href="http://webchat.freenode.net/?channels=#hadoop"&gt;#hadoop&lt;/a&gt; IRC) for help on some of the details.&lt;br /&gt;&lt;br /&gt;With this done with, it's back to doing what I can to help with Cassandra dev and looking forward to the &lt;a href="http://hadoopsummit2010.eventbrite.com/"&gt;Hadoop Summit&lt;/a&gt; at the end of the month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-7245737049503517481?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/7245737049503517481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=7245737049503517481' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7245737049503517481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7245737049503517481'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/06/presentation-on-cassandrahadoop.html' title='Presentation on Cassandra+Hadoop'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-6469076158582623880</id><published>2010-05-09T16:20:00.002-06:00</published><updated>2010-05-09T16:27:19.172-06:00</updated><title type='text'>Facebook and Privacy</title><content type='html'>I recently decided to deactivate my Facebook account.  I did that based on several reports of Facebook disregarding the privacy of users in order to further monetize their platform.  To be sure, they have a fantastic platform and I've liked being able to connect with people I haven't seen in a long time.  However, hosting user data comes with the responsibility of keeping the trust of the user.  To me, for now they've broken that trust.  Anyway, I just thought I would post what I sent to Facebook when I deactivated my account:&lt;br /&gt;&lt;blockquote&gt;According to several reports lately from the EFF, Wired, and several online publications, Facebook has consistently changed privacy terms out from underneath users.  Part of the reason that I felt safe on Facebook and not in other networks was that I trusted Facebook to some extent.  Based on these new changes and the seeming disregard for its users, I would rather not support Facebook any longer.  Thank you for the remarkable service, but right now I don't feel that Facebook is trustworthy.  They seem like they will do anything in order to further monetize the network/platform, including compromise the trust of its users.  It's an unfortunately short-sighted gamble and I hope you will reconsider.&lt;br /&gt;&lt;br /&gt;See:&lt;br /&gt;&lt;a href="http://www.wired.com/epicenter/2010/05/facebook-rogue/"&gt;http://www.wired.com/epicenter/2010/05/facebook-rogue/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eff.org/deeplinks/2010/05/things-you-need-know-about-facebook"&gt;http://www.eff.org/deeplinks/2010/05/things-you-need-know-about-facebook&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eff.org/deeplinks/2010/04/facebook-timeline"&gt;http://www.eff.org/deeplinks/2010/04/facebook-timeline&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.pcworld.com/article/195888/facebooks_antiprivacy_backlash_gains_ground.html"&gt;http://www.pcworld.com/article/195888/facebooks_antiprivacy_backlash_gains_ground.html&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-6469076158582623880?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/6469076158582623880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=6469076158582623880' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/6469076158582623880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/6469076158582623880'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/05/facebook-and-privacy.html' title='Facebook and Privacy'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-5870381435538888579</id><published>2010-03-26T12:23:00.006-06:00</published><updated>2010-03-26T13:20:21.215-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cassandra'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>NOSQL</title><content type='html'>As I've started getting up to speed at my new job at Rackspace down here in Texas, I've come into a new world called NoSQL.  &lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt; is a term that &lt;a href="http://blog.sym-link.com/"&gt;Eric Evans&lt;/a&gt; re-coined relatively recently and he's since clarified that to mean Not only SQL.  It's a term that kind of describes a set of distributed databases that have some similar properties.&lt;br /&gt;&lt;br /&gt;Some of the suspects include Google's &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt;, Hadoop's &lt;a href="http://hadoop.apache.org/hbase/"&gt;HBase&lt;/a&gt;, Amazon's &lt;a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt;Dynamo&lt;/a&gt;, Apache's &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, &lt;a href="http://www.mongodb.org/display/DOCS/Home"&gt;MongoDB&lt;/a&gt;, &lt;a href="http://project-voldemort.com/"&gt;Voldemort&lt;/a&gt;, and others.&lt;br /&gt;&lt;br /&gt;It seems to be based on the notion that if you have really, really, really large data sets, you run into some boundaries with the limits that a relational database imposes with ACID properties, transactions, and the unattainable &lt;a href="http://en.wikipedia.org/wiki/Universe_of_The_Legend_of_Zelda#Triforce"&gt;triforce&lt;/a&gt; of Consistency, Availability, and Partition-tolerance (from the &lt;a href="http://www.royans.net/arch/brewers-cap-theorem-on-distributed-systems/"&gt;CAP Theorem&lt;/a&gt;).  &lt;a href="http://spyced.blogspot.com/"&gt;Jonathan Ellis&lt;/a&gt; blogged about deciding whether you should consider a NoSQL solution &lt;a href="http://www.rackspacecloud.com/blog/2010/02/25/should-you-switch-to-nosql-too/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So I've started drinking from a firehose of sources to try to understand more about them.  We've been looking heavily into pieces of the Hadoop project for its &lt;a href="http://hadoop.apache.org/hdfs/"&gt;distributed filesystem&lt;/a&gt; and &lt;a href="http://hadoop.apache.org/mapreduce/"&gt;Map/Reduce implementation&lt;/a&gt; (not exactly NoSQL but siblings to HBase), as well as the Cassandra project because of how it brings together useful features of BigTable and Dynamo and allows for completely horizontal scaling - no single point of failure.&lt;br /&gt;&lt;br /&gt;More about the subject:&lt;br /&gt;&lt;a href="http://www.royans.net/arch/"&gt;http://www.royans.net/arch&lt;/a&gt; - a blog about scalable web architectures, often talking about big data and NoSQL&lt;br /&gt;&lt;a href="http://nosql.mypopescu.com/"&gt;http://nosql.mypopescu.com&lt;/a&gt; - a blog called myNoSQL that deals with all things NoSQL&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-5870381435538888579?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/5870381435538888579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=5870381435538888579' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5870381435538888579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5870381435538888579'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/03/nosql.html' title='NOSQL'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-8884017324596165010</id><published>2010-01-06T18:24:00.003-07:00</published><updated>2010-01-06T18:54:58.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>list comprehensions in python</title><content type='html'>One of my favorite features of &lt;a href="http://python.org/"&gt;python&lt;/a&gt; is a functional language feature that python itself &lt;a href="http://en.wikipedia.org/wiki/History_of_Python#Influences_from_other_languages"&gt;borrowed&lt;/a&gt; - &lt;a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions"&gt;list comprehensions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I just think it is wonderfully elegant if a language can do something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Example 1:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;lines = ['now is the time\r\n']&lt;br /&gt;lines.append('   for all good men ')&lt;br /&gt;lines.append(' to come to the aid of their country\n')&lt;br /&gt;&lt;br /&gt;# Does not modify list, returns a new list&lt;br /&gt;lines = [line.strip() for line in lines]&lt;br /&gt;&lt;br /&gt;print lines&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt;['now is the time', 'for all good men', 'to come to the aid of their country']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Example 2:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;lines = ['&amp;lt;act&amp;gt; is the next act']&lt;br /&gt;lines.append('performing at our show')&lt;br /&gt;lines.append('please give &amp;lt;act&amp;gt; a big round of applause')&lt;br /&gt;&lt;br /&gt;print [line.replace('&amp;lt;act&amp;gt;', 'Go Dog Go') for line in lines]&lt;br /&gt;print [line.replace('&amp;lt;act&amp;gt;', 'The Beatles') for line in lines]&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt;['Go Dog Go is the next act', 'performing at our show', 'please give Go Dog Go a big round of applause']&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt;['The Beatles is the next act', 'performing at our show', 'please give The Beatles a big round of applause']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You can do simple operations like strip and replace or even an in place &lt;a href="http://docs.python.org/reference/expressions.html#lambda"&gt;lambda&lt;/a&gt; on every element of a list and return that list... all in one line.&lt;br /&gt;&lt;br /&gt;I love Python and its functional cousin languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-8884017324596165010?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/8884017324596165010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=8884017324596165010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8884017324596165010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8884017324596165010'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/01/list-comprehensions-in-python.html' title='list comprehensions in python'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-8058495178395269978</id><published>2010-01-06T18:07:00.008-07:00</published><updated>2010-01-06T18:58:01.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='hql'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>hibernate console in intellij idea 9</title><content type='html'>I was pleasantly surprised to find better &lt;a href="https://www.hibernate.org/"&gt;hibernate&lt;/a&gt; support in &lt;a href="http://www.jetbrains.com/idea/index.html"&gt;intellij idea 9&lt;/a&gt;, which was recently released.&lt;br /&gt;&lt;br /&gt;They had hibernate support in 8.x, including a console, where you could run queries against your data using the mappings you had configured.  However in version 9, they added the ability to use named parameters with associated values.  So in essence, you can paste in a hql query and it autodetects the named parameters, e.g. :username.  That pops up on the right pane as a named paraemeter.  You just double click that, set its value, and you can run the query.&lt;br /&gt;&lt;br /&gt;intellij has had support for this in their jdbc console in the past, but it's very handy now with the hibernate console.  It removes one step from having to debug queries - you no longer have to use just the sql output that hibernate outputs and then piece queries back together and then try to guess where the disconnect was :).&lt;br /&gt;&lt;br /&gt;See intellij feature request:&lt;br /&gt;&lt;a href="http://youtrack.jetbrains.net/issue/IDEADEV-41129"&gt;http://youtrack.jetbrains.net/issue/IDEADEV-41129&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related to hibernate console, don't forget to have the ehcache.jar in your module's classpath if you want to use the hibernate console.  You can find the jar in the basic core &lt;a href="https://www.hibernate.org/6.html"&gt;download&lt;/a&gt; of hibernate - in the lib/optional/ehcache directory of the bundle.  The console requires the secondary cache and will give you odd secondary cache errors if you don't have it in the path.&lt;br /&gt;&lt;br /&gt;See this about loading ehcache:&lt;br /&gt;&lt;a href="http://youtrack.jetbrains.net/issue/IDEA-21914"&gt;http://youtrack.jetbrains.net/issue/IDEA-21914&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-8058495178395269978?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/8058495178395269978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=8058495178395269978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8058495178395269978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8058495178395269978'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2010/01/hibernate-console-in-intellij-idea-9.html' title='hibernate console in intellij idea 9'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-5553410136812285465</id><published>2009-12-01T11:27:00.002-07:00</published><updated>2009-12-01T11:33:20.277-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='hotkey'/><category scheme='http://www.blogger.com/atom/ns#' term='version control'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Custom hotkeys in IntelliJ IDEA</title><content type='html'>Three custom hotkeys I use quite frequently in IntelliJ IDEA:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;alt-shift-L - Compare with latest repository version&lt;/span&gt;&lt;br /&gt;creates a diff from your copy to the latest version of the current file from the repository&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;alt-shift-H - Show History&lt;/span&gt;&lt;br /&gt;shows the version history of the file with who modified it, revision number, and comments&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;alt-shift-A - Annotate&lt;/span&gt;&lt;br /&gt;annotates the current file with the revision number and who modified each line last - I love this one.&lt;br /&gt;&lt;br /&gt;To create custom hotkeys, go to File-&gt;Settings-&gt;Keymap.&lt;br /&gt;&lt;br /&gt;You can find those mappings under Version Control Systems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-5553410136812285465?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/5553410136812285465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=5553410136812285465' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5553410136812285465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5553410136812285465'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/12/custom-hotkeys-in-intellij-idea.html' title='Custom hotkeys in IntelliJ IDEA'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-2994329664527249773</id><published>2009-11-24T16:20:00.003-07:00</published><updated>2009-11-24T17:09:15.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>Scrum?</title><content type='html'>So I've been on several teams that refer to themselves as agile.  They do &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;scrum&lt;/a&gt; meetings each day and get updates from individuals on the team.  Presumably, the meeting is for coordination of effort among the individuals.&lt;br /&gt;&lt;br /&gt;Scrum seems to work better in some groups - finding holes in requirements, promoting discussion about a data model, general communication to make sure everyone can deliver for the next iteration.&lt;br /&gt;&lt;br /&gt;Sound good?  Sound normal?  Sound effective?&lt;br /&gt;&lt;br /&gt;Well I've wondered lately about the cumulative time from all the individuals in the room - that's a lot of work time.  That's a lot of disruption.  That's a lot of "I'm working on bugs" on some days.&lt;br /&gt;&lt;br /&gt;Then today I was reading a passage in the book &lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439"&gt;Peopleware&lt;/a&gt; that warns of a balance.&lt;br /&gt;&lt;blockquote&gt;The ultimate management sin is wasting people's time.&lt;br /&gt;...&lt;br /&gt;When you convoke a meeting with &lt;span style="font-style: italic;"&gt;n&lt;/span&gt; people present, the normal presumption is that all those in the room are there because they need to interact with each other in order to come to certain conclusions.  When, instead, the participants take turns interacting with one key figure, the expected rationale for assembling the whole group is missing; the boss might just as well have interacted separately with each of the subordinates without obliging the others to listen in.&lt;/blockquote&gt;He goes on to say that some ceremonial meetings are necessary, for project milestones, when new people come on, celebrating a release, etc.  However, the authors in the same section of the book say:&lt;br /&gt;&lt;blockquote&gt;A real working meeting is called when there is a real reason for &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; the people invited to think through some matter together.  The purpose of the meeting is to reach consensus.  Such a meeting is, almost by definition, an ad hoc affair.  Ad hoc implies that the meeting is unlikely to be regularly scheduled.  Any regular get-together is therefore somewhat suspect as likely to have a ceremonial purpose rather than a focused goal of consensus.  The weekly status meeting is an obvious example.  Though its goal may seem to be status reporting, its real intent is status confirmation.  And it's not the status of the work, but the status of the boss.&lt;br /&gt;&lt;/blockquote&gt;Weekly status meetings?!?  What about a daily status meeting?&lt;br /&gt;&lt;br /&gt;Now I'm not saying that scrum is always a waste of everyone's time.  However, I wonder if we in the world of agile are missing the point sometimes and ceremony trumps getting work done.  I wonder if many of the same things could be accomplished by having a common work area online, like a &lt;a href="http://campfirenow.com/"&gt;campfire&lt;/a&gt; chat room or an &lt;a href="http://jeromatron.blogspot.com/2009/05/irc-internet-relay-chat.html"&gt;IRC&lt;/a&gt; channel for &lt;a href="http://www.metabrew.com/article/how-we-use-irc-at-lastfm/"&gt;work discussions&lt;/a&gt;.  I thought a recent &lt;a href="http://www.inc.com/magazine/20091101/the-way-i-work-jason-fried-of-37signals_pagen_2.html"&gt;interview&lt;/a&gt; (links to page 2) with Jason Fried of 37 Signals was interesting - his take on meetings.&lt;br /&gt;&lt;br /&gt;The excerpts from Peopleware come from chapter 33: "The Ultimate Management Sin Is ..."  It goes on to talk about all sorts of ways to waste people's time.&lt;br /&gt;&lt;br /&gt;I just thought it was interesting to contrast the need in agile for a scrum-like meeting with the need for uninterrupted work time.  I think it just inspires thought about whether or not a given meeting, particularly a regularly scheduled meeting, is of value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-2994329664527249773?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/2994329664527249773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=2994329664527249773' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/2994329664527249773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/2994329664527249773'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/11/scrum.html' title='Scrum?'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-4462269754366057080</id><published>2009-11-24T09:08:00.004-07:00</published><updated>2009-11-24T09:21:28.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>An Office Environment</title><content type='html'>Since I picked it up in grad school, I've been fascinated by a book called &lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439"&gt;Peopleware&lt;/a&gt; and the different ways of thinking about the work place.&lt;br /&gt;&lt;br /&gt;This morning I read a bit about how a work place or work space affects the productivity of a software developer:&lt;br /&gt;&lt;blockquote&gt;"Staying late or arriving early or staying home to work in peace is a damning indictment of the office environment.  The amazing thing is not that it's so often impossible to work in the workplace; the amazing thing is that everyone knows it and nobody ever does anything about it."&lt;br /&gt;&lt;span style="font-size:85%;"&gt;- Chapter 8, "You Never Get Anything Done Around Here from 9 to 5"&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;They went on to describe a study they did involving developer productivity.  They found the normal 10:1 range of individual developer productivity.  What was surprising was they also found that there was a 10:1 or so range for organizational productivity - with two developers from each organization.  The two developers from each performed on about the same level.&lt;br /&gt;&lt;br /&gt;It would seem that not only individual developer productivity matters, but also their working environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-4462269754366057080?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/4462269754366057080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=4462269754366057080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/4462269754366057080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/4462269754366057080'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/11/office-environment.html' title='An Office Environment'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-7785957868480922096</id><published>2009-10-22T10:26:00.001-06:00</published><updated>2009-10-22T10:28:10.667-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='ssb'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><title type='text'>Using firefox extensions in mozilla prism</title><content type='html'>Matt Gertner, creator of the Mozilla Prism firefox addon/SSB, just posted some basics on how to get a firefox extension working with prism.&lt;br /&gt;&lt;br /&gt;Thought it was interesting for those messing with site-specific browsers...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://browsing.justdiscourse.com/2009/10/22/prism-and-extensions/"&gt;http://browsing.justdiscourse.com/2009/10/22/prism-and-extensions/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-7785957868480922096?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/7785957868480922096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=7785957868480922096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7785957868480922096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7785957868480922096'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/using-firefox-extensions-in-mozilla.html' title='Using firefox extensions in mozilla prism'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-622252807638933925</id><published>2009-10-20T13:10:00.003-06:00</published><updated>2009-10-23T17:11:46.812-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pidgin'/><category scheme='http://www.blogger.com/atom/ns#' term='growl'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>A Pidgin plugin for Growl for Windows</title><content type='html'>I've been fond of &lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; on the mac as a pretty standard notification mechanism.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.growlforwindows.com/"&gt;Growl for Windows&lt;/a&gt; is a project that uses the same protocols to do notification on the windows side.&lt;br /&gt;&lt;br /&gt;After a discussion in the forums, someone has finally implemented support for one of the last core apps that was missing for a long time: pidgin.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.growlforwindows.com/2009/10/pigdin-growl-sittin-in-tree.html"&gt;http://blog.growlforwindows.com/2009/10/pigdin-growl-sittin-in-tree.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Previously there was a snarl-&gt;growl bridge called gnarly that would notify growl of messages, but it's nice to see that such a popular app is getting some attention :).&lt;br /&gt;&lt;br /&gt;W00t for open source :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-622252807638933925?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/622252807638933925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=622252807638933925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/622252807638933925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/622252807638933925'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/pidgin-plugin-for-growl-for-windows.html' title='A Pidgin plugin for Growl for Windows'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-3702469120557960460</id><published>2009-10-12T11:24:00.003-06:00</published><updated>2009-10-23T17:12:17.310-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='findbugs'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>FindBugs in IntelliJ IDEA</title><content type='html'>I was just perusing the plugin repository for &lt;a href="http://www.jetbrains.com/idea"&gt;IntelliJ IDEA&lt;/a&gt; plugins recently and came across the &lt;a href="http://plugins.intellij.net/plugin/?id=3847"&gt;FindBugs plugin&lt;/a&gt;.  It will analyze your code and give you a categorized list of potential problems in your code that links to the source.  It bundles the latest &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; implementation so there is no need to download that as well.&lt;br /&gt;&lt;br /&gt;It looks promising for catching things I may have missed in my code.&lt;br /&gt;&lt;br /&gt;There is currently a bug where when you first use it, you need to go into the settings for FindBugs and click on Restore Defaults.  That initializes the list of detectors that it uses.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;a href="http://findbugs.sourceforge.net/"&gt;http://findbugs.sourceforge.net&lt;/a&gt; - the findbugs home page&lt;br /&gt;&lt;a href="https://findbugs-idea.dev.java.net/"&gt;https://findbugs-idea.dev.java.net&lt;/a&gt; - the findbugs IntelliJ IDEA home page&lt;br /&gt;&lt;a href="http://www.jetbrains.com/idea"&gt;http://www.jetbrains.com/idea&lt;/a&gt; - the IntelliJ IDEA home page&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-3702469120557960460?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/3702469120557960460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=3702469120557960460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3702469120557960460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3702469120557960460'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/findbugs-in-intellij-idea.html' title='FindBugs in IntelliJ IDEA'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-8935612497799872930</id><published>2009-10-09T08:22:00.004-06:00</published><updated>2009-10-23T17:14:56.672-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ssb'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Additional stuff from Developing with Mozilla Prism</title><content type='html'>Yesterday in my presentation on &lt;a href="http://jeromatron.blogspot.com/2009/10/slides-for-developing-with-mozilla.html"&gt;Developing with Mozilla Prism&lt;/a&gt;, I had some difficulties getting an app to work because of an intermittent bug in prism right now.&lt;br /&gt;&lt;br /&gt;I did want to post the webapp.js code for the Google Reader prism app that I was showing during the presentation:&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt;* Google Reader web app script&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;function n(app, msg) {&lt;br /&gt; window.platform.showNotification(app, msg, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* standard webrunner plugin api&lt;br /&gt;*/&lt;br /&gt;function startup() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function preload() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function load() {      &lt;br /&gt;   Reader.load();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function shutdown() {&lt;br /&gt;   Reader.shutdown();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function error() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var Reader = {&lt;br /&gt;   _timer : null,&lt;br /&gt;   _unreadCount : 0,&lt;br /&gt;   _window : null,&lt;br /&gt;&lt;br /&gt;   receiveMessage : function() {    &lt;br /&gt;       //window.platform.sound().beep();&lt;br /&gt;       window.platform.getAttention();&lt;br /&gt;&lt;br /&gt;       n("Google Reader", "You have " + Reader._unreadCount + " unread item(s).");&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   _init : function() {&lt;br /&gt;       Reader._unreadCount = 0;&lt;br /&gt;       Reader._window = window;&lt;br /&gt;   },&lt;br /&gt; &lt;br /&gt;   run : function() {&lt;br /&gt;       if (Reader._unreadCount == undefined)&lt;br /&gt;       Reader._unreadCount = 0;&lt;br /&gt;&lt;br /&gt;       var title = Reader._window.top.document.title;&lt;br /&gt;&lt;br /&gt;       var matches = title.match(/Google Reader \((\d+)\)/);&lt;br /&gt;       if (matches) {    &lt;br /&gt;           if (matches[1] &gt; Reader._unreadCount) {&lt;br /&gt;                Reader._unreadCount = matches[1];&lt;br /&gt;                Reader.receiveMessage();&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           Reader._unreadCount = matches[1];&lt;br /&gt;       }&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   load : function() {  &lt;br /&gt;       Reader._init();&lt;br /&gt;       // kick off a polling timer to check for new articles&lt;br /&gt;       Reader._timer = Reader._window.setInterval(Reader.run, 5000);&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   shutdown : function() {  &lt;br /&gt;       if (Reader._timer)&lt;br /&gt;           Reader._window.clearInterval(Reader._timer);&lt;br /&gt;   }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Also, the MIME type to add to your httpd.conf to allow prism webapp bundles to load properly by linking to them is:&lt;pre&gt;&lt;br /&gt;AddType application/x-webapp .webapp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Talking with Matt Gertner a little about adding javascript to your own web page...  He said that you could use the window.platform stuff in your webapp and that would, in many cases, simply replace the need for webapp.js since your web page would then essentially become prism aware.  That's another option for trying to distribute a prism app.&lt;br /&gt;&lt;br /&gt;For more information on prism - check out &lt;a href="https://developer.mozilla.org/en/Prism"&gt;https://developer.mozilla.org/en/Prism&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-8935612497799872930?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/8935612497799872930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=8935612497799872930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8935612497799872930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8935612497799872930'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/additional-stuff-from-developing-with.html' title='Additional stuff from Developing with Mozilla Prism'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-1509249605953069272</id><published>2009-10-08T12:43:00.003-06:00</published><updated>2009-10-23T17:15:29.090-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ssb'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Slides for Developing with Mozilla Prism</title><content type='html'>I just wanted to post my slides for my presentation this afternoon on &lt;a href="http://2009.utosc.com/presentation/96/"&gt;Developing with Mozilla Prism&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It will be in the Auditorium at 3 PM.  I hope to see you there!&lt;br /&gt;&lt;br /&gt;I received a bag of stuff from Mozilla to give away - various fun mozilla/firefox stickers and mozilla firefox badge lanyards.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.google.com/fileview?id=0B897WCL8cEU5ZWRjZTE5NDMtM2M3Ni00MTM0LThhMTQtYjg4MDc1MGYxNTE1&amp;amp;hl=en"&gt;Slides&lt;/a&gt; (pdf through Google Docs)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-1509249605953069272?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/1509249605953069272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=1509249605953069272' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/1509249605953069272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/1509249605953069272'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/slides-for-developing-with-mozilla.html' title='Slides for Developing with Mozilla Prism'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-3131811261340083282</id><published>2009-10-03T23:01:00.004-06:00</published><updated>2009-10-23T17:15:53.587-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssb'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Utah Open Source conference 2009 - Developing with Mozilla Prism</title><content type='html'>I will be speaking at the Utah Open Source conference next Thursday at 3 PM on &lt;a href="http://2009.utosc.com/presentation/96/"&gt;Developing with Mozilla Prism&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm excited because Mozilla Prism is nearing a final release of 1.0 - it's at 1.0 b2 at this point.  I talked to a Mozilla employee, Mark Finkle, who works on &lt;a href="http://prism.mozilla.com/"&gt;Prism&lt;/a&gt;, in addition to &lt;a href="https://wiki.mozilla.org/Fennec"&gt;Fennec&lt;/a&gt;, their mobile browser project.  He talked to Mozilla HQ and it sounds like I'll be able to get some Mozilla swag to give away at the presentation!&lt;br /&gt;&lt;br /&gt;I'm also trying to start a community around building a prism webapp bundle library that I'll talk about more in my presentation.  I thought it would be nice to have some open source examples of Prism web application bundles that people could refer to and add to.  So I created a Google Code project called &lt;a href="http://code.google.com/p/prism-apps/"&gt;prism-apps&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In any case, check out the &lt;a href="http://prism.mozilla.com/"&gt;Prism&lt;/a&gt; &lt;a href="https://developer.mozilla.org/en/Prism"&gt;project&lt;/a&gt; and &lt;a href="http://attend.utosc.com/"&gt;come&lt;/a&gt; to the presentation!&lt;br /&gt;&lt;br /&gt;(I'll post my slides later in the week as I finalize them.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-3131811261340083282?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/3131811261340083282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=3131811261340083282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3131811261340083282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3131811261340083282'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/utah-open-source-conference-2009.html' title='Utah Open Source conference 2009 - Developing with Mozilla Prism'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-6532622616198476232</id><published>2009-10-02T13:15:00.004-06:00</published><updated>2009-10-23T17:16:19.243-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='internationalization'/><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><title type='text'>Subtle difference - extending ListResourceBundle vs ResourceBundle</title><content type='html'>I've been mucking about extending ListResourceBundle and then just plain ResourceBundle trying to get things to work with a base case - a custom resource bundle.&lt;br /&gt;&lt;br /&gt;Taking a look at the Java i18n tutorial, extending ListResourceBundle doesn't require subclassing the default bundle; see &lt;a href="http://java.sun.com/docs/books/tutorial/i18n/resbundle/list.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then taking a look at the ResourceBundle javadocs and their custom resource bundle example, you *do* have to extend the default bundle; see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/ResourceBundle.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class MyListResources_it extends ListResourceBundle {&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;as opposed to:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class MyResources_it extends MyResources {&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Kind of a confusing inconsistency - maybe the ListResourceBundle is just smarter about its look up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-6532622616198476232?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/6532622616198476232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=6532622616198476232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/6532622616198476232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/6532622616198476232'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/10/subtle-difference-extending.html' title='Subtle difference - extending ListResourceBundle vs ResourceBundle'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-5075182564236248504</id><published>2009-09-25T12:41:00.005-06:00</published><updated>2009-10-23T17:16:34.128-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dynamic'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='internationalization'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk6'/><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Internationalization - dynamic and in a database</title><content type='html'>So I've been tasked with doing some internationalization for a web application in a less conventional way.  I thought it would be useful to put together some thoughts as I get started on what I think will be a decent solution.&lt;br /&gt;&lt;br /&gt;From what I understood, internationalization in Java (the language I'm using) involves properties files and locales and such.  In the project I'm on, there is a requirement to be able to update the translated texts on the fly, without a server restart.  This complicates the using of properties files a bit, since writing to those files seems a bit hackish and then what do I do to reload them.&lt;br /&gt;&lt;br /&gt;So we've decided to look into a database backing for the whole business since that's pretty dynamic and accessible to the people - either via some database interface or an admin tool - working on the text.&lt;br /&gt;&lt;br /&gt;We were kicking around various options to do something custom, a custom map or something and redirect whatever framework we were using.&lt;br /&gt;&lt;br /&gt;Then I found some methods native to Java - no framework required - which should handle it nicely.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/util/ListResourceBundle.html"&gt;ListResourceBundle&lt;/a&gt; has been around for a while in Java-land, but it's a nice &lt;a href="http://java.sun.com/docs/books/tutorial/i18n/resbundle/list.html"&gt;way&lt;/a&gt; of not using properties files, but classes as bundles for different locales.  This seems like a great way to get those database backed properties into the mix.&lt;/li&gt;&lt;li&gt;Java 6 also has some nice customization options for how resource bundles get loaded.  Specifically, &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.Control.html"&gt;ResourceBundle.Control&lt;/a&gt; has some options to &lt;a href="http://java.sun.com/docs/books/tutorial/i18n/resbundle/control.html"&gt;customize&lt;/a&gt; the time-to-live of the cache for the resource bundle, from no-cache at all, to specifying a timeframe in milliseconds for how long a cache is valid.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;So going forward, it looks like I'll need to mess with both for making something that's as close to the wire as I can - which allows me to not have to re-code caching and other things specific to a system for i18n.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-5075182564236248504?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/5075182564236248504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=5075182564236248504' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5075182564236248504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5075182564236248504'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/09/internationalization-dynamic-and-in.html' title='Internationalization - dynamic and in a database'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-8306084724570411432</id><published>2009-09-16T15:02:00.004-06:00</published><updated>2009-10-23T17:18:11.136-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Having intellij + tomcat update web content without a restart</title><content type='html'>So I've had issues with intellij + tomcat updating web content without a tomcat restart - very painful.&lt;br /&gt;&lt;br /&gt;I've found the magic that will allow for it thanks to a coworker.&lt;br /&gt;&lt;br /&gt;There are three things to do:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make sure your webapp is an exploded directory instead of a war (not sure if this is required)&lt;/li&gt;&lt;li&gt;Set Settings-&gt;Debugger-&gt;HotSwap-&gt;Reload classes after compilation to Always - if it can't do it, I'll have to restart anyway&lt;/li&gt;&lt;li&gt;Set Settings-&gt;Compiler-&gt;Deploy web applications to server after compilation to Never&lt;/li&gt;&lt;/ol&gt;Then after updating a page, on Windows press ctrl-shift-F9 to "compile" the page or re-put it into the exploded directory.&lt;br /&gt;&lt;br /&gt;My sticking point was number 3 - it would put the updated file out there, but when it deployed the web application, tomcat got all confused and required a restart - I think probably because everything was updated including the web.xml.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-8306084724570411432?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/8306084724570411432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=8306084724570411432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8306084724570411432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8306084724570411432'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/09/having-intellij-tomcat-update-web.html' title='Having intellij + tomcat update web content without a restart'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-6852135359027498075</id><published>2009-09-06T22:57:00.004-06:00</published><updated>2009-10-23T17:18:29.347-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssb'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Some basics on Mozilla Prism</title><content type='html'>Lately I've been working on getting Mozilla Prism working for me on linux.  It's in the 1.0 beta stage and seems to me to be the most promising now among the cross-platform site-specific browsers.&lt;br /&gt;&lt;br /&gt;Personally I use it for gmail, google docs, google calendar, outlook web access, and stuff like that.&lt;br /&gt;&lt;br /&gt;Following are some helpful introductory links on prism:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://prism.mozilla.com/"&gt;http://prism.mozilla.com/&lt;/a&gt; - the prism home page (it's a mozilla labs project)&lt;/li&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/Prism"&gt;https://developer.mozilla.org/en/Prism&lt;/a&gt; - the prism developer's home page - this includes documentation on how to build your own prism app and bundle it for distribution. It includes references for scripting in the prism world (javascript).&lt;/li&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/Prism/BundleLibrary"&gt;https://developer.mozilla.org/en/Prism/BundleLibrary&lt;/a&gt; - the library of webapps that people have already created as prism apps. Your mileage may vary - using prism as a stand alone app has brought me the most success on linux with the current version (1.0 b2).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-6852135359027498075?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/6852135359027498075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=6852135359027498075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/6852135359027498075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/6852135359027498075'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/09/some-basics-on-mozilla-prism.html' title='Some basics on Mozilla Prism'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-3144180499052403957</id><published>2009-08-03T11:39:00.006-06:00</published><updated>2009-10-23T17:18:59.619-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snarl'/><category scheme='http://www.blogger.com/atom/ns#' term='pidginsnarl'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='gnarly'/><category scheme='http://www.blogger.com/atom/ns#' term='pidgin'/><category scheme='http://www.blogger.com/atom/ns#' term='growl'/><category scheme='http://www.blogger.com/atom/ns#' term='freenode'/><category scheme='http://www.blogger.com/atom/ns#' term='mirc'/><title type='text'>IRC on windows with notifications</title><content type='html'>I wanted to document a few steps to getting IRC working on windows with notifications.  &lt;a href="http://pidgin.im/"&gt;Pidgin&lt;/a&gt; is a decent client to connect to IRC on Windows, though some prefer using &lt;a href="http://www.mirc.com/"&gt;mIRC&lt;/a&gt;.  Unfortunately for windows, there's not a well established notifications framework like there is on the mac (&lt;a href="http://growl.info/"&gt;growl&lt;/a&gt;) or linux (libnotify).&lt;br /&gt;&lt;br /&gt;So to start, download and install the following:&lt;br /&gt;&lt;a href="http://pidgin.im/"&gt;Pidgin&lt;/a&gt;&lt;br /&gt;&lt;a href="http://growlforwindows.com/gfw/default.aspx"&gt;Growl for Windows&lt;/a&gt;&lt;br /&gt;&lt;a href="http://growlforwindows.com/gfw/gnarly/publish.htm"&gt;Gnarly&lt;/a&gt;  (Growl-&gt;Snarl bridge)&lt;br /&gt;&lt;a href="http://tlhan-ghun.de/?q=node/22"&gt;PidginSnarl&lt;/a&gt; (pidgin notification plugin)&lt;br /&gt;&lt;br /&gt;Once all these have been installed, add an IRC server to your pidgin installation, such as irc.freenode.net.&lt;br /&gt;&lt;br /&gt;Growl needs to be started and in the preferences, you'll likely want to load it at startup.&lt;br /&gt;&lt;br /&gt;You'll likely have to restart pidgin after installing the pidginsnarl plugin.  After restarting, go to Tools-&gt;Plugins.  There will be two that you'll want to enable:&lt;br /&gt;Message Notifications&lt;br /&gt;PidginSnarl&lt;br /&gt;&lt;br /&gt;Then configure MessageNotifications - enable notifications for Chat, and then if you'd like have it notify you only if someone chats to your username.&lt;br /&gt;&lt;br /&gt;Then go into Growl into the Applications section, click on PidginSnarl.  Configure the Chat Received notifications to how you'd like it.&lt;br /&gt;&lt;br /&gt;You may want to configure other things like logins and logouts and status changes to not notify you as well (disabling them).&lt;br /&gt;&lt;br /&gt;That's it.  Whew, kinda complicated on windows, but that's it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-3144180499052403957?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/3144180499052403957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=3144180499052403957' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3144180499052403957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3144180499052403957'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/08/irc-on-windows-with-notifications.html' title='IRC on windows with notifications'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-8983920996850560281</id><published>2009-05-15T11:12:00.003-06:00</published><updated>2009-10-23T17:19:17.089-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotation'/><title type='text'>Steer for the deep waters only</title><content type='html'>A cool quote by &lt;a href="http://en.wikipedia.org/wiki/Walt_Whitman"&gt;Walt Whitman&lt;/a&gt; that I think about sometimes when I am learning new things and trying to adapt them for use...&lt;br /&gt;&lt;br /&gt;"Sail Forth- Steer for the deep waters only. Reckless O soul, exploring. I with thee and thou with me. For we are bound where mariner has not yet dared go. And we will risk the ship, ourselves, and all."&lt;br /&gt;&lt;br /&gt;This quote and other writings by Walt Whitman were used in &lt;a href="http://en.wikipedia.org/wiki/Ralph_Vaughan_Williams"&gt;Ralph Vaughn Williams'&lt;/a&gt; &lt;a href="http://www.amazon.com/Vaughan-Williams-Symphony-Christine-Goerke/dp/B00006AAV7"&gt;first symphony&lt;/a&gt; - &lt;a href="http://en.wikipedia.org/wiki/A_Sea_Symphony"&gt;A Sea Symphony&lt;/a&gt;, which is also really cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-8983920996850560281?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/8983920996850560281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=8983920996850560281' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8983920996850560281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/8983920996850560281'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/05/steer-for-deep-waters-only.html' title='Steer for the deep waters only'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-4715749770629592651</id><published>2009-05-13T17:27:00.005-06:00</published><updated>2009-10-23T17:19:52.683-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mibbit'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='pidgin'/><category scheme='http://www.blogger.com/atom/ns#' term='colloquy'/><category scheme='http://www.blogger.com/atom/ns#' term='freenode'/><category scheme='http://www.blogger.com/atom/ns#' term='mirc'/><title type='text'>IRC - Internet Relay Chat</title><content type='html'>For those who don't know what irc is - it's basically a chat service where you can ask and answer questions and discuss technologies.  There are several development oriented channels out there.  On irc.freenode.net (&lt;a href="http://freenode.net/"&gt;more info&lt;/a&gt;), there are channels like #jquery, #hudson, #spring, #hibernate, #jsf, #oracle, #jython, #intellij, #eclipse, and many many others.  Organizations like &lt;a href="http://www.mozilla.org/"&gt;mozilla&lt;/a&gt; (irc.mozilla.org) have their own irc server.  Sometimes you have to hunt down where a channel might live.  For example the #maven channel is found on irc.codehaus.org (&lt;a href="http://codehaus.org/"&gt;more info&lt;/a&gt;).  Often, developers of that particular technology lurk in the channels as well.&lt;br /&gt;&lt;br /&gt;For those used to a chatroom where people constantly monitor the goings on, IRC is a bit different.  True there are often several people in a channel at a time.  However, they often stay logged in at work and possibly while they are away from their computer.  Therefore, depending on the channel, you might need to wait 10 or 20 minutes for a response to a general question.  If you know who you would like to ask, then use their username in your question or comment.  That usually triggers a notification in their IRC client and they are more apt to answer if they are around.&lt;br /&gt;&lt;br /&gt;More information about irc and different clients can be found here:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat" target="_blank"&gt;http://en.wikipedia.org/wiki/&lt;wbr&gt;Internet_Relay_Chat&lt;/a&gt;&lt;br /&gt;&lt;a href="http://freenode.net/faq.shtml#whatwhy" target="_blank"&gt;http://freenode.net/faq.shtml#&lt;wbr&gt;whatwhy&lt;/a&gt; - why freenode exists&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Clients:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mirc.com/" target="_blank"&gt;http://www.mirc.com/&lt;/a&gt; - a popular windows based client&lt;/li&gt;&lt;li&gt;&lt;a href="http://colloquy.info/" target="_blank"&gt;http://colloquy.info/&lt;/a&gt; - a popular mac client (also has an iphone client that works well)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mibbit.com/" target="_blank"&gt;http://www.mibbit.com/&lt;/a&gt; - a web based client that can also be embedded as a widget into sites&lt;/li&gt;&lt;li&gt;&lt;a href="http://pidgin.im/" target="_blank"&gt;http://pidgin.im/&lt;/a&gt; - you can setup pidgin (formerly gaim) with irc accounts&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-4715749770629592651?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/4715749770629592651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=4715749770629592651' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/4715749770629592651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/4715749770629592651'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/05/irc-internet-relay-chat.html' title='IRC - Internet Relay Chat'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-7515922898515715368</id><published>2009-05-12T19:11:00.008-06:00</published><updated>2009-10-23T17:20:22.510-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bubbles'/><category scheme='http://www.blogger.com/atom/ns#' term='ssb'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><category scheme='http://www.blogger.com/atom/ns#' term='fluid'/><title type='text'>Site-specific browsers (SSB)</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Site-specific_browser"&gt;Site-specific browsers&lt;/a&gt; are kind of a hobby topic for me because of their utility.  I often find that there are things like &lt;a href="http://mail.google.com/mail"&gt;GMail&lt;/a&gt;, &lt;a href="http://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;, and others that seem to fit a mold where they are kind of a world of their own, a self-contained web application.  If I use something like that with any degree of frequency, I consider making it into a site-specific browser instance.&lt;br /&gt;&lt;br /&gt;Some of the basic niceties that I've found for my use include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;- Ability to choose an icon for the SSB&lt;/li&gt;&lt;li&gt;- Modify the URL that is being used upon creation of the SSB&lt;/li&gt;&lt;li&gt;- Show/don't show navigation controls&lt;/li&gt;&lt;li&gt;- Hotkey support&lt;/li&gt;&lt;li&gt;- Show/don't show the status bar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A few of the SSBs that I've tried on various platforms include:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Fluid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By far, &lt;a href="http://fluidapp.com/"&gt;fluid&lt;/a&gt; (mac only) is the best that I've seen for my needs.  It is essentially a layer on top of the webkit browser on the mac.  It has all of the basics and &lt;a href="http://fluidapp.com/developer/"&gt;much, much more&lt;/a&gt;.  It is the most configurable, almost to a fault interface-wise.  It can integrate with &lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; on the mac, which allows for desktop notification.  It has &lt;a href="http://8-p.info/greasekit/"&gt;greasekit&lt;/a&gt; support.  That opens up tons of possibilities.  That is part of the plugin support.  It also has a few themes for the UI itself.  One of the nicest features is to allow for regular expressions of which sites it allows within the SSB.  Along with that you can default to another browser for external linking.  This makes Google Reader or other web based RSS aggregator quite useful in fluid.  You can configure it to open rss feed links in the external browser in the background, so you can scan all of the new items and then go to, say, Firefox (with adblock plus) to actually read the stories.  Besides all that, it allows for tabbed browsing with the SSB if you wish.  My rating for fluid is awesome, based on a scale from 0 to awesome.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Chrome&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/chrome"&gt;Chrome &lt;/a&gt;is okay.  It is essentially a beta SSB in my mind.  It seems that currently, they're just throwing out the notion of using GMail, Google apps, etc. as their own app within Chrome on the desktop.  However, it's still pretty clunky.  There is no support for browser controls.  There is no support for modifying the URL.  There is almost no configuration of any kind.  It makes it simple in a good and bad way.  The only thing you *can* configure is where a shortcut can be placed.  I think with the competition and the resources they're putting into it, it will improve.  &lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt; is coming up and I'm thinking that they'll announce a pretty great roadmap for the browser.  Cross-platform support and plugins seem to be foremost on their minds right now though, so SSB functionality/configurability might take a little while, depending on their strategy for Chrome.  You never know with Google.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Prism&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mozilla.com/"&gt;Mozilla&lt;/a&gt; started &lt;a href="http://prism.mozilla.com/"&gt;Prism&lt;/a&gt;, then it got to version 0.9.x in the Summer of 2008, then it fell off the face of the Earth.  There was no real development again until they released version 1.0 beta recently with an updated &lt;a href="http://prism.mozilla.com/"&gt;site&lt;/a&gt;.  Since I am currently using windows and linux, the latest prism update is my option of choice.  Prism is kind of the middle ground between chrome and fluid.  It allows for some configurability and with the Firefox plugin, it allows you to create a shortcut or prism application right from Firefox.  Addons seem to be coming as there is a configuration option for them in each prism instance.  The inclusion of addons would definitely set it apart.  However currently, the list of available addons (and themes) for prism is empty.  I do like the fact that it tries to integrate well with the platform too.  You can have it minimize to the system tray on windows, leaving your task bar real estate for other things.  One other new feature that I like is the auto-update functionality.  Fluid has to update each instance individually, but it looks like prism allows for updating across all instances.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Bubbles&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bubbleshq.com/"&gt;Bubbles&lt;/a&gt; is another contender that is based on the IE engine and is therefore limited to Windows.  I don't personally like windows very much but I've found value in creating a "bubble" for Outlook Web Access.  Its main goal, it seems, is to create a variety of pre-built bubbles for things like GMail so that people can just use them.  It does a decent job and might be like a fluid for windows.  However, I don't like the IE engine and I don't like windows.  Besides that it has a central interface for your bubbles, which I don't particularly like.  Updating is always a hassle with SSBs so I can see where a centrally managed set of SSBs is nice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Others&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.apple.com/safari/features.html"&gt;Safari 4.0&lt;/a&gt; on &lt;a href="http://www.apple.com/macosx/snowleopard/"&gt;Snow Leopard&lt;/a&gt; (Mac OS 10.6) &lt;a href="http://arstechnica.com/apple/news/2008/06/safari-4-to-include-ssb-feature-and-fastest-javascript-ever.ars"&gt;supposedly&lt;/a&gt; will have SSB support, like is sort of does on the iPhone.  It will be interesting to see how Apple approaches it.  Generally I like many of their defaults, but I'm usually underwhelmed by what they provide with configurability with Safari.  Come on Apple, let's see some plugin support.&lt;br /&gt;&lt;br /&gt;I briefly also tried &lt;a href="http://mango.impactsoft.hr/default.aspx?m=screenshots"&gt;Mango SSB&lt;/a&gt;, but at that point I was kind of sick of trying new SSB engines...&lt;br /&gt;&lt;br /&gt;Anyway, it seems like an interesting space that will see quite a bit of development over the next 6-12 months.  I'm hoping that this blog entry will be quite ancient in SSB progress by then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-7515922898515715368?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/7515922898515715368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=7515922898515715368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7515922898515715368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7515922898515715368'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/05/site-specific-browsers-ssb.html' title='Site-specific browsers (SSB)'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-5794213776821964466</id><published>2009-05-05T17:30:00.004-06:00</published><updated>2009-10-23T17:20:50.485-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fusion'/><category scheme='http://www.blogger.com/atom/ns#' term='parallels'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Virtual Box</title><content type='html'>I am currently trying out &lt;a href="http://www.virtualbox.org/"&gt;Virtual Box&lt;/a&gt;.  It's an OSS virtualization product managed by Sun.&lt;br /&gt;&lt;br /&gt;I come from having used a mac these last few years and had gotten used to the warring between Parallels &lt;a href="http://www.parallels.com/products/desktop/"&gt;Desktop&lt;/a&gt; and VMWare &lt;a href="http://www.vmware.com/products/fusion/"&gt;Fusion&lt;/a&gt;.  Both of those progressed nicely over time and remind me why competition is so great for the consumer.&lt;br /&gt;&lt;br /&gt;Virtual Box takes a different approach with its open-source codebase, with the option to utilize some proprietary extensions in the closed-source version.&lt;br /&gt;&lt;br /&gt;My plan is to use it as a container for a winxp machine for testing and windows-necessary stuff like MS Office.  Currently the host for that vm is winxp too, but when the vm is ready, I'm planning to move to &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; (jaunty jackalope) as the host.&lt;br /&gt;&lt;br /&gt;So far, Virtual Box has satisfied my needs.  It has a seamless mode to sort of have the programs running in vm look like they are just programs running in the host.  It's not as elegantly done as the other two I've used in the past, but it's functional.  For example alt-tab, when in seamless mode, only switches between the vm's applications.  The Virtual Box Guest Additions provide the mouse pass-through mode so you can more easily switch between host and vm.  And from what it looks like networking and audio also appear to work (in winxp and ubuntu at least).&lt;br /&gt;&lt;br /&gt;Things I wish it had were drag-and-drop file support and a better seamless mode.  One other thing I found out from the IRC channel is that in order to move a vm from one platform to another, you need to make sure you export and import the vm.  I was used to just copying the vm file in vmware fusion at least, but that's not a frequent operation.  Features/enhancements like those may come in the future though and it's hard to argue with the price.&lt;br /&gt;&lt;br /&gt;One thing that is quite nice about virtual box though is the community.  If I have a question, I search online or I can check out the IRC channel (#virtualbox on irc.freenode.net).  I had some questions earlier and they were quite friendly and responsive (on the IRC channel).&lt;br /&gt;&lt;br /&gt;All-in-all, I am quite impressed with it thus far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-5794213776821964466?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/5794213776821964466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=5794213776821964466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5794213776821964466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/5794213776821964466'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/05/virtual-box.html' title='Virtual Box'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-7082349837141690720</id><published>2009-05-01T14:38:00.005-06:00</published><updated>2009-10-23T17:21:19.359-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlalchemy'/><title type='text'>JPA composite key craziness (vs. SQL Alchemy)</title><content type='html'>I know that a framework generally isn't designed to handle edge use cases gracefully.  The old saying goes that you make the common case fast and the rare case possible.  That often turns out to be the case for frameworks as well.&lt;br /&gt;&lt;br /&gt;I was trying to map a composite key that made up an Oracle view - two foreign keys.  The JPA is sadly very complicated with its mapping of composite keys (&lt;a href="http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e1700"&gt;hibernate doc link&lt;/a&gt;).  I heard stories around the office like, "I think XXX tried to do one of those, but then he backed out those changes." and "I did one of those once (shudder)."&lt;br /&gt;&lt;br /&gt;In response to my ranting, a python guru &lt;a href="http://spyced.blogspot.com/"&gt;friend&lt;/a&gt; of mine who works on both python code and java code regularly, told me that &lt;a href="http://www.sqlalchemy.org/"&gt;SQL Alchemy&lt;/a&gt; has had support for composite keys since version 0.1.  He said it's &lt;a href="http://www.sqlalchemy.org/docs/05/metadata.html#defining-foreign-keys"&gt;pretty simple&lt;/a&gt;...  Too bad.  Too bad the JPA standard isn't better.  However, maybe now that Oracle is buying Sun, the JPA will get a shot in the arm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-7082349837141690720?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/7082349837141690720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=7082349837141690720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7082349837141690720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/7082349837141690720'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2009/05/jpa-composite-key-craziness-vs-sql.html' title='JPA composite key craziness (vs. SQL Alchemy)'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-3584260114852659516</id><published>2008-10-01T18:19:00.002-06:00</published><updated>2009-10-23T17:22:16.845-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='sonatype'/><category scheme='http://www.blogger.com/atom/ns#' term='nexus'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Nexus</title><content type='html'>Lately, I've been reviewing &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt;, a maven repository manager for use within our company.  Previous to that, I had just been using the &lt;a href="http://maven.apache.org/ant-tasks.html"&gt;maven ant tasks&lt;/a&gt; library to install dependencies into a web accessible filesystem on our corporate network.  As I've looked at Nexus, a handful of things stood out to me as reasons why I am going to use it both as our corporate repository manager as well as a local proxy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Reliability, Performance, and Memory Usage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Previously, I had tried &lt;a href="http://archiva.apache.org/"&gt;Archiva&lt;/a&gt;.  Although it is good at what it does, it would sometimes have reliability problems.  Beyond that, with the load that we put on it and the fact that it shares the VMWare instance with Bamboo, it tended to bog things down and make the &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Bamboo&lt;/a&gt; server even less responsive than it normally is within the VM.&lt;br /&gt;&lt;br /&gt;Nexus uses less memory, appears to be more reliable, and appears to take less CPU thus far.  Granted, I haven't turned on the firehose yet, but with small tests, it appears to perform better, more reliably and with considerably less memory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Installing artifacts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using Firefox, I was able to just right-click on a repository and go to &lt;a href="http://www.sonatype.com/book/reference/repository-manager.html#sect-upload-asset-ui"&gt;upload an artifact&lt;/a&gt; to the repository, say, in the case of a third-party library that isn't available in the public repositories.  I liked how simple it was.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Groups&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure if the concept is unique to nexus, but they use &lt;a href="http://www.sonatype.com/book/reference/repository-manager.html#d0e21464"&gt;groups&lt;/a&gt; to act as a aggregation of repositories - so you can point locally to the group instead of individual repositories.  That way, everything, including public maven2 dependencies, can be resolved through the group.  It can also be partitioned into public and corporate groups or for releases and snapshots or a combination of those.  I like the fact that maven only has to point to one location though to retrieve any artifact.  It saves time when trying to resolve a third-party dependency, for example, and if it has to search a different repository location, that's an extra call over the network.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Local repository proxy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One thing suggested on the nexus IRC channel was using it as a local repository proxy.  That makes it so you can have everything public and third-party related stored in a local proxy in case you want to blow away your repository and start fresh.  It makes doing so quite fast.  Also, with IDE plugins, it speeds up the checking for updates considerably.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Installation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Though they are currently looking into making it available as a separate war file, it is currently installed as a complete server, using the &lt;a href="http://www.mortbay.org/jetty/"&gt;jetty&lt;/a&gt; server underneath.  The actual repository and all configuration is done separate from the server directory for easy upgrading.  I appreciated that since often upgrades for things like &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; get a little dicey with the default configuration in place (e.g. webapps, server.xml, etc.).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Besides the nice ajaxy interface, I really like nexus as it feels complete, even though it's just at version 1.0.2 last I checked.  Sonatype has done a good job with it thus far.  I'm looking forward to pushing it live on our corporate network within the next couple of days.&lt;br /&gt;&lt;br /&gt;See also: the great (completely unrelated) board game &lt;a href="http://www.boardgamegeek.com/game/15363"&gt;Nexus Ops&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-3584260114852659516?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/3584260114852659516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=3584260114852659516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3584260114852659516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3584260114852659516'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2008/10/nexus.html' title='Nexus'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5430164083972077839.post-3892002036281555530</id><published>2008-04-13T20:34:00.001-06:00</published><updated>2009-10-23T17:22:08.652-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Hope for Maven 2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Maven 2 Is Getting There&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To me a build tool needs to just work.  There are *enough* build problems outside of the actual tools one chooses - that is with the actual software being built. &lt;a href="http://ant.apache.org/"&gt; ant&lt;/a&gt; works. &lt;a href="http://www.gnu.org/software/make/"&gt; make&lt;/a&gt; works. &lt;a href="http://maven.apache.org/"&gt; maven&lt;/a&gt; works... most of the time.  It's a complicated tool and it's getting better, but it does have its idiosyncrasies.&lt;br /&gt;&lt;br /&gt;For example, I remember &lt;a href="http://java.dzone.com/news/don-brown-fixing-maven-2"&gt;reading&lt;/a&gt; a little while back how someone was working on some patches to "make [maven 2] not suck," like to use an asynchronous dependency downloader.  The author was the one implementing the downloader patches.  It's nice to see a problem and contribute to its solution.  I can see this helping tremendously with build times as the tool often checks for updates from repositories.&lt;br /&gt;&lt;br /&gt;Another example is the fact that every once in a while local build repositories inexplicably get corrupted. Often, the solution is to simply delete the it and start fresh, but it's frustrating to have to download several megabytes of libraries again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hope&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It appears that the patches will be available with version 2.1.0 of maven.  As of 1 October, 2008, it is in the RC1 stage before release.&lt;br /&gt;&lt;br /&gt;I'm hopeful also that &lt;a href="http://m2eclipse.codehaus.org/"&gt;m2eclipse&lt;/a&gt; (m2e) and &lt;a href="http://code.google.com/p/q4e/"&gt;q4e&lt;/a&gt; will be able to help out with &lt;a href="http://maven.apache.org/eclipse-plugin.html"&gt;eclipse integration&lt;/a&gt;.  m2e is in &lt;a href="http://www.eclipse.org/m2e/"&gt;incubation&lt;/a&gt; to become part of eclipse and is quite mature.  q4e is also in &lt;a href="http://www.eclipse.org/projects/project_summary.php?projectid=technology.iam"&gt;incubation&lt;/a&gt; with eclipse, though it won't be out in full glory until sometime next year, according to the latest projections.&lt;br /&gt;&lt;br /&gt;Overall maven 2 has an active community both in use and development, so hopefully the kinks will get worked out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5430164083972077839-3892002036281555530?l=jeromatron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeromatron.blogspot.com/feeds/3892002036281555530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5430164083972077839&amp;postID=3892002036281555530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3892002036281555530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5430164083972077839/posts/default/3892002036281555530'/><link rel='alternate' type='text/html' href='http://jeromatron.blogspot.com/2008/04/hope-for-maven-2.html' title='Hope for Maven 2'/><author><name>jeremy</name><uri>http://www.blogger.com/profile/03922781110155059528</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
