<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;A0UDSHk7eCp7ImA9WxBbEk8.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395</id><updated>2010-03-10T06:54:39.700-07:00</updated><title>one</title><subtitle type="html">"Whenever you find yourself on the side of the majority, it is time to pause and reflect." - Mark Twain</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://one.valeski.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://one.valeski.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>176</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/valeski/one" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="valeski/one" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0UDSHk6fip7ImA9WxBbEk8.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-7596480101769439121</id><published>2010-03-07T20:01:00.002-07:00</published><updated>2010-03-10T06:54:39.716-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-10T06:54:39.716-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mountain biking" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="hardware" /><title>Fast &amp; Slow</title><content type="html">Pondering the meaning of life while &lt;a href="http://connect.garmin.com/activity/26459956"&gt;bombing down Poorman&lt;/a&gt; the other day on my mountain bike, I realized the two things that have had the most impact on my two my favorite activities (coding and mtn. biking) serve two radically different purposes.&lt;br /&gt;&lt;br /&gt;Disk Brakes. I got my first set (&lt;a href="http://www.hopetechusa.com/"&gt;Hope manufactured&lt;/a&gt;) just last year. I'm a late adopter on the bike equipment front. The slowing/stopping power of these has totally changed how I ride.  &lt;br /&gt;&lt;br /&gt;Solid State Drives. I've been using these since they came to market. I'm an early adopter on the computer junk. The I/O speed of these things has totally changed how fast I can build &amp; run tests.&lt;br /&gt;&lt;br /&gt;It's the little things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-7596480101769439121?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/7596480101769439121/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=7596480101769439121" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7596480101769439121?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7596480101769439121?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/03/fast-slow.html" title="Fast &amp; Slow" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CEENQHc5eyp7ImA9WxBVE0k.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-3483813021925453780</id><published>2010-02-16T10:22:00.006-07:00</published><updated>2010-02-16T10:51:31.923-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-16T10:51:31.923-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Multi-level Single Table Inheritance (STI) in Rails</title><content type="html">This took me more than one attempt to get right, so I thought I'd blat it out in a blog post in case anyone else has been struggling with it. In the end, the implementation matches your intuition, but getting the sub-classing syntax right took a few tries (undoubtedly due to my relative newness to Rails/Ruby).&lt;br /&gt;&lt;br /&gt;Why would you want multi-level STI? When you're using multiple inheritance (class_c inherits from class_b and class_b inherits from class_a) and you want that relationship maintained through ActiveRecord; that's when.&lt;br /&gt;&lt;br /&gt;Take the following three classes for example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/app/model/a/class_a.rb&lt;br /&gt;class A&lt;br /&gt; def method_a&lt;br /&gt;   "a"&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;/app/model/a/class_b.rb (yes, I mean dir 'a'. class_b.rb is a peer of class_a.rb)&lt;br /&gt;class A::B &lt; A&lt;br /&gt;  def method_b&lt;br /&gt;    "b"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class A::B::C &lt; A::B&lt;br /&gt;  def method_c&lt;br /&gt;    "c"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Notice the explicit class hierarchy notation. Without this, I can't get the multi-level relationship maintained through STI.&lt;br /&gt;&lt;br /&gt;From here, you can merrily create the class through ActiveRecord, assuming you have an existing table for the base class (which includes the 'type' column (where AR stashes the class hierarchy/name information for subsequent instanciations), and use all the methods.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;A::B::C.create!&lt;br /&gt;...&lt;br /&gt;c = A.first&lt;br /&gt;c.method_a =&gt; 'a'&lt;br /&gt;c.method_b =&gt; 'b'&lt;br /&gt;c.method_c =&gt; 'c'&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-3483813021925453780?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/3483813021925453780/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=3483813021925453780" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3483813021925453780?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3483813021925453780?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/02/multi-level-single-table-inheritance.html" title="Multi-level Single Table Inheritance (STI) in Rails" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0QFQHs-eSp7ImA9WxBWFE8.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-2664395606122792914</id><published>2010-02-05T21:03:00.002-07:00</published><updated>2010-02-05T21:08:31.551-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-05T21:08:31.551-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="chrome" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="browser" /><title>Google Chrome for Mac</title><content type="html">I spent the past few days with Google Chrome for Mac as my default browser on my primary machine. I &lt;a href="http://search.twitter.com/search?q=&amp;amp;ands=&amp;amp;phrase=&amp;amp;ors=&amp;amp;nots=&amp;amp;tag=chrome&amp;amp;lang=all&amp;amp;from=jvaleski&amp;amp;to=&amp;amp;ref=&amp;amp;near=&amp;amp;within=15&amp;amp;units=mi&amp;amp;since=&amp;amp;until=&amp;amp;rpp=20"&gt;tweeted some notes about the experience&lt;/a&gt; if you're interested in the details.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've reverted my default back to Firefox (3.6) however because of page incompatibility (rendering, JS execution, and lacking plugin support) issues I just don't have time to workaround with a new browser.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I did like about the experience however were the DNS pre-caching optimizations that Google incorporated, and how child-tabs were handled; nice work!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Building a browser is hard. Good luck Google.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-2664395606122792914?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/2664395606122792914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=2664395606122792914" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2664395606122792914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2664395606122792914?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/02/google-chrome-for-mac.html" title="Google Chrome for Mac" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0EGSHc7cSp7ImA9WxBXEEw.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-2864914878181889925</id><published>2010-01-20T10:07:00.004-07:00</published><updated>2010-01-20T11:20:29.909-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-20T11:20:29.909-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="http" /><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="browser" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Does Browser HTML5 Support Matter?</title><content type="html">A few weeks ago I watched a saddening interview that a Google guy conducted in NYC; &lt;a href="http://www.youtube.com/watch?v=o4MwTvtyrUQ"&gt;What is a Browser&lt;/a&gt;? It was sad because effectively no-one even knows what a browser is. The neat thing about that fact though is that the browser is so ubiquitous that people don't even know it exists.&lt;br /&gt;&lt;br /&gt;The other day a co-worker and I were talking about whether or not HTML5 stuff matters anymore. Did Flash get enough market coverage to own "rich" client-side-software forevermore? Will content developers use HTML5 stuff? Are content developers relevant anymore? These are the kinds of questions that came up in the conversation. Here's my perspective.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Flash&lt;/span&gt;&lt;br /&gt;It's done a lot for us (thanks Macromedia), but it's still too proprietary and takes too much tooling to do anything interesting with it. Furthermore, video quality (at least what the industry has adopted) is pathetic, and in a world wherein video is becoming more and more relevant (thanks to ease of production of HD content, as well as increasing bandwidth), it's not going to cut it much longer. There's a quarter-ton of Flash content out there though (e.g. YouTube), so, in some capacity, it's here to stay for a long time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Content Developers&lt;/span&gt;&lt;br /&gt;HTML5 exposes some incredible functionality at the JS/HTML/DOM levels. However, while the erosion of the plugin API walls allows for a more fluid/native/stable browsing experience, today's Content Developers aren't going to be able to leverage most of the features directly. Relatively complex programming concepts are making their way up the stack which is great (un-chain the beast!), but the Content Developer brains out there aren't going to map 1-to-1 with the skill-set it takes to harness the beast's strength. New tool chains (ala Macromedia/Adobe app suites) will have to emerge in order to allow today's Content Devs/shops to build using most of the new features.&lt;br /&gt;&lt;br /&gt;Put another way, the folks I know leveraging &lt;canvas&gt;, web sockets, &amp;amp; new local storage interfaces in interesting ways are heavy hitting engineers. Convenience libs will evolve however, and the masses will be able to leverage the new features in the end. It'll just take some time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Will the features get used? Or, if they build it, will developers come?&lt;/span&gt;&lt;br /&gt;HTML5 implementations will yield the most significant browser innovation in a long time, but who's pushing for the changes to begin with? Google for one. Last year's Google I/O conference was a HTML5 circus; I was shocked. I'm stoked Google's pushing hard on HTML5 content/app creation, and apparently betting their entire app strategy on it. I'm still perplexed by Chrome though, and am convinced they're using it simply to stoke Mozilla into building all the right features into Firefox, at which point they kill Chrome. Firefox will do the right thing, of course, w/ HTML5; they're pushed by community &amp;amp; Google. Apple's still off in the weeds with Safari/WebKit; I hope they do the right thing w/ HTML5, but don't really care (other than insofar as it affects my iPhone browsing experience). Microsoft... who cares (other than enterprise which has billions invested in a toolchain that won't adopt HTML5 stuff anytime soon); they're irrelevant in my world anymore.&lt;br /&gt;&lt;br /&gt;So, if you resolve that the browsers will provide "good HTML5" support, who will predominately use the features? Will today's content dev shops announce to their clients that they support "HTML5" and build to it? Or will it be the firms building the browsers themselves (e.g. Google) that have vested application advancement interest?&lt;br /&gt;&lt;br /&gt;Ten years ago I would have said the developers would dictate and bring about the changes. Today... not so much. If HTML5 goes anywhere in today's world, it will be because the big guys pushed it, promoted it, and built to it. The world has changed in this regard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What is "good HTML5 support?"&lt;/span&gt;&lt;br /&gt;The stuff that matters, and why, in HTML5 follows.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;canvas&gt;. we haven't been able to natively draw yet. c'mon.&lt;/li&gt;&lt;li&gt;offline data storage/caching. use gmail on an iPhone to see how powerful this is. you can't build apps without state. you can't build real apps without persistent state. offline data storage will bridge a huge gap between "online" apps and "desktop" apps.&lt;/li&gt;&lt;li&gt;web sockets. this feature has the most potential; both to do evil and good. apps being bound to obfuscated HTTP interactions has been extremely limiting to the content/web-app dev tier, so opening connections up to the page/JS will be powerful. However, the thought of some of the folks who build web-apps having access to a socket also gives me chills.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;nav&gt; element. keyboard navigation to new pages is horrible in today's browsers. while the &lt;nav&gt; element would help fix this, sadly only Safari appears to support it right now.&lt;/li&gt;&lt;li&gt;&lt;audio&gt; &amp;amp; &lt;video&gt;. the law of operating system feature creep says that ubiquitous functionality needs to be natively absorbed. audio and video are a huge part of the web, yet I still have to muck with a zillion different players to listen/see.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-2864914878181889925?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/2864914878181889925/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=2864914878181889925" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2864914878181889925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2864914878181889925?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/01/does-browser-html5-support-matter.html" title="Does Browser HTML5 Support Matter?" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEINR3Y6cCp7ImA9WxBSE0k.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-4361949940880413523</id><published>2009-12-20T13:33:00.005-07:00</published><updated>2009-12-20T15:03:16.818-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-20T15:03:16.818-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="GNIP" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>Gnip's 2009 Rocked My World</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/a/ae/Metamorphosis_frog_Meyers.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 800px; height: 600px;" src="http://upload.wikimedia.org/wikipedia/commons/a/ae/Metamorphosis_frog_Meyers.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After spending 2008 building a phenomenal development team, early 2009 tested me like I'd never been tested before. Half of my career has been spent building/managing teams, and I thought I had it dialed in. Along the way, feedback from individuals (peers, bosses, employees), raises/bonuses, and promotions reinforced an apparent self delusion. At the end of Q1 I was met with the proverbial dousing of cold water in the face. I was confronted with a "Jud goes or I go" situation. My heart broke (it's better now and stronger than ever). I stayed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Compromise&lt;/span&gt;&lt;br /&gt;Prior to that confrontation, while bouncing issues/ideas back and forth with someone who's experience I highly regard and respect, they suggested that I was "overly principled." It was an interesting choice of words I thought. They felt like a gentle way of saying "you're stubborn" or "you're inflexible"; something like that. I used to think I was flexible on the things I should be flexible on, and passionate about the other set. However the entire scenario caused me to reflect and realize that in fact I was incredibly rigid on a few things I shouldn't have been rigid about. I've since changed my approach entirely when working with people (bosses, employees, peers) to one that starts with openness, and morphs from there. Call me soft, but this approach is baring delicious fruit. Have I sacrificed too much? So far no, but only time will tell, and I'm hopeful that the answer is "no."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Any Monkey Could Play&lt;/span&gt;&lt;br /&gt;I used to pride myself exclusively on being able to a) identify great opportunities b) identify, and hire, great talent, and c) rinse-repeat. The theory went that if you only pick winning ideas, and winning people, you will win. My perspective was that if you set that up, then the rest is cake. When churning on this with a friend they suggested "dude, if that's the game, then any monkey could play." With my tail between my legs, I realized the challenge is in recovering from the mistakes (that inevitably get made), adapting to uncontrollable dynamics (even the best laid plans fail), and persevering. Identifying great opportunities and people to work with is only the beginning, and frankly, it's the easy part.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;To Thine Own Self Be True&lt;/span&gt;&lt;br /&gt;My family will tell you I don't have an empathetic bone in my body, and it's likely because I pour my empathy into my employees. Earlier this year I learned that I was out of balance with this arrangement. My "overly principled" stance led to being "overly emotionally" invested in certain people, approaches and dynamics. I'd always been this way on the job, it had worked exceedingly well. However, when running a business, this isn't priority #1. If you're managing people in a mid-large sized company it probably is priority #1, but when you're trying to start something from the ground up, enough shrapnel flies around that folks are going to get hurt. My takeaway here is that I have to shift my empathy around a bit. This is a tricky balance between doing the Right thing from a human/people standpoint, and doing the right thing for the business. It's a different calculation for each person. I'm adjusting mine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Back to that Flexibility Point&lt;/span&gt;&lt;br /&gt;My partner and I have big egos, yet they come out in wildly different ways. Our initial approach to building the product and company left a palpable struggle over control in the air. The struggle nearly destroyed the company. Him being ultimately responsible, as CEO, things came to the ultimate head and we firmly hit the reset button on the company (we let almost half of the company go, we changed the product direction, and technology stack, entirely). We should have done it earlier. The bravery he showed in making that decision was admirable, and it's a lesson I'll take with me forever. While the words went unspoken, it was time for me to back off of a schlew of points that I'd been firmly holding. The ego struggle had to yield or the company would die. That's behind us now, and neither one of us has to expend energy in that space anymore, and we get to focus our energy on things that matter; like building a phenomenal product that meets our customer's needs.&lt;br /&gt;&lt;br /&gt;If you're in an early stage startup...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;focus on building the product, not the company. if you succeed, you can focus on the latter. there's a chicken and egg challenge here that's fun to play with.&lt;/li&gt;&lt;li&gt;if you're doing the previous thing, then you can't handle everyone with soft and fuzzy kid gloves. empathize with people, but be clear and concise around what's working and what's not.&lt;/li&gt;&lt;li&gt;be wary of too many cooks in the kitchen. I used to think that I'd rather deal with the challenge of managing multiple egos and blustering, but no more. I'd rather have one rooster on the team. As always this isn't perfectly cut and dry, but...&lt;/li&gt;&lt;li&gt;employees are happy to tell you what's wrong with your company, but will rarely, ever?, tell you what's wrong with you.&lt;/li&gt;&lt;li&gt;trust your gut; always.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;do &lt;span style="font-weight: bold;"&gt;your&lt;/span&gt; best, and don't worry about the people around you. a year ago Esquire magazine interviewed Client Eastwood and he spewed this gem "&lt;b&gt;As you get older,&lt;/b&gt; you're not afraid of doubt. Doubt isn't running the show. You take out all the self-agonizing."&lt;/li&gt;&lt;/ul&gt;This whole post feels cliche and as though I should have known all of this; heck I've probably been preaching many of these things. Always funny how life twists and turns.&lt;br /&gt;&lt;br /&gt;Work hard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-4361949940880413523?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/4361949940880413523/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=4361949940880413523" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/4361949940880413523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/4361949940880413523?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/12/gnips-2009-rocked-my-world.html" title="Gnip's 2009 Rocked My World" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUUNQnc_eyp7ImA9WxBTF0k.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-324214493944983004</id><published>2009-12-13T16:14:00.004-07:00</published><updated>2009-12-13T16:34:53.943-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T16:34:53.943-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="hci" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="hardware" /><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><category scheme="http://www.blogger.com/atom/ns#" term="browser" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Chaning My Computer Interface</title><content type="html">For a few weeks now I've been using fingerprint readers to login to my computers. Mostly an experiment to see how good, or bad, the technology has become over the past several years, it's turned into my preference for logging into my machines and accessing sensitive information.&lt;br /&gt;&lt;br /&gt;The basic idea was to minimize the number of times per day that I have to type my 13 character password. Across my machines I estimate that I get asked for my password 36 times per day (not including websites, but that's a different post). I now respond to at least 24 of those requests with a finger swipe. The remaining requests still require password typing as those requests are to unlock my Apple keychain which the software I'm using (&lt;a href="http://www.upek.com/solutions/mac/"&gt;Upek Protector Suite for Mac&lt;/a&gt;) doesn't support yet (other than one-time global unlocking which I don't want to enable).&lt;br /&gt;&lt;br /&gt;The reader accuracy is effectively 99%, so recognition, which I thought would be an issue, is a forgone conclusion these days; a non-issue.&lt;br /&gt;&lt;br /&gt;I'm left wondering why all machines don't integrate (via mouse, keyboard, or body) fingerprint readers by default. Then again, I'm also the guy wondering why all machines don't come standard with retinal scanners. I know the answer to both wishes, but... dare to dream.&lt;br /&gt;&lt;br /&gt;It looks like the Protector Suite software supports windows machines 10x better than it does OSX, but it's enough of a step up in user experience for me that I'm sticking with it.&lt;br /&gt;&lt;br /&gt;A notable bug is that manual password override doesn't work when bring the machine out of sleep mode when the USB reader is NOT plugged in. Put another way, you have to always have the reader plugged in when moving in/out of sleep mode. This is a major annoyance when using a laptop as it means you have to drag the thumbdrive sized device along with you. The workaround is to cold-boot the machine and potentially lose data in the process. Upek blames Apple's Snow Leopard release, and is waiting for them to resolve the issue, which I suspect will never happen.&lt;br /&gt;&lt;br /&gt;Feature Requests:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firefox password manager support for Mac.&lt;/li&gt;&lt;li&gt;Background swipe monitoring for fast user switching. If I walk up to my home machine, which has 4 different user accounts on it, and the machine is logged into userA (I'm userB), I want to just swipe my finger and have it automatically switch me to userB.&lt;/li&gt;&lt;li&gt;Individual keychain access request unlock swipe support.&lt;/li&gt;&lt;li&gt;Physical hardware integration with all the hardware I use. iPhones, starting my car, all my machines, etc. The readers have to be all but free to manufacture anymore, so I'd like to see them as ubiquitous as built-in web cams please. Thanks.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;My configs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All machines running Apple OSX Snow Leopard&lt;/li&gt;&lt;li&gt;13" Macbook Pro laptop&lt;/li&gt;&lt;li&gt;21" iMac&lt;/li&gt;&lt;li&gt;13" Macbook laptop&lt;/li&gt;&lt;li&gt;One Upek mini/portable/thumb-drive sized USB reader&lt;/li&gt;&lt;li&gt;One Upek larger desktop based USB reader&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-324214493944983004?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/324214493944983004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=324214493944983004" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/324214493944983004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/324214493944983004?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/12/chaning-my-computer-interface.html" title="Chaning My Computer Interface" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkMGRHs9fip7ImA9WxNbGEw.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-8864036947863688080</id><published>2009-11-21T08:07:00.004-07:00</published><updated>2009-11-21T08:47:05.566-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-21T08:47:05.566-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ip-address" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="clouds" /><title>IP Address Brokers; Please Stand Up</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.guim.co.uk/sys-images/Travel/Pix/pictures/2009/4/2/1238691104153/Kennet--Avon-Canal-Lock-n-001.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 460px; height: 276px;" src="http://static.guim.co.uk/sys-images/Travel/Pix/pictures/2009/4/2/1238691104153/Kennet--Avon-Canal-Lock-n-001.jpg" alt="" border="0" /&gt;&lt;/a&gt;I've been trying to formulate some clear thinking for awhile now regarding a major challenge on the network today. It's been brewing for years, and the proliferation of API usage is boiling it over. The power of open discussion is giving the topic some structure and vocabulary, finally, and I'll try to take a step further with this post. Rinse... repeat.&lt;br /&gt;&lt;br /&gt;I spoke at Boulder's CTO lunch earlier this week and we got around to talking about the importance of IP addresses/namespaces/blocks in today's API economy. Josh Fraser (attended the lunch as well) does a great job distilling much of the &lt;a href="http://www.onlineaspect.com/2009/11/20/everything-comes-down-to-the-ip-address/"&gt;thinking in his recent blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;History has taught us that control of information is a powerful economic motivator. Governments and economies rise and fall when regulatory constraints affect how groups of people, or individuals, access to the flow of information/goods. The control may be fueled by greed or survival, but somehow choke points always make their way into the system. APIs in high demand either put business controls on access, or technical controls in place in order to keep backend software running. These controls ultimately boil down to the only entity that is immutable by the time it arrives at a computer system's gateway; the IP address.&lt;br /&gt;&lt;br /&gt;IP addresses are discrete and categorized. They are the single unit that can be perfectly controlled at the very edge of your network. Using them, your system can easily determine who to let in, and who to keep out on an individual basis, or by grouping "all requests coming from company X."&lt;br /&gt;&lt;br /&gt;The advent of cloud computing allows developers to build applications across large IP address blocks owned by someone else (e.g. Amazon). &lt;a href="http://one.valeski.org/2009/08/fatal-flaw-in-cloud-based-social-media.html"&gt;I blogged about this potential fatal flaw a few months ago&lt;/a&gt;. This is a boon for developers, and abusers alike, and it's the latter bucket of individuals that will change the way IP addresses are used for API access. This will be the second coming IP addresses onto the field. The first major control ecosystem for IP addresses came from email and email spam. This new tier will come from APIs, and abuse/spam of them.&lt;br /&gt;&lt;br /&gt;For months I'd been trying to figure out how to virtualize the IP address itself. In Ruby land, &lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt; has pushed IP address allocation so far up into the stratosphere, that it's the closest thing I've seen to getting the IP address completely out of my way. It's only problem is that I still have to have knowledge of the block of IPs from which it draws.&lt;br /&gt;&lt;br /&gt;As a developer I don't want to have to think about the IP address from which my software is making requests. I don't want to know if it's "clean" or "dirty" from the POV of the service I'm trying to access. I just want to access the service, within the bounds of its ToS. However, with cloud computing, I may be being punished because the IP address I'm using may be in a block of addresses that the service provider has "blacklisted" and constrained access to. This is bad and I currently have to spend time thinking about it, and working around it, much like legitimate email senders had to do yesterday. Today however, they can pay an intermediary to ensure the email gets through. I want an intermediary to ensure my API calls will get through.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Industries Born&lt;/span&gt;&lt;br /&gt;In the coming months we're going to see router manufacturers make plenty of money providing more configurable IP routing/blocking/management solutions built directly into their firmware. Companies have productized their APIs, and ops teams are going to need easy solutions to managing the IP addresses accessing those APIs.&lt;br /&gt;&lt;br /&gt;More significantly, we're going to see IP address brokerages emerge for APIs just as we did for email. Hundreds of millions of dollars are spent each year to ensure email gets through. Email brokerage is a big business, and I'd like to see those firms provide API brokerage as well (hint hint &lt;a href="http://sendgrid.com/"&gt;SendGrid&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-8864036947863688080?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/8864036947863688080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=8864036947863688080" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/8864036947863688080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/8864036947863688080?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/11/ip-address-brokers-please-stand-up.html" title="IP Address Brokers; Please Stand Up" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0YNRng5cSp7ImA9WxNUFkk.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-5541429202215251934</id><published>2009-11-07T17:19:00.006-07:00</published><updated>2009-11-07T17:46:37.629-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-07T17:46:37.629-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="u" /><title>Isolated Collaboration</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wired.cz/matrix1/images/FAQs/Litref/mouth.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 390px; height: 250px;" src="http://www.wired.cz/matrix1/images/FAQs/Litref/mouth.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I periodically checkout the &lt;a href="http://addons.mozilla.org/"&gt;Mozilla Add-ons site&lt;/a&gt; to see what's new. I just grabbed &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5677"&gt;Reframe-it&lt;/a&gt; given that a decentralized client, non-publishing platform specific, commenting model only makes sense. Sadly, no-one's using it; the sites I visited didn't have others commenting on content. This reminded me of the me.dium (now oneriot) sidebar I worked on years ago. Again, another solid decentralized collaborative client (centralized server) product idea, that consumers wouldn't consume. Again, sad.&lt;br /&gt;&lt;br /&gt;As consumers why do we continue to do it the wrong way? Relying on publishers to install walled garden user feedback/comment models (IntenseDebate, disquss, etc) is a disaster. When does commenting/discussion break out into its own client/server/protocol (obviously reuse something on that front) so I don't have to rely on the Publisher to have done something w/ their site to support feedback loops. I wonder if Google Wave will gain enough momentum to cause real change here.&lt;br /&gt;&lt;br /&gt;The industry is heavily weighted toward open protocols/standards that allow services to cross-communicate (oauth, openid, come to mind). While a good thing, I think we've swung too far to the server-side in this regard. Look at it this way, sans browsers (clients), we've got nothing, yet we're trying to build something (collaboration) based on servers/publishing platforms that have walls between them. That seems horribly broken to me. The model is ripe to have clients (mind you, potentially server-side operated clients... not strictly client-side-software... though in this case I suspect client-side is opportune) act as collaborative agents in order to get a sense of community across the network (not just within various walled gardens) at large.&lt;br /&gt;&lt;br /&gt;I don't buy that customers don't want this; lots of people comment on blogs. It falls squarely into the "we don't know what's in our own best interest" bucket. It's going to take a consortium of the major publishing players (from news sites, media companies, blog services) to buy-in to a standard (ha!), or the client (browser) is going to have to force the UI/UX onto us; optional plugins/addons won't cut it.&lt;br /&gt;&lt;br /&gt;The network is desperate for a revolution on several fronts. I'm hopeful there's enough steam in the collective invention engine to make some stuff happen. While I've enjoyed living through the advent of the Internet, I don't want it to have been the only major societal shift in my lifetime.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-5541429202215251934?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/5541429202215251934/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=5541429202215251934" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/5541429202215251934?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/5541429202215251934?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/11/isolated-collaboration.html" title="Isolated Collaboration" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0EGRnY_eip7ImA9WxNVEU0.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-3856884443643831430</id><published>2009-10-20T22:11:00.003-06:00</published><updated>2009-10-20T23:07:07.842-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T23:07:07.842-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="parenting" /><title>Like Father, Like Son</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ori.dhhs.gov/tools/high_low_contrast_regions_large.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 800px; height: 400px;" src="http://ori.dhhs.gov/tools/high_low_contrast_regions_large.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahhh parenting.&lt;br /&gt;&lt;br /&gt;Earlier this evening my wife and I returned from our seven-year-old's first parent-teacher conference as a first grader. We'd done a few when he was in kindergarten, but those don't really count as they're just too young to derive much from the discussion.&lt;br /&gt;&lt;br /&gt;This one was hard.&lt;br /&gt;&lt;br /&gt;I never fit in growing up. I probably still don't today, but as we grow older there are fewer and fewer clicks for folks to actually fit into, so things tend to find natural balance. At first glance it's looking like my son won't fit the general profile either. I feel bad for my wife as, if these early signs are a harbinger, she's not ready for what lies ahead in the years to come.&lt;br /&gt;&lt;br /&gt;You see, I can be a tad pedantic, and my son is trending the same way. I've always been this way, and particularly in the early years, it really gets in the way. When other kids were blissfully unaware of what was going on around them, I was obsessed with my surroundings; people, authority (real &amp; imagined), culture, structure, music, science, how the world works, etc. The challenge is that such an outlook on life doesn't fit the mold, so there is constant tension, confusion, and misunderstanding amongst the players.&lt;br /&gt;&lt;br /&gt;The education system deemed me "too serious," "angry," "depressed," "anti-social," and on and on and on. As a result, I was always the odd man out. The models didn't work for me, so I got squeezed out to the sidelines while the majority gleefully marched along.&lt;br /&gt;&lt;br /&gt;After some big bumps in the road, I finally figured out the game and realized it was easier to play along with everyone else for a few more years, then I'd be off to college and able to define my world the way I wanted it to be. I'd get to leave the constricted frameworks behind. All of that has worked out pretty well, though there are still plenty of constructs I don't fit in. I've learned how to adapt/adjust however, and life is good.&lt;br /&gt;&lt;br /&gt;We talked with the teacher for awhile about some of these notions, and I imagined my parents' first parent-teacher conference with my first grade teacher. I'm sure it went the exact same way. My parents screwed up plenty while rearing me and my brother (we'll obviously do the same with our children), but one thing they did that blows me away to this day is they loved me, believed in me, and fought for me for over a decade of true mayhem.&lt;br /&gt;&lt;br /&gt;While I hope we're just in yet another proverbial phase, in case we're not, I look forward to leading my son with the same love, perseverance, dedication and faith that my parents did with me.&lt;br /&gt;&lt;br /&gt;To my wife, if we have to walk down this path, while it'll be petrifying, don't worry, I've walked down it, I know which turns to take, and amazing things are at the other end.&lt;br /&gt;&lt;br /&gt;To my son (if you ever wind up reading this), I love who you are. I love knowing we see the world through similar eyes. We experience life in the same way, and that bond is truly amazing; we'll share it forever in ways few ever do. Embrace who you are and enjoy it. Being the black-sheep yields greatness. I'll always be by your side.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-3856884443643831430?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/3856884443643831430/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=3856884443643831430" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3856884443643831430?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3856884443643831430?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/10/like-father-like-son.html" title="Like Father, Like Son" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEQCRXs_cSp7ImA9WxNWF0g.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-5774528950390256307</id><published>2009-10-16T22:43:00.004-06:00</published><updated>2009-10-16T23:12:44.549-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-16T23:12:44.549-06:00</app:edited><title>Nokogiri Performance: xpath vs. tree walking/iterating</title><content type="html">At &lt;a href="http://gnip.com"&gt;Gnip&lt;/a&gt; we're doing some heavy XML parsing in Ruby and obviously chose &lt;a href="http://nokogiri.rubyforge.org/nokogiri/"&gt;Nokogiri&lt;/a&gt; as the underlying engine. I started the week doing xpath searches to tease out the elements/attributes from the documents we were parsing, and ended the week iterating over the root's children in order to achieve significant (~3x) performance improvements. While xpath is convenient, as you don't have to pay attention to document structure (assuming you have your head around xpath syntax to begin with), it's horribly expensive in terms of processing time. It's truly searching the document for what you want; expensive!&lt;br /&gt;&lt;br /&gt;There's a big difference between using the "search" (e.g. xpath) interface on top of a parsed DOM and running over the entire tree, testing each node for what it is you're looking for. Code gets a little uglier when doing the latter, it's not as elegant/clean, but performance starts kicking in when you do it. Moving from xpath search-style parsing, to tree walking yielded ~3x performance improvement in parsing for me. I suspect that going all the way to either Nokogiri's Reader or SAX interface would yield an additional 10% improvement over that. However, I'm stoping here for now as the readability/complexity detriment in doing a full Reader/SAX stack-maintenance model doesn't feel worth it at the moment. I would like to try &lt;a href="http://github.com/pauldix/sax-machine"&gt;pauldix's SAX machine&lt;/a&gt; declarative parser (built on Nokogiri) and run some benchmarks, but... another day.&lt;br /&gt;&lt;br /&gt;Old:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  doc = Nokogiri::XML.parse(some_xml_string) { |cfg| cfg.noblanks }&lt;br /&gt;&lt;br /&gt;  doc.xpath('/xmlns:feed/xmlns:entry').each do |entry|&lt;br /&gt;    at = entry.xpath('xmlns:published').text&lt;br /&gt;    id = entry.xpath('xmlns:id').text&lt;br /&gt;    ...&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;New:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  doc = Nokogiri::XML.parse(some_xml_string) { |cfg| cfg.noblanks }&lt;br /&gt;&lt;br /&gt;  doc.root.children.each do |node|&lt;br /&gt;    if node.name == 'entry'&lt;br /&gt;      node.children.each do |sub_e|&lt;br /&gt;        at = sub_e.inner_text if sub_e.name == 'published'&lt;br /&gt;        id = sub_e.inner_text if sub_e.name == 'id'&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    ...&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-5774528950390256307?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/5774528950390256307/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=5774528950390256307" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/5774528950390256307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/5774528950390256307?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/10/nokogiri-performance-xpath-vs-tree.html" title="Nokogiri Performance: xpath vs. tree walking/iterating" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkQESHo6eip7ImA9WxNQFEg.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-5734533734802801609</id><published>2009-09-20T08:19:00.004-06:00</published><updated>2009-09-20T08:51:49.412-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-20T08:51:49.412-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mountain biking" /><category scheme="http://www.blogger.com/atom/ns#" term="friends" /><title>Tahoe Weekend</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3419/3934696702_b77c10db67.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 375px; height: 500px;" src="http://farm4.static.flickr.com/3419/3934696702_b77c10db67.jpg" alt="" border="0" /&gt;&lt;/a&gt;I'm wrapping up a perfect mountain biking weekend with some old friends. We've been riding our brains out for three days up in Lake Tahoe. One of the guys used to own his own bike shop, so he became defacto group-support on the trail. What a luxury it is having a mechanic on the rides; the slightest mechanical issue gets resolved in an instant. He also turned out to be a great cook, so instead of constantly eating out, we had fabulous home cooked meals to start and end the days. You rule Buck.&lt;br /&gt;&lt;br /&gt;About half of the group consisted of locals (Truckee, Tahoe Donner) that one of my friends befriended when he lived up here for a few years. The local connection is always priceless. The right trails, the right subtleties, the right everything, instead of fumbling around like a pure tourist. One of the group owns a restaurant in Reno ("Beuno Grill"), and his annual community party coincided with our trip so we partied there last night. Great people, great time.&lt;br /&gt;&lt;br /&gt;The main rides:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://connect.garmin.com/activity/13546608"&gt;Tahoe Rim&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://connect.garmin.com/activity/13615497"&gt;Hole in the Ground&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;One of my favorite things about riding a hard-tail bike is when I get mixed in with soft-tail riders. There's nothing like being told "you can't do this trail on that" by a softie, and then beating them to the finish. I did get to ride some ultra-plush custom Ventanna full-suspensions though. I have to say, really nice rides, but just too disconnected from the trail. I need to feel what's going on underneath me, not be shielded from it. That makes for a good segue into one of the cool cars that came up.&lt;br /&gt;&lt;br /&gt;The car enthusiast in the group brought up his new tricked out BMW M5 (500hp). While a killer ride with amazing power, the entire system is "drive by wire." Driving it was almost confusing as I lacked direct connections to the brakes, gearbox, and throttle. I want to be directly connected to a car with that much power. While BMW had done an incredible job pulling it all together, it was obvious there was a computer between me and the road.&lt;br /&gt;&lt;br /&gt;I've been on V-Brakes forever, but after riding some HOPE branded hydraulic disk brakes, I'm going to switch over. The stopping power is incredible, and my forearms could use a break. I'm going to stay hard-tail though; all hard... all the time.&lt;br /&gt;&lt;br /&gt;Great weekend. Nice to catchup with old friends. Nice to grind out some epic rides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-5734533734802801609?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/5734533734802801609/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=5734533734802801609" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/5734533734802801609?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/5734533734802801609?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/09/tahoe-weekend.html" title="Tahoe Weekend" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkMER3k6eip7ImA9WxNQEkw.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-6690709420140331134</id><published>2009-09-17T11:26:00.008-06:00</published><updated>2009-09-17T12:00:06.712-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T12:00:06.712-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="scale" /><category scheme="http://www.blogger.com/atom/ns#" term="techstars" /><title>TechStars Pain Pattern</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.colinsackett.co.uk/images/books/ellipsis.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 472px; height: 354px;" src="http://www.colinsackett.co.uk/images/books/ellipsis.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Image courtesy of&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt; &lt;a href="http://www.colinsackett.co.uk/"&gt;&lt;span style="font-size:100%;"&gt;Colin Sackett &lt;span class="maroon"&gt;|&lt;/span&gt; Book design &amp;amp; publishing&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I recognize patterns; large and small; over short periods, and long. Remember those SAT questions to find patterns in obscure information? I &lt;span style="font-weight: bold;"&gt;owned&lt;/span&gt; those. After my 2nd year involved in &lt;a href="http://www.techstars.org/"&gt;TechStars&lt;/a&gt;, a pattern has squarely emerged. Almost all teams build something quickly based on some LAMP stack derivative. The teams that "succeed" (e.g. find users/usage) always start asking performance related "help" questions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The application is slowing down." "The site is slow when we do a campaign." etc. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wind up digging into a team's stack and inevitably see three things that always account for the bulk, if not being exclusively, "the problem."&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Page loads cause complex SQL queries to be run. Don't do that. It's cute and easy when you don't have usage, but it won't work when you get traction. If you did it for expediencies' sake, fine, but plan on undoing it later. DB's can crater any good application. Cache the data your users want so they don't have to hit a DB for it. You can't always tear a DB out of the flow, but try, and try hard.&lt;/li&gt;&lt;li&gt;The server does more processing than it needs to do. Use your users. They have powerful computers and browsers that can execute code very well. Shunt rendering of data/objects down to the browser via JS (or Flash), if this becomes a problem. Do you really need to parse that DOM on the server for every page-load to derive the list of things you want to show the user? No, let client-side JS do the parsing/sorting. This line is always fine however; overburdening the browser doesn't buy you much. Point is, find the balance. Your goal in life should be to serve flat files that require nothing more than Apache connecting an IP socket to a file descriptor to let the OS shuffle bits to and fro. Follow that path and good things will come. Flatten your stuff &lt;span style="font-weight: bold;"&gt;before &lt;/span&gt;a user accesses a page on your service, not &lt;span style="font-weight: bold;"&gt;when&lt;/span&gt; they do.&lt;/li&gt;&lt;li&gt;Don't store images in a database. C'mon, seriously. Worst case store references to said images that live out on a disk (or CDN) somewhere. I'd argue you don't even need to store the references if you get your model right; your app should just be able to derive an image's location based on some pattern. Ahhh, full circle.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;On a related note, at a local "CTO lunch" the other day, &lt;a href="http://falseprecision.typepad.com/my_weblog/2007/11/scaling-your-st.html"&gt;Todd Vernon recited an old blog post of his called "Scaling Your Startup"&lt;/a&gt;. A few of some of these principles are reiterated there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-6690709420140331134?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/6690709420140331134/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=6690709420140331134" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6690709420140331134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6690709420140331134?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/09/techstars-pain-pattern.html" title="TechStars Pain Pattern" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0QMQ3s4eip7ImA9WxNRFkU.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-7576225447185417330</id><published>2009-09-11T09:53:00.004-06:00</published><updated>2009-09-11T10:09:42.532-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-11T10:09:42.532-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c10k" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="scale" /><title>Can't scale? Be Sure To Blame Your Code.</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wwwedu.ge.ch/po/stael/anglais/g3/Read/leapfrog.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 234px; height: 361px;" src="http://wwwedu.ge.ch/po/stael/anglais/g3/Read/leapfrog.gif" alt="" border="0" /&gt;&lt;/a&gt;Web app scale bottlenecks (software &amp;amp; hardware) have leapfrogged themselves a few times over the past 15 years, and I just came across a concise view of how software had to react once hardware/bandwidth reached a new speed/throughput tier back around the year 2000; &lt;a href="http://www.kegel.com/c10k.html"&gt;http://www.kegel.com/c10k.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The C10k problem, and solutions, document is a fabulous overview of the techniques used to eliminate software servers as a bottleneck. Thus, hardware became the bottleneck again.&lt;br /&gt;&lt;br /&gt;If you can't meet your application's user demand it is because you haven't written the correct software to do so. You can try to blame the fact that you don't have enough hardware/bandwidth, but that problem is solved with the flick of a pen (money). Your challenge is solving your software problem. Enough components in the stack (from web servers, to application servers (custom if you have to) and data storage solutions) solve the C10k problem now, that any issues in your application software are likely yours. Find better tools/components, and/or write better code.&lt;br /&gt;&lt;br /&gt;If you don't have the money to acquire the hardware you want, you might be working on the wrong thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-7576225447185417330?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/7576225447185417330/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=7576225447185417330" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7576225447185417330?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7576225447185417330?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/09/cant-scale-be-sure-to-blame-your-code.html" title="Can't scale? Be Sure To Blame Your Code." /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CU4BRX04cSp7ImA9WxNSEUk.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-3986394526479989675</id><published>2009-08-24T11:54:00.001-06:00</published><updated>2009-08-24T13:59:14.339-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T13:59:14.339-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ip-address" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="clouds" /><title>Fatal Flaw in Cloud Based Social Media Apps?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.craphound.com/images/black-hole-800.GIF"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 420px; height: 295px;" src="http://www.craphound.com/images/black-hole-800.GIF" alt="" border="0" /&gt;&lt;/a&gt;For the purposes of this post I'm going to define "cloud computing" as a service that allows you to easily run your application on someone elses' infrastructure, and importantly, within their IP address block range.&lt;br /&gt;&lt;br /&gt;As "web app" web API usage continues to grow, the significance of the long forgotten IP address as a fundamental application stack component grows along with it.&lt;br /&gt;&lt;br /&gt;Public facing web APIs are accessible via publicly facing IP addresses, by applications running on other publicly facing IP addresses. When the demand for a polled web API outstrips supply (artificially imposed or otherwise), engineers throttle access to said API based on the consumer's IP address. The consuming IP address is the only guaranteed uniquely identifiable attribute of a "web app." Therefore, it is the one thing that can guarantee the rate-limiting of a resource.&lt;br /&gt;&lt;br /&gt;This was all well and good when standing up your web application in an environment with its own IP address was relatively difficult. However, with the advent of Google App Engine and Amazon Ec2 "clouds," "web app" deployment is trivial. The result is a lot of software utilizing a relatively constrained resource; the IP address.&lt;br /&gt;&lt;br /&gt;The overuse and abuse of web APIs is well documented and many services have been brought to their knees as a result. Operations teams have had to fall back on age-old IP address blocking techniques in order to protect themselves. Unfortunately, for cloud computing services, this means their IP address blocks/ranges are often black-listed, which leaves legitimate web applications built on top of them out in the cold.&lt;br /&gt;&lt;br /&gt;The historical parallel to this kind of black-holing of IP address ranges goes back to ISPs restricting email from servers which would consistently allow spam through their gateways. Any email provider of size has black-lists of known wrong-doing IP address blocks, to ensure their system's (and their user's) aren't crushed by the onslaught of spam. While a reasonable model for blocking spam, the thought of the same model being used to control web application innovation is frightening.&lt;br /&gt;&lt;br /&gt;That said, the market will decide whether or not the IP address will remain the canonical access regulator. In many ways any other version of the future is incomprehensible, but now that the IP address has become such a fundamental part of an application developer's daily life, I have to think a new construct for cross-machine communication will evolve.&lt;br /&gt;&lt;br /&gt;Cloud providers can either live with the fact that their IP address blocks are being limited, and have web API leveraging "web app" developers move away from their platforms, or they can work to find a solution. Unfortunately for them, their entire frameworks currently revolve around relatively contiguous IP address blocks, and changing that isn't easy given their operating scale.&lt;br /&gt;&lt;br /&gt;As with any constrained resource, developers will work hard to obtain it, and web APIs are no exception.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-3986394526479989675?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/3986394526479989675/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=3986394526479989675" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3986394526479989675?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3986394526479989675?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/08/fatal-flaw-in-cloud-based-social-media.html" title="Fatal Flaw in Cloud Based Social Media Apps?" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0YBQH06fCp7ImA9WxNTFU8.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-6462312714320469487</id><published>2009-08-17T09:50:00.005-06:00</published><updated>2009-08-17T10:05:51.314-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-17T10:05:51.314-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GNIP" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Dirty Data, Python &amp; Gnip</title><content type="html">I've been tinkering with Python (2.5) over the past few months; both in Google App Engine, and in free-running apps/processes. My initial free-running apps ingested "structured" content from a variety of web APIs, and would crash roughly every 12 hours, and would need to be restarted. Subsequently I took a "short-lived" process approach to managing these apps; cron would monitor them to make sure they were still running, then restart them if they'd died.&lt;br /&gt;&lt;br /&gt;More recently I built an app that digested data from a known clean API (Gnip). Digesting data from Gnip ensures consistency in data format and structure. As a result, the Python app has been running for several days without issue. Now, of course the initial app crashing was due to bugs in code I wrote, but bulletproofing against broken/dirty/poorly-encoded/inconsistently-encoded data coming from random web APIs is a pain. Covering every case in modern apps takes a lot of energy. I opted for the "bounce it" strategy rather than to debug the issue (a major time sync due to variability and inconsistency; any engineer's worst nightmare).&lt;br /&gt;&lt;br /&gt;The new application has instilled faith in Python as a choice for long-lived app processes, and reinforced how important clean input data is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-6462312714320469487?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/6462312714320469487/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=6462312714320469487" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6462312714320469487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6462312714320469487?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/08/dirty-data-python-gnip.html" title="Dirty Data, Python &amp; Gnip" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0cBQHs7eCp7ImA9WxJUEEg.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-958760158166223665</id><published>2009-07-08T07:10:00.002-06:00</published><updated>2009-07-08T07:17:31.500-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-08T07:17:31.500-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="analysis" /><category scheme="http://www.blogger.com/atom/ns#" term="sentiment" /><title>Sarcasm and Sentiment Analysis</title><content type="html">Sentiment analysis of digitized content (tweets, email, blog posts, etc) is hard. Sarcasm makes it even harder. Consider how many sarcastic comments are made in our online communications each day. "I love being delayed at the airport." "I can't stand it when everything is going my way." etc. Analyzing text like that has got to throw even the best sentiment analysis engines for a loop, and the false positives start flying.&lt;br /&gt;&lt;br /&gt;If you're sarcastic, like me, you've learned to keep your sarcasm to a minimum when you're writing because the context just isn't there for your reader, much less a machine, to understand the subtle shifts in tone or where you're coming from.&lt;br /&gt;&lt;br /&gt;I'm looking forward to sentiment deduction getting better, but I'd like to see how the logic evolves to understand age-old sarcasm.&lt;br /&gt;&lt;br /&gt;&lt;sarcasm&gt;Maybe we will all just stop being sarcastic to support the machines running our lives.&lt;/sarcasm&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-958760158166223665?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/958760158166223665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=958760158166223665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/958760158166223665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/958760158166223665?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/07/sarcasm-and-sentiment-analysis.html" title="Sarcasm and Sentiment Analysis" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkAHQHs5cCp7ImA9WxJVFUs.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-6265939700763543322</id><published>2009-07-02T14:41:00.002-06:00</published><updated>2009-07-02T15:05:31.528-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-02T15:05:31.528-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="http" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="gae" /><category scheme="http://www.blogger.com/atom/ns#" term="aws" /><title>Speed Date with Google App Engine</title><content type="html">I assumed that in the months since the announcement of &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, that its glaring HTTP client deficiencies would have been resolved. Nope.&lt;br /&gt;&lt;br /&gt;Any modern platform needs a robust HTTP client (timeout controls, full method support, custom headers, compression support, authentication support, and redirect handling). Unfortunately, GAE's urlfetch client (which the standard Python HTTP clients all funnel down to) doesn't let you tweak various headers (including Referer). Nor can you customize the connection timeouts. Both of these tweaks are tools of the modern day web services programming trade. Subsequently, I have to cast GAE to the tinker toy pile with the rest of today's high-level web apps. A quick look at the app repository proves this out sadly.&lt;br /&gt;&lt;br /&gt;On the other hand, take a look at what's been built on &lt;a href="http://aws.typepad.com/"&gt;Amazon's AWS&lt;/a&gt;. Goes to show what you can do when you have an open platform.&lt;br /&gt;&lt;br /&gt;That said, GAE does show promise for hosting simple user facing web applications, or offline data crunching/hosting apps (ala google.com) with quick user facing response times and little reliance on the outside web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-6265939700763543322?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/6265939700763543322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=6265939700763543322" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6265939700763543322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6265939700763543322?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/07/speed-date-with-google-app-engine.html" title="Speed Date with Google App Engine" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUMGRX4zfCp7ImA9WxJVEU0.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-1853421752523181283</id><published>2009-06-26T19:57:00.005-06:00</published><updated>2009-06-27T06:57:04.084-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-27T06:57:04.084-06:00</app:edited><title>TechStars Boulder 2009: Half-Time Report</title><content type="html">The other night I attended the first "pitch practice" for this year's set of &lt;a href="http://www.techstars.org/"&gt;TechStars&lt;/a&gt; Boulder companies. Watching the evolution is always fascinating. So far, my first impressions are holding strong. Those who I suspected would struggle, are struggling. Those who I expected would be knocking it out of the park are doing so.&lt;br /&gt;&lt;br /&gt;Comparing and contrasting the 2009 crew to the 2008 crew, I find that this year's companies are, on the whole, more mature than last year's. More companies this year have their products further down the path of where I think they will ultimately end up, than last year. It's been nice to work with teams that are more crystallized in their thinking and implementations. Of course, there's always the crew that bounces back and forth for awhile until they hone things to the point they can walk down a straight line.&lt;br /&gt;&lt;br /&gt;For those doing user facing products, the focus on the concepts that will "hook" a user is much better than last year. Too many priorities tend to doom a team, and recognition of this is coming fast. That said, there's a big difference between knowing which features to drop and actually dropping them; it can be hard to let go.&lt;br /&gt;&lt;br /&gt;For those doing more infrastructure intense products, the technical skills brought to bare, and understanding of the issues at hand, is much more advanced than last year. The infrastructure plays have a special place in my heart so it's been fun to work with folks doing more backend stuff.&lt;br /&gt;&lt;br /&gt;Of course, there's a star burning hotter than the others. This team has taken a problem that billions of dollars have been thrown at, to little avail, and turned it upside down. As a result, they have a phenomenal product that is going to do things for an industry that has been begging for it for decades. Brilliant, and totally cool. I can't say who it is, but it will be apparent when the season's over.&lt;br /&gt;&lt;br /&gt;Some technical patterns/themes that pervade almost every team this year:&lt;br /&gt;- Polling. Mashing APIs together is the norm now, and the access paradigm overly leveraged is polling. Conveniently my company Gnip (http://gnip.com) is trying to make this easier.&lt;br /&gt;- Queuing. Polling's ugly sibling. More teams are challenged with queuing needs in their application which bumps complexity up a notch. The simplest advice is best here. Queuing Theory 101: if the average inbound rate of items is greater than the system's ability to digest them; you're screwed, rethink the model.&lt;br /&gt;- Data Storage. "How am I going to store all that data in an access efficient manner?" The inbred offspring of Polling and Queuing, data storage challenges are real for a few of the companies. For the others, the age old simple relational DB model will foot the bill.&lt;br /&gt;&lt;br /&gt;One thing that will never cease to amaze me is the energy, passion, and commitment that radiates from the teams. Amazing.&lt;br /&gt;&lt;br /&gt;Boulder is lucky to have this program, and I'm lucky to be a part of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-1853421752523181283?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/1853421752523181283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=1853421752523181283" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/1853421752523181283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/1853421752523181283?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/06/techstars-boulder-2009-half-time-report.html" title="TechStars Boulder 2009: Half-Time Report" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkIERnw4eCp7ImA9WxJWE0U.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-9083241005422299855</id><published>2009-06-18T20:38:00.003-06:00</published><updated>2009-06-18T21:01:47.230-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T21:01:47.230-06:00</app:edited><title>Faithfully Breaking Rules</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.basturea.com/images/faith-and-confidence-pulitzer.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 348px; height: 434px;" src="http://blog.basturea.com/images/faith-and-confidence-pulitzer.jpg" alt="" border="0" /&gt;&lt;/a&gt;Spending a week on a 15k person island (Martha's Vineyard) with family has made me think about breaking the rules in more ways than one. Reading the local paper this morning reminded me of how important it can be to break the rules. One of the bakeries in Oak Bluffs opens their back alley door at 10:30pm every night to sell doughnuts as they're coming off the line; all night until 7am. I'm sure they're breaking numerous zoning and health code rules in the process, but needless to say with a population of this size, everyone loves it, and no-one cares; no harm no foul.&lt;br /&gt;&lt;br /&gt;The "family" aspect of this vacation has me bending/breaking, and enforcing, numerous parenting rules as well. Ice cream everyday? No problem. Licorice before breakfast? Sure.&lt;br /&gt;&lt;br /&gt;Reading about President Obama's Finance industry reworking got me thinking about "bigger" rules that affect our everyday lives, indirectly and directly. That turned me to one of my favorite, and brutally simple, rules that we, internationally and cross-culturally, effectively &lt;span style="font-weight: bold;"&gt;never&lt;/span&gt; break: "stay on your side of the road when driving."&lt;br /&gt;&lt;br /&gt;Think about it. Everyday millions of people drive two-thousand pound chunks of metal at high-speeds in opposite directions, with nothing more than a couple of feet between them as they pass eachother. There is some base rule that taps into our mortality that truly prevents us from breaking this rule. We have faith that complete strangers will adhere to the rule as well. We hand our lives over to other drivers everyday. I always like coming back to that one as it's an interesting exercise regarding faith in others.&lt;br /&gt;&lt;br /&gt;Photo by: William C. Beall of Washington Daily News&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-9083241005422299855?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/9083241005422299855/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=9083241005422299855" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/9083241005422299855?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/9083241005422299855?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/06/faithfully-breaking-rules.html" title="Faithfully Breaking Rules" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUQGSX88eSp7ImA9WxJQGEs.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-6687356616432221520</id><published>2009-06-01T08:25:00.006-06:00</published><updated>2009-06-01T08:42:08.171-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-01T08:42:08.171-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="family" /><title>"Mommamacations" &amp; Perfect Software</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_iPi569bVVoc/SiPn9Cm9eqI/AAAAAAAAADg/aFIG1KGfQQU/s1600-h/iterations.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 250px; height: 211px;" src="http://3.bp.blogspot.com/_iPi569bVVoc/SiPn9Cm9eqI/AAAAAAAAADg/aFIG1KGfQQU/s320/iterations.gif" alt="" id="BLOGGER_PHOTO_ID_5342368618849860258" border="0" /&gt;&lt;/a&gt;My 6.5 year old son and I built a Lego Mindstorm vehicle yesterday. After constructing it, we wrote the software for it. After watching version 1.0 of our software run for about 5 seconds, we noticed a bug so we iterated, fixed the bug, and ran v2 of the software. After about 30 seconds we noticed another issue with the number of degrees the vehicle was turning when it confronted an obstacle. We tuned the software to increase the angle to 90 degrees, compiled, pushed code to the vehicle, and ran it.&lt;br /&gt;&lt;br /&gt;This version, v3, of the software ran for awhile. It ran at home, at his grandparents house, and again this morning. It ran well, for a long time. However, a few minutes ago we found yet another refinement we could make to the turning angle to make it get out of a jam even faster, and I said "aha, I found &lt;span style="font-weight: bold;"&gt;another &lt;/span&gt;modification we can make!" My son replied, "let's make all of the mommamacations [sic] this time." He wanted to write the software once, without bugs, perfectly.&lt;br /&gt;&lt;br /&gt;I went on to explain how it takes time to understand how software is going to work in the real-world and how you can't account for all of the variables and scenarios up front. As a result, you build, test, and refine; you iterate. You can't write it once and have it work perfectly forever.&lt;br /&gt;&lt;br /&gt;He didn't fully grok it, but its starting to sink in. It was a neat interaction with my boy around what my world is all about. Ha! My daughter just yelled out "am I doing ballet today?" Gotta run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-6687356616432221520?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/6687356616432221520/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=6687356616432221520" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6687356616432221520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6687356616432221520?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/06/mommamacations-perfect-software.html" title="&quot;Mommamacations&quot; &amp; Perfect Software" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_iPi569bVVoc/SiPn9Cm9eqI/AAAAAAAAADg/aFIG1KGfQQU/s72-c/iterations.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0UEQ348fSp7ImA9WxJQGE8.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-1695572222927916527</id><published>2009-05-31T19:16:00.005-06:00</published><updated>2009-05-31T19:53:22.075-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-31T19:53:22.075-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xmpp" /><category scheme="http://www.blogger.com/atom/ns#" term="GNIP" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>Google I/O: My Impressions</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.medien.ifi.lmu.de/fileadmin/mimuc/mmi_ws0405/uebung/essays/matthias.schicker/pix/punch%20card.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 606px; height: 273px;" src="http://www.medien.ifi.lmu.de/fileadmin/mimuc/mmi_ws0405/uebung/essays/matthias.schicker/pix/punch%20card.jpg" alt="punch card pic" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.medien.ifi.lmu.de/fileadmin/mimuc/mmi_ws0405/uebung/essays/matthias.schicker/Devices_for_text_input.htm"&gt;&lt;span style="font-size:78%;"&gt;Photo from Matthias Schicker's post.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I attended last week's &lt;a href="http://code.google.com/events/io/"&gt;Google I/O 2009 conference&lt;/a&gt; in San Francisco. Here's what struck me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;HTML 5&lt;/span&gt;&lt;br /&gt;Some friends and I debated what the punchline of the show was over dinner one night, but for me, it was HTML 5; the browser. &lt;a href="http://www.youtube.com/view_play_list?p=41F4CEB92D80C4B7"&gt;The entire introduction sequence&lt;/a&gt; was about JavaScript execution, rendering speeds, &amp;amp; HTML 5 standards. The five minute automated intro demo before the keynote demonstrated web browser functionality, literally, using a web browser for everything. This theme was downright entertaining. HTML 5 is the distillation of everything we've wanted/needed in the browser over the past decade. What's particularly funny about HTML 5, and in Google's all-hands-on-deck push for its implementation across the board, is that, without exception, all the relevant portions were knocked together (in prototype form at a minimum) a decade ago between Netscape/Mozilla, IE, and Opera. The entire two days felt like a browser resurgence.&lt;br /&gt;&lt;br /&gt;What I liked about this was that Google had the gumption, and obviously the money, to make something old, new again. If you ever spent time working on one of the major browsers, you too see the world through HTTP/URL/JavaScript lenses. Those technologies unlock &lt;span style="font-weight: bold;"&gt;everything&lt;/span&gt;. It was cool and fun to be part of a conference dedicated to these concepts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Wave&lt;/span&gt;&lt;br /&gt;I left about of a third of the way through the Wave introduction. Again, 10-year old communication/message-threading concepts being demonstrated in front of a technical audience of four-thousand. My initial reaction was, yawn. I've always loved the notion of treating messaging more centralized (in a logical sense) both from a backend protocol/storage standpoint, as well as from a UI perspective. Naturally flowing between an asynchronous email conversation, and a synchronous IM conversation, will be a beautiful thing when we finally get there. However, it felt awkward having one of Google's top three themes be Wave.&lt;br /&gt;&lt;br /&gt;Architecturally Wave appears to be able to get us there, however standing up Wave providers en-masse will take a long time (consider how long it took for SMTP/POP/IMAP to proliferate).&lt;br /&gt;&lt;br /&gt;I'm particularly excited about Wave's leverage of XMPP (with extensions) as the connection/protocol model, though; feels very fitting. Furthermore, Cisco's acquisition of Jabber last year is feeling like a sweet decision right about now. Imagine Cisco's XMPP routers hardened for Wave Providers; nice dovetail.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Android&lt;/span&gt;&lt;br /&gt;Google handed out &lt;a href="http://www.mobilemag.com/2009/05/28/google-io-attendees-receive-ion-phone-special-htc-magic-immediately-list-on-ebay/"&gt;four thousand Android/HTC mobile's&lt;/a&gt; in hopes of spurring Android development. I've gone so far as to pull down the SDK and do some dev "how-to" reading, but I've gotten distracted and have moved on. There are three fatal flaws with Android and the HTC device.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The soft-keyboard is too small which makes it very hard to type. This is purely a function of the device/form-factor which can/will change over time.&lt;/li&gt;&lt;li&gt;No iTunes/iPod. There's a media player, but my world is painted in iTunes (for better or worse) and it's already a sync'ing nightmare so I'm not about to add another framework into the mix. My "phone" and music/video are on one device (iPhone) and I can never go back to multi devices. If anything, the iPhone has replaced my laptop as well on an occasional business trip.&lt;/li&gt;&lt;li&gt;The browser is all but useless. This shocked me, but the UI metaphors (which I'm sure some of which Apple has patented) on the iPhone Safari browser are so well done, that anything less on such a small form factor is a huge step backward.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://josephsmarr.com/2009/05/29/the-social-web-an-implementers-guide-google-io-2009/"&gt;Joseph Smarr on "The Social Web"&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Smarr's always good to watch/hear. He understands the high-level yet always has his hands dirty with the actual hand's on implementation. He underscored how much things have changed with respect to OpenID and OAuth adoption over the past 12 months. Very true, and great to see. He mentioned Gnip, and Plaxo's integration points with it, which was much appreciated; thanks Joseph!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;"Spelly"&lt;/span&gt;&lt;br /&gt;One of the tracks was about "Spelly"; notably the server-side spell checker used in the Wave demos. What was so cool about this spell checker is that it was backed not by a dictionary, but the statistical probability (language independent) of a word being spelled correctly based on its position relative to the surrounding words. For example "Let's met tomorrow" slammed against the corpus of indexed web documents illustrates that the vast majority of the time words starting with 'm', between "Let's" and "tomorrow" are spelled "meet", not "met." So cool!&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;App Engine + Java&lt;/span&gt;&lt;br /&gt;Google's hamstrung Java to about the same degree they did Python in App Engine. If you're a high-level Java hacker you might have fun, otherwise this was a solid miss (at least for now).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-1695572222927916527?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/1695572222927916527/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=1695572222927916527" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/1695572222927916527?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/1695572222927916527?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/05/google-io-my-impressions.html" title="Google I/O: My Impressions" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE4DRngycCp7ImA9WxJRFUU.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-842847788269791297</id><published>2009-05-17T11:32:00.005-06:00</published><updated>2009-05-17T11:56:17.698-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-17T11:56:17.698-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="entrepreneur" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="california" /><category scheme="http://www.blogger.com/atom/ns#" term="boulder" /><category scheme="http://www.blogger.com/atom/ns#" term="techstars" /><title>Boulder &amp; California</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_iPi569bVVoc/ShBPYyKTh8I/AAAAAAAAADY/uXvyxjgbj54/s1600-h/boulder-california.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 322px;" src="http://1.bp.blogspot.com/_iPi569bVVoc/ShBPYyKTh8I/AAAAAAAAADY/uXvyxjgbj54/s400/boulder-california.jpg" alt="" id="BLOGGER_PHOTO_ID_5336852845634488258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;While playing with my daughter this morning she pulled out the key-chain pictured here. I noticed that the "Boulder" sticker was sitting on top of another. I peeled it back and found "California" underneath. Growing up in Boulder, spending four years in Silicon Valley, then moving back to Boulder to help build and grow our software/technology sector, caused me to view the picture through several lenses.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;California is passe and products/companies/people are re-branding themselves as Boulder which is trendy.&lt;/li&gt;&lt;li&gt;The key-chain manufacturer decided to put California stickers on the keychains as they came off the line, then localize the keychains on-demand and in smaller batches when needed, in order to save cost.&lt;/li&gt;&lt;li&gt;Some of Boulder's entrepreneurship is really California underneath.&lt;/li&gt;&lt;li&gt;Some of California's entrepreneurship is really Boulder underneath.&lt;/li&gt;&lt;li&gt;The Californication of Boulder is real.&lt;/li&gt;&lt;li&gt;The migration of Californian's to Boulder continues.&lt;/li&gt;&lt;/ul&gt;A few friends of mine have written some interesting pieces on Boulder along these lines.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Micah - &lt;a href="http://learntoduck.com/micah/boulder.hear.roar"&gt;I am Boulder, Hear me Roar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Andrew Hyde - &lt;a href="http://andrewhyde.net/"&gt;http://andrewhyde.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;may others that I don't have time to track down given my kids are unattended in the front yard doing a lemonade stand.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;While I'm here, I'll plug what's turned into a phenomenal entrepreneurship and technology incubator; &lt;a href="http://www.techstars.org/"&gt;TechStars&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-842847788269791297?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/842847788269791297/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=842847788269791297" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/842847788269791297?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/842847788269791297?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/05/boulder-california.html" title="Boulder &amp; California" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_iPi569bVVoc/ShBPYyKTh8I/AAAAAAAAADY/uXvyxjgbj54/s72-c/boulder-california.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUADQnw7cSp7ImA9WxJRE04.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-7481858726815761154</id><published>2009-05-14T14:25:00.005-06:00</published><updated>2009-05-14T14:42:53.209-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-14T14:42:53.209-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hiring" /><category scheme="http://www.blogger.com/atom/ns#" term="GNIP" /><title>Pair Programming &amp; "top notch programmers"</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_iPi569bVVoc/SgyBkdlBn_I/AAAAAAAAADQ/y3mJGNxVsnw/s1600-h/Conflicted%2Bsmall.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 233px; height: 320px;" src="http://lh3.ggpht.com/_iPi569bVVoc/SgyBkdlBn_I/AAAAAAAAADQ/y3mJGNxVsnw/s320/Conflicted%2Bsmall.jpg" alt="" id="BLOGGER_PHOTO_ID_5335782121942392818" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.gnip.com/"&gt;Gnip&lt;/a&gt; is &lt;a href="http://www.gnip.com/company/jobs"&gt;hiring again&lt;/a&gt; so the flood of recommendations/resumes/suggestions has begun. Gnip's a pair programming shop which means there are two developers for every CPU in the office, and two developers sit side by side, day in and day out. Pair programming isn't for everyone, and many simply aren't cut out for it. When hiring for a pairing position, digesting recommendations of "rockstar" or "top notch programmers" as friends/colleagues forward resumes along is often like trying to fit a square peg into a round hole. As an aside, checkout my &lt;a href="http://one.valeski.org/2008/10/job-applicant-rejection.html"&gt;previous posting on rejection and our hiring process&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The majority of developers come from non-pairing backgrounds, and therefore the good candidates have learned how to build amazing code &lt;span style="font-weight: bold;"&gt;alone&lt;/span&gt;. They've built a reputation for being a rock star while sitting at a desk by themselves', knocking out software. It's hard rejecting incredible engineering talent because an individual doesn't play well in a pairing environment, but it's something we have to do at Gnip.&lt;br /&gt;&lt;br /&gt;If you know a killer developer who you're thinking of pointing at Gnip, please consider their pair programming passion/tendencies before sending them our way. If neither exist, they're just not going to fit into our culture and process regardless of how talented they are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-7481858726815761154?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/7481858726815761154/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=7481858726815761154" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7481858726815761154?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7481858726815761154?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/05/pair-programming-top-notch-programmers.html" title="Pair Programming &amp; &quot;top notch programmers&quot;" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_iPi569bVVoc/SgyBkdlBn_I/AAAAAAAAADQ/y3mJGNxVsnw/s72-c/Conflicted%2Bsmall.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DE8DQXg-fip7ImA9WxJTE0Q.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-2570842861785034904</id><published>2009-04-22T04:05:00.003-06:00</published><updated>2009-04-22T04:41:10.656-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-22T04:41:10.656-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="boulder" /><category scheme="http://www.blogger.com/atom/ns#" term="restaurants" /><category scheme="http://www.blogger.com/atom/ns#" term="food" /><title>State of Boulder Dinning</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_iPi569bVVoc/Se70Kk_5fkI/AAAAAAAAADI/jSC5KqSQJQw/s1600-h/fork-knife.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://4.bp.blogspot.com/_iPi569bVVoc/Se70Kk_5fkI/AAAAAAAAADI/jSC5KqSQJQw/s200/fork-knife.gif" alt="" id="BLOGGER_PHOTO_ID_5327463871793430082" border="0" /&gt;&lt;/a&gt;Boulder's at an interesting juncture when it comes to it's restaurant offerings. If you adhere to the notion that opening a restaurant takes at least 12 months of planning, our new crop of joints are the brainchildren of plans concocted prior to the economic disaster that unwound over the past year. What follows is some speculation around the new spots in town, and some perspective on some of the staples.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The New Guys&lt;/span&gt;&lt;br /&gt;Two major components have shifted since the inception of Happy Noodle House, Terra, Full Belly, and Arugula; the small/mid-tier banks that lend to small businesses (e.g. these restaurants) have stopped lending, and diners aren't as fast and loose as they were a year ago.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Happy Noodle House&lt;/span&gt;&lt;br /&gt;I'm loving Happy Noodle House these days, though the nearly 100% "community table" (aka "European seating") is taking some community adjustment (both on the part of the staff, as well as the customers). Their price point, quality, location, the fact that they're fully operational, and connection to Dave Query (nearly bulletproof), have me bullish on their longevity.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Terra&lt;/span&gt;&lt;br /&gt;I'm highly skeptical of Terra's plan. The location is choice, the chef's got promise, but the build out is expensive, and the price point is likely to be mid-to-upper tier as well. They'll get pit against the ever successful Kitchen which ought to be an interesting battle. I don't think Boulder can support two "Kitchens" effectively adjacent to one another. That said, Kitchen's offering became overly consistent a couple of years ago for me. Every time I go, I know what my food's going to taste like, which leads me to believe the consistency in low-level flavors (be it the olive oil or butter used in *everything*) which contributed to their success, is making the experience too predictable anymore. Terra may be able to siphon off bored Kitchen customers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Full Belly + Arugula&lt;/span&gt;&lt;br /&gt;As for Full Belly and Arugula, they're so far off the beaten path for me (my tiny world is confined to downtown) that I still haven't eaten at either. Assuming they're both delicious, Laudisio proved the location doesn't work, especially with two upstarts being adjacent. One will fail, the other will limp along.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Jax Fishouse&lt;/span&gt;&lt;br /&gt;As for Jax Fishhouse. I'm stoked for Hosea for the Top Chef win. We've religiously gone to Jax every Thursday night for over a decade, but... the Top Chef status stuff has since ruined the experience for us. Dishes are bigger (&lt;a href="http://one.valeski.org/2008/12/food-portion-sizes.html"&gt;see my post on trying to get dishes to be smaller&lt;/a&gt;), crowds (tourists) swamp the joint now, and the soul in the food is gone. We've stopped going, and will pick it back up in 6-12 months, when hype has died down, to see if things get back to normal.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Frasca&lt;/span&gt;&lt;br /&gt;Frasca gets its own section. The food remains impeccable and the staff remains committed and top notch. The location remains unfortunate. I'm hopeful they find a new location soon. I'm bearish on the 9th &amp;amp; Pearl development actually happening which would leave them at 18th &amp;amp; Pearl for the foreseeable future. I can live with that however. I go to Frasca to be surrounded by people (staff &amp;amp; patrons) who care about food and wine, and to have the best of both served by professionals.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Brasserie Ten-Ten&lt;/span&gt;&lt;br /&gt;This is the ringer in the bunch. They've nailed it! Brunch, lunch, dinner, happy hour... you name it. The restaurant acclimates to the time of day, and day of the week, incredibly well. Food is consistent and flavorful, and the wine list is broad and deep. A few years ago Ten-Ten was highly suspect to me, but now I can bank on it anytime for a good experience. The build-out is quality as well.&lt;br /&gt;&lt;br /&gt;There you have it. My insomnia fueled blog post on my view of restaurants in Boulder at the moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-2570842861785034904?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/2570842861785034904/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=2570842861785034904" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2570842861785034904?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2570842861785034904?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/04/state-of-boulder-dinning.html" title="State of Boulder Dinning" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_iPi569bVVoc/Se70Kk_5fkI/AAAAAAAAADI/jSC5KqSQJQw/s72-c/fork-knife.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0QARnc4eSp7ImA9WxVbEUo.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-8271032414411175660</id><published>2009-03-27T10:54:00.003-06:00</published><updated>2009-03-27T11:35:47.931-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-27T11:35:47.931-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ads" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><title>Twitter: Niche Advertising That Actually Works</title><content type="html">Advertising is all about getting information about a company/product/service in front of a demographically appropriate audience to tease them into spending money on said product/service.&lt;br /&gt;&lt;br /&gt;When everyone used to spend most of their time in front of a live broadcast television, television ads were used to convey a product/service to general consumers. Then the internet and Tivo hit; destroying the Television ad market. Internet ads are all but useless now as well (Google will one day have to own up to the click-fraud reality that underpins its financials). So, I'm left adrift in a free-market economy without a way for advertisers to reach me. Bummer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; is changing this. The companies/products/services I care about have figured out how to get to me, via Twitter.&lt;br /&gt;&lt;br /&gt;Twitter provides a broadcast system system that smart businesses are using to reach out to relevant people. I don't have to waste time consuming ads I don't care about. Instead I get to selectively choose which businesses I want to hear from when some new product/service/discount/sale becomes available. Finally, the consumer is in control, and the advertiser doesn't have to mess with subscription lists (email/snail-mail/phone numbers) to reach me. All I have to do is "follow"/listen to the "channels" I want, and if I end up not liking the company doing the advertising, I can turn them off.&lt;br /&gt;&lt;br /&gt;Feels darn close to a perfect advertisement communication system to me.&lt;br /&gt;&lt;br /&gt;For example, local companies I "follow" who tell me about real-time services they provide are listed below. They get advertisements in-front of me, when I want them, and I make real-time purchasing decisions as a result.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;https://twitter.com/TeeandCakes (just bought doughnuts from there because they tweeted that they had arrived)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;http://twitter.com/twospoonssoups (not eating there today because the soup I love isn't avail today)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;http://twitter.com/spudbros&lt;/li&gt;&lt;li&gt;http://twitter.com/larkburger (they're not in my daily walk/flow, but now I get good reminders of them and can decide to head over there when in the mood)&lt;/li&gt;&lt;/ul&gt;More advertisements via Twitter/broadcast please.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-8271032414411175660?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/8271032414411175660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=8271032414411175660" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/8271032414411175660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/8271032414411175660?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2009/03/twitter-niche-advertising-that-actually.html" title="Twitter: Niche Advertising That Actually Works" /><author><name>Jud</name><uri>http://www.blogger.com/profile/09136293397615624023</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08088564897660357856" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
