<?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:blogger='http://schemas.google.com/blogger/2008' 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-7022592537325150312</id><updated>2024-09-27T23:33:39.952-05:00</updated><category term="Groovy"/><category term="Scalability"/><category term="XmlSlurper"/><category term="Cluster"/><category term="HTTP response code: 503"/><category term="Mongo"/><category term="MongoDB"/><category term="Screen-Scraping"/><category term="TagSoup"/><category term="Web Development"/><category term="XML"/><category term="XmlParser"/><title type='text'>About Nothing</title><subtitle type='html'>A blog (mostly) about nothing by a software engineer that loves to spend time with his family, golf, run, play hockey and discuss all things related to science, politics and our civilization.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-5715972792151642076</id><published>2014-10-10T16:16:00.005-05:00</published><updated>2014-10-11T06:48:23.981-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cluster"/><category scheme="http://www.blogger.com/atom/ns#" term="Mongo"/><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><category scheme="http://www.blogger.com/atom/ns#" term="Scalability"/><title type='text'>Setting Up a MongoDB Cluster</title><content type='html'>I recently setup a &lt;a href=&quot;http://www.mongodb.org/&quot; target=&quot;_blank&quot;&gt;MongoDB&lt;/a&gt;&amp;nbsp;cluster on my workstation. &amp;nbsp;While the Mongo documentation is very good, the proper setup is scattered between the &lt;a href=&quot;http://docs.mongodb.org/manual/core/replication-introduction/&quot; target=&quot;_blank&quot;&gt;Replication&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;http://docs.mongodb.org/manual/core/sharding-introduction/&quot; target=&quot;_blank&quot;&gt;Sharding&lt;/a&gt;&amp;nbsp;documentation. &amp;nbsp;I figured this might be helpful to others working with Mongo for the first time. &amp;nbsp;Obviously this is not a valid production setup! &amp;nbsp;For this, you&#39;d need to place the replication sets, shard servers and config servers on separate machines.&lt;br /&gt;
&lt;br /&gt;
The commands rs.help() and sh.help() come in handy along the way. &amp;nbsp;Additional useful commands include rs.status(), rs.printReplicationInfo(), rs.printSlaveReplicationInfo(), sh.status(), and db.{$collection-name}.getShardDistribution().&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Config Server Setup for 3 Nodes&lt;/b&gt;&lt;br /&gt;
1. Create a data directory for each of the three config server nodes.&lt;br /&gt;
mkdir c:\data\cluster\config\node1&lt;br /&gt;
mkdir c:\data\cluster\config\node2&lt;br /&gt;
mkdir c:\data\cluster\config\node3&lt;br /&gt;
&lt;br /&gt;
2. Start the 3 config server nodes.&lt;br /&gt;
mongod --configsvr --dbpath c:\data\cluster\config\node1 --bind_ip ${machine-name} --port 27020&lt;br /&gt;
mongod --configsvr --dbpath c:\data\cluster\config\node2 --bind_ip ${machine-name} --port 27021&lt;br /&gt;
mongod --configsvr --dbpath c:\data\cluster\config\node3 --bind_ip ${machine-name} --port 27022&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Start 2 MongoDB Shard Servers (mongos) Used By Client Apps&lt;/b&gt;&lt;br /&gt;
1. Start the 2 mongos instances.&lt;br /&gt;
mongos --configdb ${machine-name}:27020,${machine-name}:27021,${machine-name}:27022 --port 27017&lt;br /&gt;
mongos --configdb ${machine-name}:27020,${machine-name}:27021,${machine-name}:27022 --port 27018&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Replication Set (RS) and Shard Setup for Shard 1 &lt;/b&gt;&lt;br /&gt;
1. Create the data directory for each node.&lt;br /&gt;
mkdir c:\data\cluster\node1&lt;br /&gt;
mkdir c:\data\cluster\node2&lt;br /&gt;
mkdir c:\data\cluster\node3&lt;br /&gt;
&lt;br /&gt;
2. Start the 3 nodes.&lt;br /&gt;
mongod --dbpath c:\data\cluster\node1 --bind_ip ${machine-name} --port 27000 --replSet &quot;rs1&quot;&lt;br /&gt;
mongod --dbpath c:\data\cluster\node2 --bind_ip ${machine-name} --port 27001 --replSet &quot;rs1&quot;&lt;br /&gt;
mongod --dbpath c:\data\cluster\node3 --bind_ip ${machine-name} --port 27002 --replSet &quot;rs1&quot;&lt;br /&gt;
&lt;br /&gt;
3. Connect to one of the nodes.&lt;br /&gt;
mongo --host ${machine-name} --port 27000&lt;br /&gt;
&lt;br /&gt;
4. Create the replication set.&lt;br /&gt;
rs.initiate()&lt;br /&gt;
&lt;br /&gt;
5. Add the second node to the replication set.&lt;br /&gt;
rs.add(&quot;${machine-name}:27001&quot;)&lt;br /&gt;
&lt;br /&gt;
6. Add the third node to the replication set.&lt;br /&gt;
rs.add(&quot;${machine-name}:27002&quot;)&lt;br /&gt;
&lt;br /&gt;
7. Validate your replication setup. &amp;nbsp;You should see JSON output with a single PRIMARY and two SECONDARY records.&lt;br /&gt;
rs1:PRIMARY&amp;gt; rs.status()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;set&quot; : &quot;rs1&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;date&quot; : ISODate(&quot;2014-10-10T20:44:52Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;myState&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;members&quot; : [&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 0,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot; : &quot;l7a973:27000&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;health&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;state&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;stateStr&quot; : &quot;PRIMARY&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;uptime&quot; : 1989,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optime&quot; : Timestamp(1412972013, 1),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optimeDate&quot; : ISODate(&quot;2014-10-10T20:13:33Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;electionTime&quot; : Timestamp(1412971998, 2),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;electionDate&quot; : ISODate(&quot;2014-10-10T20:13:18Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;self&quot; : true&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot; : &quot;l7a973:27001&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;health&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;state&quot; : 2,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;stateStr&quot; : &quot;SECONDARY&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;uptime&quot; : 1882,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optime&quot; : Timestamp(1412972013, 1),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optimeDate&quot; : ISODate(&quot;2014-10-10T20:13:33Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeat&quot; : ISODate(&quot;2014-10-10T20:44:50Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeatRecv&quot; : ISODate(&quot;2014-10-10T20:44:51Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;pingMs&quot; : 0,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;syncingTo&quot; : &quot;l7a973:27000&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 2,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot; : &quot;l7a973:27002&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;health&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;state&quot; : 2,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;stateStr&quot; : &quot;SECONDARY&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;uptime&quot; : 1879,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optime&quot; : Timestamp(1412972013, 1),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optimeDate&quot; : ISODate(&quot;2014-10-10T20:13:33Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeat&quot; : ISODate(&quot;2014-10-10T20:44:51Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeatRecv&quot; : ISODate(&quot;2014-10-10T20:44:50Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;pingMs&quot; : 0,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;syncingTo&quot; : &quot;l7a973:27000&quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;ok&quot; : 1&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
8. &amp;nbsp;Connect to one of the shard servers (mongos).&lt;br /&gt;
mongo --host&amp;nbsp;${machine-name}&amp;nbsp;--port 27017&lt;br /&gt;
&lt;br /&gt;
9. Add the replication set to the shard.&lt;br /&gt;
sh.addShard(&quot;rs1/${machine-name}:27000&quot;)&lt;br /&gt;
&lt;br /&gt;
10. Enable sharding for the database (I&#39;m using &quot;ngi&quot; for my database name).&lt;br /&gt;
sh.enableSharding(&quot;${database-name}&quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Replication Set (RS) and Shard Setup for Shard 2&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
1. Create the data directory for each node.&lt;br /&gt;
mkdir c:\data\cluster\node4&lt;br /&gt;
mkdir c:\data\cluster\node5&lt;br /&gt;
mkdir c:\data\cluster\node6&lt;br /&gt;
&lt;br /&gt;
2. Start the 3 nodes.&lt;br /&gt;
mongod --dbpath c:\data\cluster\node4 --bind_ip&amp;nbsp;${machine-name}&amp;nbsp;--port 27010 --replSet &quot;rs2&quot;&lt;br /&gt;
mongod --dbpath c:\data\cluster\node5 --bind_ip&amp;nbsp;${machine-name}&amp;nbsp;--port 27011 --replSet &quot;rs2&quot;&lt;br /&gt;
mongod --dbpath c:\data\cluster\node6 --bind_ip&amp;nbsp;${machine-name}&amp;nbsp;--port 27012 --replSet &quot;rs2&quot;&lt;br /&gt;
&lt;br /&gt;
3. Connect to one of the nodes.&lt;br /&gt;
mongo --host&amp;nbsp;${machine-name}&amp;nbsp;--port 27010&lt;br /&gt;
&lt;br /&gt;
4. Create the replication set.&lt;br /&gt;
rs.initiate()&lt;br /&gt;
&lt;br /&gt;
5. Add the second node to the replication set.&lt;br /&gt;
rs.add(&quot;${machine-name}:27011&quot;)&lt;br /&gt;
&lt;br /&gt;
6. Add the third node to the replication set.&lt;br /&gt;
rs.add(&quot;${machine-name}:27012&quot;)&lt;br /&gt;
&lt;br /&gt;
7. Validate your replication setup. &amp;nbsp;You should see JSON output with a single PRIMARY and two SECONDARY records.&lt;br /&gt;
rs2:PRIMARY&amp;gt; rs.status()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;set&quot; : &quot;rs2&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;date&quot; : ISODate(&quot;2014-10-10T20:46:15Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;myState&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;members&quot; : [&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 0,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot; : &quot;l7a973:27010&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;health&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;state&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;stateStr&quot; : &quot;PRIMARY&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;uptime&quot; : 1642,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optime&quot; : Timestamp(1412973972, 1),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optimeDate&quot; : ISODate(&quot;2014-10-10T20:46:12Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;electionTime&quot; : Timestamp(1412972423, 2),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;electionDate&quot; : ISODate(&quot;2014-10-10T20:20:23Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;self&quot; : true&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot; : &quot;l7a973:27011&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;health&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;state&quot; : 5,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;stateStr&quot; : &quot;STARTUP2&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;uptime&quot; : 7,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optime&quot; : Timestamp(0, 0),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optimeDate&quot; : ISODate(&quot;1970-01-01T00:00:00Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeat&quot; : ISODate(&quot;2014-10-10T20:46:14Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeatRecv&quot; : ISODate(&quot;2014-10-10T20:46:13Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;pingMs&quot; : 0&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 2,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;name&quot; : &quot;l7a973:27012&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;health&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;state&quot; : 5,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;stateStr&quot; : &quot;STARTUP2&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;uptime&quot; : 3,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optime&quot; : Timestamp(0, 0),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;optimeDate&quot; : ISODate(&quot;1970-01-01T00:00:00Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeat&quot; : ISODate(&quot;2014-10-10T20:46:14Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;lastHeartbeatRecv&quot; : ISODate(&quot;2014-10-10T20:46:14Z&quot;),&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;pingMs&quot; : 0&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ],&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;ok&quot; : 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
8. &amp;nbsp;Connect to one of the shard servers (mongos)&lt;br /&gt;
mongo --host&amp;nbsp;${machine-name}&amp;nbsp;--port 27017&lt;br /&gt;
&lt;br /&gt;
9. Add the replication set to the shard.&lt;br /&gt;
mongos&amp;gt;sh.addShard(&quot;rs2/${machine-name}:27010&quot;)&lt;br /&gt;
&lt;br /&gt;
10. Validate your setup. &amp;nbsp;You should see JSON output with a single PRIMARY and two SECONDARY records.&lt;br /&gt;
mongos&amp;gt; sh.status()&lt;br /&gt;
--- Sharding Status ---&lt;br /&gt;
&amp;nbsp; sharding version: {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;_id&quot; : 1,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;version&quot; : 4,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;minCompatibleVersion&quot; : 4,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;currentVersion&quot; : 5,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;clusterId&quot; : ObjectId(&quot;54383c1cc3b7bde946a478cf&quot;)&lt;br /&gt;
}&lt;br /&gt;
&amp;nbsp; shards:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp;&quot;_id&quot; : &quot;rs1&quot;, &amp;nbsp;&quot;host&quot; : &quot;rs1/l7a973:27000,l7a973:27001,l7a973:27002&quot; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp;&quot;_id&quot; : &quot;rs2&quot;, &amp;nbsp;&quot;host&quot; : &quot;rs2/l7a973:27010,l7a973:27011,l7a973:27012&quot; }&lt;br /&gt;
&amp;nbsp; databases:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp;&quot;_id&quot; : &quot;admin&quot;, &amp;nbsp;&quot;partitioned&quot; : false, &amp;nbsp;&quot;primary&quot; : &quot;config&quot; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp;&quot;_id&quot; : &quot;ngi&quot;, &amp;nbsp;&quot;partitioned&quot; : true, &amp;nbsp;&quot;primary&quot; : &quot;rs1&quot; }&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Add Some Test Data and Validate the Distribution&lt;/b&gt;&lt;br /&gt;
1. &amp;nbsp;Connect to one of the shard servers (mongos)&lt;br /&gt;
mongo --host&amp;nbsp;${machine-name}&amp;nbsp;--port 27017&lt;br /&gt;
&lt;br /&gt;
2. Switch to your database.&lt;br /&gt;
mongos&amp;gt;use ${database-name}&lt;br /&gt;
&lt;br /&gt;
3. Add 100,000 test data records.&lt;br /&gt;
mongos&amp;gt; for(var i=1; i&amp;lt;=100000; i++) { db.mycollection.insert({x:i}) }&lt;br /&gt;
&lt;br /&gt;
4. Shard the collection based on the id. &amp;nbsp;Remember that &quot;ngi&quot; is my database name.&lt;br /&gt;
mongos&amp;gt; sh.shardCollection(&quot;ngi.mycollection&quot;, {_id: 1})&lt;br /&gt;
{ &quot;collectionsharded&quot; : &quot;ngi.mycollection&quot;, &quot;ok&quot; : 1 }&lt;br /&gt;
&lt;br /&gt;
5. Validate that the collection is sharded&lt;br /&gt;
mongos&amp;gt; db.mycollection.getShardDistribution()&lt;br /&gt;
&lt;br /&gt;
Shard rs1 at rs1/l7a973:27000,l7a973:27001,l7a973:27002&lt;br /&gt;
&amp;nbsp;data : 602KiB docs : 12860 chunks : 1&lt;br /&gt;
&amp;nbsp;estimated data per chunk : 602KiB&lt;br /&gt;
&amp;nbsp;estimated docs per chunk : 12860&lt;br /&gt;
&lt;br /&gt;
Shard rs2 at rs2/l7a973:27010,l7a973:27011,l7a973:27012&lt;br /&gt;
&amp;nbsp;data : 3.98MiB docs : 87140 chunks : 2&lt;br /&gt;
&amp;nbsp;estimated data per chunk : 1.99MiB&lt;br /&gt;
&amp;nbsp;estimated docs per chunk : 43570&lt;br /&gt;
&lt;br /&gt;
Totals&lt;br /&gt;
&amp;nbsp;data : 4.57MiB docs : 100000 chunks : 3&lt;br /&gt;
&amp;nbsp;Shard rs1 contains 12.86% data, 12.86% docs in cluster, avg obj size on shard : 48B&lt;br /&gt;
&amp;nbsp;Shard rs2 contains 87.13% data, 87.14% docs in cluster, avg obj size on shard : 48B</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/5715972792151642076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/5715972792151642076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/5715972792151642076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/5715972792151642076'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2014/10/setting-up-mongodb-cluster.html' title='Setting Up a MongoDB Cluster'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-1512995888286825616</id><published>2012-10-30T16:28:00.001-05:00</published><updated>2012-10-30T16:30:40.925-05:00</updated><title type='text'>The Future of Analytics and Business Intelligence</title><content type='html'>Been excitedly waiting to see what comes from Numenta since ~2006.  Can&#39;t wait to see what&#39;s next. If I could go work for them tomorrow I would.

&lt;a href=&quot;http://youtu.be/A8sHMcCk0lU&quot;&gt;Can&#39;t wait to see what Hawkins is talking about 20 years from now.&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/1512995888286825616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/1512995888286825616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1512995888286825616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1512995888286825616'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2012/10/the-future-of-analytics-and-business.html' title='The Future of Analytics and Business Intelligence'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-6998417949054565555</id><published>2012-10-30T16:14:00.001-05:00</published><updated>2012-10-30T16:14:37.455-05:00</updated><title type='text'>Clojure!</title><content type='html'>Spent some time looking at &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt; today.  Definitely mind-bending given I&#39;ve never worked with a Lisp dialect. Downloaded and walked trough the examples on the site. I will definitely be taking a deeper dive if nothing more than to help diversify my perspective. I&#39;m interested in learning more including ClojureScript.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/6998417949054565555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/6998417949054565555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/6998417949054565555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/6998417949054565555'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2012/10/clojure.html' title='Clojure!'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-426353484581759885</id><published>2012-07-18T22:45:00.003-05:00</published><updated>2012-07-18T22:50:43.298-05:00</updated><title type='text'>Habitat for Humanity</title><content type='html'>I spent the day yesterday with 15 co-workers helping to build a Habitat for Humanity house.  It was fun, felt good and was less stressful than work. We spent the day putting siding on the house. I enjoyed challenging my fear of heights standing on scaffolding at the peak of the roof while using a nail gun.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/426353484581759885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/426353484581759885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/426353484581759885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/426353484581759885'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2012/07/habitat-for-humanity.html' title='Habitat for Humanity'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-7250072221110456246</id><published>2009-12-29T08:43:00.003-06:00</published><updated>2014-10-11T07:37:05.208-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="Screen-Scraping"/><category scheme="http://www.blogger.com/atom/ns#" term="TagSoup"/><category scheme="http://www.blogger.com/atom/ns#" term="XmlSlurper"/><title type='text'>HTML Parsing With Groovy and TagSoup</title><content type='html'>I&#39;m working on an app where I need to parse some HTML.  This is the first time I&#39;ve had to do screen-scraping with Groovy.  After a bit of trial and error I think I&#39;m getting the hang of it. The HTML I&#39;m working with isn&#39;t well-formed, so the default Groovy XmlSlurper and XmlParser puke. After some digging I found &lt;a href=&quot;http://home.ccil.org/~cowan/XML/tagsoup/&quot; target=&quot;_new&quot;&gt;TagSoup&lt;/a&gt;. It &quot;parses HTML as it is found in the wild: poor, nasty and brutish, though quite often far from short&quot;.&lt;br /&gt;
&lt;br /&gt;
It made my parsing much easier. Thanks John Cowan!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/7250072221110456246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/7250072221110456246' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7250072221110456246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7250072221110456246'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/12/html-parsing-with-groovy-and-tagsoup.html' title='HTML Parsing With Groovy and TagSoup'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-4229129759309047750</id><published>2009-12-29T05:38:00.008-06:00</published><updated>2009-12-29T05:58:04.834-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP response code: 503"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><category scheme="http://www.blogger.com/atom/ns#" term="XmlParser"/><category scheme="http://www.blogger.com/atom/ns#" term="XmlSlurper"/><title type='text'>Groovy XmlSlurper and HTTP 503 Response Code</title><content type='html'>I struggled a bit  when trying to parse some XHTML with Groovy&#39;s XmlSlurper (and XmlParser).  I was receiving the following:&lt;br /&gt;&lt;br /&gt;Caught: java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;br /&gt;&lt;br /&gt;It turns out that &lt;a target=&quot;_new&quot; href=&quot;http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic&quot;&gt;the guys from W3C got sick of dealing with the excessive traffic for their DTDs&lt;/a&gt;. So now they return a Service Unavailable (HTTP 503) if they detect parser requests.&lt;br /&gt;&lt;br /&gt;To solve the problem I had to set the loading of external DTDs to false.  Here&#39;s the code.&lt;br /&gt;&lt;br /&gt;def slurper = new XmlSlurper()&lt;br /&gt;slurper.setFeature(&quot;http://apache.org/xml/features/nonvalidating/load-external-dtd&quot;, false)&lt;br /&gt;def results = slurper.parseText(htmlResponse)&lt;br /&gt;&lt;br /&gt;Googling for the answer wasn&#39;t extremely helpful. &lt;a target=&quot;_new&quot; href=&quot;http://kanemu1117nc.blogspot.com/2009/10/xmlslurper.html&quot;&gt;This blog post helped (I think it&#39;s in Japanese)&lt;/a&gt;.  &lt;a target=&quot;_new&quot; href=&quot;http://blog.sweetxml.org/2009/08/resolving-xhtml1-dtd-locally-avoiding.html&quot;&gt;This post also helped&lt;/a&gt;.  Thanks guys!&lt;br /&gt;&lt;br /&gt;I decided to re-post the solution since it took me awhile googling for the answer.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/4229129759309047750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/4229129759309047750' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/4229129759309047750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/4229129759309047750'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/12/groovy-xmlslurper.html' title='Groovy XmlSlurper and HTTP 503 Response Code'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-3749268150853878720</id><published>2009-12-27T06:30:00.004-06:00</published><updated>2009-12-27T06:32:22.244-06:00</updated><title type='text'>The Science of Avatar</title><content type='html'>An interesting read on the &lt;a target=&quot;_new&quot; href=&quot;http://www.aintitcool.com/node/43440?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+google%2FYRZh+%28Raj%27s+shared+items+in+Google+Reader%29&quot;&gt;science of Avatar&lt;/a&gt;. I still haven&#39;t seen the movie; just too much going on with the holidays.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/3749268150853878720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/3749268150853878720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/3749268150853878720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/3749268150853878720'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/12/science-of-avatar.html' title='The Science of Avatar'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-1338426007127530450</id><published>2009-12-08T06:32:00.004-06:00</published><updated>2009-12-08T06:39:25.796-06:00</updated><title type='text'>(Near) Real-Time Analytics</title><content type='html'>At my new gig, I&#39;ve been asking whether the team has considered the possibility of using map/reduce or a similar grid-based solution to conduct our analytics in (near) real-time.  Interestingly enough, I ran across &lt;a href=&quot;http://natishalom.typepad.com/nati_shaloms_blog/2009/10/how-mapreduce-and-the-cloud-are-affecting-analytics-applications.html&quot; target=&quot;_blank&quot;&gt;Nati Shalom&#39;s post on real-time analytics&lt;/a&gt; yesterday.  This should help give me some ammunition to convince everyone that we need to move in this direction for the solution we&#39;re building.  Thanks Nati!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/1338426007127530450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/1338426007127530450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1338426007127530450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1338426007127530450'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/12/near-real-time-analytics.html' title='(Near) Real-Time Analytics'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-7865621772983677533</id><published>2009-12-08T06:16:00.003-06:00</published><updated>2009-12-08T06:39:51.770-06:00</updated><title type='text'>A Feast for Crows</title><content type='html'>I just finished re-reading George R. R. Martin&#39;s &lt;a href=&quot;http://en.wikipedia.org/wiki/A_Feast_for_Crows&quot; target=&quot;_new&quot;&gt;A Feast for Crows&lt;/a&gt;. I enjoyed it more than the first time I read it. My favorite still continues to be A Storm of Swords.  Now if he&#39;d just publish A Dance with Dragons!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/7865621772983677533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/7865621772983677533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7865621772983677533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7865621772983677533'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/12/feast-for-crows.html' title='A Feast for Crows'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-6421058446031724619</id><published>2009-05-13T06:45:00.003-05:00</published><updated>2009-05-13T06:50:28.688-05:00</updated><title type='text'>The Definitive Guide to Grails</title><content type='html'>I finished up The Definitive Guide to Grails close to a month ago, but I forgot to blog about it (I&#39;m using my blog to help keep track of which books I&#39;ve read). It was an excellent read. I&#39;m sold on Groovy and Grails, particularly for Java shops. Given the recent SpringSource purchase of G2One, I expect Groovy and Grails to gain much wider adoption in the enterprise.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/6421058446031724619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/6421058446031724619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/6421058446031724619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/6421058446031724619'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/05/definitive-guide-to-grails.html' title='The Definitive Guide to Grails'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-5227956008091449728</id><published>2009-03-22T05:58:00.003-05:00</published><updated>2009-03-22T06:03:03.389-05:00</updated><title type='text'>The Productive Programmer</title><content type='html'>I just finished up &lt;a href=&quot;http://oreilly.com/catalog/9780596519780/&quot; target=&quot;_new&quot;&gt;The Productive Programmer&lt;/a&gt; by &lt;a href=&quot;http://nealford.com/&quot; target=&quot;_new&quot;&gt;Neal Ford&lt;/a&gt;.  It was so good I decided to buy my own copy.  It definitely made me realize how much more efficient I can make myself.  There are a ton of tips for both Mac and Windows.  One of the major themes was automate everything you can.  Thanks Neal!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/5227956008091449728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/5227956008091449728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/5227956008091449728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/5227956008091449728'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/03/productive-programmer.html' title='The Productive Programmer'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-7213309117019107601</id><published>2009-03-13T15:15:00.007-05:00</published><updated>2009-03-14T05:19:58.939-05:00</updated><title type='text'>No Fluff Just Stuff</title><content type='html'>Today is the first day of the &lt;a href=&quot;http://www.nofluffjuststuff.com/show_view.jsp?showId=81&quot; target=&quot;_new&quot;&gt;Twin Cities Software Symposium&lt;/a&gt;.  The first talk I attended was REST: Information Driven Architectures for the 21st Century by &lt;a href=&quot;http://www.nofluffjuststuff.com/conference/speaker/brian_sletten.html&quot; target=&quot;_new&quot;&gt;Brian Sletten&lt;/a&gt;.  Very informative.  Definitely not an introductory REST talk.  I&#39;m curious to hear Brian&#39;s Semantic SOA talk later today.  A couple things that stuck included &lt;a href=&quot;http://www.postel.org/postel.html&quot; target=&quot;_new&quot;&gt;Jon Postel&#39;s&lt;/a&gt; &lt;span style=&quot;font-style:italic;&quot;&gt;&quot;Be liberal in what you accept, and conservative in what you send.&quot;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;A couple of things Brian talked about that sound like they&#39;re worth investigating include &lt;a href=&quot;http://www.sinatrarb.com/&quot; target=&quot;_new&quot;&gt;Sinatra&lt;/a&gt;, a DSL for building web applications in Ruby and &lt;a href=&quot;http://labs.systemone.at/retrievr/&quot; target=&quot;_new&quot;&gt;retrievr&lt;/a&gt;, which lets you find &lt;a href=&quot;http://www.flickr.com/&quot;&gt;Flickr&lt;/a&gt; photos by creating a sketch of what you&#39;re after.&lt;br /&gt;&lt;br /&gt;Brian&#39;s new gig sounds pretty cool: &lt;a href=&quot;http://leagueoflegends.com/&quot; target=&quot;_new&quot;&gt;League of Legends&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/7213309117019107601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/7213309117019107601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7213309117019107601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7213309117019107601'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/03/no-fluff-just-stuff.html' title='No Fluff Just Stuff'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-8987789242019314258</id><published>2009-03-01T06:05:00.002-06:00</published><updated>2009-03-01T06:10:43.073-06:00</updated><title type='text'>Einstein</title><content type='html'>I recently finished reading &lt;a href=&quot;http://www.amazon.com/Einstein-Life-Universe-Walter-Isaacson/dp/0743264746/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1235909205&amp;sr=1-1&quot; target=&quot;_new&quot;&gt;Einstein: His Life and Universe&lt;/a&gt;, a biography by Walter Isaacson.  I enjoyed it very much.  It gave excellent insight into the man.  The most interesting thing to me was that even though he was brilliant, he struggled with things in his everyday life just like everyone else.  His family life wasn&#39;t perfect and neither were many other aspects of his life.  I love the fact he was a non-conformist not only in science, but in political affairs as well.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/8987789242019314258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/8987789242019314258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/8987789242019314258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/8987789242019314258'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/03/einstein.html' title='Einstein'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-1886251589528449684</id><published>2009-02-14T17:04:00.008-06:00</published><updated>2009-02-14T18:05:30.159-06:00</updated><title type='text'>Crystal Clear</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.amazon.com/Crystal-Clear-Human-Powered-Methodology-Development/dp/0201699478&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 80px; height: 90px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGITmjFo-Jpas7m-pnskZjJPlTfkKmUFh-AcJZAXrtrHPzCvibRngq3w_JN4DtWb7_yUs8pO7j2KMhWtBXhsJtfZ_6T3vg2cihIJ3WLaAZ5qyiWeg9DBtX9n-E6DbObxxfQ33lStR1vDgF/s200/crystalclear.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5302807959810760546&quot; /&gt;&lt;/a&gt;&lt;br /&gt;I just finished up &lt;a href=&quot;http://www.amazon.com/Crystal-Clear-Human-Powered-Methodology-Development/dp/0201699478&quot; target=&quot;_new&quot;&gt;Crystal Clear&lt;/a&gt; by &lt;a href=&quot;http://alistair.cockburn.us/&quot; target=&quot;_new&quot;&gt;Alistair Cockburn&lt;/a&gt;.  A very good book, but it was a stretch to get it to 300 pages. The first chapter threw me for a loop the way it was structured and the last chapter, a case study, was a dud. While the team size for Crystal should be 8 or less, a case study with 1.5 developers doesn&#39;t sound like a very good case study. However, the chapters in between were excellent. Cockburn admittedly structured each chapter differently attempting to cater to different readers. It gave me some insights into how a successful team should interact and was very complementary to the other Agile documentation that I&#39;ve seen. I definitely liked his guidance on Walking Skeleton and Incremental Re-architecture. It helped me reinforce the concept of an Architectural Slice that I&#39;ve been conveying to the folks on the large Java project that I&#39;m currently working on.&lt;br /&gt;&lt;br /&gt;Kudos to Andy Miller for recommending this book!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/1886251589528449684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/1886251589528449684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1886251589528449684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1886251589528449684'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/02/crystal-clear.html' title='Crystal Clear'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGITmjFo-Jpas7m-pnskZjJPlTfkKmUFh-AcJZAXrtrHPzCvibRngq3w_JN4DtWb7_yUs8pO7j2KMhWtBXhsJtfZ_6T3vg2cihIJ3WLaAZ5qyiWeg9DBtX9n-E6DbObxxfQ33lStR1vDgF/s72-c/crystalclear.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-3768187264347505352</id><published>2009-02-14T09:13:00.003-06:00</published><updated>2009-02-14T09:36:54.716-06:00</updated><title type='text'>Shipped It!</title><content type='html'>&lt;a href=&quot;http://www.jaredrichardson.net/&quot; target=&quot;_new&quot;&gt;Jared Richardson&lt;/a&gt; of &lt;a href=&quot;http://www.pragprog.com/titles/prj/ship-it&quot; target=&quot;_new&quot;&gt;Ship It!&lt;/a&gt; fame spoke at the &lt;a href=&quot;http://www.intertech.com/UserGroups/JavaUserGroup.aspx&quot; target=&quot;_new&quot;&gt;TCJUG&lt;/a&gt; on Monday.  His topic was your career.  He started out a bit slow, but the pace picked up as his presentation progressed.  I think most folks got quite a bit out of it, but it reminded me of several presentations I had seen before.  Particularly there was some overlap with a presentation I went to several years ago by Dave Thomas at NFJS Denver.  Dave&#39;s theme was about investing in your career.  That was the first time I heard Dave&#39;s infamous &quot;Herding Racehorses and Racing Sheep&quot;.&lt;br /&gt;&lt;br /&gt;I did learn some new stuff at Jared&#39;s presentation.  In particular I learned about &lt;a href=&quot;http://qik.com&quot; target=&quot;_new&quot;&gt;qik&lt;/a&gt;, which looks pretty cool.  It allows you to share a live video feed from your phone; Jared had someone in the audience do the live feed to qik using Jared&#39;s iPhone.  I liked Jared&#39;s acronym for public speaking (L)ock eyes, (I)ntonation, (P)ause as well.  This will definitely come in handy for me in the future.&lt;br /&gt;&lt;br /&gt;The part that surprised me the most was how few people in the audience new about Blogs and Feed Readers.  Another shocker was how few people had heard of &lt;a href=&quot;http://www.pragprog.com/titles/tpp/the-pragmatic-programmer&quot; target=&quot;_new&quot;&gt;The Pragmatic Programmer&lt;/a&gt;.  Maybe people were just too lazy to raise their hands.  If not, c&#39;mon TCJUG attendees!  &lt;br /&gt;&lt;br /&gt;Thanks for flying all the way to Minnesota to enlighten us Jared!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/3768187264347505352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/3768187264347505352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/3768187264347505352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/3768187264347505352'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/02/shipped-it.html' title='Shipped It!'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-1932698094555169342</id><published>2009-01-31T06:19:00.007-06:00</published><updated>2009-01-31T08:20:12.276-06:00</updated><title type='text'>Groovy Encapsulation - Say What?</title><content type='html'>I&#39;m reading &lt;a href=&quot;http://www.pragprog.com/titles/sdgrvr/groovy-recipes&quot; target=&quot;_new&quot;&gt;Groovy Recipes&lt;/a&gt; by &lt;a href=&quot;http://thirstyhead.com/&quot; target=&quot;_new&quot;&gt;Scott Davis&lt;/a&gt; and find this troubling:&lt;br /&gt;&lt;br /&gt;class Book3{ &lt;br /&gt;  private String title &lt;br /&gt;  private String getTitle(){} &lt;br /&gt;  private void setTitle(title){} &lt;br /&gt;} &lt;br /&gt;def b3 = new Book3() &lt;br /&gt;b3.@title = &quot;Groovy Recipes&quot; &lt;br /&gt;println b3.@title &lt;br /&gt;===&gt; Groovy Recipes &lt;br /&gt;&lt;br /&gt;In Groovy, private attributes can be modified, even if you use private setters.  That&#39;s not cool.  I&#39;m hoping there&#39;s some way to enforce encapsulation, but it&#39;s not looking good right now.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/1932698094555169342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/1932698094555169342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1932698094555169342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1932698094555169342'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/01/groovy-encapsulation-say-what.html' title='Groovy Encapsulation - Say What?'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-3621976251951661936</id><published>2009-01-25T06:52:00.001-06:00</published><updated>2009-01-25T10:15:58.689-06:00</updated><title type='text'>Groovy!</title><content type='html'>I just finished up &lt;a href=&quot;http://www.infoq.com/minibooks/grails&quot; target=&quot;_new&quot;&gt;Getting Started with Grails&lt;/a&gt; the free book from &lt;a href=&quot;http://www.infoq.com&quot; target=&quot;_new&quot;&gt;InfoQ&lt;/a&gt; by &lt;a href=&quot;http://jasonrudolph.com/&quot; target=&quot;_new&quot;&gt;Jason Rudolph&lt;/a&gt;.  An excellent book.  Thanks Jason!  I thought it was so good I decided to pay for it (even though it&#39;s free) to help support the author and InfoQ.  There&#39;s a few discrepancies because the book is almost two years old and quite a bit has changed in Grails since then, but I had very few problems working through the examples with the latest version of Grails.&lt;br /&gt;&lt;br /&gt;I&#39;m definitely on the Groovy and Grails learning train.  Both still seem very promising to me (being a Java guy) and I&#39;m going to continue investigating both.  While I set out to learn more about Ruby and Rails this year, the winds have shifted and I&#39;m now focused on Groovy and Grails.  I purchased the PDF version of &lt;a href=&quot;http://thirstyhead.com/&quot; target=&quot;_new&quot;&gt;Scott Davis&#39;&lt;/a&gt; book &lt;a href=&quot;http://www.pragprog.com/titles/sdgrvr/groovy-recipes&quot; target=&quot;_new&quot;&gt;Groovy Recipes&lt;/a&gt; and &lt;a href=&quot;http://www.amazon.com/gp/product/1590599950&quot; target=&quot;_new&quot;&gt;The Definitive Guide to Grails&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/3621976251951661936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/3621976251951661936' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/3621976251951661936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/3621976251951661936'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/01/groovy.html' title='Groovy!'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-2914251250898679486</id><published>2009-01-17T06:38:00.001-06:00</published><updated>2009-01-25T10:16:45.887-06:00</updated><title type='text'>Hockey Day Minnesota</title><content type='html'>Today is &lt;a href=&quot;http://wild.nhl.com/team/app/?service=page&amp;page=NHLPage&amp;id=18611&quot; target=&quot;_new&quot;&gt;Hockey Day Minnesota&lt;/a&gt;.  I&#39;m going to try to honor that by getting my daughters out on the neighbor&#39;s pond followed up by taking them to the University of Minnesota Women&#39;s game against Bemidji State.  It&#39;ll then be on to termite practice where the kids will get to play pond hockey instead of practicing.  We&#39;ll wind it down with watching some of the Gopher and Wild games.  It should be a ton of fun!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/2914251250898679486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/2914251250898679486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/2914251250898679486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/2914251250898679486'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/01/hockey-day-minnesota.html' title='Hockey Day Minnesota'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-1316734569320524412</id><published>2009-01-17T06:14:00.001-06:00</published><updated>2009-01-25T10:17:15.403-06:00</updated><title type='text'>Code Freeze</title><content type='html'>I attended the &lt;a href=&quot;http://www.umsec.umn.edu/events/Code-Freeze-2009&quot; target=&quot;_new&quot;&gt;Code Freeze&lt;/a&gt; conference at the University of Minnesota on Thursday.  It was an excellent local event, especially considering it was an all-day event for only $90.  This was the first year I&#39;ve attended Code Freeze; this year&#39;s theme was Maximizing Developer Value.  &lt;a href=&quot;http://nealford.com&quot; target=&quot;_new&quot;&gt;Neal Ford&lt;/a&gt; kicked things off and as usual he knocked it out of the park.  His topic was On the Lamb from the Furniture Police.  It covered the fact that as programmers we&#39;re hired to concentrate for long periods of time, yet corporate environments provide the exact opposite affect.&lt;br /&gt;&lt;br /&gt;Other speakers included Luke Francl, &lt;a href=&quot;http://ntschutta.com/jat/&quot; target=&quot;_new&quot;&gt;Nate Schutta&lt;/a&gt;, Susan Standiford, Andy Miller and Tomo Lennox.  I was very impressed with Nate&#39;s presentation, it seemed to directly pick-up where Neil left off.  I was particularly interested in Nate&#39;s comments about the working of the human brain, as it is an area of interest for me.&lt;br /&gt;&lt;br /&gt;I was also intrigued by Andy&#39;s presentation entitled &quot;Why I don’t estimate with &quot;points&quot; (and how you too can be delivered from the tedium of repetitive estimation)&quot;.  Andy and I are currently at the same client working together on a large re-engineering project.  I haven&#39;t work with Andy for long, but I was very impressed with his presentation and was impressed with his pragmatic approach to estimating.  It definitely opened my eyes to new ideas.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/1316734569320524412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/1316734569320524412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1316734569320524412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/1316734569320524412'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/01/code-freeze.html' title='Code Freeze'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-8363981061748880331</id><published>2009-01-10T07:38:00.001-06:00</published><updated>2009-01-25T10:20:01.103-06:00</updated><title type='text'>Hackers and Painters</title><content type='html'>One of my 2009 resolutions is to read more.  I just finished up &lt;a href=&quot;http://www.amazon.com/Hackers-Painters-Big-Ideas-Computer/dp/0596006624&quot; target=&quot;_new&quot;&gt;Hackers and Painters&lt;/a&gt;.  I had made it half-way through a couple of years ago and decided to start over and I made it all the way through.  A quick and insightful read.  &lt;a href=&quot;http://www.paulgraham.com/&quot; target=&quot;_new&quot;&gt;Paul Graham&lt;/a&gt; is fairly opinionated, which makes for a good read.  I&#39;ve never seen Lisp, but I am very curious if it as good as he claims.  Based on my experiences, I definitely agree with his thoughts on development productivity.  It makes me that much more interested in learning Ruby and Rails.  The last time I worked seriously with a dynamic language was with Perl in college when we were building the Heil X6 SMT&#39;s kernel, simulator and assembler.  The Heil X6 was the computer we (a team of 6 graduate and undergraduates) built in our ECE 554 Digital Engineering Lab using FPGAs that we had to hand-wire.  What a trip!</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/8363981061748880331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/8363981061748880331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/8363981061748880331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/8363981061748880331'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/01/hackers-and-painters.html' title='Hackers and Painters'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-85295609646032841</id><published>2009-01-10T07:13:00.002-06:00</published><updated>2009-01-25T10:18:13.151-06:00</updated><title type='text'>Groovy and Grails</title><content type='html'>At the DevJam Jam Session on Wednesday, &lt;a href=&quot;http://mikehugo.com/&quot; target=&quot;_new&quot;&gt;Mike Hugo&lt;/a&gt; gave a presentation on Groovy and Grails.  I had heard Scott Davis speak about Groovy and Grails over a year ago and thought it was pretty cool, but back then it didn&#39;t feel real.  Since then Grails has produced a 1.0 release; put simply I was extremely impressed.  Mike is a very good presenter, his slides had very few words and some great pictures.  He kept it lively with some humorous slides plus some succinct demos.  I&#39;ve been looking at Ruby on Rails off and on over the last couple of years.  One of my New Year&#39;s resolutions for 2009 was to really dig into Rails and write a decent sized application.  However, after Mike&#39;s presentation I began to think that a better investment of my time may be in Grails given that it runs on the JVM and plays very nicely with the Java language.  I downloaded Grails yesterday and played around with it a bit.  Very nice.  Just like with Rails, it&#39;s amazingly easy to get a site up and running quickly.  Grails is still a 1.0 release, so I have some concerns about it&#39;s maturity.  However, it runs on the JVM and uses Spring, Hibernate and SiteMesh under the covers.  Obviously all of them are very mature.  &lt;br /&gt;&lt;br /&gt;After the presentation by Mike, we entered the Fish Bowl round table discussion, which I believe is the best part of the Jam Sessions.  I&#39;m amazed by the brain power in the room at these sessions and I definitely like the Fight Club mentality.  The conversation touched on a number of topics including the advantages / disadvantages of statically vs dynamically typed languages.  The consensus seemed to be we&#39;re definitely seeing a movement toward dynamically typed languages.  Someone even dropped the Lisp quote along the lines of Hackers and Painters (&quot;...we could do that in Lisp back in 1968...&quot;), which was interesting given that I just finished the book. One person, who seemed to know a ton about language theory (he even dropped F#), mentioned that he thinks that the gulf between the two is getting bigger and bigger: static languages are becoming more strongly typed and dynamic languages are/will become more dynamic.  It makes sense to me given where I see the Java language headed and makes my desire to learn Ruby and Groovy that much stronger.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/85295609646032841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/85295609646032841' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/85295609646032841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/85295609646032841'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2009/01/groovy-and-grails.html' title='Groovy and Grails'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-4484633622374477726</id><published>2008-01-05T09:31:00.000-06:00</published><updated>2008-01-07T07:55:13.941-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Scalability"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Development"/><title type='text'>Building Scalable Web Sites</title><content type='html'>I just finished reading the book &lt;a href=&quot;http://www.amazon.com/Building-Scalable-Web-Sites-applications/dp/0596102356/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1199547405&amp;sr=8-1&quot; target=&quot;_blank&quot;&gt; Building Scalable Web Sites&lt;/a&gt; by Cal Henderson of &lt;a href=&quot;http://www.flickr.com&quot; target=&quot;_blank&quot;&gt;Flickr&lt;/a&gt; fame.  It was a very interesting read and covered quite a few things I wasn&#39;t expecting.  Most of the code was PHP, which I&#39;ve never worked with, so that in itself was cool to see for the first time.  He covered a ton of topics, including walking through how they scaled Flickr.  I got the most out of chapter 9: Scaling Web Applications.  He also gives a decent overview of Web Services in the last chapter, which I wasn&#39;t expecting.  The book was easy to read and some of the difficult topics he explained clearly and concisely.&lt;br /&gt;&lt;br /&gt;Overall it was an excellent book and I would recommend it to anyone building web sites regardless of whether or not they&#39;re using PHP.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/4484633622374477726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/4484633622374477726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/4484633622374477726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/4484633622374477726'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2008/01/building-scalable-web-sites.html' title='Building Scalable Web Sites'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-157113732719234143</id><published>2007-12-21T08:44:00.000-06:00</published><updated>2008-01-05T09:29:36.270-06:00</updated><title type='text'>Spring 2.5 Upgrade</title><content type='html'>&lt;span style=&quot;font-size:100%;&quot;&gt;I upgraded out platform infrastructure to Spring 2.5 this morning.  It was pretty straight-forward, although I had one painful issue.  For any of our tests that use Hibernate, I was getting the following error:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Caused by: org.hibernate.HibernateException: saveOrUpdate is not valid without active transaction&lt;br /&gt;at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)&lt;br /&gt;at $Proxy39.saveOrUpdate(Unknown Source)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After a bit of digging, I realized we had the following Hibernate property set:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;prop key=&quot;hibernate.current_session_context_class&quot;&gt;&amp;lt;prop key=&quot;hibernate.current_session_context_class&quot;&amp;gt;org.hibernate.context.ThreadLocalSessionContext&amp;lt;/prop&amp;gt;&lt;/prop&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Basically, this was preventing Spring from managing the transaction context correctly.  Once I removed it, all of our tests passed.  I wonder if this is the reason why we&#39;ve had some problems with NOT_SUPPORTED and SUPPORTS previously.  This will require some additional testing...&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/157113732719234143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/157113732719234143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/157113732719234143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/157113732719234143'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2007/12/spring-25-upgrade.html' title='Spring 2.5 Upgrade'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-7808972175341806785</id><published>2007-12-20T10:57:00.000-06:00</published><updated>2007-12-20T11:09:35.812-06:00</updated><title type='text'>Spore</title><content type='html'>I stumbled across a new PC game today entitled &lt;a href=&quot;http://www.spore.com&quot; target=&quot;_blank&quot;&gt;Spore&lt;/a&gt;.  It&#39;s not GA yet, but it looks extremely interesting.  It looks like &lt;a href=&quot;http://www.2kgames.com/civ4/home.htm&quot; target=&quot;_blank&quot;&gt;Civilization&lt;/a&gt; meets &lt;a href=&quot;http://thesims.ea.com/&quot; target=&quot;_blank&quot;&gt;The Sims&lt;/a&gt;.  Spore was created by Will Wright, the creator of The Sims.  Here&#39;s the &lt;a href=&quot;http://video.google.com/videoplay?docid=8372603330420559198&quot; target=&quot;_blank&quot;&gt;video&lt;/a&gt; I watched.  You start as a single-celled organism and you evolve your species all the way up to an advanced spaced-based civilization.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/7808972175341806785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/7808972175341806785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7808972175341806785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/7808972175341806785'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2007/12/spore.html' title='Spore'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7022592537325150312.post-5213580029235174290</id><published>2007-12-15T10:08:00.000-06:00</published><updated>2007-12-15T10:14:46.764-06:00</updated><title type='text'>Desktop Matters (TSE Day 4)</title><content type='html'>In the second session of the morning, I decided to attend the talk entitled &lt;b&gt;Desktop Matters&lt;/b&gt; by Jim Moore.  I didn&#39;t learn much in this presentation.  He walked through  the history of computers from a UI perpsective: mainframe to client server to web.  He then went into UI technologies that are available today to build rich applications: Flex, Apollo, Silverlight, GWT, WebStart, etc.  He had a couple of bullets points for each, but he didn&#39;t get into much detail in terms of what each does.  I would&#39;ve liked to have seen more in the way of the positives vs. negatives of each and some recommendations.</content><link rel='replies' type='application/atom+xml' href='http://stevefinck.blogspot.com/feeds/5213580029235174290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7022592537325150312/5213580029235174290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/5213580029235174290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7022592537325150312/posts/default/5213580029235174290'/><link rel='alternate' type='text/html' href='http://stevefinck.blogspot.com/2007/12/desktop-matters-tse-day-4.html' title='Desktop Matters (TSE Day 4)'/><author><name>Steve Finck</name><uri>http://www.blogger.com/profile/00111289021695221865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_l2NoBR63c4U/SWiekfb1SBI/AAAAAAAAAAM/fMfZeEBrtiE/S220/Photo+7.jpg'/></author><thr:total>0</thr:total></entry></feed>