<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Seek Nuance</title>
	<atom:link href="http://seeknuance.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://seeknuance.com</link>
	<description>Python, Django, technology, Seattle, careers, life, et cetera...</description>
	<lastBuildDate>Thu, 23 May 2013 12:57:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='seeknuance.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Seek Nuance</title>
		<link>http://seeknuance.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://seeknuance.com/osd.xml" title="Seek Nuance" />
	<atom:link rel='hub' href='http://seeknuance.com/?pushpress=hub'/>
		<item>
		<title>Upgrading our CloudFiles API</title>
		<link>http://seeknuance.com/2013/05/21/upgrading-our-cloudfiles-api/</link>
		<comments>http://seeknuance.com/2013/05/21/upgrading-our-cloudfiles-api/#comments</comments>
		<pubDate>Wed, 22 May 2013 02:11:53 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rackspace]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7585</guid>
		<description><![CDATA[We host IP Street&#8217;s SAAS product at Rackspace. We&#8217;re finally taking the plunge and upgrading from python-cloudfiles to pyrax. We didn&#8217;t have any big issues with python-cloudfiles, but I was tiring of getting the brush-off from Rackspace when we asked for help with an API failure. The benefits of keeping a technology up-to-date far outweighs [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7585&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We host IP Street&#8217;s SAAS product at <a href="http://www.rackspace.com">Rackspace</a>. We&#8217;re finally taking the plunge and upgrading from <a href="https://github.com/rackerlabs/python-cloudfiles">python-cloudfiles</a> to <a href="https://github.com/rackspace/pyrax">pyrax</a>. We didn&#8217;t have any big issues with python-cloudfiles, but I was tiring of getting the brush-off from Rackspace when we asked for help with an API failure.</p>
<p>The benefits of keeping a technology up-to-date far outweighs the costs, unless you&#8217;re in an extreme corner case with a very unreliable vendor. Better performance, bug fixes, better capabilities, better support&#8230; all good stuff.</p>
<p>&nbsp;</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/python/'>Python</a>, <a href='http://seeknuance.com/tag/rackspace/'>Rackspace</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7585/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7585&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/05/21/upgrading-our-cloudfiles-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>Comparing two technologies on their configuration style</title>
		<link>http://seeknuance.com/2013/05/19/comparing-two-technologies-on-their-configuration-style/</link>
		<comments>http://seeknuance.com/2013/05/19/comparing-two-technologies-on-their-configuration-style/#comments</comments>
		<pubDate>Sun, 19 May 2013 22:13:39 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bad practices]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7538</guid>
		<description><![CDATA[At IP Street, most of our technology stack is open-source. Something happened last week that threw our components&#8217; different design philosophies into stark relief. We use Solr (with Zookeeper) for many of our search and pivot tasks, and Redis as a Swiss Army Knife. They do different things and have different consistency requirements. You can easily critique any [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7538&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>At <a href="http://www.ipstreet.com">IP Street</a>, most of our technology stack is open-source. Something happened last week that threw our components&#8217; different design philosophies into stark relief.</p>
<p>We use <a href="http://lucene.apache.org/solr/">Solr</a> (with <a href="http://zookeeper.apache.org">Zookeeper</a>) for many of our search and pivot tasks, and <a href="http://redis.io">Redis</a> as a <a href="http://www.swissarmy.com/us/product/Swiss-Army-Knives/Category/Do-It-Yourself/SwissChamp-SOS-Kit/53511">Swiss Army Knife</a>. They do different things and have different consistency requirements. You can easily critique any juxtaposition as comparing apples to oranges. I think it&#8217;s instructive, because Solr and Redis are both high-performance, production-quality, and powerful tools.</p>
<p>Working on them within the same day, I experienced exact terminal opposites in configuration philosophy!</p>
<h3>Let&#8217;s meet contestant number 1</h3>
<p>Solr is a powerful search engine. Their <a href="http://wiki.apache.org/solr/SolrCloud">Cloud</a> feature lets you shard and scale your index, and Solr will do the internal shard and node routing. Or you can direct your queries to the appropriate node for a small performance win. Being <del>short-handed</del> <del>understaffed</del> frugal with our <del>peons</del> <del>worker bees</del> people, we let Solr do the routing. &#8220;Here&#8217;s a document, store it.&#8221; &#8220;I want this document.&#8221; &#8220;Here&#8217;s a pivot within a search, do it and assemble the results for me, pronto.&#8221; Etc.</p>
<p>Solr nodes are peers, though internally there are leaders and replicas. Solr uses Zookeeper, an Apache technology for distributed persistent configuration. Nodes do the right thing when other nodes come and go.<br />
<span id="more-7538"></span></p>
<h3>Let&#8217;s meet contestant number 2</h3>
<p>Redis is a fast, reliable, straightforward key:value store. Its commands remind me of assembly language opcodes. &#8220;Here a key and a value, remember it.&#8221; &#8220;Give me the value at this key.&#8221; &#8220;Give me the hashed value at this key.&#8221; Etc.</p>
<p>Redis has asynchronous non-blocking master-slave replication. A master can have any number of slaves, and a slave can have any number of slaves. Slaves are read-only by default, though you can make a tree of cascading read/write slaves if you&#8217;re game.</p>
<p>Third-party packages exist to do read/write routing, and to even hot failover. For now, we&#8217;re keeping things simple and doing our own read/write splitting.</p>
<h3>Deployment automation</h3>
<p>Because of the relatively few number of servers in our production system, we don&#8217;t use a configuration management system (e.g., <a href="http://www.opscode.com/chef/">Chef</a>, <a href="https://puppetlabs.com">Puppet</a>, <a href="http://ansible.cc">Ansible</a>) yet. We use <a href="http://docs.fabfile.org/en/1.6/">Fabric</a> for deployment automation, and we just upgrade in place using Fabric tasks. It&#8217;s not as automated as a CM tool, but OTOH it&#8217;s one fewer technology with which to grapple. We don&#8217;t support hundreds of nodes.</p>
<h3>So last week&#8230;</h3>
<p>We added a Redis slave, which I wanted to codify in our operations fabfile. The slave was for redundancy (though not hot-failover) and future scaling. We send writes to the master, and we read from a load balancer <a href="http://en.wikipedia.org/wiki/Virtual_IP_address">VIP</a> that consists of the master and the slave. I needed to update our fabfile.py to account for this.</p>
<p>We upgraded to Solr 4.0 in January, and then to 4.1. We did it all interactively. We&#8217;ve got an awesome Solr consultant advising us, and sometimes doing the work.  The Solr 4.x installation and configuration instructions were documented, but our Fabric scripts hadn&#8217;t yet been upgraded. So, I also wanted to codify the installation and configuration in our fabfile.py.</p>
<p>Off I went to upgrade our Fabric script.</p>
<h4>First, Redis</h4>
<p>Every Redis node has two configuration files. One is unique for the node, and the other has parameters that are common to every node. The former links to the latter. (Of course, you could also just have one (larger) file on each node.)</p>
<p>To set up a slave, you include a <a href="http://redis.io/commands/slaveof">SLAVEOF</a> command in your configuration file:</p>
<pre class="brush: plain; title: ; notranslate">
SLAVEOF &lt;master_ip&gt; &lt;master_port&gt;
</pre>
<p>If your master node has a password, there&#8217;s one other command to supply it.</p>
<p>When a node knows it&#8217;s a slave, it sends the master a SYNC command. It doesn&#8217;t matter if it&#8217;s the first time it has connected or if it&#8217;s a reconnection. The master then starts background saving, and collects all new commands received that will change the dataset. When the background saving is complete, the master transfers the database file to the slave, which saves it on disk, and then loads it into memory. The master then sends the slave all accumulated commands, and all new commands received from clients that will change the dataset. This command stream is in the format of the Redis protocol itself. (<a href="http://redis.io/topics/replication">This paragraph is shamelessly copied.</a>)</p>
<p>The most obvious critique is the lack of partial upgrades and timestamps. If a slave loses connection, it re-syncs, to which the master will respond by re-sending the entire database. This is inefficient; there may have been few (or no) database changes since the slave was last synced. OTOH, it&#8217;s simple. You might say, foolproof.</p>
<p>Upgrading our fabric script was easy. The &#8220;provision redis&#8221; task knows when it&#8217;s provisioning a master or a slave. (The master is list entry [0].) When provisioning a slave, it uses <a href="http://www.gnu.org/software/sed/manual/sed.html">sed</a> to insert a SLAVEOF into the configuration file.</p>
<h4>Then, Solr</h4>
<p>Solr is written in <a href="http://www.java.com/en/">Java</a>, so its configuration includes the usual Javaesque parameters to <a href="http://www.eclipse.org/jetty/">Jetty</a> or <a href="http://tomcat.apache.org">Tomcat</a>.</p>
<p>I started codifying our Solr 4.1 installation and configuration into our fabfile. First, we need to edit <strong>/etc/security/limits.conf</strong> to increase the maximum file descriptors. That was only a couple of sed commands.</p>
<p>Next up was changes to <strong>/etc/pam.d/su</strong>. Also easy.</p>
<p>Next, for Zookeeper, we have to put this node&#8217;s unique identifying number into <strong>/etc/zookeeper/conf/myid</strong>.</p>
<p>Wait, WTAF? Each Solr node needs a unique identifying number — 1, 2, 3, etc. A node finds its number by looking in <strong>/etc/zookeeper/conf/myid</strong>. But, erm, <em>every node has a unique IP address.</em> You&#8217;re running two instances on the same server? Fine, toss in the port number. Why can&#8217;t Zookeeper use that?!</p>
<p>I got a can of Coke and wrote a simple function that returned a node&#8217;s unique identifying number. This wasn&#8217;t the end of the world, but it was unnecessary.</p>
<p>Then, we have to update <strong>/etc/default/zookeeper</strong> to adjust JAVA_OPTS.</p>
<p>Then we have to edit <strong>/etc/zookeeper/conf/zoo.cfg</strong> to insert the server&#8217;s IP address in some commands. <em>Holy crap</em>, it has a unique integer <em>and</em> a unique IP address?!</p>
<p>I was now getting a headache.</p>
<p>Are we done? No. Then we run <strong>/usr/share/zookeeper/bin/cli_mt</strong> to do something. Then <strong>/usr/share/zookeeper/bin/zkCli.sh</strong> to do something else. Then run <strong>zktreeutil</strong>. Then check <strong>/var/log/zookeeper/zookeeper.log</strong> to see if the world has exploded.</p>
<p>Are we done? No. Then we install Jetty, which includes editing<strong>/etc/default/jetty</strong> to set a smorgasbord of JAVA_OPTIONS and define JAVA_HOME.</p>
<p>Then we install Solr. For this we have to <strong>mkdir</strong>, <strong>jar</strong>, <strong>cp</strong>, and <strong>chown</strong> various files. Then edit <strong>/etc/solr/solr.xml</strong>. (Using XML in configuration files is idiotic, but there we are.)</p>
<p><em>Then</em> we can start Jetty.</p>
<p>But we&#8217;re not done. Although Solr&#8217;s configuration files have shard information, Solr doesn&#8217;t use it. You have to use <a href="http://linux.about.com/od/commands/l/blcmdl1_curl.htm">curl</a> to tell Solr about its shards.</p>
<p>Now are we done? Beats the shit out of me, because I gave up five paragraphs ago.</p>
<h4>OMG my head exploded</h4>
<p>It seems to me that Solr and Zookeeper&#8217;s configuration was designed without any consideration of deployment automation. No thought was given to what an IT staff must do to install and configure this technology. It was designed (I use that word loosely) for an interactive deployment.</p>
<p>Many files must be edited, in the right order, and there no easy markers on which to hang sed commands. Each step can be explained to a human, but is non-trivial to code in even a powerful language like Python. And the total of all of the steps makes you throw up your hands.</p>
<p>In isolation, each step is necessary and reasonable. Although I itch at Javaesque parameters and XML configuration files, I don&#8217;t question any one step, except for the &#8220;myid&#8221;.</p>
<p>But think about how this stuff must be deployed, repeatedly, in real-world situations. When you consider all of what must be done to install and configure Zookeeper/Solr, your head explodes like those poor SOB&#8217;s in <a href="http://www.imdb.com/title/tt0081455/">Scanners</a>. &#8220;All&#8221; of the configuration isn&#8217;t amenable to automation with commonplace tools.</p>
<p>I&#8217;m not sure what to do about this. For now, I&#8217;ve moved on to another task, and I&#8217;ll mull what to do about Solr this week. Maybe just stash the post-edited copies of the configuration files in our pool?</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/bad-practices/'>bad practices</a>, <a href='http://seeknuance.com/tag/deployment/'>deployment</a>, <a href='http://seeknuance.com/tag/redis/'>Redis</a>, <a href='http://seeknuance.com/tag/solr/'>Solr</a>, <a href='http://seeknuance.com/tag/technology/'>technology</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7538/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7538&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/05/19/comparing-two-technologies-on-their-configuration-style/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>Fun with the Internet</title>
		<link>http://seeknuance.com/2013/04/25/fun-with-the-internet/</link>
		<comments>http://seeknuance.com/2013/04/25/fun-with-the-internet/#comments</comments>
		<pubDate>Fri, 26 Apr 2013 02:13:36 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7536</guid>
		<description><![CDATA[I just found my ninth-grade science teacher online. I e-mailed him to say how great he was, and how much I appreciated his influence during my turbulent adolescence. So there&#8217;s that. &#160; Tagged: life<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7536&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I just found my ninth-grade science teacher online. I e-mailed him to say how great he was, and how much I appreciated his influence during my turbulent adolescence. So there&#8217;s that.</p>
<p>&nbsp;</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/life/'>life</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7536/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7536&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/04/25/fun-with-the-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>PyCon 2013 things I didn&#8217;t do</title>
		<link>http://seeknuance.com/2013/03/17/pycon-2013-things-i-didnt-do/</link>
		<comments>http://seeknuance.com/2013/03/17/pycon-2013-things-i-didnt-do/#comments</comments>
		<pubDate>Sun, 17 Mar 2013 18:42:13 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PyCon]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7520</guid>
		<description><![CDATA[I didn&#8217;t claim my &#8220;swag bag&#8221;. I wasn&#8217;t even tempted. I don&#8217;t need another meh coffee mug or pen. I don&#8217;t need a small stack of paper brochures I&#8217;ll only discard. It&#8217;s time for conferences to retire the swag bag! This anachronism should have perished years ago. Anything I want to discover, I can discover [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7520&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><strong>I didn&#8217;t claim my &#8220;swag bag&#8221;.</strong> I wasn&#8217;t even tempted. I don&#8217;t need another meh coffee mug or pen. I don&#8217;t need a small stack of paper brochures I&#8217;ll only discard.</p>
<p>It&#8217;s time for conferences to retire the swag bag!</p>
<p>This anachronism should have perished years ago. Anything I want to discover, I can discover on the web 1000x faster than I can in a swag bag. You expect me to flip through the paper collateral? If I&#8217;m interested in web-based analytics, Python IDEs, or &#8220;live chat&#8221; technology for web pages, I&#8217;ll search online. I know the swag bag is a tiny and unrepresentative subset of my options. If you&#8217;re expecting me to think, &#8220;Ooo, I&#8217;ll use <em>their</em> product, <em>they&#8217;re</em> in my swag bag!&#8221; your model of how brains work (well, my brain, anyway, but then again mine&#8217;s the archetype) is wrong.</p>
<p>Back in the day, you looked forward to finding the latest copies of software, or interesting trial/demo/crippleware, in a swag bag. Trial copies of Visual Studio, or a Linux distribution, or the like. Or, going <em>way</em> back, new products that you never heard of. None of that is true anymore.</p>
<p>I know swag bag material helps sell sponsor slots, and that&#8217;s how conferences defray costs. But they&#8217;re still nigh useless, and bad for the environment. It&#8217;s a matter of time before vendors wise up to how little return they get on their swag dollar. Conferences should move now to kill this ancient custom!</p>
<p><strong>Every attendee received</strong> a <a href="http://www.raspberrypi.org">Raspberry Pi</a>, <a href="http://www.newark.com/jsp/search/productdetail.jsp?sku=43W5302">Model B</a> unit. Very cool! I didn&#8217;t have any interest, so I didn&#8217;t claim mine. All the unclaimed units are being donated to charities and schools, so my Raspberry Pi will go to some worthy cause somewhere. I hope some girl or boy is inspired by it.</p>
<p><strong>I wanted to take in some evening events</strong>, but except for the first night, my control rods went in around 6:30 pm and I chilled instead. On the plus side, I got lots of sleep and woke up refreshed each morning. In fact, I noticed myself dragging less on the conference&#8217;s last day than I normally do at this point in a conference. Getting good sleep is good. Who woulda thunk it?</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/pycon/'>PyCon</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7520/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7520/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7520&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/03/17/pycon-2013-things-i-didnt-do/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>PyCon better this year than last</title>
		<link>http://seeknuance.com/2013/03/14/pycon-better-this-year-than-last/</link>
		<comments>http://seeknuance.com/2013/03/14/pycon-better-this-year-than-last/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 16:11:36 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PyCon]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7518</guid>
		<description><![CDATA[I&#8217;m enjoying myself more this year than last. I think it&#8217;s because my head&#8217;s in a better place than it was last year. Things are better at work, a dim light may be visible at the end of the tunnel, etc. Odd. &#160; Tagged: PyCon<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7518&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m enjoying myself more this year than last. I think it&#8217;s because my head&#8217;s in a better place than it was last year. Things are better at work, a dim light may be visible at the end of the tunnel, etc.</p>
<p>Odd.</p>
<p>&nbsp;</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/pycon/'>PyCon</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7518/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7518/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7518&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/03/14/pycon-better-this-year-than-last/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>37.404145 -121.974399</georss:point>
		<geo:lat>37.404145</geo:lat>
		<geo:long>-121.974399</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>PyCon 2013</title>
		<link>http://seeknuance.com/2013/03/12/pycon-2013/</link>
		<comments>http://seeknuance.com/2013/03/12/pycon-2013/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 23:34:27 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PyCon]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7515</guid>
		<description><![CDATA[I&#8217;m attending PyCon again this year. The tutorials and the main conference. In past years, I posted commentary about the sessions I attended. I won&#8217;t do that this year. Don&#8217;t feel like it. Not sure why. &#160; Tagged: PyCon<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7515&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m attending PyCon again this year. The tutorials and the main conference.</p>
<p>In past years, I posted commentary about the sessions I attended. I won&#8217;t do that this year. Don&#8217;t feel like it. Not sure why.</p>
<p>&nbsp;</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/pycon/'>PyCon</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7515/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7515&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/03/12/pycon-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>37.404812 -121.976502</georss:point>
		<geo:lat>37.404812</geo:lat>
		<geo:long>-121.976502</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>Drobo data recovery: Conclusion</title>
		<link>http://seeknuance.com/2013/02/09/drobo-data-recovery-conclusion/</link>
		<comments>http://seeknuance.com/2013/02/09/drobo-data-recovery-conclusion/#comments</comments>
		<pubDate>Sat, 09 Feb 2013 19:48:33 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Drobo]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7465</guid>
		<description><![CDATA[My dead Drobo saga&#8217;s conclusion&#8230; tl;dr Grades: Drobo customer support: A+. DiskWarrior: F. Disk Rescue 3: A-. Don&#8217;t consider your Drobo to be hot-swappable. Ever. Buy Disk Rescue 3 and have it on hand. Run Disk Utility and do a Verify Disk once a month. If that&#8217;s too often for you, do it once a quarter. [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7465&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>My dead <a href="http://www.drobo.com">Drobo</a> saga&#8217;s conclusion&#8230;</p>
<h3>tl;dr</h3>
<ul>
<li>Grades: Drobo customer support: <strong>A+</strong>. <a href="http://www.alsoft.com/diskwarrior/">DiskWarrior</a>: <span style="color:#ff0000;"><strong>F</strong></span>. <a href="http://www.prosofteng.com/products/data_rescue.php">Disk Rescue 3</a>: <strong>A-</strong>.</li>
<li>Don&#8217;t consider your Drobo to be hot-swappable. Ever.</li>
<li>Buy Disk Rescue 3 and have it on hand.</li>
<li>Run Disk Utility and do a Verify Disk once a month. If that&#8217;s too often for you, do it once a quarter.</li>
</ul>
<p><span id="more-7465"></span></p>
<h3>Gory details</h3>
<p>To <a title="A Drobo firmware update bricked my Drobo" href="http://seeknuance.com/2013/02/03/a-drobo-firmware-update-bricked-my-drobo/">summarize&#8230;</a> My Drobo S (since replaced in their product lineup, I think, by the <a href="http://www.drobo.com/products/professionals/drobo-5d/index.php">Drobo 5D</a>) was on my laptop&#8217;s USB 3.0 bus. I did a firmware update and *poof* it turned into a brick. By &#8220;brick,&#8221; I mean that OS X couldn&#8217;t mount it and so it was inaccessible.</p>
<p>I acknowledge that I may have caused this by an inopportune power-cycle. I&#8217;m ashamed to admit I was doing three things simultaneously when this happened. I <em>think</em> I was careful but my actions are now a blur. So I can&#8217;t conclusively say it was the firmware update that triggered it — it might have been my own fumble fingers.</p>
<p>My first recovery action was to try OS X Disk Utility. Its device list highlighted the Drobo in red. &#8220;Verify Disk&#8221; said it needed repair, but <a title="A Drobo firmware update bricked my Drobo" href="http://seeknuance.com/2013/02/03/a-drobo-firmware-update-bricked-my-drobo/">&#8220;Repair Disk&#8221; failed to repair it</a>. I tried running &#8220;Repair Disk&#8221; four times in a row (this was one suggestion I received, and I was willing to try anything) but it couldn&#8217;t repair it.</p>
<h4>Drobo customer support: A+</h4>
<p>Plan &#8220;b&#8221; was contacting Drobo customer support. The support rep was very responsive and supportive. He asked for a diagnostics dump (via the Drobo Dashboard app), then had me try a couple of things, like hooking it up to a USB 2.0 bus and trying a different computer. Alas, none of his suggestions were profitable, because this was diagnosed to not be a Drobo problem per se, but rather a file system format problem.</p>
<p>But I appreciated his responsiveness (within 12 hours each time, and I responded at night after I got home from work) and his being <em>engaged</em>. I could tell I wasn&#8217;t getting rote answers selected off a menu by some guy in the Philippines. (Or, if I was, <em>boy</em> is their help-desk software good!!) He asked pertinent questions, advised me on disk repair &amp; recovery software, and &#8220;stayed with me&#8221; during the entire saga.</p>
<p>If anyone in the Drobo mothership is reading this, my great support rep was &#8220;Caleb D.&#8221; His communications make me more likely to consider buying a Drobo again.</p>
<h4>DiskWarrior: F</h4>
<p>Plan &#8220;c&#8221; was to then buy DiskWarrior, a disk repair application. This was a complete waste of time.</p>
<p>OS X saw the Drobo sufficiently well so that Disk Utility saw it. And Disk Utility saw it sufficiently well to allow Verify/Repair Disk operations. The Repair Disk failed after spewing out lots of diagnostic information, so it at least gave it a shot. I assumed DiskWarrior would be no less capable (and should of course be far more capable) than Disk Utility.</p>
<p>Well, DiskWarrior couldn&#8217;t find the Drobo! It wasn&#8217;t even listed as a disk on which I could attempt a repair! I tried running it from its stand-alone DVD on my wife&#8217;s iMac (my MBP/Retina doesn&#8217;t have an optical drive) and attaching the Drobo to the iMac&#8217;s USB 2.0 or FireWire buses. Nothing!</p>
<p>I couldn&#8217;t fathom how OS X and Disk Utility saw the Drobo, but DiskWarrior — even stand-alone — did not. So, I contacted their customer support.</p>
<p>I got back a response that gave me hope. They felt the problem would be easier to diagnose and handle if we IM&#8217;d each other in real-time when I ran DiskWarrior. They gave me a time range when they&#8217;d be available, and their IM handle. Super!</p>
<p>I left work early the next day and went home. (I was also sick, so I needed to leave work early anyway. I thought about postponing this and crawling into bed, but as it turns out I didn&#8217;t need to.) I got online, IM&#8217;d them, and&#8230;</p>
<div id="attachment_7481" class="wp-caption alignnone" style="width: 546px"><img class=" wp-image-7481    " style="border:0;margin-top:0;margin-bottom:0;" alt="Customer support is not on-line." src="http://seeknuance.files.wordpress.com/2013/02/screen-shot-2013-02-09-at-11-47-08-am.png?w=536&#038;h=260" width="536" height="260" /><p class="wp-caption-text">Customer support is not on-line.</p></div>
<p>WTF? I used the IM handle they gave me. They aren&#8217;t registered?!?</p>
<p>I emailed them and asked for a functional IM handle. No response! (I then crawled into bed and slept for 18 hours.)</p>
<p>Their product didn&#8217;t work. Their product didn&#8217;t work off a stand-alone disk. Their customer support blew me off. I&#8217;m sorry, but this earns a grade of<strong><span style="color:#ff0000;"> F</span></strong>.</p>
<h4>Data Rescue 3: A-</h4>
<p>Plan &#8220;d&#8221; was my last available option, which was to rescue data off the Drobo. Reading disk data is different from repairing its file structure, and is easier in some ways while harder in others.</p>
<p>Data Rescue 3 comes in downloadable and bootable-CD form. I didn&#8217;t need the downloadable CD now but I bought it anyway.</p>
<p>Data Rescue 3 took <em>days</em> to read the Drobo, because it was reading a lot of data block by block. This got me thinking&#8230; The Drobo reported its capacity as 16TB, but contained only 12TB of disks. (&#8220;Only&#8221; 12TB of disks! I remember then 100MB was a universe of disk storage!) Data Rescue 3&#8242;s scan would have been faster if it knew this. Data recovery requires knowing details of the data you&#8217;re trying to recover — file systems, file types, directory headers, etc. It&#8217;s not a stretch that adding knowledge of a Drobo&#8217;s disk organization could speed up a scan.</p>
<p>Although it wasted time scanning non-existent blocks, it got the job done! It found all the files and I was able to restore them to my laptop. Yay!</p>
<h4>Wrap-up</h4>
<p>I&#8217;ve re-formatted the Drobo. I promise to not be sloppy about shutting down the Drobo. I promise to run Disk Utility on it once a month. I swear.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/drobo/'>Drobo</a>, <a href='http://seeknuance.com/tag/technology/'>technology</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7465/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7465&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/02/09/drobo-data-recovery-conclusion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>

		<media:content url="http://seeknuance.files.wordpress.com/2013/02/screen-shot-2013-02-09-at-11-47-08-am.png?w=595" medium="image">
			<media:title type="html">Customer support is not on-line.</media:title>
		</media:content>
	</item>
		<item>
		<title>Trying to rescue data off my dead Drobo</title>
		<link>http://seeknuance.com/2013/02/05/trying-to-rescue-data-off-my-dead-drobo/</link>
		<comments>http://seeknuance.com/2013/02/05/trying-to-rescue-data-off-my-dead-drobo/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 14:38:18 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Drobo]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7461</guid>
		<description><![CDATA[Drobo customer support is trying but is coming up empty. Now I&#8217;m trying Data Rescue 3 to read data off the Drobo. DiskWarrior can&#8217;t see the Drobo because it isn&#8217;t mounted, but Data Rescue 3 can. In fact, DiskWarrior also doesn&#8217;t see the Drobo when it&#8217;s run stand-alone off their DVD! I tried this on [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7461&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Drobo customer support is trying but is coming up empty. Now I&#8217;m trying <a href="http://www.prosofteng.com/products/data_rescue.php">Data Rescue 3</a> to read data off the Drobo. <a href="http://www.alsoft.com/diskwarrior/">DiskWarrior</a> can&#8217;t see the Drobo because it isn&#8217;t mounted, but Data Rescue 3 can.</p>
<p>In fact, DiskWarrior <em>also</em> doesn&#8217;t see the Drobo when it&#8217;s run stand-alone off their DVD! I tried this on my wife&#8217;s iMac. OS X sees the disk (but does not mount it), Disk Utility lists it and allows me to try a Verify Disk and Repair Disk, but DiskWarrior doesn&#8217;t see it. I&#8217;ll try their tech support next.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/drobo/'>Drobo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7461/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7461&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/02/05/trying-to-rescue-data-off-my-dead-drobo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>Drobo update: In the hands of Drobo customer support&#8230;</title>
		<link>http://seeknuance.com/2013/02/03/drobo-update-in-the-hands-of-drobo-customer-support/</link>
		<comments>http://seeknuance.com/2013/02/03/drobo-update-in-the-hands-of-drobo-customer-support/#comments</comments>
		<pubDate>Mon, 04 Feb 2013 02:14:18 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Drobo]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7457</guid>
		<description><![CDATA[I&#8217;ve filed a ticket with their customer support system. They&#8217;ve been excellent when I&#8217;ve used them in the past, although those times were for nothing as serious as this. Tagged: Drobo<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7457&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve filed a ticket with their customer support system. They&#8217;ve been excellent when I&#8217;ve used them in the past, although those times were for nothing as serious as this.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/drobo/'>Drobo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7457/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7457&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/02/03/drobo-update-in-the-hands-of-drobo-customer-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>A Drobo firmware update bricked my Drobo</title>
		<link>http://seeknuance.com/2013/02/03/a-drobo-firmware-update-bricked-my-drobo/</link>
		<comments>http://seeknuance.com/2013/02/03/a-drobo-firmware-update-bricked-my-drobo/#comments</comments>
		<pubDate>Sun, 03 Feb 2013 19:54:57 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Drobo]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7453</guid>
		<description><![CDATA[I&#8217;m migrating my files and apps to my new MacBook Pro. A highly anticipated improvement was connecting my Drobo S to a USB 3.0 interface, instead of my previous laptop&#8217;s USB 2.0 bus. During my migration, the Drobo Dashboard advised me that a Drobo firmware update was available. I did the update, which -boom- bricked [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7453&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m migrating my files and apps to my new MacBook Pro. A highly anticipated improvement was connecting my <a href="http://www.drobo.com/products/professionals/drobo-s/index.php">Drobo S</a> to a USB 3.0 interface, instead of my previous laptop&#8217;s USB 2.0 bus.</p>
<p>During my migration, the Drobo Dashboard advised me that a Drobo firmware update was available. I did the update, which -boom- bricked my Drobo.</p>
<p>After trying rebooting, power-cycling the Drobo, and plugging it into the other USB socket, I&#8217;m at a point where Drobo Dashboard says the Drobo is healthy. But OS X won&#8217;t mount it. Disk Utility says:</p>
<blockquote><p><span style="color:#ff0000;">Unable to bootstrap transaction group 6000: cksum mismatch</span><br />
<span style="color:#ff0000;"> No valid commit checkpoint found</span><br />
<span style="color:#ff0000;"> The volume xxxxxxx was found corrupt and needs to be repaired.</span><br />
Problems were found with the partition map which may prevent booting<br />
<strong><span style="color:#ff0000;">Error: This disk needs to be repaired. Click Repair Disk.</span></strong></p></blockquote>
<p>I then run Repair Disk, and it tells me the same thing! So Repair Disk can&#8217;t repair the disk!</p>
<p>I bought <a href="http://www.alsoft.com/diskwarrior/">DiskWarrior</a> (for $109, I&#8217;ll have you know) but it can&#8217;t repair a disk that isn&#8217;t mounted. They&#8217;ll ship me a physical CD-ROM of my purchase, so I can try booting from it. Oh, but wait, my MacBook Pro/Retina doesn&#8217;t have a CD-ROM drive!</p>
<p>I am not a happy camper.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/drobo/'>Drobo</a>, <a href='http://seeknuance.com/tag/mac/'>Mac</a>, <a href='http://seeknuance.com/tag/technology/'>technology</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7453/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7453/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7453&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/02/03/a-drobo-firmware-update-bricked-my-drobo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>How not to maintain an API</title>
		<link>http://seeknuance.com/2013/01/12/how-not-to-maintain-an-api/</link>
		<comments>http://seeknuance.com/2013/01/12/how-not-to-maintain-an-api/#comments</comments>
		<pubDate>Sat, 12 Jan 2013 19:47:13 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bad practices]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7431</guid>
		<description><![CDATA[We license a vendor&#8217;s services for corporate information, like annual revenue and office locations. Their name shall be kept confidential in this story. We access their API via http calls. They call it a REST API. But like 95% of the &#8220;REST&#8221; APIs in the world, it&#8217;s not REST at all, and in fact nowhere [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7431&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We license a vendor&#8217;s services for corporate information, like annual revenue and office locations. Their name shall be kept confidential in this story.</p>
<p>We access their API via http calls. They call it a <a href="http://en.wikipedia.org/wiki/Representational_state_transfer">REST</a> API. But like 95% of the &#8220;REST&#8221; APIs in the world, it&#8217;s not REST at all, and in fact nowhere near REST. The term &#8220;REST&#8221; has <del>been corrupted to be</del> become synonymous with, &#8220;web API&#8221;.</p>
<p>But whatever. It&#8217;s an API accessed with http calls.</p>
<p>One of service calls has a parameter called, &#8220;countryCode&#8221;, which was documented as an <a href="http://www.iso.org/iso/country_codes.htm">ISO 3166 country code</a>.</p>
<p><span id="more-7431"></span>I coded up new features that used this API. And I wrote unit tests, and debugged the code on my dev box up to a reasonable point. (It was a &#8220;reasonable point&#8221; for typical vendors, but not this one, as it turns out.) I then propagated it to the trunk, and uploaded it to our QA system.</p>
<p>As soon as we started system testing, we noticed they didn&#8217;t recognize some valid codes. Like the one for United Kingdom (GB).</p>
<p>After thoroughly checking our code for bugs, I submitted a ticket asking them to investigate. Two weeks go by with no response. Then the answer comes back: &#8220;Oh, oops. For some countries, we don&#8217;t use ISO 3166. Instead, we use our own internal codes. &lt;I won&#8217;t bore you with their reasoning, which was nonsensical.&gt; So you need to replace &#8216;GB&#8217; with &#8216;UK&#8217;.&#8221;</p>
<p>I pointed out that this was odd, fraught with peril, and undocumented. What happens when ISO 3166 adds codes that collide with their codes? I received no response.</p>
<p>I sucked it up, coded a dict replacement table, and updated our servers. (I should have manually tested this. But I was pressed for time and hadn&#8217;t yet woken up to their level of intellectual rigor.)</p>
<p>Now the calls with &#8220;UK&#8221; were bombing!</p>
<p>I submitted another ticket. A week later the response comes back: &#8220;Oh, ooops. UK won&#8217;t work either. You must submit the country in which the company is located. We accept the special strings &#8216;england&#8217;, &#8216;scotland&#8217;, &#8216;northern ireland&#8217;, and &#8216;wales&#8217;; we don&#8217;t recognize any symbol for the United Kingdom.&#8221;</p>
<p>WTF. <strong>WTF to the max.</strong> This was absurd in an indeterminate number of ways.</p>
<p>I realized I&#8217;d have to create a UK gazetteer to do this. This is the subject of another blog post, but suffice to say I built a city:country UK gazetteer, hacked our code to use it, and uploaded to our servers.</p>
<p>Yeah, I know, I should have manually tested what they told me. I&#8217;ve since learned my lesson.</p>
<p>As soon as the new code was on our QA system, I saw that these service calls still didn&#8217;t work. So I contacted them again.</p>
<p>A couple of days later the answer comes back: &#8220;Oh, ooops. You should use &#8216;GB&#8217; for the country code after all. We don&#8217;t recognize the country names you submitted.&#8221;</p>
<p><strong>WHAT. THE. ACTUAL. FUCK.</strong></p>
<p>I counted to 100 and <em>very</em> tartly replied that we started down this path by using the ISO 3166 &#8220;GB&#8221; code in the first place, and they hadn&#8217;t recognized it. Why should it now work? <em>Are you changing your API without any versioning, notice, warning, or documentation changes?</em></p>
<p>They didn&#8217;t reply to this.</p>
<p>I stomped around the office for a few minutes. Then I ripped out the hack code and gazetteer table, so the ISO 3166 &#8220;GB&#8221; code would be used in our service calls. And again updated our servers.</p>
<p>Presto, the calls now worked as advertised.</p>
<p>And that&#8217;s how not to maintain an API.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/bad-practices/'>bad practices</a>, <a href='http://seeknuance.com/tag/technology/'>technology</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7431/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7431&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2013/01/12/how-not-to-maintain-an-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>2012 in review</title>
		<link>http://seeknuance.com/2012/12/30/2012-in-review/</link>
		<comments>http://seeknuance.com/2012/12/30/2012-in-review/#comments</comments>
		<pubDate>Sun, 30 Dec 2012 20:27:11 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7426</guid>
		<description><![CDATA[The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog. Here&#8217;s an excerpt: 19,000 people fit into the new Barclays Center to see Jay-Z perform. This blog was viewed about 59,000 times in 2012. If it were a concert at the Barclays Center, it would take about 3 sold-out performances for that [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7426&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The WordPress.com stats helper monkeys prepared a 2012 annual report for this blog.</p>
<p><a href="http://seeknuance.com/2012/annual-report/"><img alt="" src="http://www.wordpress.com/wp-content/mu-plugins/annual-reports/img/emailteaser.jpg" width="100%" /></a></p>
<p>Here&#8217;s an excerpt:</p>
<blockquote><p>19,000 people fit into the new Barclays Center to see Jay-Z perform. This blog was viewed about <strong>59,000</strong> times in 2012. If it were a concert at the Barclays Center, it would take about 3 sold-out performances for that many people to see it.</p></blockquote>
<p><a href="http://seeknuance.com/2012/annual-report/">Click here to see the complete report.</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7426/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7426/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7426&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2012/12/30/2012-in-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>

		<media:content url="http://www.wordpress.com/wp-content/mu-plugins/annual-reports/img/emailteaser.jpg" medium="image" />
	</item>
		<item>
		<title>Where my time&#8217;s going</title>
		<link>http://seeknuance.com/2012/12/30/where-my-times-going/</link>
		<comments>http://seeknuance.com/2012/12/30/where-my-times-going/#comments</comments>
		<pubDate>Sun, 30 Dec 2012 19:41:37 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7421</guid>
		<description><![CDATA[I&#8217;m not doing much blogging lately. Obviously. I&#8217;ve spent lots of time at work. We&#8217;re doing a big release in January, and there&#8217;s no end of bugs to fix, features to tweak, and QA logs through which to grep. It&#8217;s not a death march by any means, but it is, I admit, a bit of [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7421&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m not doing much blogging lately. Obviously.</p>
<p>I&#8217;ve spent lots of time at work. We&#8217;re doing a big release in January, and there&#8217;s no end of bugs to fix, features to tweak, and QA logs through which to grep. It&#8217;s not a death march by any means, but it is, I admit, a bit of a grind. Far more time is being spent on technology integration than is ideal, and I had expected.</p>
<p>It&#8217;ll be good to get it behind us. I&#8217;m looking forward to being able to make some strategic technology and process choices afterward.</p>
<p>I&#8217;m looking forward to replacing my 2008-vintage MBP at home with a new model, probably in February.</p>
<p>End of report.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/life/'>life</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7421/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7421/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7421&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2012/12/30/where-my-times-going/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>As the world turns&#8230;</title>
		<link>http://seeknuance.com/2012/12/02/as-the-world-turns/</link>
		<comments>http://seeknuance.com/2012/12/02/as-the-world-turns/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 00:07:19 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7416</guid>
		<description><![CDATA[Boy, what a roller coaster! Shortly after opening a position for a Senior Devops engineer, we had a funding &#8220;event&#8221; and now the opening&#8217;s gone. What&#8217;s worse, I had to lay off one of my developers, right before before the end-of-year holidays. It was stressful for all involved. We&#8217;re doing some interesting things with name [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7416&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Boy, what a roller coaster! Shortly after <a href="http://seeknuance.com/2012/11/04/ip-street-is-looking-for-a-senior-devops-engineer/">opening a position for a Senior Devops engineer</a>, we had a funding &#8220;event&#8221; and now the opening&#8217;s gone. What&#8217;s worse, I had to lay off one of my developers, right before before the end-of-year holidays. It was stressful for all involved.</p>
<p>We&#8217;re doing some interesting things with name relationships at work, and these present fun development challenges. I&#8217;m trying to spend as much time as possible in Emacs, because the less-fun work issues always occur when I&#8217;m not coding.</p>
<p>I upgraded our codebase to version 3 of Celery, just to get us off version 2. I&#8217;m still hankering to replace Celery, but it must have known it was living on borrowed time because it&#8217;s been behaving lately, so I&#8217;ve decided to fry some bigger fish. But the moment Celery starts acting up again&#8230;</p>
<p>I just turned 55. How the <em>hell</em> did <em>that</em> happen?!?</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/career/'>career</a>, <a href='http://seeknuance.com/tag/technology/'>technology</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7416/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7416&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2012/12/02/as-the-world-turns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
		<item>
		<title>IP Street is looking for a Senior Devops engineer!</title>
		<link>http://seeknuance.com/2012/11/04/ip-street-is-looking-for-a-senior-devops-engineer/</link>
		<comments>http://seeknuance.com/2012/11/04/ip-street-is-looking-for-a-senior-devops-engineer/#comments</comments>
		<pubDate>Sun, 04 Nov 2012 22:00:07 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jobs]]></category>

		<guid isPermaLink="false">http://seeknuance.com/?p=7412</guid>
		<description><![CDATA[We&#8217;re looking for a smart person to be our only Devops person now, and become the team lead as the group grows. If you know someone who fits the bill, send them this post! &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; ￼Title: Senior Devops Engineer Reports to: VP Engineering Location: Seattle, WA About IP Street Founded in 2009, IP Street develops [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7412&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>We&#8217;re looking for a smart person to be our only Devops person now, and become the team lead as the group grows. If you know someone who fits the bill, send them this post!</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><strong>￼Title:</strong> Senior Devops Engineer</p>
<p><strong>Reports to:</strong> VP Engineering</p>
<p><strong>Location:</strong> Seattle, WA</p>
<p><strong>About IP Street</strong><br />
Founded in 2009, IP Street develops and markets software to help corporations, law firms, and research firms better analyze patent-related information. We make IP data easy to get, use, and understand.</p>
<p>Learn more about IP Street by visiting <a href="http://www.ipstreet.com">www.ipstreet.com</a>.</p>
<p><strong>Summary</strong><br />
We’re a small company that’s developed a new way to visualize and data-mine intellectual property. You’ll be part of an innovative, high-performance engineering team that’s committed to delivering our product using the best technologies and software development processes.</p>
<p>Our technology stack is almost all OSS, and our server-side code is Python/Django. We use esoteric search technologies. Our QA and production servers are managed servers and VMs, running Linux. We deploy with Fabric.</p>
<p>Most of the job will focus on:</p>
<ul>
<li>Monitoring, upgrading, and diagnosing our production system</li>
<li>Being personally responsible for our production system’s availability and reliability</li>
<li>Being the technical contact with our hosting providers</li>
<li>Collaborating with developers to optimize code. And understanding and fixing product bugs yourself</li>
<li>Direct involvement with new features’ design and performance projections</li>
</ul>
<p>We’re looking for someone who is hands-on, smart, and energetic. We’ll consider someone who wants to remain an individual contributor, but we ideally want someone who wants to become the Devops lead as the company grows. We don’t know how big this function will become, or what areas of emphasis it will have. But we do know it <em>will</em> expand, and be extremely important to our success, as the user base grows.</p>
<p>So, we’d like this hire to become the Devops lead as the team expands. You’ll be able to set the pace for the group as you build it. And naturally, the future work will include team building, leadership, and management.</p>
<p>This position is ideal for someone who doesn’t have team management experience now, but wants to develop it as their group grows. The rest of the IP Street team will support you in this, if you’ll step up to the challenge when it comes!</p>
<p><strong>Key Responsibilities</strong></p>
<ul>
<li>Set up automated monitoring and alerts for our systems, and establish our corporate monitoring practices</li>
<li>Set up, and/or work with consultants on setting up, master/slave farms for some subsystems, such as Redis, Lighttpd, and PostgreSQL</li>
<li>Do system and high-level application performance analysis, such as: Monitoring server load over time; adjusting configurations of technologies such as lighttpd, httpd, and memcache; understanding “where the time is going” in problematic code paths; and knowing when to call in a technology expert</li>
<li>Deploy hot fixes and regular releases. This includes preparing an upgrade plan, ensuring we can rollback, and communicating the schedule and status to the company</li>
<li>Continually look for ways to improve our system management, e.g. in security, efficiency, and employee workload</li>
<li>Set up and manage our QA staging system when we enter a release cycle</li>
<li>Be our first response level for all production problems. Quickly triage them according to severity, probable cause, and workarounds</li>
<li>Design and implement an operational coverage plan for when we need to expand beyond 5 x 8 support</li>
<li>Work with the developers to characterize and understand bugs, and fix code bugs yourself</li>
</ul>
<p><strong>Qualifications</strong></p>
<ul>
<li>7+ years experience in devops. Experience in managing 20+ servers (and you aren’t hesitant about managing more of them)</li>
<li>2+ years real-world, serious Python coding experience</li>
<li>Solid experience in deploying code to, configuring, and working with virtual hosting environments and Linux (Debian family) systems</li>
<li>Solid experience with modern software engineering techniques and tools</li>
<li>Excellent judgement in assessing problems. When you encounter a symptom with incomplete information, you’re comfortable choosing a technique or process to deal with it, and improvising as you go</li>
<li>Familiarity with different approaches to expanding operational coverage</li>
<li>Points awarded for experience in profiling or tuning databases or search engines (e.g., Postgres, Redis, and Solr), even if only at the system level</li>
<li>Points awarded for experience with Fabric, Munin, Nagios, configuration management tools, centralized logging services or tools, Nginx, and HAProxy or similar load balancers / reverse proxies</li>
<li>You would describe your skills as spanning coding, system administration, Linux, and configuring and administering OSS technologies</li>
<li>You don’t just learn how things work. You also learn why!</li>
<li>You’re self-sufficient and a self-starter, and confident in setting standards</li>
<li>You’re eager to build a team from the ground up</li>
<li>Excellent team and communication skills</li>
<li>Bachelors Degree or equivalent in Computer Science or Software Engineering</li>
</ul>
<p>To submit your resume, or for more information, contact <em>john @ this site’s domain</em>.</p>
<br /> Tagged: <a href='http://seeknuance.com/tag/jobs/'>jobs</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/seeknuance.wordpress.com/7412/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/seeknuance.wordpress.com/7412/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=seeknuance.com&#038;blog=2611216&#038;post=7412&#038;subd=seeknuance&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://seeknuance.com/2012/11/04/ip-street-is-looking-for-a-senior-devops-engineer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>47.631545 -122.364657</georss:point>
		<geo:lat>47.631545</geo:lat>
		<geo:long>-122.364657</geo:long>
		<media:content url="http://0.gravatar.com/avatar/06e11035cfdfa379361211795b43f87e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=X" medium="image">
			<media:title type="html">John</media:title>
		</media:content>
	</item>
	</channel>
</rss>
