<?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:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;A0UHRX4yfCp7ImA9WxFbGUk.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395</id><updated>2010-07-12T09:40:34.094-06: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>185</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;A0UHRX87cCp7ImA9WxFbGUk.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-7538300910960204991</id><published>2010-07-12T09:03:00.002-06:00</published><updated>2010-07-12T09:40:34.108-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-12T09:40:34.108-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="calendar" /><title>TimeBridge and Behavioral Change</title><content type="html">Users rarely, if ever, change behavior. It takes unprecedented genius or beneficial workflow changes to get us to change our ways. We're lazy... bottom line.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A service called &lt;a href="https://app.timebridge.com/lp/meetwithme"&gt;TimeBridge/meetwith.me&lt;/a&gt; changed my behavior. I use it religiously now. What's surprising to me is that the service touches the "third rail" of scheduling/calendar products which are notoriously messy and hard to get anything right with. TimeBridge says they "make it easy for others to schedule meetings with you" and incredibly, they deliver on that promise, when hundreds before them have failed miserably. How did they do it?&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Setup for you is pretty easy. The site's not perfect, and there were bugs in app/screen flow, but it amounts to wiring their app up with your calendar app (Google Calendar for me). You'll be using a calendar app that either "works" or "doesn't." If you fall into the latter category, cut bait and pretent TimeBridge doesn't exist.&lt;/li&gt;&lt;li&gt;Setup for people trying to schedule time with you is... well... there really isn't any, and this is the critical piece. There have been plenty of apps promising to make scheduling easy, but they've all required everyone in the workflow to go through a mess of setup. Guess, what, someone scheduling time with me has never heard of TimeBridge, and certainly isn't going to go through any setup with it in order to schedule time with me. So, they've solved this by not requiring any setup for the ppl trying to get on your schedule.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Some of the flows are buggy or a little unclear, so there's lots of room for refinement, but the use case that matters is absolutely nailed. Well done guys. I'm impressed.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-7538300910960204991?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/7538300910960204991/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=7538300910960204991" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7538300910960204991?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/7538300910960204991?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/07/timebridge-and-behavioral-change.html" title="TimeBridge and Behavioral Change" /><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>0</thr:total></entry><entry gd:etag="W/&quot;AkQFRH4zeCp7ImA9WxFUFEo.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-6382607584478368925</id><published>2010-06-25T08:37:00.003-06:00</published><updated>2010-06-25T09:05:15.080-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-25T09:05:15.080-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ignite" /><title>Ignite Boulder: Morning After</title><content type="html">Last night's &lt;a href="http://igniteboulder.com/"&gt;Ignite Boulder&lt;/a&gt; was one of the better ones. It was the first held at Chautauqua's auditorium which is a great venue; though the audio was a bit off for the sparks (music sounded solid). I hope Andrew sticks with Chautauqua as a venue going forward (at least in the nice Spring/Summer months), it was nice to chill at the park before/after the event.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With increased popularity, the content feels like its starting to water down a bit. I want the edge back! Where's the heckling anymore?!? I do my part, but more often than not the ppl around me don't get it. The perils of mass mediaization; I wonder if you can ever get away from it en masse. If anyone can figure out the mix it's Andrew though.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few of the talks struck me as particularly bad, and a few as particularly good. Some thoughts on the good ones.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Josh Fraser's talk on fear&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Reminded me of &lt;a href="http://www.imdb.com/title/tt0310793/"&gt;Bowling for Columbine&lt;/a&gt;. We live in a culture of fear, and it's sad. Statistically everything's always going to be alright, yet we live with irrational fears that dramatically affect our behaviors. Why we do this is always a good question, and Josh got the numbers out there in front of us to laugh at. Nicely done.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ryan's talk on selfishness&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Should you be selfless or selfish? I've always lived my life as a selfish bastard, so I felt a little vindicated w/ this talk. Ryan's one of those rarities in life. Incredible ability to put the core of his being out there in front of everyone, and not in a lame way, rather in a way you connect with; he has true creative genius. Favorite line of the night [paraphrase/butcher]: "while trying to be selfless in trying to be what the one I love[d] wanted, I turned into something she didn't love at all because I lost my selfishness."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;a href="http://www.ceciervin.com/"&gt;Ceci Ervin&lt;/a&gt;'s talk on a trip to Poland for a surgical procedure to help/cure MS (which she has).&lt;/span&gt; &lt;/div&gt;&lt;div&gt;I'm not a sympathy vote kinda guy (back to that selfish thing), but she presented her quest in such a way that the faith and bravery simply tore through the screen and into the audience. Unbelievable journey with a happy ending. This kind of insight always makes me feel weak and useless, which then drives me to be more. Thanks for the perspective Ceci.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-6382607584478368925?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/6382607584478368925/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=6382607584478368925" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6382607584478368925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6382607584478368925?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/06/ignite-boulder-morning-after.html" title="Ignite Boulder: Morning After" /><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>0</thr:total></entry><entry gd:etag="W/&quot;CU4HQXc-fyp7ImA9WxFVFEU.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-8076154313863770857</id><published>2010-06-13T19:47:00.005-06:00</published><updated>2010-06-13T20:52:10.957-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-13T20:52:10.957-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="plugins" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="sdk" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Can Google's Native Client SDK Fix The Web?</title><content type="html">Modern life owes much to the Internet. Many proverbial thanks are due to the inventors at CERN (incl. Tim Burner's Lee) and to Netscape (Jim Clark; the money. Founding engineers; the know-how) for making it accessible to all of us. A recent visit to Google's Boulder, CO office brought back that aching question for me though; is &lt;b&gt;this&lt;/b&gt; all the Internet has to offer?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What if it never happened?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Would traditional client-server computing have been able to push network infrastructure (modems, hard-wire networks, wireless-networks, fiber, satellite) as far as the graphical browser has? If we had given it the years that the Internet's had, would we have skipped over and evolved past all the advertising, porn, and shopping that has become &lt;b&gt;our&lt;/b&gt; network? I have to wonder if we have simply over-sold/hyped ourselves over the past decade, and subsequently distracted ourselves from the end-goal; better overall human computer interaction. The web is a complete UI/UX disaster, and has severely stunted HCI (Human Computer Interaction) efforts that can only come to fruition with deep driver/hardware bindings (e.g. &lt;a href="http://oblong.com/"&gt;Oblong&lt;/a&gt; - a firm you've never heard of that has the potential to change &lt;b&gt;everything&lt;/b&gt;). We're still wallowing around inside web pages, building applications that have awful authentication/authorization models (how many usernames and passwords do &lt;b&gt;you&lt;/b&gt; have?), and HTML5 is our latest savior?!? Please.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Getting Serious (again)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;My recent conversation in the Google cafeteria challenged some base assumptions that I, and most of my colleagues, make; namely that web-apps are "it." That lunch discussion is well represented in a talk two of the key engineers gave at Google I/O 2010; &lt;a href="http://code.google.com/p/nativeclient-sdk/"&gt;Programming the web with Native Client SDK&lt;/a&gt;". When we were talking, what was initially described to me was something I could neatly, and conveniently, fit into today's browser plugin APIs. "Why not just use NPAPI; why re-invent the wheel?" I asked. I got a response that only someone with the know-how, and the resources could give; "because this [web as we know it] can't be it." I left skeptical, but it's been a month or so, and I'm there. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'd be nowhere without the tubes that have been built. From a gazzillion miles of various types of cable/wire being laid all over the world, to IP/HTTP ubiquity. However, consider them a simple, yet crucial, layer in the client-server software model stack. Sure it's taken us 15 years to build it, but what if you chalk it up as "done." What's the next layer in the cake diagram that you'd pursue?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If we'd had this layer complete 15 years ago, the kings of client-server software at the time (Microsoft and IBM) could have started building highly distributed applications then, as opposed to trying to do so now (IBM quite successfully in more of an industry consultancy role, and MSFT arguably flat out failing at it). With Native Client, Google is trying to answer the question of what should software look like now that the connectivity layer is "done?" It's a cool question if you think about it and are able to extract yourself for a moment from our day-to-day web-app construction, and browser engineering realities; we have a hard time seeing the forrest from the trees.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It has a very long way to go, but a new way of executing "native" code through our "tubes" could open the door to a new generation of software. One that can harness the power of our hardware and the most important part of the Internet, namely the "tubes." While a train-wreck, recall the confines Microsoft tried to break out of with &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Bob"&gt;Microsoft Bob&lt;/a&gt;; knocking down the four walls of the traditional rectangle window managers that none of us exists without. Imagine networked software that can talk to your hardware to obtain identity information (something that requires a hardware component; &lt;b&gt;you&lt;/b&gt;). These are things that we shouldn't be dreaming about, they should just &lt;b&gt;be&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While Google's Native Client SDK goals seem audacious, they are also admirable, and if there's one company out there right now that has the power to pull something like this off, Google's it. Good luck.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-8076154313863770857?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/8076154313863770857/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=8076154313863770857" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/8076154313863770857?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/8076154313863770857?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/06/can-googles-native-client-sdk-fix-web.html" title="Can Google's Native Client SDK Fix The Web?" /><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>0</thr:total></entry><entry gd:etag="W/&quot;C0YAQ3k5eip7ImA9WxFWGUo.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-2225679846889689880</id><published>2010-06-07T22:23:00.004-06:00</published><updated>2010-06-07T22:25:42.722-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-07T22:25:42.722-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="process" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>Development Process</title><content type="html">Tonight I was asked some high-level questions about development process. I wound up responding w/ enough material that I thought I'd share the thoughts here for broader consumption.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;Hey guys,&lt;div&gt;Please  feel free to ignore this email but I'd extremely appreciate some advice  if you have a couple of minutes.  I am trying to compare best practices  for teams over 10 programmers to determine what software development  methodology has been the most productive for your company but at the  same most fun for your team.  If you have time I'd appreciate answers to  the following:&lt;/div&gt;  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Software Development Process used (i.e. Scrum,  XP, custom)&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;"agile" (no scrum)...  weekly iterations/sprints (no standup). have driven/done xp (pair  programming mix) as well; I'd only go this (xp/pairing) route again if I  were in a more supportive ecosystem (e.g. SF).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;&lt;div&gt;2)  Do you track # of hours programmers work in a project? &lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;never.  bad idea IMO.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;&lt;div&gt;3) Do  you have a QA team, if so how many?&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;no. though  I've considered one or two QA folks... it'd definitely be nice to  objectively do white/black box testing outside of dev. we're pretty  close to TDD, so we've convinced ourselves we "don't need it." I go back  and forth.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;&lt;div&gt;4) How  often is your release cycle?&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;we deliver code to  production once a week.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;  &lt;div&gt;5) Who is allowed to deploy code into production?&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;we  rotate who does the deploy (everyone on the team, including me, is  capable of doing it). we run a shared responsibilty/exposure shop in  order to reduce/eliminate the "john's the only one who knows that  code/process" scenarios. my general philosophy here is if you're not  hiring engineers that you don't trust well enough to do a deploy...  you're liking hiring the wrong folks.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;&lt;div&gt;6)  What project management tools do you use?&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;http://pivotaltracker.com  . in the spirit of agile... we're very light on process/tools. never  document something in more than one place (e.g. in the "story"), and  even then be light.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"&gt;&lt;div&gt;7)  How accurate are your release predictions?&lt;/div&gt;&lt;/blockquote&gt;eh.  having tried (as mgr and individual contributor) everything under the  sun... I no longer believe numbers folks toss out ("we're 90% on time"  etc). I've found everyone's (mine included) numbers are BS, and if you  dig into what actually transpired after the release... enough corners  were cut, enough brilliant engineering ideas employed, and enough  requirements were relaxed during the release cycle, that you never end  up with what you started with anyway, so the A to B comparison and  judgement of "on-time" is never valid. your mileage will vary though. it  all comes down to the "unit"... the "team"... their cohesiveness,  experience working together and trustworthiness amongst eachother. that  said, if you handed me a green teem of folks that never worked together,  I'd drive it agile-style with one to two week iterations/sprits (and  production deploy) cycles with goal-level commitments (e.g. team  committing to having x y and z done by date 'a'... and working as hard  as they can to meet that commitment).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-2225679846889689880?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/2225679846889689880/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=2225679846889689880" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2225679846889689880?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/2225679846889689880?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/06/development-process.html" title="Development Process" /><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>0</thr:total></entry><entry gd:etag="W/&quot;CkANQXg9cSp7ImA9WxFXFkg.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-3979142166131306215</id><published>2010-05-23T15:24:00.002-06:00</published><updated>2010-05-23T15:39:50.669-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-23T15:39:50.669-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recycling" /><title>I'm Done Recycling...</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.portlandtribune.com/news_graphics/118685993504445300.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 278px; height: 195px;" src="http://www.portlandtribune.com/news_graphics/118685993504445300.jpg" alt="" border="0" /&gt;&lt;/a&gt;... at cafe's at least; sorry. I thought this get here, but after years of recycling I'm fed up. At home I can control the separation between compost, mixed materials, and trash/landfill. But... cafe's had made it impossible to recycle or compost anymore. Some provide compostable straws/lids/cups/napkins, but some don't; telling the difference between the two is all but impossible. The end result... I don't spend the extra 30 seconds it takes to figure it all out.&lt;br /&gt;&lt;br /&gt;To further complicate things, everyone has their own cute recycle station with paragraphs describing what to put in which of the, at least three, bins. Guess what, I just hunt for the trash/landfill bin so I don't have to hurt my little brain by figuring out what is in my hand, and which bin it should go in.&lt;br /&gt;&lt;br /&gt;I started recycling and composting long before it became popular/trendy, and have voted for every legislative measure to promote recycling over the past couple of decades I've been able to vote over. However, I hate to say it, the regulations around what can go where have turned me off. Humans are generally lazy and dumb. American's (of which I am one) like to throw unbelievable amounts of things away. Combine the two with today's recycling measures and I predict we're taking a step backward.&lt;br /&gt;&lt;br /&gt;Once fairly clean recycle streams are now polluted with materials that don't mix and the energy it takes to clean the stream counters the benefits of recycling at all. Here's a &lt;a href="http://www.portlandtribune.com/sustainable/story.php?story_id=118685531900028000"&gt;decent writeup on the stream problem&lt;/a&gt;, and plenty have been written about Boulder County as well.&lt;br /&gt;&lt;br /&gt;We need to mandate the production of compostable materials (cups, straws, bowls, forks, spoons, knives, etc) so, as consumers, we don't have to think about what we're about to "throw away." This should all be &lt;span style="font-weight: bold;"&gt;easy&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-3979142166131306215?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/3979142166131306215/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=3979142166131306215" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3979142166131306215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3979142166131306215?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/05/im-done-recycling.html" title="I'm Done Recycling..." /><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>0</thr:total></entry><entry gd:etag="W/&quot;Ak8CSXs4cCp7ImA9WxFQFEg.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-6750458388432646682</id><published>2010-05-09T20:25:00.002-06:00</published><updated>2010-05-09T20:34:28.538-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-09T20:34:28.538-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="amazon" /><category scheme="http://www.blogger.com/atom/ns#" term="s3" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aws" /><title>Take 2: Amazon S3 file deletion FAIL</title><content type="html">The S3 bucket key deletion saga continues. I had two Ec2 XL instances running 24/7 for about a month, running ~150 parallelized DELETE requests on s3 bucket keys (each machine), and dented my S3 usage by only 10%. I spent ~$1,500 (money went to Amazon obviously) on those dedicated XL instances in the process, while only reducing my S3 bill by ~10%, and that doesn't include the operational/engineering overhead to manage the deletion software/machines.&lt;br /&gt;&lt;br /&gt;I'm left with only one option to wipe out the data on S3 that I don't need anymore; closing my Amazon account, and opening a new one. While I have high hopes that I'll be able to use the same keys/tokens/secrets in the new account, I'm doubtful. Thus, I'll incur several thousand more dollars re-wiring Gnip's vast network of machines, and RightScale, to work w/ the new account.&lt;br /&gt;&lt;br /&gt;Lesson here is that you have to be very conscious when dealing with very large data sets on Amazon's S3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-6750458388432646682?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/6750458388432646682/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=6750458388432646682" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6750458388432646682?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/6750458388432646682?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/05/take-2-amazon-s3-file-deletion-fail.html" title="Take 2: Amazon S3 file deletion FAIL" /><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>0</thr:total></entry><entry gd:etag="W/&quot;C0ANQ3ozeip7ImA9WxFSE0k.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-4875460709951079925</id><published>2010-04-15T07:54:00.004-06:00</published><updated>2010-04-15T08:29:52.482-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-15T08:29:52.482-06:00</app:edited><title>Twitter's Ad Model; It's All In The Fraud Baby</title><content type="html">It's taken Twitter a long time to get where they are, and knowing some of their backstory has made watching the journey from the outside quite entertaining. A few things haven't changed: Biz pontificates and paints the &lt;a href="http://twitter.com/bpm140/status/12171771183"&gt;"Twitter is a triumph of humanity"&lt;/a&gt; picture (exceedingly well I might add), Ev leads the flock with jagged thinking &amp;amp; speaking, and Dick is the one saying "no guys, really, we need to focus and make some money, here's how we're going to try to do it; no more goofing off." Ryan Sarver has his head squarely around the outward facing platform implementation and needs; he's an asset. Jason Goldman... I still can't figure him out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;On Making Money&lt;/span&gt;&lt;br /&gt;Dick's pitch was pretty good. The idea is that tweets themselves are the commodity. Rather than some new model in the system, e.g. a formal "ad," the Tweet structure as we know and love it today, will be the item that is bought/sold. "Promoted" tweets, as Dick kept referring to them as, will float to the top of distilled tweet pages (like search, or top tweets, or trending topics, etc). The "float" algorithm will be affected by 1) whether or not someone's paid for a tweet to float up and 2) whether or not it resonates with users. #1 is obvious and will result in a marketplace for pricing/bidding/buying/selling (ala Google's ad model). #2 isn't as simple (not that the former is simple to begin with).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resonating&lt;/span&gt;&lt;br /&gt;I argue that the dirty little secret on the network today is that current ad models on the web are a sham; a house of cards. We've all made plenty of money on the backs of click fraud, and it'll eventually collapse. Twitter's trying to "do it right" by influencing a promoted tweet's visibility based on whether or not a promoted tweet resonates with users. Whatever your platform, when money's involved, it gets gamed. Whether it's bots doing re-tweeting, clicking, forwarding, generating, whatever, the bots will do their thing. When bots can't do it, cheap humans will be employed to do the machine's bidding.&lt;br /&gt;&lt;br /&gt;"If a promoted tweet doesn't resonate, it will go offline." That statement was spewed, in one form or another, over and over again by the Twitter crew. I love the idea as a user, but if Google had squashed ads that weren't resonating with users, they never would have had a business to begin with (and arguably they wouldn't have one now if they moved to this glorious idea). &lt;span style="font-weight: bold;"&gt;It's all in the fraud baby.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The chicken and egg problem Twitter faces with an ad model is that you need many producers to build a marketplace, yet you need the marketplace to draw the producers. If you do the righteous thing and only display ads that resonate with users, guess what, you won't have many ads to show. Though users would benefit, ad prices would be so high (both in cost and quality) that not many people will pay for them. As a result, resonance is de-emphasized in order to stoke the overall marketplace.&lt;br /&gt;&lt;br /&gt;Traditional Internet ad models are fairly simple pyramids folks... the bottom many subsidize the top. Both in terms of quantity, in order for the marketplace to exist, and the dollars.&lt;br /&gt;&lt;br /&gt;The picture Dick painted was a pretty one. As an end-user, the notion of only being exposed to "resonating ads" (errr "promoted tweets") is a treat. I hope Twitter can change Internet ad history and actually pull it off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-4875460709951079925?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/4875460709951079925/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=4875460709951079925" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/4875460709951079925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/4875460709951079925?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/04/twitters-ad-model-its-all-in-fraud-baby.html" title="Twitter's Ad Model; It's All In The Fraud Baby" /><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>0</thr:total></entry><entry gd:etag="W/&quot;CU8BQHo-eip7ImA9WxBaEU8.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-3170778773855202445</id><published>2010-03-20T16:07:00.003-06:00</published><updated>2010-03-20T16:24:11.452-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-20T16:24:11.452-06:00</app:edited><title>Get A Job! At Walmart.</title><content type="html">This post inspired by a conversation I had with my mother this morning.&lt;br /&gt;&lt;br /&gt;My mom has been self-employed for decades via a small business she runs. Unfortunately her industry has been all but obliterated by the usual "faster/cheaper" competitive model. She refuses to acknowledge that the American consumer is driven almost exclusively by money. She longs for, as do I, altruistic motives on the consumer's part, and moral high-ground. Specifically she's saddened by the decimation of local (state and smaller) government tax revenues, and the fact that consumers choose cheaper products over her more expensive, higher-quality, products.&lt;br /&gt;&lt;br /&gt;The conversation led to "buy local" as the solution to the problem. While I generally agree, and do buy local all the time (spending more than many of my peers do; for better and worse), I realized long ago that a perspective counter to the one I'm surrounded by is significant. Namely, if you want to really affect global change, go work for Walmart.&lt;br /&gt;&lt;br /&gt;Activists constantly fight "the man" in the form of Walmart, when in fact what they should do is go work for Walmart, and change things from the inside. Identifying processes that save Walmart money, and implementing them, will have more reach than me diligently buying produce at my local farmer's market ever will. For some perspective, checkout some &lt;a href="http://www.knowmore.org/wiki/index.php?title=Wal-Mart_Statistics"&gt;generally recognized facts about Walmart&lt;/a&gt;, the largest company in the world.&lt;br /&gt;&lt;br /&gt;When Walmart says "jump" every one of its vendors says "how high." If Walmart said "go green" every one of its vendors would do so overnight. Go figure out how to get Walmart to say "go green" or "create local, high-paying, jobs."&lt;br /&gt;&lt;br /&gt;Oh yea, and if you don't like what Walmart does to your local economy, don't shop there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-3170778773855202445?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/3170778773855202445/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=3170778773855202445" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3170778773855202445?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3170778773855202445?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/03/get-job-at-walmart.html" title="Get A Job! At Walmart." /><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>0</thr:total></entry><entry gd:etag="W/&quot;A0YGQX46fip7ImA9WxBbGE4.&quot;"><id>tag:blogger.com,1999:blog-8196699014965996395.post-3594219366927039279</id><published>2010-03-17T09:11:00.003-06:00</published><updated>2010-03-17T09:18:40.016-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-17T09:18:40.016-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="s3" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="aws" /><title>Amazon S3 file deletion FAIL</title><content type="html">I'm a huge fan of Ec2 and S3 offerings from Amazon; they're the future. However, there's a severe deficiency in the S3 API; when you need to delete billions of files, the API breaks down. While there are batch operations, they don't handle enough keys to be of use when dealing with very large file counts, and enough requests are made over the long duration (days) of running your script, that expected errors wind up crapping out the whole process. Rinse-repeat doesn't work when the mean-time-between-failure is on the order of days.&lt;br /&gt;&lt;br /&gt;Yes, I'm running the operations on an Ec2 instance. Yes, I'm using the almighty &lt;a href="http://s3sync.net/wiki"&gt;s3sync&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Amazon, you're printing money with AWS, please open up the deletion API so ppl can better manage their files. The current API's inability to a) delete non-empty buckets, and b) handle larger batch requests, feels a lot like greedy "lock-in."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8196699014965996395-3594219366927039279?l=one.valeski.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://one.valeski.org/feeds/3594219366927039279/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8196699014965996395&amp;postID=3594219366927039279" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3594219366927039279?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8196699014965996395/posts/default/3594219366927039279?v=2" /><link rel="alternate" type="text/html" href="http://one.valeski.org/2010/03/amazon-s3-file-deletion-fail.html" title="Amazon S3 file deletion FAIL" /><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>0</thr:total></entry><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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>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>0</thr:total></entry></feed>
