<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kyle Cordes &#187; video</title>
	<atom:link href="http://kylecordes.com/tag/video/feed" rel="self" type="application/rss+xml" />
	<link>http://kylecordes.com</link>
	<description>Software, Business, and Life</description>
	<lastBuildDate>Fri, 18 Nov 2011 13:01:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Lua Doesn&#8217;t Suck &#8211; Strange Loop 2010 video</title>
		<link>http://kylecordes.com/2010/lua-strange-loop</link>
		<comments>http://kylecordes.com/2010/lua-strange-loop#comments</comments>
		<pubDate>Sun, 17 Oct 2010 00:42:29 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=786</guid>
		<description><![CDATA[At Strange Loop 2010, I gave a 20 minute talk on Lua. The talk briefly covered six reasons (why, not how) to choose Lua for embedded scripting. Lua is safe, fast, simple, easily learned, and more popular that you might expect. The Strange Loop crew only recorded video in the two largest venues (out of [...]]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://strangeloop2010.com/">Strange Loop 2010</a>, I gave a 20 minute <a href="http://strangeloop2010.com/talks/14490">talk on Lua</a>. The talk briefly covered six reasons (<strong>why</strong>, not how) to choose Lua for embedded scripting. Lua is safe, fast, simple, easily learned, and more popular that you might expect.</p>
<p>The Strange Loop crew only recorded video in the two largest venues (out of six), so I made a &#8220;bootleg&#8221; video of my talk, for your viewing pleasure:</p>
<a id="wpfp_55b677c61cc9f2ee1bbb3085152b5ac9" style="width:640px; height:360px;" class="flowplayer_container"><img src="http://kylecordes.com/blog/wp-content/uploads/2010/10/Cordes-2010-StrangeLoop-Lua-splash.jpg" alt="" class="splash" /><img width="83" height="83" border="0" src="RELATIVE_PATH/images/play.png" alt="" class="splash_play_button" style="top: 135px; border:0;" /></a>
<p>The video/audio sync starts out OK, but drifts off by a second or so by the end. The drift is minor, so it is reasonably viewable all the way through. If you don&#8217;t have Flash installed (and thus don&#8217;t see the video above), you can <a href="http://media.kylecordes.com/Cordes-2010-StrangeLoop-Lua.m4v">download the video (x264)</a>; it plays well on most platforms (including an iPad).</p>
<p>The slides are online below, and are also <a href="http://kylecordes.com/files/SL2010-Lua-Cordes.pdf">available for PDF download</a>.</p>
<div id="__ss_5461928" style="width: 425px;"><object id="__sse5461928" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sl2010-lua-cordes-101016151903-phpapp02&amp;stripped_title=lua-tiny-embeddable-scripting-that-doesnt-suck&amp;userName=kylecordes" /><param name="name" value="__sse5461928" /><param name="allowfullscreen" value="true" /><embed id="__sse5461928" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sl2010-lua-cordes-101016151903-phpapp02&amp;stripped_title=lua-tiny-embeddable-scripting-that-doesnt-suck&amp;userName=kylecordes" name="__sse5461928" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<hr />
<h3>Video Hackery</h3>
<p>This video recording was an experiment: instead of hiring a video crew (with professional equipment), or using my DV camcorder, I instead used the video recording capability of my family&#8217;s consumer-grade Canon digicam. This device has three advantages over my DV camcorder:</p>
<ol>
<li>No tape machinery; no motors; thus no motor noise in the audio.</li>
<li>Smaller size, easier to carry in and out.</li>
<li>Directly produces a video file, easily copied off its SD card.</li>
</ol>
<p>As you can see from the results, the video quality is adequate but not great. Still, I learned that if I want to increase the quality of recording, the first step is <strong>not</strong> to use a better camera or lens! Rather, it is to bring (or persuade the venue to provide) better light. For good video results, the key is light the speaker well, without shining any extra light on the projector screen. With that in place, a better camera make sense.</p>
<p>The audio was a different story. Like nearly all consumer video cameras (and digicams with video), mine doesn&#8217;t have an external audio input, so the audio (from ~12 feet away) was awful. As a backup I had used a $75 audio recorder and a $30 lapel microphone, and that audio is very good, certainly worth using instead of the video recording audio track.</p>
<p>To combine the video in file A with the audio in file B, I used the ffmpeg invocation below. I reached the time adjustments below in just a few iterations of trial and error, by watching the drafts in VLC, using &#8220;f&#8221; and &#8220;g&#8221; to experiment with the audio/video time sync. I also trimmed off a bit of the bottom of the video, and used &#8220;mp4creator.exe -optimize&#8221;, which I had handy on a Windows machine, to prepare the file for progressive download viewing.</p>
<p><code>ffmpeg -y -ss 34.0 -i WS_10001.WMA -ss 34.0 -itsoffset -12.05 -i MVI_4285.AVI -shortest -t 8000 -vcodec libx264 -vpre normal -cropbottom 120 -b 400k -threads 2 -async 200 Cordes-2010-StrangeLoop-Lua.m4v</code></p>
<p>The remaining bits of technology are FlowPlayer, a WordPress FlowPlayer plugin, and Amazon&#8217;s CloudFront CDN.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/lua-strange-loop/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SaaS: The Business Model – Video</title>
		<link>http://kylecordes.com/2010/saas-video</link>
		<comments>http://kylecordes.com/2010/saas-video#comments</comments>
		<pubDate>Thu, 10 Jun 2010 17:50:02 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=652</guid>
		<description><![CDATA[On Feb. 27 at St. Louis Innovation Camp 2010, I gave a talk on the SaaS business model. I posted the slides, handout, audio, and transcript soon thereafter. Here, finally, is a video of the 44-minute-long talk. Why did it take over three months to get online? Read on below. Warning: Sausage-making Discussion Below The [...]]]></description>
			<content:encoded><![CDATA[<p>On Feb. 27 at St. Louis Innovation Camp 2010, I gave a talk on the SaaS business model. I <a href="http://kylecordes.com/2010/saas-slides-audio">posted the slides, handout, audio, and transcript</a> soon thereafter. Here, finally, is a video of the 44-minute-long talk. Why did it take over three months to get online? Read on below.</p>
<a id="wpfp_21d968a635c2865eebc4c2079f1a7e9d" style="width:680px; height:382px;" class="flowplayer_container"><img src="http://kylecordes.com/blog/wp-content/uploads/2010/06/Cordes-2010-SaaS-splash.jpg" alt="" class="splash" /><img width="83" height="83" border="0" src="RELATIVE_PATH/images/play.png" alt="" class="splash_play_button" style="top: 146px; border:0;" /></a>
<h3>Warning: Sausage-making Discussion Below</h3>
<p>The following has <strong>nothing</strong> to do with the content of the video.</p>
<p>This is an x.264 video, shown here initially with a Flash-only player (<a href="http://foliovision.com/seo-tools/wordpress/plugins/fv-wordpress-flowplayer">FV WordPress Flowplayer</a>). The video file is served by Amazon&#8217;s <a href="http://aws.amazon.com/cloudfront/">CloudFront CDN</a>, which is trivial to sign up for without any sales process or minimum service cost. Later I&#8217;ll replace this Flash-only widget with one that offers HTML5 video (for iPad use, in particular), when I find one that works sufficiently well.</p>
<p>That&#8217;s the easy part, though. Getting this video to you here was an adventure, and not in a good way. Three recordings were made of the talk:</p>
<ol>
<li>We hired a professional videographer to record the talk. When I say professional, I mean it <strong>only</strong> in the most literal way, i.e. the videographer charged money. They showed up with a nice camera and a wireless lapel mic&#8230; but somehow produced a broken video recording (the first 10-15 minutes were intermittant video noise). In addition, the mic gain was turned up way too high and thus the audio is awful.</li>
<li><a href="http://www.linkedin.com/in/daveblankenshipstl">Dave Blankenship</a> recorded the talk on his consumer camcoder; he was not paid for this, and he did a much better job. This video is usable all the way through, but arrived in <a href="http://en.wikipedia.org/wiki/MOD_(file_format)">an oddball format produced mostly by some models of JVC camcorders</a>. The audio was not so hot, because he used the mic built in to the camcorder from the back of the room.</li>
<li>I recorded the audio using a $5 microphone plugged in to an iPod Nano, sitting on a table at the front of the room. It&#8217;s a bit noisy, but with a few minutes of work with Audacity (Noise Removal and Normalization), the results are much better than either video attempt.</li>
</ol>
<p>Armed with this, I set about to somehow combine the video from #2 with the audio from #3. I send emails describing this mess to several videographers I found on Craigslist. Most of them didn&#8217;t reply at all. I finally got a cost estimate from one, of many hundreds of dollars or more, and not much assurance of results.</p>
<p>Now I&#8217;m willing to spend some money to get good results, but spending it without confidence of results is less appealing; so I set about trying myself instead.</p>
<p>First, I cleaned the audio in Audacity as mentioned above.</p>
<p>Second, I watched the video and listened to the audio a few times, to get the approximate starting timestamp in each one of the moment the talk actually started; each recording had a different amount of lead-in time</p>
<p>Third, I grabbed ffmpeg, the swiss army knife of command line video and audio processing. After reading a dozen web pages of ffmpeg advice, and a number of experiments (with short -t settings, to quickly see how well it works without waiting to transcode the whole thing), I ended up with this command to produce the encoded video:</p>
<p><code>ffmpeg -y -ss 40.0 -i Recording-3-audio-only-clean.wav -ss 95 -i Recording-2-video-ok-audio-bad.mod -shortest -t 18000 -vcodec libx264 -vpre normal -b 700k -threads 2 Cordes-2010-SaaS.m4v<br />
</code></p>
<p>I then noticed that the MacPorts installation of ffmpeg omits the important qt-faststart tool, and found <a href="http://www.entropy.ch/software/macosx/#qtfaststart">this helpful version of qt-faststart</a> and used it instead, on my Mac; later I switched to a Linux machine with an <a href="http://ubuntuforums.org/showthread.php?t=786095">ffmpeg install including qt-faststart</a>. Without the faststart step, the metadata in the m4v file is arranged in a way that prevent progressive/streaming play-while-downloading.</p>
<p>The results are good but not great:</p>
<ul>
<li>The video has some motion/interlace artifacts; these were present in the original recording, and I&#8217;m not aware offhand of what to do about them</li>
<li>The video camera used rectangular pixels; the pixel aspect ratio is 3:2 while it is intended for display at 16:9. I wasn&#8217;t able (at least in 20 minutes of learning and experimentation) to get the 16:9 output working correctly, so if you grab the underlying m4v file you can see the aspect ratio a bit off in the shape of the clock on the wall, for example.</li>
<li>The audio-video sync is adequate (and plenty good enough to follow along) but not perfect. Clearly using the audio track on a video recording is much better than putting them together in post-processing.</li>
<li>The audio is not as good as if I used a lav or headset mic, though I think it&#8217;s quite remarkably good for a $5 mic plugged in to iPod.</li>
<li>I&#8217;ve no idea if ffmpeg complies with any of the relevant copyrights/patents/whatever in video production, though it seems hopefully safe to use for a one-off non-commercial video like this. (Normally I use Apple&#8217;s iMovie for my videos, and I assume Apple has taken care of such things.)</li>
</ul>
<p>A few morals of this story:</p>
<ul>
<li>Get some <strong>powerful</strong> tools, and learn how to use them.</li>
<li>Be willing to pay for professional work, but be <strong>skeptical</strong>. Just because you pay, doesn&#8217;t mean it will be quality work.</li>
<li><strong>Have a plan B</strong>. If I had assumed that at least one of the two videos would get decent audio, and skipped my own audio recording, I&#8217;d not have been able to deliver the acceptable audio here. If Dave had assumed that my professional videographer would produce results, and turned off his camera, we&#8217;d have no video here at all.</li>
</ul>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/saas-video/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take a Strategic Vacation</title>
		<link>http://kylecordes.com/2010/strategic-vacation</link>
		<comments>http://kylecordes.com/2010/strategic-vacation#comments</comments>
		<pubDate>Thu, 27 May 2010 18:28:32 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[delegation]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=622</guid>
		<description><![CDATA[This is yet another story that I’ve told dozens of time to individual and groups, and now finally written down. Here is a short video talk: As usual, the vimeo page offers it for HTML5, non-Flash platforms like the iPad. Back in 2004 I co-founded Mobile Workforce Management, a vertical market SaaS firm. For the [...]]]></description>
			<content:encoded><![CDATA[<p>This is yet another story that I’ve told dozens of time to individual and groups, and now finally written down. Here is a short video talk:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=12085132&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=12085132&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>As usual, the <a href="http://vimeo.com/12085132">vimeo page</a> offers it for HTML5, non-Flash platforms like the iPad.</p>
<p>Back in 2004 I co-founded Mobile Workforce Management, a vertical market SaaS firm. For the first 6+ months, I was the entire development team, while my co-founder was the entire analysis, support, and customer happiness department. Over the course of a few years, we hired developers, a very-senior developer / leader / general manager, support staff, and more. In spite of these hires, as of 2007 I was still in the loop for numerous critical processes that had to happen every day or week to keep the doors open &#8211; not a great situation.</p>
<p>Around that time I was inspired to take a month-long family vacation, far longer than any past vacation. My family made arrangements to spend 3 weeks in a house by the beach, 1000 miles away, in the summer of 2008; these arrangements must be made far in advance, as such houses tend to fill up. I’d be away for approximately an entire month, allowing for travel time and stops along the way.</p>
<p>With that hard date in hand, my notions of ironing out the business processes “someday” were swept aside, and I set about tracking, automating, documenting, and delegating any of the work that involved me and had to happen at least monthly.</p>
<ul>
<li>accounting / bookkeeping / payroll</li>
<li>production sysadmin</li>
<li>development sysadmin</li>
<li>system monitoring</li>
<li>management processes</li>
<li>customer relationship processes</li>
<li>vendor relationships</li>
<li>design and code reviews</li>
<li>much more</li>
</ul>
<p>It took months of hard work (by myself and others) to build up our company ability to handle all of these things well in my absence. As of the vacation date, all of this was set up to run smoothly either entirely without me, or with a tiny bit of remote input from me.</p>
<p>This worked, in fact it worked <strong>so well that our customers didn’t even notice my absence</strong>.</p>
<p>Though I didn’t know it at the time, the work I did then to increase our organizational process maturity was a turning point in the life if the business, enabling its <a href="http://kylecordes.com/2010/mwm-sold">eventual sale</a>. Before that work, I’d have been a bit embarrassed to say “organizational process maturity” in public. Afterward, I have lived (rather than just learned about and talked about) the notions of working on-rather-than-in a business, of building a business with a life separate from that of its owners.</p>
<p>In retrospect I’m calling that trip a <strong>Strategic Vacation</strong> &#8211; a vacation taken both for its own value, and to drive the accomplishment other critical goals. If your business needs you every single day, that’s a problem. Create some pressure on yourself to solve it, by scheduling a strategic vacation, then go make it happen.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/strategic-vacation/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Prolog Story</title>
		<link>http://kylecordes.com/2010/the-prolog-story</link>
		<comments>http://kylecordes.com/2010/the-prolog-story#comments</comments>
		<pubDate>Thu, 20 May 2010 03:10:37 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[prolog]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=582</guid>
		<description><![CDATA[I&#8217;ve told this story in person dozens of times, it&#8217;s time to write it down and share it here. I&#8217;ve again experimentally recorded a video version (below), which you can view on a non-Flash device here. I know a little Prolog, which I learned in college &#8211; just enough to be dangerous. Armed with that, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve told this story in person dozens of times, it&#8217;s time to write it down and share it here. I&#8217;ve again experimentally recorded a video version (below), which you can view on a non-Flash device <a href="http://vimeo.com/11994794">here</a>.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11994794&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=11994794&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>I know a little <a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a>, which I learned in college &#8211; just enough to be dangerous. Armed with that, and some vigorous just-in-time online learning, I used Prolog in a production system a few years ago, with great results. There are two stories about that woven together here; one about the technical reasons for choosing this particular tool, and the other about the business payoff for taking a road less travelled.</p>
<p>In 2004 (or so) I was working on a project for an Oasis Digital customer on a client/server application with SQL Server behind it. This application worked (and still works) very well for the customer, who remains quite happy with it. This is the kind of project where there is an endless series of enhancement and additions, some of them to attack a problem-of-the-moment and some of them to enrich and strengthen the overall application capabilities.</p>
<p>The customer approached us with a very unusual feature request &#8211; pardon my generic description here; I don’t want to accidentally reveal any of their business secrets. The feature was described to us declaratively, in terms of a few rules and a bunch of examples of those rules. The wrinkle is that these were not “forward” rules (if X, do Y). Rather, these rules describe scenarios, such that if those scenarios happen, then something else should happen. Moreover, the rules were are on complex transitive/recursive relationships, the sort of thing that SQL is not well suited for.</p>
<p>An initial analysis found that we would need to implement a complex depth/breadth search algorithm either in the client application or in SQL. This wasn’t a straightforward graph search, though, rather that part was just the tip of the iceberg. I’m not afraid of algorithmic programming, Oasis Digital is emphatically not an “OnClick-only” programming shop, so I dug in. After spending a couple of days attacking the problem this way, I concluded that this would be a substantial block of work, at least several person-months to get it working correctly and efficiently. That’s not a lot in the grand scheme of things, but for this particular customer, this would use up their reasonable-but-not-lavish budget for months, even ignoring their other feature needs.</p>
<p>We set this problem aside for a few days, and upon more though I realized that:</p>
<ul>
<li>this would be a simple problem to <strong>describe</strong> in Prolog</li>
<li>the Prolog runtime would then <strong>solve</strong> the problem</li>
<li>the Prolog runtime would be responsible for doing it correctly and efficiently, i.e. our <strong>customer would not foot the bill</strong> to achieve those things.</li>
</ul>
<p>We proceeded with the Prolog approach.</p>
<p>&#8230;.</p>
<p>It actually took <strong>one day of work</strong> to get it working, integrated, and into testing, then a few hours a few weeks later to deploy it.</p>
<p>The implementation mechanism is pretty rough:</p>
<ul>
<li>The rules (the fixed portions of the Prolog solution) are expressed in a prolog source file, a page or two in length.</li>
<li>A batch process runs every N minutes, on a server with spare capacity for this purpose.</li>
<li>The batch process executes a set of SQL queries (in stored procs), returning a total of tens or hundreds of thousands of rows of data. SQL is used to format that query output as Prolog terms. These stored procs are executed using SQL Server BCP, making it trivial to save the results in files.</li>
<li>The batch process run a Prolog interpreter, passing the data and rules (both are code, both are data) as input. This takes up to a few minutes.</li>
<li>The Prolog rules are set up, with considerable hackery, to emit the output data we needed in the form of CSV data. This output is directed to a file.</li>
<li>SQL Server BCP imports this output data back in to the production SQL Server database.</li>
<li>The result of the computation is thus available in SQL tables for the application to use.</li>
</ul>
<p>This batch process is not an optimal design, but it has the advantage of being quick to implement, and robust in operation. The cycle time is very small compared to the business processes being controlled, so practically speaking it is 95% as good as a continuous calculation mechanism, at much less cost.</p>
<p>There are some great lessons here:</p>
<ul>
<li><strong>Declarative &gt;&gt;&gt; Imperative</strong>. This is among the most important and broad guidelines to follow in system design.</li>
<li><strong>Thinking Matters</strong>. We cut the cost/time of this implementation by 90% or more, not by coding more quickly, but by thinking more clearly. I am a fan of TDD and incremental design, but you’re quite unlikely to ever make it from a handcoded solution to this simply-add-Prolog solution that way.</li>
<li><strong>The Right Tool for the Job</strong>. Learn a lot of them, don’t be the person who only has a hammer.</li>
<li><strong>A big problem is a big opportunity</strong>. It is quite possible that another firm would not have been able to deliver the functionality our customer needed at a cost they could afford. This problem was an opportunity to win, both for us and for our customer.</li>
</ul>
<p>That’s all for now; it&#8217;s time for <a href="http://lessconf.lesseverything.com/">LessConf</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/the-prolog-story/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>When Will It Ship? Estimates and Promises</title>
		<link>http://kylecordes.com/2010/estimates-and-promises</link>
		<comments>http://kylecordes.com/2010/estimates-and-promises#comments</comments>
		<pubDate>Fri, 07 May 2010 21:26:44 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[estimates]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=573</guid>
		<description><![CDATA[I&#8217;m trying something new with this post: a short video presentation of approximately the same content. This is a Vimeo video, embedded as Flash. You can go over to Vimeo to watch it with HTML5-video devices like an iPad. I expect to offer better quality and more options as I learn more. Here is an [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m trying something new with this post: a short video presentation of approximately the same content.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11563705&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=11563705&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>This is a Vimeo video, embedded as Flash. You can <a href="http://vimeo.com/11563705">go over to Vimeo</a> to watch it with HTML5-video devices like an iPad. I expect to offer better quality and more options as I learn more.</p>
<hr />Here is an area of confusion that has come up both at Oasis Digital, and at every other firm I’ve worked:</p>
<p style="text-align: center;"><strong>estimate ≠ promise</strong></p>
<h2>Background: Unpredictability</h2>
<p>Around half of my software development and leadership experience has been in enterprise/internal software development, and that is the world I am thinking of as I write this.</p>
<p>Software development, like other endeavors with a significant creative component, is inherently unpredictable. With a good, deep understanding of the development process, you can build a model of the probability distribution of the cost, effort, and elapsed time for software development work. In the large, on average this can be made to work: small and large projects can succeed, within some broad range of predictability.</p>
<p>But notice also how common it is for large complex projects (in software and elsewhere) to be farcically over budget and late. This is not (usually) due to incompetence or fraud. It is because of the inherent unpredictability of the work.</p>
<p>If someone claims that they (or you) can exactly predict software development work, they are:</p>
<ul>
<li>mistaken, or</li>
<li>lying, or</li>
<li>padding their estimates very substantially, stating a date or cost much later/higher than a neutral median estimate would suggest</li>
</ul>
<p>As a customer of software development services, and as a provider of such services, I don’t want any of those things.</p>
<h2>Blame the Service Trades</h2>
<p>I place some of the blame for the confusion of these two wildly different things, on the service trades: it is common for auto repair shops, roof installers, landscapers, and the like to offer something they call an estimate, but which is actually a fixed price quote (a promise).</p>
<p>Sadly, while there are plenty of common good synonyms for promise, there aren’t many for estimate. We’re stuck with using the word estimate, and explaining that we really mean it as defined. Perhaps in a few more decades we will lose the word entirely, much like the word “literally” has come to mean its antonym, “figuratively”, which renders it mostly useless.</p>
<h2>Estimates</h2>
<p>An estimate is an approximation of an unknown quantity. Typically in the world of software development, it is a prediction of the cost, working hours, or delivery date of a project or milestone. It is not in any sense a commitment, any more than estimating the temperature outside this afternoon is a commitment.</p>
<p>As the word implies, a customer reasonably expects the actual value to vary somewhat, in either direction, from the estimate. In fact, if an estimate turns out exactly match the actual result, there is a good chance the books have been cooked. Moreover, if the work is completed at-or-before the estimate most of the time, this means the estimates (on average) are too high.</p>
<p>An estimate “costs” nothing, other than the time/effort required to create it, which consists of analyzing the work at hand, decomposing it in to parts, and comparing those parts to past work.</p>
<h2>Promises</h2>
<p>A promise, also called a commitment, deadline, quote, fixed price, etc. is a different beast entirely.</p>
<p>With a promise in hand, a customer should expect with high confidence that the actual value (for cost, hours of work, delivery date) will be less than (before), or equal to, the promised value/date.</p>
<p>Be wary of a promise easily made and freely given: it probably doesn’t mean anything at all. A wise customer (and I aim to count myself in this category) should expect that a casually made commitment will probably be broken; not because the maker is morally defective, but simply because meeting a commitment for complex work requires considerable effort and thought. Without evidence that happens, it would be mere wishful thinking to expect the results delivered as promised.</p>
<p>Likewise, keeping promises often has a cost. If the work underway gets behind the schedule needed to meet the promise, something will have to give:</p>
<ul>
<li>Other work may fall behind, as time and effort are diverted to meet the promise.</li>
<li>Weekends, evenings, and overtime work may be needed. These might appear free, but are not.</li>
<li>Staff may need to be reassigned, or added</li>
<li>Additional hardware and software may be needed.</li>
</ul>
<p>These risks cost real money; thus a wise promise-maker will find that, on average, it costs more to promise feature X by date D, than to delivery feature X by date D without such a promise.</p>
<h2>Estimates are Cheaper, so Prefer Estimates</h2>
<p>At Oasis Digital, we provide many estimates, but few promises. Most of the time, an estimate is what our customers need; and we can provide at estimate with very little cost. Typically we estimate reasonably well:</p>
<ul>
<li>small features usually arrive with a day or two (plus or minus) of the estimated delivery date (and likewise for cost)</li>
<li>medium items within a week or two of the estimate, likewise</li>
<li>large items (major new features or subsystems with complex interdependencoes) within a month or so, likewise</li>
</ul>
<p>The key here is is that with good estimate, commitments (promises) aren’t needed very often, and therefore the <strong>cost</strong> of promises can be avoided.</p>
<h2>But Learn How to Promise Well, Also</h2>
<p>Yet occasionally, a customer needs a commitment, most often because a software version needs to be available to match an important business event with a fixed date, such as a presentation, a legal filing, etc. I&#8217;ll follow up later (no promise or estimate, as to when) with thoughts on:</p>
<ul>
<li>how to credibly <strong>make</strong> promises (as a service provider)</li>
<li>how to <strong>evaluate</strong> promises (as a customer)</li>
</ul>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/estimates-and-promises/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Very slick video dragging</title>
		<link>http://kylecordes.com/2009/very-slick-video-dragging</link>
		<comments>http://kylecordes.com/2009/very-slick-video-dragging#comments</comments>
		<pubDate>Sat, 10 Jan 2009 20:55:13 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=231</guid>
		<description><![CDATA[Brett Rampata pointed out this very slick &#8220;Direct Manipulation of Video&#8221; demo video: Here is a more explanatory video from the same project: I&#8217;m curious how difficult it was to create that behavior. I&#8217;m confident that our customers (we build a variety of video applications for our customers at Oasis Digital) would be thrilled by [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.graviti.tv/blog/?p=50">Brett Rampata pointed out</a> this <a href="http://www.youtube.com/watch?v=WcIy9O344bI">very slick &#8220;Direct Manipulation of Video&#8221; demo video</a>:</p>
<p>Here is a more explanatory video from the same project:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="src" value="http://www.youtube.com/v/ib_g7F6WKAA&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/ib_g7F6WKAA&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1" allowfullscreen="true"></embed></object></p>
<p>I&#8217;m curious how difficult it was to create that behavior. I&#8217;m confident that our customers (we build a variety of video applications for our customers at Oasis Digital) would be thrilled by it.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/very-slick-video-dragging/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Growing a Language, by Guy Steele</title>
		<link>http://kylecordes.com/2007/growing-a-language</link>
		<comments>http://kylecordes.com/2007/growing-a-language#comments</comments>
		<pubDate>Wed, 17 Oct 2007 01:44:01 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/10/16/growing-a-language/</guid>
		<description><![CDATA[This is an oldie-but-goodie: Guy Steele’s “Growing a Language” talk from OOPSLA 1998. It is amazing to me that Guy, whose is something of a legend in language design, and who thinks so clearly about what makes a good language, was also key in designing Java. Java has been extremely slow to grow in the [...]]]></description>
			<content:encoded><![CDATA[<p>This is an oldie-but-goodie: <a href="http://video.google.com/videoplay?docid=-8860158196198824415">Guy Steele’s “Growing a Language” talk from OOPSLA 1998</a>.</p>
<p>It is amazing to me that Guy, whose is something of a legend in language design, and who thinks so clearly about what makes a good language, was also key in designing Java. Java has been extremely slow to grow in the sense described in this talk, because for many years Sun resisted such growth. Only the rise of C# and the growing popularity of dynamic languages generated enough pressure to get Java unstuck&#8230; and in the last few year Java has become somewhat growable in the sense Guy describes.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/growing-a-language/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YouTube Scalability Talk</title>
		<link>http://kylecordes.com/2007/youtube-scalability</link>
		<comments>http://kylecordes.com/2007/youtube-scalability#comments</comments>
		<pubDate>Thu, 12 Jul 2007 15:39:55 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/07/12/youtube-scalability/</guid>
		<description><![CDATA[Cuong Do of YouTube / Google recently gave a Google Tech Talk on scalability. I found it interesting in light of my own comments on YouTube&#8217;s 45 TB a while back. Here are my notes from his talk, a mix of what he said and my commentary: In the summer of 2006, they grew from [...]]]></description>
			<content:encoded><![CDATA[<p>Cuong Do of YouTube / Google recently gave a <a href="http://video.google.com/videoplay?docid=-6304964351441328559">Google Tech Talk on scalability</a>.</p>
<p>I found it interesting in light of my own <a href="http://kylecordes.com/2006/08/30/youtube-tb/">comments on YouTube&#8217;s 45 TB</a> a while back.</p>
<p>Here are my notes from his talk, a mix of what he said and my commentary:</p>
<p>In the summer of 2006, they grew from 30 million pages per day to 100 million pages per day, in a 4 month period.  (Wow! In most organizations, it takes nearly 4 months to  pick out, order, install, and set up a few servers.)</p>
<p>YouTube uses Apache for FastCGI serving.  (I wonder if things would have been easier for them had they chosen <a href="http://nginx.net/">nginx</a>, which is apparently wonderful for FastCGI and less problematic than Lighttpd)</p>
<p>YouTube is coded mostly in Python. Why? &#8220;Development speed critical&#8221;.</p>
<p>They use <a href="http://psyco.sourceforge.net/">psyco</a>, Python -&gt; C compiler, and also C extensions, for performance critical work.</p>
<p>They use <a href="http://www.lighttpd.net/">Lighttpd</a> for serving the video itself, for a big improvement over Apache.</p>
<p>Each video hosted by a &#8220;mini cluster&#8221;, which is a set of machine with the same content. This is a simple way to provide headroom (slack), so that a machine can be taken down for maintenance (or can fail) without affecting users. It also provides a form of backup.</p>
<p>The most popular videos are on a CDN (Content Distribution Network) &#8211; they use external CDNs and well as Google&#8217;s CDN.  Requests to their own machines are therefore tail-heavy (in the &#8220;Long Tail&#8221; sense), because the head codes to the CDN instead.</p>
<p>Because of the tail-heavy load, random disks seeks are especially important (perhaps more important than caching?).</p>
<p>YouTube uses simple, cheap, commodity Hardware.  The more expensive the hardware, the more expensive everything else gets (support, etc.). Maintenance is mostly done with rsync, SSH, other simple, common tools.<br />
The fun is not over: Cuong showed a recent email titled &#8220;3 days of video storage left&#8221;.  There is constant work to keep up with the growth.</p>
<p>Thumbnails turn out to be surprisingly hard to serve efficiently. Because there, on average, 4 thumbnails per video and many thumbnails per pages, the overall number of thumbnails per second is enormous.  They use a separate group of machines to serve thumbnails, with extensive caching and OS tuning specific to this load.</p>
<p>YouTube was bit by a &#8220;too many files in one dir&#8221; limit: at one point they could accept no more uploads (!!) because of this. The first fix was the usual one: split the files across many directories, and switch to another file system better suited for many small files.</p>
<p>Cuong joked about &#8220;The Windows approach of scaling: restart everything&#8221;</p>
<p>Lighttpd turned out to be poor for serving the thumbnails, because its main loop is a bottleneck to load files from disk; they addressed this by modifying Lighttpd to add worker threads to read from disk.  This was good but still not good enough, with one thumbnail per file, because the enormous number of files was terribly slow to work with (imagine tarring up many million files).</p>
<p>Their new solution for thumbnails is to use Google&#8217;s <a href="http://labs.google.com/papers/bigtable.html">BigTable</a>, which provides high performance for a large number of rows, fault tolerance, caching, etc. This is a nice (and rare?) example of actual synergy in an acquisition.</p>
<p>YouTube uses MySQL to store metadata. Early on they hit a Linux kernel issue which prioritized the page cache higher than app data, it swapped out the app data, totally overwhelming the system. They recovered from this by removing the swap partition (while live!). This worked.</p>
<p>YouTube uses <a href="http://www.danga.com/memcached/">Memcached</a>.</p>
<p>To scale out the database, they first used MySQL replication.  Like everyone else that goes down this path, they eventually reach a point where replicating the writes to all the DBs, uses up all the capacity of the slaves. They also hit a issue with threading and replication, which they worked around with a very clever &#8220;cache primer thread&#8221; working a second or so ahead of the replication thread, prefetching the data it would need.</p>
<p>As the replicate-one-DB approach faltered, they resorted to various desperate measures, such as splitting the video watching in to a separate set of replicas, intentionally allowing the non-video-serving parts of YouTube to perform badly so as to focus on serving videos.</p>
<p>Their initial MySQL DB server configuration had 10 disks in a RAID10. This does not work very well, because the DB/OS can’t take advantage of the multiple disks in parallel. They moved to a set of RAID1s, appended together. In my experience, this is better, but still not great. An approach that usually works even better is to intentionally split different data on to different RAIDs: for example, a RAID for the OS / application, a RAID for the DB logs, one or more RAIDs for the DB table (uses “tablespaces” to get your #1 busiest table on separate spindles from your #2 busiest table), one or more RAID for index, etc. Big-iron Oracle installation sometimes take this approach to extremes; the same thing can be done with free DBs on free OSs also.</p>
<p>In spite of all these effort, they reached a point where replication of one large DB was no longer able to keep up. Like everyone else, they figured out that the solution database partitioning in to “shards&#8221;.  This spread reads and writes in to many different databases (on different servers) that are not all running each other’s writes. The result is a large performance boost, better cache locality, etc. YouTube reduced their total DB hardware by 30% in the process.</p>
<p>It is important to divide users across shards by a controllable lookup mechanism, not only by a hash of the username/ID/whatever, so that you can rebalance shards incrementally.</p>
<p>An interesting DMCA issue: YouTube complies with takedown requests; but sometimes the videos are cached way out on the “edge” of the network (their caches, and other people’s caches), so its hard to get a video to disappear globally right away. This sometimes angers content owners.</p>
<p>Early on, YouTube leased their hardware.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/youtube-scalability/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Pipe RGB data to ffmpeg</title>
		<link>http://kylecordes.com/2007/pipe-ffmpeg</link>
		<comments>http://kylecordes.com/2007/pipe-ffmpeg#comments</comments>
		<pubDate>Thu, 05 Jul 2007 17:28:26 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/07/05/pipe-ffmpeg/</guid>
		<description><![CDATA[A while back I asked on the ffmpeg mailing list how to pipe RGB data in to ffmpeg. I described it as follows: in my code I am building video frames, 720x480x24bit. I have in mind generating a large number of these, as long as a full DVD worth at 30fps, then using ffmpeg (followed [...]]]></description>
			<content:encoded><![CDATA[<p>A while back I <a href="http://osdir.com/ml/video.ffmpeg.user/2006-04/msg00041.html">asked on the ffmpeg mailing list</a> how to pipe RGB data in to <a href="http://ffmpeg.mplayerhq.hu/">ffmpeg</a>. I described it as follows:</p>
<blockquote><p>in my code I am building video frames, 720x480x24bit. I have in mind generating a large number of these, as long as a full DVD worth at 30fps, then using ffmpeg (followed by dvdauthor) to encode them in to MPEG2 for DVD usage.</p></blockquote>
<p>There were a few replies, but no definitive answer. With considerable experimentation, I got it to work. It turns out that (as far as I can tell) ffmpeg does not have the ability to accept piped in RGB frames. It will however accept piped in data in its “yuv4mpegpipe” format. With some searching and reading I found that this is roughly akin to the format of raw DV video; each frame consists of a header something like this:</p>
<p>YUV4MPEG2 W%d H%d F%d:%d Ip A0:0 C420mpeg2 XYSCSS=420MPEG2</p>
<p>&#8230; then an LF character, then data for the the Y, U, and V &#8220;planes&#8221;. The Y data is full resolution, while the U and Y are half-resolution (this is called &#8220;420&#8243; in the video world). These planes are uncompressed, one byte per pixel. All of my past work with computer video (going back to Commodore 64s and Apple IIs) has arranged all of the bits for each pixel within a few bytes of each other; this format (with all the Y data for the whole frame, then all the U data, then all the V data) is starkly different.</p>
<p>The essential problem remaining was how to convert RGB to YUV. Happily there are plenty of online references for this.  Unhappily there are few fast implementations, and a naive implementation will be very slow. I solved this problem by finding and hiring an expert in low-level data processing with MMX, SSE2, etc. instructions. (I am not in a position to publish that code here.)</p>
<p>In retrospect, though, there are routines included in Intel’s “<a href="http://www.intel.com/cd/software/products/asmo-na/eng/302910.htm">Integrated Performance Primitives</a>” library which perform this transformation in a highly optimized way. IPP is a bargain: for only a few hundred dollars you get a wealth of high optimized ready-to-use library routines for signal processing.</p>
<p>The ffmpeg piping solution consists, therefore, of:</p>
<ol>
<li>A module which generated frames in RGB format, to contain whatever contents your application requires.</li>
<li>A module to very quickly convert these to YUV in yuv4mpegpipe format (write your own, or use routines in IPP, for the RGB-&gt;YUV420 part).</li>
<li>Pipe this data stream to ffmpeg with stdin; ffmpeg is invoked something like this: ffmpeg -y -f yuv4mpegpipe -i &#8211; -i audio.mp3 -target ntsc-dvd -aspect 4:3 foo.mpg</li>
</ol>
<p>By using a multicore CPU and threads, this whole process can be made to happen in real time or better (i.e., one second of &#8220;wall clock&#8221; processing time, for one second of finished MPEG2 video). The resulting MPEG2 file can be used with a DVD authoring application to produce a ready-to-burn DVD ISO image.</p>
<p><strong>Update</strong>: the data format above is published <a href="http://www.penguin-soft.com/penguin/man/5/yuv4mpeg.html">here as part of the mjpegtools man pages</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/pipe-ffmpeg/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>TEDTalks &#8211; Ideas Worth Spreading &#8211; Video Worth Watching</title>
		<link>http://kylecordes.com/2007/ted</link>
		<comments>http://kylecordes.com/2007/ted#comments</comments>
		<pubDate>Sat, 26 May 2007 21:38:17 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/05/26/ted/</guid>
		<description><![CDATA[TED is an annual conference at which a bunch of (hopefully?) remarkable people say remarkable things. I&#8217;m using the word in a Seth Godin sort of way: remarkable things are those which inspire people to literally remark about them. It appears to be &#8220;A-list&#8221; event, meaning that I&#8217;m not likely to make the cut anytime [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ted.com/">TED</a> is an annual conference at which a bunch of (hopefully?) remarkable people say remarkable things. I&#8217;m using the word in a Seth Godin sort of way: remarkable things are those which inspire people to literally remark about them.</p>
<p>It appears to be &#8220;A-list&#8221; event, meaning that I&#8217;m not likely to make the cut anytime soon.</p>
<p>Fortunately, many TED sessions are available to the rest of us online: <a href="http://www.ted.com/tedtalks/">TEDTalks</a>.  Here are some that I bookmarked to watch again; the download links are for QuickTime videos. Many of these are also on Google Video or elsewhere.</p>
<p><a href="http://ted.streamguys.net/ted_rutan_b_2006.zip">Burt Rutan</a></p>
<p><a href="http://ted.streamguys.net/ted_schwartz_b_2005.zip">Barry Schwartz</a></p>
<p><a href="http://ted.streamguys.net/ted_gladwell_m_2004.zip">Malcom Gladwell</a></p>
<p><a href="http://ted.streamguys.net/ted_levitt_s_2004.zip">Steven Levitt</a></p>
<p><a href="http://ted.streamguys.net/ted_negroponte_n_2006.zip">Nicholas Negroponte</a></p>
<p><a href="http://ted.streamguys.net/ted_rosling_h_2006.zip">Hans Rosling</a> (One word summary: Wow.)</p>
<p><a href="http://video.google.com/videoplay?docid=-4964296663335083307&#038;q=tedtalks">Ken Robinson &#8211; Do schools today kill creativity?</a></p>
<p><a href="http://video.google.com/videoplay?docid=-7822696446273926158&#038;q=tedtalks">Dan Gilbert  &#8211; The (misguided) pursuit of happiness</a></p>
<p>The Secret of Happiness, according to Dan Gilbert:</p>
<ol>
<li>Accrue wealth, power, and prestige. Then lose it.</li>
<li>Spend as much of your life in prison as you possibly can.</li>
<li>Make someone else really, really rich.</li>
<li>Never ever join the Beatles.</li>
</ol>
<p>(watch the video for the story behind this)</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/ted/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linus Torvalds explains distributed source control</title>
		<link>http://kylecordes.com/2007/linux-git-distributed</link>
		<comments>http://kylecordes.com/2007/linux-git-distributed#comments</comments>
		<pubDate>Thu, 17 May 2007 14:00:42 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[source-control]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/05/17/linux-git-distributed/</guid>
		<description><![CDATA[On several occasions over the last year, I&#8217;ve pointed out that distributed source control tools are dramatically better than centralized tools. It&#8217;s quite hard for me to explain why. This is probably because of sloppy and incomplete thinking on my part, but it doesn’t help that most of the audiences / people I&#8217;ve said this [...]]]></description>
			<content:encoded><![CDATA[<p>On several occasions over the last year, I&#8217;ve pointed out that distributed source control tools are dramatically better than centralized tools. It&#8217;s quite hard for me to explain why. This is probably because of sloppy and incomplete thinking on my part, but it doesn’t help that most of the audiences / people I&#8217;ve said this to, have never used a distributed tool. (I&#8217;ve been trying out <a href="http://svk.bestpractical.com/view/HomePage">SVK</a>, <a href="http://bazaar-vcs.org/">bzr</a>, git, etc.) Fortunately, I no longer need to stumble with attempts at explaining this; instead, the answer is to watch as:</p>
<p><a href="http://www.youtube.com/watch?v=4XpnKHJAok8">Linus Torvalds explains distributed source control in general, and git in particular, at Google</a></p>
<p>Here are some of his points, paraphrased. They might not be clear without watching the video.</p>
<ul>
<li>He hates CVS</li>
<li>He hates <a href="http://subversion.tigris.org/">SVN</a> too, since it&#8217;s &#8220;CVS done right&#8221;, because you can&#8217;t get anywhere good from there.</li>
<li>If you need a commercial tool, <a href="http://www.bitkeeper.com/">BitKeeper</a> is the one you should use.</li>
<li>Distributed source control is much more important than which tool you choose</li>
<li>He looked at a lot of alternatives, and immediately tossed anything not distributed, slow, or which does not guarantee that what goes in, comes out [using secure hashes]</li>
<li>He liked Monotone, but it was too slow</li>
<li>With a distributed tool, no single place is vital to your data</li>
<li>Centralized does not scale to Linux-kernel sized projects</li>
<li>Distributed tools work offline, with full history</li>
<li>Branching is not an esoteric, rare event &#8211; everyone branches all the time every time they write a line of code &#8211; but most tools don&#8217;t understand this, they only understand branching as a Very Big Deal.</li>
<li>Distributed tools serve everyone; everyone has “commit” access to their branches. Everyone has all of the tool’s features, rather than only a handful of those with special access.</li>
<li>Of course noone else will necessarily adopt your changes; using a tool in which every developer has the full feature set, does not imply anarchy.</li>
<li>Merging works like security: as a network of trust</li>
<li>Two systems worth looking at: <a href="http://git.or.cz/">git</a> and <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>. The others with good features are too slow [for large projects].</li>
<li>Lots of people are using git for their own work (to handle merges, for example), inside companies where the main tools is SVN. git can pull changes from (and thus stay in sync with) SVN.</li>
<li>Git is now much easier to use than CVS or other common tools</li>
<li>Git makes it easier to merge than other tools. So the problem of doing more merging, is not much of a problem, not something you need to fear.</li>
<li>Distributed tools are much faster because they don’t have to go over the network very often. Not talking to a server, is tremendously faster, than talking to even a high end server over a fast network.</li>
<li>SVN working directories and repositories are quite large, git equivalents are much smaller</li>
<li>The repository (=project) is the unit of checkout / commit / etc.; don’t put them all in to on repository. The separate repositories can share underlying storage.</li>
<li>Performance is not secondary. It affect everything you do, it affects how you use an application. Faster operations = merging not a big deal = more, smaller changes.</li>
<li>SVN “makes branching really cheap”. Unfortunately, “merging in SVN is a complete disaster”. “It is incredible how stupid these people are”</li>
<li>Distributed source control is mostly inherently safer: no single point of failure, secure hashes to protect from even intentional malicious users.</li>
<li>“I would never trust Google to maintain my source code for me” – with git (and other distributed systems) the whole history is in many places, nearly impossible to lose it.</li>
</ul>
<p>My own observations:</p>
<p>There are important differences between source control tools. I have heard it said that these are all “just tools” which don’t matter, you simply use whatever the local management felt like buying.  That is wrong: making better tool choices will make your project better (cheaper, faster, more fun, etc.), making worse tool choices will make your project worse (more expensive, slower, painful, higher turnover, etc.)</p>
<p>Distributed tools make the “network of trust” more explicit, and thus easier to reason about.</p>
<p>I think there is an impression out there that distributed tools don&#8217;t accomodate the level of control that &#8220;enterprise&#8221; shops often specify in their processes, over how code is managed. This is a needless worry; it is still quite possible to set up any desired process and controls for the the official repositories. The difference is that you can do that, without the collateral damage of taking away features from individual developers.</p>
<p>Git sounds like the leading choice on Linux, but at the moment it is not well supported on Windows, and I don’t see any signs of that changing anytime soon. I will continue working with bzr, SVK, etc.</p>
<p>There is widespread, but mostly invisible demand for better source control. Over the next few years, the hegemony of the legacy (centralized) design will be lessened greatly. One early adopter is Mozilla, which is switching (or has switched?) to Mercurial. Of course, many projects and companies (especially large companies) will hang on for years to come, because of interia and widespread tool integration.</p>
<p>Several of the distributed tools (SVK, bzr, git, probably more) have the ability to pull changes from other systems, including traditional centralized systems like SVN. These make it possible to use a modern, powerful tool for your own work, even when you are working on a project where someone else has chosen such a traditional system for the master repository.</p>
<p><strong>Update</strong>: <a href="http://www.ociweb.com/mark/">Mark</a> commented that he doesn&#8217;t feel like he has really commited a changeset, until it is on a remote repository. I agree. However, this is trivial: with any of the tools you can push your change from your local repository to a remote one (perhaps one for you alone), with one command. With some of them (bzr, at least) you can configure this to happen automatically, so it is zero extra commands. This <strong>does not negate the benefits</strong> of a local repository, because you can still work offline, and all read operations still happen locally and far more quickly.</p>
<p><strong>Update</strong>: I didn&#8217;t mention <a href="http://www.selenic.com/mercurial/">Mercurial</a> initially, but I should have (thanks, Alex). It is another strong contender, and Mozilla recently chose it. Its feature set is similar to git&#8217;s, but with more eager support for Windows.</p>
<p><strong>Update</strong>: There is another <a href="http://codicesoftware.blogspot.com/2007/05/linus-torvalds-on-git-and-scm.html">discussion of Linus&#8217;s talk over on Codice Software&#8217;s blog</a>, which was <a href="http://developers.slashdot.org/article.pl?sid=07/06/03/004214">linked on Slashdot</a>. Since Codice sells a source control product, the Slashdot coverage is a great piece of free publicity.</p>
<p><strong>Update</strong>: Mark Shuttleworth pointed out below that <a href="http://bazaar-vcs.org/">bzr</a> is much faster than it used to be, and that it has top-notch renaming support; which he <a href="http://www.markshuttleworth.com/archives/123">explains in more detail</a> on in a post. Bzr was already on my own short-list, I am using it for a small project here at Oasis Digital.</p>
<p><strong>Update</strong>: I&#8217;ve started gathering notes about git, bzr, hg, etc., for several upcoming posts (and possibly a talk or two). If you&#8217;re interested in these, subscribe to the feed using the links in the upper right of <a href="http://kylecordes.com/">my home page</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/linux-git-distributed/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Excellent JavaScript talk from Yahoo</title>
		<link>http://kylecordes.com/2007/crockford-javascript</link>
		<comments>http://kylecordes.com/2007/crockford-javascript#comments</comments>
		<pubDate>Fri, 04 May 2007 02:33:39 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/05/03/crockford-javascript/</guid>
		<description><![CDATA[Over at Yahoo Video you can watch an excellent talk by Doug Crockford on JavaScript (part 1). (part 2, part 3, part 4) This is likely the best introduction to JavaScript I have seen, and worthwhile even if you’ve been using JS for years. Why does JavaScript matter? 1) It is ubiquitous now (in nearly [...]]]></description>
			<content:encoded><![CDATA[<p>Over at Yahoo Video you can watch an <a href="http://video.yahoo.com/video/play?vid=cccd4aa02a3993ab06e56af731346f78.1710507">excellent talk by Doug Crockford on JavaScript (part 1)</a>. (<a href="http://video.yahoo.com/video/play?vid=111594">part 2</a>, <a href="http://video.yahoo.com/video/play?vid=111595">part 3</a>, <a href="http://video.yahoo.com/video/play?ei=UTF-8&amp;b=7&amp;vid=111596&amp;gid=133414">part 4</a>)  This is likely the best introduction to JavaScript I have seen, and worthwhile even if you’ve been using JS for years.</p>
<p>Why does JavaScript matter?</p>
<p>1) It is ubiquitous now (in nearly every browser, in Flash as ActionScript, etc.)</p>
<p>2) It is likely to be the default choice for building scriptable Java applications, due to the Rhino JS interpreter “in the box” in Java 1.6</p>
<p><strong>Update</strong>: These videos are more conveniently <a href="http://101out.com/js.php">all on one page here</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/crockford-javascript/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>High Quality Screen Recordings</title>
		<link>http://kylecordes.com/2007/screen-recordings</link>
		<comments>http://kylecordes.com/2007/screen-recordings#comments</comments>
		<pubDate>Thu, 12 Apr 2007 02:25:14 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/04/11/screen-recordings/</guid>
		<description><![CDATA[At Oasis Digital we&#8217;ve found that we can communicate effectively with each other and with customers, across time and space, using screen + audio recording (also called screencasts or screen videos). We use these to demonstrate a new feature, to explain how code works, to described how a new feature should work, etc. The communication [...]]]></description>
			<content:encoded><![CDATA[<p>At Oasis Digital we&#8217;ve found that we can communicate effectively with each other and with customers, across time and space, using screen + audio recording (also called screencasts or screen videos). We use these to demonstrate a new feature, to explain how code works, to described how a new feature should work, etc. The communication is not as good as a live, in-person meeting/demo, but the advantages often outweigh that factor:</p>
<ol>
<li>No travel.</li>
<li>No need to syncronize schedules.</li>
<li>The receiving person can view the recording repeatedly, at their convenience.</li>
<li>Customers and develoeprs who join the project team later, can look at old recordings to catch up.</li>
</ol>
<p>It turns out that I am unusually picky about the quality of such recordings; I&#8217;ve written up some technical notes on how to get good results, and posted them: <a href="http://kylecordes.com/files/HighQualityScreenRecordings.pdf">HighQualityScreenRecordings.pdf</a>.</p>
<p>A few highlights:</p>
<ul>
<li>A reasonably fast computer can both run application and record screen video at the same time; but if you will be recording the use of an application that generates a lot of disk activity, you <strong>must</strong> save the video to separate hard drive (internal, external, network server, etc.) from the hard drive you are running your OS and applications from. (For applications that generate little disk activity, a single system hard drive works fine.)</li>
</ul>
<ul>
<li>Use a headset-style microphone, and record in a quiet place: close the door, turn off the music, etc.</li>
</ul>
<ul>
<li>Adjust your audio levels well. Please. This is the most common and most annoying problem with screencast and podcast recordings I find.</li>
</ul>
<ul>
<li>Bytes are cheap; use a sufficiently large window and sufficiently high bitrate.</li>
</ul>
<p>Many more details are in the PDF linked above.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/screen-recordings/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Tech Talks</title>
		<link>http://kylecordes.com/2007/google-tech-talks</link>
		<comments>http://kylecordes.com/2007/google-tech-talks#comments</comments>
		<pubDate>Thu, 15 Mar 2007 19:56:18 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/03/15/google-tech-talks/</guid>
		<description><![CDATA[Google, a mecca for top notch programmers, attracts many top speakers to give talks on (generally) technical topics. They graciously record these talks and upload them to Google Video. You can get a list of most of them by searching video.google.com for “engEDU”. Think of these as virtual user group talks, but usually with bigger [...]]]></description>
			<content:encoded><![CDATA[<p>Google, a mecca for top notch programmers, attracts many top speakers to give talks on  (generally) technical topics. They graciously record these talks and upload them to Google Video.  You can get a list of most of them by <a href="http://video.google.com/videosearch?q=engEDU">searching video.google.com for “engEDU”</a>. Think of these as virtual user group talks, but usually with bigger “name” speakers than a typical local group offers.</p>
<p>Here are just a few that&#8217;s I&#8217;ve enjoyed recently, there are many more worth watching.</p>
<p><a href="http://video.google.com/videoplay?docid=-6726522426109060914&#038;q=engedu">How Debian (Ubuntu) packages work</a></p>
<p><a href="http://video.google.com/videoplay?docid=-6909078385965257294&#038;q=seth+godin">Seth Godin (marketing guru)</a></p>
<p><a href="http://video.google.com/videoplay?docid=-5105910452864283694&#038;q=engedu">Mary Poppendieck (“Lean Software Development” author) &#8211; Competing on the basis of speed</a></p>
<p><a href="http://video.google.com/videoplay?docid=-6972678839686672840">A new Way to look at Networking &#8211; Fascinating</a></p>
<p><a href="http://video.google.com/videoplay?docid=-7724296011317502612">The Mercurial distributed source control system</a></p>
<p>Added later:</p>
<p><a href="http://video.google.com/videoplay?docid=9192869309993503810&#038;q=user%3A%22Google+engEDU%22">Fission is the New Fire</a></p>
<p><a href="http://www.youtube.com/watch?v=z6hoPw5hItY&#038;eurl=">Jessica Livingston, talking about &#8220;Founders at Work&#8221;</a></p>
<p>Still later:</p>
<p><a href="http://video.google.com/videofeed?type=search&#038;q=Google+engEDU&#038;so=1&#038;num=20&#038;output=rss">Subscribe to this feed to find out about each talk</a></p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/google-tech-talks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I have seen the future, and it runs OSX</title>
		<link>http://kylecordes.com/2007/osx-handheld</link>
		<comments>http://kylecordes.com/2007/osx-handheld#comments</comments>
		<pubDate>Tue, 09 Jan 2007 21:56:27 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[wireless]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/01/09/osx-handheld/</guid>
		<description><![CDATA[iPhone: Wow It’s a phone. It&#8217;s a PDA. It’s an iPod. It’s a widescreen video iPod. It has zero physical buttons, rather the whole front is a multi-touch-screen. I’ll leave the rest of the raving to the many other sites doing a great job of that. The real innovation of this new device is the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.apple.com/iphone/">iPhone</a>: Wow</p>
<p><img src="http://kylecordes.com/images/dsc_0175.jpg" /></p>
<p>It’s a phone. It&#8217;s a PDA.  It’s an iPod.  It’s a widescreen video iPod.  It has zero physical buttons, rather the whole front is a multi-touch-screen. I’ll leave the rest of the raving to the many other sites doing a great job of that.</p>
<p>The real innovation of this new device is the OS. Apple has an answer to PalmOS and Windows Mobile (CE): run their real desktop/server OSX, with Unix inside, on the phone.  Today’s handhelds have much more computing power and storage than desktop PCs of a decade ago, and there are enormous benefits to running a real, common OS on such a device.  I’d been saying since I bought my first Palm (a Handspring, actually) than within a decade the handheld OS’s would go away.</p>
<p>Apple has gone first. How soon will Microsoft follow?  Will Palm and RIM make to the new era at all?</p>
<p>(Update: Yes, the title of this post is slightly in jest. I&#8217;m serious about real OSs in handheld devices, and the iPhone looks fantastic, but Apple is very unlikely to dominate the phone market in the way the iPod dominates the tiny-media-player market.)</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/osx-handheld/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

