<?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; audio</title>
	<atom:link href="http://kylecordes.com/tag/audio/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>SaaS: The Business Model &#8211; Slides, Audio, Transcript</title>
		<link>http://kylecordes.com/2010/saas-slides-audio</link>
		<comments>http://kylecordes.com/2010/saas-slides-audio#comments</comments>
		<pubDate>Wed, 03 Mar 2010 04:45:05 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[saas]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=463</guid>
		<description><![CDATA[On Feb. 27 at St. Louis Innovation Camp 2010, I gave a talk on the SaaS business model. If you missed it, you might be interested in: A video recording of the SaaS talk. The SaaS talk handout as a PDF The SaaS talk slides as a PDF (also shown below) Transcript of the Talk, [...]]]></description>
			<content:encoded><![CDATA[<p>On Feb. 27 at St. Louis Innovation Camp 2010, I gave a talk on the SaaS business model. If you missed it, you might be interested in:</p>
<ul>
<li><a href="http://kylecordes.com/2010/saas-video">A <strong>video recording</strong> of the SaaS talk.</a></li>
<li>The <a href="http://kylecordes.com/files/Cordes-2010-Inno-SaaS-handout.pdf">SaaS talk handout as a PDF</a></li>
<li>The <a href="http://kylecordes.com/files/Cordes-2010-Inno-SaaS-slides.pdf">SaaS talk slides as a PDF</a> (also shown below)</li>
<li><a href="/files/Cordes-2010-Inno-SaaS-Transcript.pdf">Transcript of the Talk, with slides, as a PDF</a></li>
<li><a href="http://media.kylecordes.com/Cordes-2010-Inno-SaaS.mp3">Audio recording of the SaaS talk</a></li>
</ul>
<div id="__ss_3299688" style="width: 425px;"><strong><a title="Software as a Service:  The Business Model" href="http://www.slideshare.net/kylecordes/software-as-a-service-the-business-model">Software as a Service:  The Business Model</a></strong><object 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=saasinnocamp2010-100228102033-phpapp01&amp;rel=0&amp;stripped_title=software-as-a-service-the-business-model" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=saasinnocamp2010-100228102033-phpapp01&amp;rel=0&amp;stripped_title=software-as-a-service-the-business-model" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/kylecordes">Kyle Cordes</a>.</div>
</div>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/saas-slides-audio/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://media.kylecordes.com/Cordes-2010-Inno-SaaS.mp3" length="46577370" type="audio/mpeg" />
		</item>
		<item>
		<title>Micro-review: Bose QuietComfort 15 noise-cancelling headphones</title>
		<link>http://kylecordes.com/2009/bose-qc</link>
		<comments>http://kylecordes.com/2009/bose-qc#comments</comments>
		<pubDate>Mon, 09 Nov 2009 00:16:01 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=341</guid>
		<description><![CDATA[I recently bought these Bose headphones: Yes, they cost $300. Ouch. If you travel by airplane more than 1x per year, buy these headphones. Slightly longer review: These headphones use active noise cancellation to dramatically slash the volume of loud environments; they work best for continuous, white-noise-like sounds (for example, riding in an airplane). The [...]]]></description>
			<content:encoded><![CDATA[<p>I recently bought these <a href="http://www.bose.com/controller?event=VIEW_STATIC_PAGE_EVENT&amp;url=/shop_online/headphones/noise_cancelling_headphones/quietcomfort_15/index.jsp">Bose headphones</a>:</p>
<p><img class="alignnone size-full wp-image-343" title="qc15_si_lg" src="/blog/wp-content/uploads/2009/11/qc15_si_lg.jpg" alt="qc15_si_lg" width="375" height="240" /></p>
<p>Yes, they cost $300. Ouch.</p>
<p>If you travel by airplane more than 1x per year, buy these headphones.</p>
<p><strong>Slightly longer review:</strong></p>
<p>These headphones use active noise cancellation to dramatically slash the volume of loud environments; they work best for continuous, white-noise-like sounds (for example, riding in an airplane). The experience of 4+ hours in the air is completely different when you cut down the noise level. Wearing these, vs. not, is a more dramatic difference in overall unpleasantness, than the difference been first-class and <del>steerage</del>coach.</p>
<p>Each AAA battery lasts a few flights, sometimes more. You can plug in your media player, computer, etc., or just use the noise cancellation alone.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/bose-qc/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Become a Better Speaker for $100</title>
		<link>http://kylecordes.com/2007/better-speaker-100-dollars</link>
		<comments>http://kylecordes.com/2007/better-speaker-100-dollars#comments</comments>
		<pubDate>Sat, 03 Nov 2007 16:50:21 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/11/03/better-speaker-100-dollars/</guid>
		<description><![CDATA[The title of this post is a lie. It costs $70 or less, but takes a lot of work. I&#8217;ve offered this advice person-to-person many times, and finally got around to posting it. How well you speak can have a great impact on  your ability to get customers, to attract employees, to persuade others to [...]]]></description>
			<content:encoded><![CDATA[<p>The title of this post is a lie. It costs $70 or less, but takes a lot of work. I&#8217;ve offered this advice person-to-person many times, and finally got around to posting it.</p>
<p>How well you speak can have a great impact on  your ability to get customers, to attract employees, to persuade others to adopt your ideas, and much more. But how do you know how well you speak? You can&#8217;t tell as you are speaking; and if you&#8217;ve never heard yourself speak but simply assume you do well, there is a great risk that you are very, very wrong.</p>
<p>To become a better speaker, you need to review your own &#8220;performances&#8221;. For the last few years I&#8217;ve been recording my talks (at user groups etc.) with a hand-held voice recorder. I use an Olympus WS-100 (probably obsolete by now) and you can readily find an adequate device for $70 or less.</p>
<p><strong>Make the Recording</strong></p>
<p>Don&#8217;t actually hold the recorder on your hand. Sit it on the podium if you use one (I don&#8217;t care for podiums, I use one only if I am presenting with my computer and the podium is the only place to put the computer); but not to close to your noisy computer. Put it on a table or unused chair in the first row, but not too close to any noisy people or equipment.</p>
<p>Start it at the very beginning, and stop it at the very end. It is easy to edit out extra recording later.</p>
<p>Put in a fresh battery, so it doesn&#8217;t run out partway through.</p>
<p><strong>Listen to the Recording</strong></p>
<p>Take the recorder/player in your car, copy it to  your iPod, burn to CD, whatever&#8230; but listen to it, end to end. Experience your talk as a member of the audience. Make notes about any bad habits you exhibit, such as &#8220;umm&#8221;, &#8220;ahh&#8221;, &#8220;like&#8221;, &#8220;ya-know&#8221;, long (unintentional) pauses, pointless extra words, etc. This is your first opportunity to become a better speaker by means of the recording. WARNING! The first few times this might be very, very painful.</p>
<p><strong>Edit the Recording</strong></p>
<p>If you plan to post this audio online (as I usually do),  clean up the recording to trim off any extra starting and ending time; the audio you post should start immediately with your talk content and end crisply. Download Audacity (or another audio editing) and use it for this initial trim.</p>
<p>If you can spare the time (approximately 2x the length of the talk), listen through the whole recording in Audacity, trimming out the &#8220;umms&#8221;, &#8220;ahs&#8221;, overly long pauses, etc. This is your second opportunity to become a better speaker&#8230; but only for the offline listeners, and in an artificial, one-off way. Still, for an occasional important talk it is worthwhile.</p>
<p><strong>Get a Transcript</strong></p>
<p>Finally, be aware that your (now-pristine) audio is completely unsearchable and invisible to Google. To make it findable, have a transcript made and post that also. You can pay <a href="http://castingwords.com/">CastingWords</a> or other similar service to create a transcript for around a dollar per minute, or perhaps much more cheaply with some searching. The resulting text can be readily posted online, making your talk both more findable, and more accessible.</p>
<p>An example of a recorded, lightly edited, and posted talk (with transcript) is my <a href="http://kylecordes.com/2007/03/31/ruby-gui-toolkits/">Ruby GUI talk</a> earlier this year.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/better-speaker-100-dollars/feed</wfw:commentRss>
		<slash:comments>1</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>Selling your Software as a Service: Notes and Audio</title>
		<link>http://kylecordes.com/2007/software-service</link>
		<comments>http://kylecordes.com/2007/software-service#comments</comments>
		<pubDate>Fri, 11 May 2007 01:30:20 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[saas]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/05/10/software-hosted-service/</guid>
		<description><![CDATA[At the St. Louis Code Camp on May 5, 2007, I gave a talk on Selling Your Software as a Service, in which I discussed our experiences selling a complex (Java) &#8220;enterprise&#8221; application in that manner. The room was much more crowded than I expected, it was exciting to have an eager group. As with [...]]]></description>
			<content:encoded><![CDATA[<p>At the <a href="http://stlcodecamp.org/">St. Louis Code Camp on May 5, 2007</a>, I gave a talk on Selling Your Software as a Service, in which I discussed our experiences selling a complex (Java) &#8220;enterprise&#8221; application in that manner. The room was much more crowded than I expected, it was exciting to have an eager group. As with all my recent talks, I used a handout instead of slides. You can download a <a href="http://kylecordes.com/files/SAASTalkHandout.pdf">PDF of the handout</a> (one page, one side), or read the contents below.</p>
<p>The 1 hour audio recording (Olympus WS-100 digital voice recorder, Audacity cleanup) is available here: <a href="http://media.kylecordes.com/SAASTalk.mp3">SAASTalk.mp3<br />
</a></p>
<p><a href="http://kylecordes.com/files/SAASTalk.html">A transcript of the talk is available</a>. In the talk I mentioned Paul Graham&#8217;s <a href="http://paulgraham.com/road.html">The Other Road Ahead</a>, which is shorter and easier to read the my talk transcript.</p>
<p>A couple of people at Code Camp asked if I could come give a similar talk in-house at their firms. Yes &#8211; please contact me with the contact form to arrange a date.</p>
<p>The handout contents follow.</p>
<p><span id="more-141"></span></p>
<h2>Selling your Software as a Service</h2>
<p>Kyle Cordes<br />
May 5, 2007</p>
<h2 class="western">An Encouraging Idea</h2>
<p>When you open up an IDE/editor at home, on your own time, you have a remarkable power in your hands: you can create something that you own (modulo some employment agreements). It is yours to sell, to give away, or to decline to do either, on your own terms. Likewise a company has this on a larger scale.</p>
<p>For the last few years my firm has been selling access to an application we wrote (and continue to write) as a service, charging a monthly fee for use, hosting, and support. I won&#8217;t name names or describe our product in detail (this talk is not spam), but I will share some things we&#8217;ve learned along the way.</p>
<h2 class="western">What is SAAS?</h2>
<p style="margin-bottom: 0in;">Delivering a software product (especially a complex “enterprise” system, less so with consumer products) involves more than just bits in a file / on a CD-ROM:</p>
<ol>
<li>
<p style="margin-bottom: 0.02in;">Delivery of the deployable code</p>
</li>
<li>
<p style="margin-bottom: 0.02in;">License (legal right to use it)</p>
</li>
<li>
<p style="margin-bottom: 0.02in;">Hosting: hardware, deployment, 	and management thereof</p>
</li>
<li>
<p style="margin-bottom: 0.02in;">Support for the server(s) / 	software on the servers</p>
</li>
<li>
<p style="margin-bottom: 0.02in;">Support for the end users / 	software on their PCs or other devices</p>
</li>
</ol>
<p>In a consulting or in-house project, the most common type of project for the audience here at Code Camp, you sell hours of labor to do the things above.</p>
<p>In a commercial software product company, you bundle #1 and #2 for a price, then perhaps sell a service contract for #4 and possibly #5.</p>
<p>With Software as a Service (<strong>SAAS</strong>) you bundle #1, #2, #3, #4, and possibly #5, then sell the result for a yearly / monthly fee times some measure of volume (per computer, per user, per transaction, per site, etc.). A company selling their software in this way is sometimes called an Application Service Provider.</p>
<h2 class="western">The Business Model</h2>
<p style="margin-bottom: 0in;">From a business perspective, SAAS offers a recurring revenue stream rather than “spiky” up front sales. In the short term this can make higher investment demands (since the revenue arrives more slowly). In the long term, though, recurring revenues are very amenable to a sustainable ongoing business.</p>
<p>On the downside, as a SAAS vendor you are at greater risk of ongoing payments stopping, vs. up-front payments in full when the sale is made.</p>
<p>Collections are typically much less of a problem with SAAS: you will generally be paid by customers in a timely way (as they would pay for electricity, bandwidth, and other ongoing utility services).</p>
<p>This gradual arrive of revenues will shape your company&#8217;s financial decisions: you need to meter expenses to match.</p>
<h2 class="western">Hosting</h2>
<p>With SAAS, your customer stays out of the “hosting business”, but you get in to it. One way to offer reliable hosting is to put your servers in a colo facility; you can typically get a full rack (with power and bandwidth) for less than $1000 per month. This will provide redundancy in the power, air conditioning, and connectivity, which would be much more costly to provide in-house.</p>
<p>You will become experts in hosting, by experience. You will host more instances of your software than any one customer would, so you are in a better position to do a good job doing so.</p>
<p>Another route, for a smaller operation, is to rent a single dedicated server or even a “virtual” dedicated server. Or, go utterly virtual and use Amazon EC2 and S3 as your infrastructure.</p>
<h2 class="western">Support / Operations</h2>
<p>As an SAAS firm you can offer much more hands-on support than a traditional software vendor, because you have direct and immediate access to the production systems serving your customers.</p>
<p>At the same time, this access will expose your team to the customer&#8217;s pain points, making it more likely those problems are fixed soon.</p>
<p>With SAAS you can readily deploy updates regularly (weekly / monthly) at low cost, enable end-to-end agility. Paul Graham wrote about this in “The Other Road Ahead”.</p>
<h2 class="western">What do customers like about SAAS?</h2>
<p>Customer <strong>love</strong> not paying for unproven software up front, even if they have abundant cash and even if the software is in use elsewhere. They avoid making an unrecoverable investment in case their needs change or the software turns out to be inadequate.</p>
<p>Customers generally like not running a hosting operation: not operating a data center, not hiring employees for it, etc.</p>
<p>Customers benefit with SAAS&#8217;s easy scaling up or down as their needs grow and shrink. Financial decision makers often prefer costs that scale smoothly with business volume.</p>
<h2 class="western">What do customers not like about SAAS?</h2>
<p>Customer may be concerned that they have less direct control over an application supplied SAAS, than one hosted in-house, with less ability to persuade an operator/developer to drop everything and fix it now.</p>
<p>Eventually a customer may spend more with SAAS (at least in terms of the checks written to the software vendor, though perhaps not in total cost) than they would have spent buying a license up-front; thus they are prone to regret that they didn&#8217;t buy an up front license.</p>
<p>A customer may want to customize the software in a way the vendor does not offer.</p>
<h2 class="western">Start Fast</h2>
<p>SAAS provides considerable flexibility in delaying software work past the product launch; “admin” features can be less complete and more rough, if they are used primarily by the vendor&#8217;s staff instead of by the customer, and can require deeper system knowledge.</p>
<p>There is also a risk that the ability to get by with rough edges will too easily allow you to never truly finish the product.</p>
<h2 class="western">What&#8217;s it like to sell software this way?</h2>
<p>The biggest difference in selling SAAS is a more substantial long term relationship with the customer, both operationally and financially. This can be a great advantage – with a close customer relationship you will be in a position to understand their needs more fully, and innovate in your software to meet those needs better.</p>
<h2 class="western">Customizations</h2>
<p>The purest SAAS way to offer customizations is to not charge hourly / project fees for the changes, but rather to invest in the desired enhancements then charge a higher ongoing price for the enhanced system. Hybrid customization payments are also possible, combinations of customization fees and monthly costs. Be sure your customer understands that paying for a customization, does not grant ownership of the underlying system.</p>
<h2 class="western">Intellectual Property</h2>
<p>While an SAAS firm usually owns (or licenses) its software, customers should own their data (and have access to a copy of the raw data, if they ask for it). Hire a lawyer to work out the details.</p>
<p>Go to great lengths to keep customer data separate: you must make sure to never, even briefly or accidentally, give one customer access to another customer&#8217;s data. For small, cheap services, WHERE clauses are OK for this, but for large expensive services, use (at minimum) separate databases and server code instances, and perhaps even separate  hardware.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/software-service/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://media.kylecordes.com/SAASTalk.mp3" length="35758325" type="audio/mpeg" />
		</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>Ruby GUI Toolkit Talk: Notes and Audio</title>
		<link>http://kylecordes.com/2007/ruby-gui-toolkits</link>
		<comments>http://kylecordes.com/2007/ruby-gui-toolkits#comments</comments>
		<pubDate>Sat, 31 Mar 2007 19:53:14 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/03/31/ruby-gui-toolkits/</guid>
		<description><![CDATA[On March 27th I gave a talk at the St. Louis Ruby User Group about Ruby GUI Toolkits. As with my last few talks, there were no slides, but rather a handout. The original handout fit tightly on a single, two-sided printed page; I’ve expanded the materials slightly and pasted them here. I also recorded [...]]]></description>
			<content:encoded><![CDATA[<p>On March 27th I gave a talk at the <a href="http://stlruby.org/">St. Louis Ruby User Group</a> about Ruby GUI Toolkits. As with my last few talks, there were no slides, but rather a handout.  The original handout fit tightly on a single, two-sided printed page; I’ve expanded the materials slightly and pasted them here.</p>
<p>I also recorded audio of the talk with my <a href="http://www.olympusamerica.com/cpg_section/product.asp?product=1170">Olympus WS-100 digital voice recorder</a>, then used <a href="http://audacity.sourceforge.net/">Audacity</a> to clean it up; Audacity’s “Remove Noise” feature worked surprisingly well. The recording lasts 1 hour 23 minutes, is 49 MB in size: <a href="http://media.kylecordes.com/RubyGUIToolkitTalk.mp3">RubyGUIToolkitTalk.mp3</a></p>
<p>A <a href="http://kylecordes.com/files/RubyGUIToolkitTalk.html">transcript of the talk</a> is also available.</p>
<p>In the audio I mention screen shots and demos; you can find those at the respective toolkits’ web sites (linked below).  I also briefly discuss and demo some code from a <a href="http://kylecordes.com/2005/09/09/direct-swing/">2005 talk about Swing</a>.</p>
<p>The handout contents follow below.</p>
<p><span id="more-136"></span></p>
<h1 class="western">Ruby GUI Toolkits</h1>
<p style="margin-bottom: 0in;">St. Louis Ruby UG &#8211; http://stlruby.org &#8211; March 27, 2007</p>
<p style="margin-bottom: 0in;">Kyle Cordes &#8211; http://kylecordes.com &#8211; Contact me via my web site</p>
<p style="margin-bottom: 0in;">These notes will on my web site sometime this week.</p>
<h6 class="western">Agenda</h6>
<ol>
<li>
<p style="margin-bottom: 0in;">Review the myriad options</p>
</li>
<li>
<p style="margin-bottom: 0in;">Let&#8217;s see some code</p>
</li>
</ol>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Ruby is quite popular for web applications (mostly with Rails) and for utility scripting. But there is a world of GUIs beyond web applications, a world which is not going away. To build such applications in Ruby, we must choose a GUI toolkit and Ruby bindings. My criteria for a rich client application toolkit (or the resulting application) are perhaps harsh:</p>
<p style="margin-bottom: 0in;">
<ul>
<li>
<p style="margin-bottom: 0in;">Polished, rich set of widgets (Consider the vast array of widgets available for .NET, Java Swing, Delphi, etc.)</p>
</li>
<li>
<p style="margin-bottom: 0in;">Consistent, comprehensible API, with both API reference and &#8220;how-to-use-this&#8221; narrative</p>
</li>
<li>
<p style="margin-bottom: 0in;">Robust, production-grade: No beta, 	no pre-1.0.</p>
</li>
<li>
<p style="margin-bottom: 0in;">Features beyond what&#8217;s readily 	possible in a web application</p>
</li>
<li>
<p style="margin-bottom: 0in;">Look like 2007, not 1997</p>
</li>
<li>
<p style="margin-bottom: 0in;">Look and feel, if desired, like a 	mainstream GUI application</p>
</li>
<li>
<p style="margin-bottom: 0in;">Actively developed and updated</p>
</li>
<li>
<p style="margin-bottom: 0in;">Ideally cross-platform; at 	minimum, great results on Windows, where most of the customers are.</p>
</li>
<li>
<p style="margin-bottom: 0in;">Sufficiently popular that 	programmers and community resources are available</p>
</li>
</ul>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">In summary: it must be suitable for creating <strong>applications that people will pay for</strong>. Not merely pay for in a vacuum or an internal-project-single-bid situation, but pay for in a competitive environment where I am trying to outmatch others who are using Java Swing, Java SWT, MFC, Visual Basic, Delphi, etc.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">I investigated each option enough to form an opinion of its suitability according to the criteria above. With some of them this took only a short while. Here they are, alphabetically:</p>
<h6 class="western">Cocoa</h6>
<p style="margin-bottom: 0in;">Sadly, I don&#8217;t have a Mac. If I did (and was targeting that platform only), the Ruby-Cocoa bridge would be very appealing, as it produces applications with a completely native Mac look&amp;feel, and appears to be a joy to program.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.rubycocoa.com/">http://www.rubycocoa.com/</a></p>
<p style="margin-bottom: 0in;"><a href="http://rubycocoa.sourceforge.net/doc/">http://rubycocoa.sourceforge.net/doc/</a></p>
<h6 class="western">Fox</h6>
<p style="margin-bottom: 0in;">The Fox GUI toolkit was somewhat weak when I first learned of it a few years ago, but appears to have improved considerably since then. It uses non-native widgets (which resemble &#8220;vintage&#8221;, pre-XP-Themeing Windows controls), and has a somewhat limited selection of them. <a href="http://www.fox-toolkit.org/">http://www.fox-toolkit.org/</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">FXRuby, the Ruby binding, is in the “one click installer” box. The benefit of being in the box is hard to overstate.</p>
<p style="margin-bottom: 0in;"><a href="http://www.fxruby.org/">http://www.fxruby.org/</a></p>
<p style="margin-bottom: 0in;"><a href="http://fox-tool.rubyforge.org/">http://fox-tool.rubyforge.org/</a></p>
<h6 class="western">Gtk</h6>
<p style="margin-bottom: 0in;">Gtk, the graphic toolkit from the GIMP and Gnome problems, is a strong candidate. Gtk is stable and well documented, and thoroughly proven by the large number of polished Gtk applications for Gnome. Gtk feels most at home on Linux, but also works on MacOS and Windows. I didn&#8217;t try MacOS, but I found it works and looks good on Windows.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Glade, the Gtk GUI design tool, treats GUI layout as data rather than code. (NeXT did this in the 1980s, and MS has recently reinvented it in the form of XAML.)</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">To install Gtk-Ruby on Debian (<a href="http://kylecordes.com/from%20http://ruby-gnome2.sourceforge.jp/hiki.cgi?Install+Guide+for+Windows">from http://ruby-gnome2.sourceforge.jp/hiki.cgi?Install+Guide+for+Windows</a>):</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">sudo apt-get install ruby-gnome2</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Then to try it out:</p>
<p style="margin-bottom: 0in;">ruby -r gtk2 -e &#8216;Gtk.init ; Gtk::Window.new.show ; Gtk.main&#8217;</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Unfortunately the simple invocations above didn&#8217;t work for me; but with a bit more work the samples run well.</p>
<h6 class="western">JRuby + Swing, JRuby + SWT</h6>
<p style="margin-bottom: 0in;">Java Swing or Eclipse&#8217;s SWT can be used with <a href="http://jruby.codehaus.org/">JRuby</a>. I didn&#8217;t investigate these much (aside from running the samples), because JRuby was not yet “ready for prime time” yet, as of around the end of 2006. It looks like there has been a lot of progress since then, so if you are reading this in mid-2007 or later, give it a close look.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">require &#8216;java&#8217;</p>
<p style="margin-bottom: 0in;">JFrame = javax.swing.JFrame</p>
<p style="margin-bottom: 0in;">frame = JFrame.new(&#8220;Hello Swing&#8221;)</p>
<p style="margin-bottom: 0in;">frame.getContentPane.add javax.swing.JLabel.new(&#8220;Hello World&#8221;)</p>
<p style="margin-bottom: 0in;">frame.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE</p>
<p style="margin-bottom: 0in;">frame.pack</p>
<p style="margin-bottom: 0in;">frame.visible = true</p>
<h6 class="western">Local Web Application</h6>
<p style="margin-bottom: 0in;">Ship a “local” web application: install Rails + Mongrel + etc., and launch a web browser pointed at http://localhost:port.  AJAX or Flash can be used to build a richer GUI than you can get with plain HTML. Aside from the local install process (which is not difficult), the tools are mature and powerful, and programmers are abundant.  Because of these advantages, and because of the various problems with the GUI toolkits, I would consider this strongly if I needed to build a local Ruby GUI app today.</p>
<h6 class="western">.NET</h6>
<p style="margin-bottom: 0in;">There is a Ruby-.NET bridge which can use WinForms (in .NET 1.x), but it hasn&#8217;t been updated since 2004.:</p>
<p style="margin-bottom: 0in;"><a href="http://www.saltypickle.com/rubydotnet">http://www.saltypickle.com/rubydotnet</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">There is at least one Ruby compiler in development which targets .NET (analogous to JRuby). When that is ready, it will be possible to use WinForms and WPF (the new “Vista” era .NET GUI toolkit).</p>
<p style="margin-bottom: 0in;"><a href="http://www.plas.fit.qut.edu.au/Ruby.NET/">http://www.plas.fit.qut.edu.au/Ruby.NET/</a></p>
<h6 class="western">OpenGL / SDL</h6>
<p style="margin-bottom: 0in;">There are Ruby bindings for OpenGL and SDL; I didn&#8217;t investigate these because they are most suited for producing graphical / game software rather than application GUIs. However, as application GUIs become richer, I expect the two categories to merge to some extent, so don&#8217;t rule out this approach completely.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://ruby-opengl.rubyforge.org/">http://ruby-opengl.rubyforge.org/</a></p>
<h6 class="western">Qt</h6>
<p style="margin-bottom: 0in;">Qt is mature, stable, and of high quality. It is used for many commercial applications on Windows and Linux. The documentation is extensive and GUI layout tools are available. Qt uses native widgets on each platform. Qt is available for free for use on open source software (including KDE and the many KDE applications).  For commercial use, it is less free:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">$2000 per dev, for the &#8220;desktop light&#8221; edition (one platform)</p>
<p style="margin-bottom: 0in;">$5000 per dev, for the “full” edition on 2 platforms</p>
<p style="margin-bottom: 0in;">$more for various other packages</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">The QtRuby bindings are free, and described as “very complete”:</p>
<p style="margin-bottom: 0in;"><a href="http://developer.kde.org/language-bindings/ruby/index.html">http://developer.kde.org/language-bindings/ruby/index.html</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">There is a book from the Pragmatic Press about QtRuby:</p>
<p style="margin-bottom: 0in;">“Rapid GUI Development with QtRuby”</p>
<p style="margin-bottom: 0in;"><a href="http://www.pragmaticprogrammer.com/titles/ctrubyqt/">http://www.pragmaticprogrammer.com/titles/ctrubyqt/</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Qt/QtRuby is very appealing, probably the most polished of all the options, except for the price. I believe the price will prevent large scale adoption. For those large corporate Ruby GUI projects, go with Qt.</p>
<h6 class="western">Tk</h6>
<p style="margin-bottom: 0in;">Tk is in the Ruby “box” (installed by the installer, though I also saw instructions to install it separately), and has a complete, documented API. Unfortunately, it is also quite old and generally ugly; it seems more suitable for simple GUIs for utility programs, than for large, rich applications. However, this seems to be changing &#8211; the <a href="http://tktable.sourceforge.net/tile/">&#8220;Tile&#8221; theme engine for Tk</a> greatly improves the appearance.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">require ‘tk’</p>
<p style="margin-bottom: 0in;">root = TkRoot.new</p>
<p style="margin-bottom: 0in;">button = TkButton.new(root) {</p>
<p style="margin-bottom: 0in;">text “Hello, World!”</p>
<p style="margin-bottom: 0in;">command proc { puts “I said, Hello!” }</p>
<p style="margin-bottom: 0in;">}</p>
<p style="margin-bottom: 0in;">button.pack</p>
<p style="margin-bottom: 0in;">Tk.mainloop</p>
<h6 class="western">Win32</h6>
<p style="margin-bottom: 0in;">Also included in the Ruby installers are SWin and VRuby. SWin is a low level Win32 API binding, with VRuby is a GUI toolkit (OO wrapper) on top of that.  VRuby appears to be inspired by Visual Basic or the Delphi VCL. Its controls are the Windows controls (including the TreeView and ListView), and are of course 100% native and 0% cross-platform. It uses a clever implicit event-binding technique, requiring generally 0 lines of code to bind an event to a method.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">The documentation, while detailed, is in Japanese, and this is a relatively low-level toolkit, so it may be quite hard to adopt for non-Japanese speakers.</p>
<p style="margin-bottom: 0in;"><strong>Update, January 2008</strong>: Anthony Leotta wrote in to point out that there is now good VRuby documentation, in English.</p>
<h6 class="western">WxRuby / WxSugar</h6>
<p style="margin-bottom: 0in;">WxWidgets itself is stable, featureful, free, and used in many commercial applications. The most common way to use Wx appear to be with its native C++ API, and with WxPython. Wx uses native widgets for each platforms, and with a little work can have a modern slick look and feel.</p>
<p style="margin-bottom: 0in;"><a href="http://www.wxwidgets.org">http://www.wxwidgets.org</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Unfortunately, the WxRuby bindings are incomplete and unstable – even the demo application crashed several times.</p>
<p style="margin-bottom: 0in;"><a href="http://wxruby.rubyforge.org/">http://wxruby.rubyforge.org/</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">WxSugar adds a layer of “syntactic sugar” on top of WxRuby, to enable a more expressive, compact coding style.</p>
<p style="margin-bottom: 0in;"><a href="http://wxruby.rubyforge.org/wiki/wiki.pl?WxSugar">http://wxruby.rubyforge.org/wiki/wiki.pl?WxSugar</a></p>
<h6 class="western">Ruby Scripting for a non-Ruby GUI</h6>
<p style="margin-bottom: 0in;">Ruby can be used as an embedded scripting language; to do this, you&#8217;d write your application “core” in something else, then use Ruby for instance-specific business rules, plugins, etc. I demonstrated this last year at Code Camp with Lua, the same approach works well with other languages.</p>
<h6 class="western">So What Do We Do?</h6>
<p style="margin-bottom: 0in;">I don&#8217;t have a single answer as to which of these to use; none of them has impressed me as a compelling replacement to the mature toolkits I&#8217;ve used, such as  Java Swing (in the Java language, which for all its issues, is a good language to use for interacting with massive Java APIs).</p>
<h6 class="western">Other References</h6>
<p style="margin-bottom: 0in;">Jeff Barczewski pointed out that the <a href="http://www.syngress.com/catalog/?pid=1830">“Ruby Developer&#8217;s Guide” (a 2002 book by Michael Neumann)</a>, which features a free <a href="http://www.syngress.com/book_catalog/183_Ruby/sample.htm">sample chapter</a> on Ruby GUIs.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://wiki.rubygarden.org/Ruby/page/show/ComparingGuiToolkits/TakeTwo">http://wiki.rubygarden.org/Ruby/page/show/ComparingGuiToolkits/TakeTwo</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://groups.google.com/group/comp.lang.ruby/msg/58504a6e39e6a1c7">http://groups.google.com/group/comp.lang.ruby/msg/58504a6e39e6a1c7</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.trug.ca/Ruby_GUI_Toolkits">http://www.trug.ca/Ruby_GUI_Toolkits</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.arachnoid.com/ruby/RubyGUIProject/index.html">http://www.arachnoid.com/ruby/RubyGUIProject/index.html</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.trug.ca/VRuby">http://www.trug.ca/VRuby</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Ruby/TK tutorial: <a href="http://members.chello.nl/~k.vangelder/ruby/learntk/hello.html">http://members.chello.nl/~k.vangelder/ruby/learntk/hello.html</a></p>
<p style="margin-bottom: 0in;">
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/ruby-gui-toolkits/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
<enclosure url="http://media.kylecordes.com/RubyGUIToolkitTalk.mp3" length="50201411" type="audio/mpeg" />
		</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>
		<item>
		<title>Java Scripting Talk – Code, Notes, and Audio</title>
		<link>http://kylecordes.com/2006/java-scripting</link>
		<comments>http://kylecordes.com/2006/java-scripting#comments</comments>
		<pubDate>Fri, 10 Nov 2006 15:09:26 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/11/10/java-scripting-talk-%e2%80%93-code-notes-and-audio/</guid>
		<description><![CDATA[Last night (9 Nov 2006) at the St. Louis Java User Group, I gave a talk on “Scripting Your Java Application”. As I mentioned, there were no slides, but rather a handout, the text of which is pasted below. You can download the handout (a tight, one page PDF), the code, audio of the talk [...]]]></description>
			<content:encoded><![CDATA[<p>Last night (9 Nov 2006) at the <a href="http://ociweb.com/javasig/">St.    Louis Java User Group</a>, I gave a talk on “Scripting Your Java Application”.    As I <a href="http://kylecordes.com/2006/11/05/scripting-talk/">mentioned</a>,    there were no slides, but rather a handout, the text of which is pasted below. You    can download <a href="http://kylecordes.com/files/JavaScriptingTalk.pdf">the    handout (a tight, one page PDF)</a>, <a href="http://kylecordes.com/files/JavaScriptingTalk.zip">the    code</a>, <a href="http://kylecordes.com/files/JavaScriptingTalk.wma">audio    of the talk (WMA)</a>, and <a href="http://kylecordes.com/files/JavaScriptingTalk.mp3">audio    of the talk (MP3, larger)</a>. The audio was recorded with my <a href="http://www.olympusamerica.com/cpg_section/product.asp?product=1170">Olympus    WS100 Digital Voice Recorder</a>, so the quality is bearable but not great.</p>
<p><strong>Update: </strong>As an experiment, I also had <a href="http://castingwords.com/">CastingWords</a> prepare a <a href="http://kylecordes.com/files/JavaScriptingTalk.html">transcript of the talk</a>. It&#8217;s somewhat tedious to read (I didn&#8217;t edit it at all), but it is available as Google fodder rather than trapped only in audio.<br />
<span id="more-110"></span></p>
<h3>Beans Scripting Framework</h3>
<p><span style="font-size: 7.5pt;">http://jakarta.apache.org/bsf/projects.html</span></p>
<p>The BSF came from IBM in the late 1990s, and was the first major multi-scripting-language    plugin API. It supports many languages (BeanShell, Groovy, Jacl (Tcl), Rhino/JavaScript,    Jython, etc.), with a focus on embedding script in HTML/XML. BSF is now an Apache    project and supports non-web scripting as well.</p>
<h3><span style="font-size: 14pt;">BeanShell (JSR 274)</span></h3>
<p><span style="font-size: 8pt;">http://beanshell.org/</span></p>
<p>BeanShell supports a superset of the Java syntax; as a result you can use it    as a more-pleasant-than-Java scripting language, or use it as a Java interpreter.    BeanShell was written by Pat Niemeyer here in St. Louis.</p>
<p>Because of the Java syntax, BeanShell can be used to get code working in an    interpreted way, or as part of a script plugin/extenstion, then very easily    move that code in to your core application, unlike code written in a non-Java    scripting language.</p>
<p>Another, more extreme use of BeanShell is to use it instead of javac for an    entire application, to reduce the deployment size – with Java, compressed source    code is often smaller than the equivalent compressed compiled classes!</p>
<h3><span style="font-size: 14pt;">Groovy (JSR 241)</span></h3>
<p>Groovy is a relatively new language, whose specific syntax and semantics are    being worked out in the JSR process. Its key advantage is that its design is    much more compatible with how the JVM works than other non-Java languages: it    is less dynamic. Thus it is likely to achieve better performance and more straightforward    access to Java features, until some future JRE adds better dynamic language    support.</p>
<h3><span style="font-size: 14pt;">Java 6.0 Scripting (JSR 223)</span></h3>
<p><span style="font-size: 8pt;">http://jcp.org/en/jsr/detail?id=223</p>
<p>https://scripting.dev.java.net/</span></p>
<p>It appears that starting with Java 6.0 / 1.6, a scripting API and implementation    will arrive “in the box” in the form of the <strong>javax.script</strong> package    and bundled JavaScript (Rhino) implementation (as the “js” language). The API    is similar to the BSF API, though more refined. The API makes it easy for a    host application to support multiple script languages and integrate only once.    Java 6 will be released Dec. 7, 2006.</p>
<p>“It&#8217;s pretty hard to defend a delayed project when you are using Billy&#8217;s Scripting    Language. As a project manager or IT manager you could get fired for making    that decision. However, if you build an application using MegaStandard Scripting    Language X, you won&#8217;t because you followed the recommendation of a standards    body. Its not your fault it doesn&#8217;t work as expected.” (Richard Monson-Haefel&#8217;s    blog)</p>
<p>Other JSR 223 compliant scripting engines: AWK, BeanShell, Groovy, UGNL, Python,    Ruby, Scheme, Tcl, many more.</p>
<h3><span style="font-size: 14pt;">Rhino (JavaScript)</span></h3>
<p>You probably deploy with Java 5/1.5 or 1.4 now. Use JavaScript (the Rhino engine)    today via its API and 693K js.jar file; you are prepared for the future, you    will be able to use the JSR 223 API and in-the-box Rhino with little effort.    All existing scripts should still work.</p>
<h2><em><span style="font-size: 11pt;">Experience Report</span></em></h2>
<p>We have a large “enterprisey” product; as with many such products, there are    some aspects of behavior that are inevitably customer-specific and hard to accommodate    through a data-driven configuration mechanism. We use Rhino / JS scripting to    add customer-specific behavior, for example in the form “if fields A and B have    values C and D, then field E is required”. It was surprisingly easy to add scripting    support – perhaps a few pages of code to add plug points and invoke the script    engine. Recommended.</p>
<h3><span style="font-size: 14pt;">What’s a scripting language anyway?</span></h3>
<p>Common answers, none of which are absolute, include “duck typing”, the lack    of a complex type system, interpreted execution, ability to “just load some    text and eval() it”, lack of binary compatibility concerns, and sandboxed execution.</p>
<h3><span style="font-size: 14pt;">Why script?</span></h3>
<p>Scripting can provide more flexible configuration than the typical data-centric    configuration approach; use it whenever you feel the temptation to invent just    a little bit of an programming language, particularly in XML. (A rule to live    by: do not write code in XML.)</p>
<p>Scripting is more important in commercial systems (which serve many customers)    than in internal system; be wary of over-engineering, do not add a scripting    language when a lookup table will do. Yet in a commercial system scripting provide    a path to make your application “done”, in spite of ever-shifting customer-specific    needs.</p>
<p>Scripting serves as a “soft layer” in the “Alternate Hard and Soft Layers”    design approach, which I illustrated with Lua at a talk last year; there are    notes about the topic on my web site.</p>
<p>A scriptable application is generally also a testable, modular application.</p>
<p>Scripting opens the door to user-generated procedure content – witness the    amazing proliferation of user-written scripts in Second Life.</p>
<h3><span style="font-size: 14pt;">What should my API look like?</span></h3>
<p>With <strong>rules scripting</strong>, the user configures a logic behavior    for a situation the application encounters, such as a “billing rule”. Provide    a carefully “shaped” (but not too complex) API, such as an entry point / script    per product-type. The shaped API provides good isolation between scripts, important    since rules are often filled in by users with very little programming experience.</p>
<p><strong>Plugin scripting</strong> is more general, allowing the user to add    capabilities and features to the application, within limits. Impose much less    structure on the script; exposing very few entries points (perhaps just one),    then let the script register interest in events as they require. This will make    it possible for a scripter with some experience, to use an intentional design    for their plugin, rather than contort it to meet your API. An <strong>end-to-end    plugin</strong> spans the tiers (client/server/etc.) of the application; if    your mechanism assists the script by carrying ad hoc attributes along with predefined    data, such a plugin can be quite powerful. For example, it could define the    entry of additional data, rules for the processing of that data, billing based    on that data, etc.</p>
<p><strong>External scripting</strong>, common in large desktop applications like    Excel, steers the operation of the application with an API that resembles the    model of a user manipulating the UI, with mild additional abstraction.</p>
<p>Be wary of what primitives you expose to the scripts; you may inadvertently    expose your entire class structure – a large and complex “surface area” for    which it will be very challenging to maintain future compatibility. <strong>Sandbox</strong> your scripts as much as feasible.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/java-scripting/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://kylecordes.com/files/JavaScriptingTalk.mp3" length="44607529" type="audio/mpeg" />
<enclosure url="http://kylecordes.com/files/JavaScriptingTalk.wma" length="22756696" type="audio/x-ms-wma" />
		</item>
		<item>
		<title>&#8220;Looping&#8221; an audio file with Sox, Lame and mkfifo</title>
		<link>http://kylecordes.com/2006/loop-audio-sox-lame-fifo</link>
		<comments>http://kylecordes.com/2006/loop-audio-sox-lame-fifo#comments</comments>
		<pubDate>Sun, 30 Apr 2006 19:57:36 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/04/30/loop-audio-sox-lame-fifo/</guid>
		<description><![CDATA[Today I needed a very long (3 hour) MP3 audio file to use for an experiment; a test file with some music on it. My first thought was to start a MP3 audio recorder, turn on the radio, and leave for 3 hours. But impatience is among the three great virtues of a programmer, so [...]]]></description>
			<content:encoded><![CDATA[<p>Today I needed a very long (3 hour) MP3 audio file to use for an experiment; a test file with some music on it.  My first thought was to start a MP3 audio recorder, turn on the radio, and leave for 3 hours.</p>
<p>But impatience is among <a href="http://c2.com/cgi/wiki?LazinessImpatienceHubris">the three great virtues of a programmer</a>, so I turned to Google instead, seeking command line tools for audio manipulation.  It turns out that <a href="http://sox.sourceforge.net/">sox</a> and <a href="http://lame.sourceforge.net/">lame</a> will do the job.  I installed the tools &#8211; here is the Debian / Ubuntu invocation:</p>
<p>apt-get install sox lame</p>
<p>then grabbed an MP3 file of a piece of music (Peter T. Noonan, album &#8220;Cafe at Arles&#8221;, track 9 &#8220;Life&#8217;s Old Road&#8221;, if you are curious) and repeated it a few times:</p>
<p>sox music.mp3 foo.wav repeat 3</p>
<p>lame foo.wav longmusic.mp3</p>
<p>This worked well, the first time&#8230; but consumed a lot of disk space.  To get to 3 hours I would need enough disk space for a 3 hour uncompressed WAV file.  Unfortunately Sox does not support MP3 output, and I didn&#8217;t want to compress to a format it does support, then uncompress and recompress again.  So I used a Unix/Linux FIFO pipe instead of a file, with Sox running in the background to fill the pipe with data for Lame:</p>
<p>mkfifo foo.mp3</p>
<p>sox music.mp3 foo.wav repeat 10 &#038;</p>
<p>lame foo.wav longmusic.mp3</p>
<p>a little while later, longmusic.mp3 is a very long MP3 file&#8230; but not long enough, because sox fails when the &#8220;virtual&#8221; WAV file it is writing reaches 2 Gb in size, just as it fails with a real WAV file at that size.  That was about 1 hour and 41 minutes &#8211; not long enough; so I ended up looking elsewhere:</p>
<p><strong>The Ugly Hack</strong></p>
<p>It turns out that Lame will tolerate an MP3 which consists of several appended MP3 files as its input.  It complains but keeps processing when encountering the extra headers in the middle of such a file.  So this solution with cat, a pipe, and Lame, worked:</p>
<p>cat 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 1.mp3 |  <strong>lame </strong>- longmusic.mp3</p>
<p>A little while later, I had a 3 hour long, valid MP3 file.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/loop-audio-sox-lame-fifo/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Make a DVD with ffmpeg</title>
		<link>http://kylecordes.com/2006/dvd-ffmpeg</link>
		<comments>http://kylecordes.com/2006/dvd-ffmpeg#comments</comments>
		<pubDate>Sat, 01 Apr 2006 04:13:54 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/03/31/dvd-ffmpeg/</guid>
		<description><![CDATA[For a project we have going at Oasis Digital, we have explored various libraries for creating video DVDs from computer-generated content until program/script control. There are quite a few ways to do this; one that is appealing for a command-line junkie is the combination of ffmpeg, dvdauthor, and mkisofs. It took considerable research to figure [...]]]></description>
			<content:encoded><![CDATA[<p>For a project we have going at Oasis Digital, we have explored various libraries for creating video DVDs from computer-generated content until program/script control.  There are quite a few ways to do this; one that is appealing for a command-line junkie is the combination of ffmpeg, dvdauthor, and mkisofs.  It took considerable research to figure out what commands to string together for a simple scenario:</p>
<ul>
<li>you have some video in AVI format (for example, an MJPEG AVI from a DV video camera)</li>
<li>you have some background music in mp3 format</li>
<li>you want a simple one-title one-chapter DVD with that video and audio</li>
</ul>
<p>There are plenty of sites with long and complex sets of commands to accomplish these things.  But for this simplest case, the essential commands are:</p>
<p><a href="http://ffmpeg.sourceforge.net/index.php">ffmpeg</a> -y -i video.avi -i audio.mp3 -target ntsc-dvd -aspect 4:3 dvd.mpg</p>
<p>mkdir DVD</p>
<p><a href="http://dvdauthor.sourceforge.net/">dvdauthor</a> -x file.xml   # there is a way to avoid the file by putting a few more options here</p>
<p><a href="http://linux.about.com/library/cmd/blcmdl8_mkisofs.htm">mkisofs</a> -dvd-video -o dvd.iso DVD</p>
<p>Of course, there is considerable other work involved in wiring up a full solution, but that is more project specific.  I hope these example commands shorten the research time for the next fellow who needs to do this core processing.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/dvd-ffmpeg/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slider Control for Touch-Screen Applications</title>
		<link>http://kylecordes.com/2006/slider-control-for-touch-screen-applications</link>
		<comments>http://kylecordes.com/2006/slider-control-for-touch-screen-applications#comments</comments>
		<pubDate>Wed, 15 Mar 2006 01:10:38 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[screencast]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/03/14/slider-control-for-touch-screen-applications/</guid>
		<description><![CDATA[At Oasis Digital we are working on an application that will run on a touch-screen computer, and which will be used to (among other things) control an audio amplification system. There are some design considerations for touch-screen applications which are rather stark once you use the touch-screen for a few minutes: A finger is rather [...]]]></description>
			<content:encoded><![CDATA[<p>At Oasis Digital we are working on an application that will run on a touch-screen computer, and which will be used to (among other things) control an audio amplification system.  There are some design considerations for touch-screen applications which are rather stark once you use the touch-screen for a few minutes:</p>
<ul>
<li>A finger is rather less precise than a mouse pointer &#8211; hitting small targets is hard</li>
<li>Drag/drop operations (or grab-adjust operations) sometimes don&#8217;t start quite where you aimed</li>
<li>Your finger blocks the point on the screen where you are pressing</li>
<li>The concept of keyboard &#8220;focus&#8221; is moot on applications with no keyboard</li>
</ul>
<p>To accomodate the first two of these, I&#8217;ve built a prototype/example of a slider control to use for audio adjustment in such an application.  It has these key features:</p>
<ol>
<li>It does not matter if you click on the &#8220;handle&#8221; or on the rest of the bar &#8211; because with touch screen you won&#8217;t be able to reliably do one vs. the other.</li>
<li>The adjustment is not immediate; there is a limit of the speed of the adjustment to produce smoother audio control. The slider handle will move down very quickly, but will move up slowly. This avoids the possibility of an accidental touch pushing the audio amplification in to feedback.</li>
</ol>
<p>The prototype/example looks like the screenshot here:</p>
<p><img title="Touchscreen Slider" src="/images/touchscreen-slider.png" alt="Touchscreen Slider" /></p>
<p>&#8230; but <strong>ignore the static image</strong>, it doesn&#8217;t tell the story.  To see it in action, take a look at the <a href="/files/touchscreen-slider.wmv">screencast</a> (currently in a WMV file, easily viewable only on Windows) or download the <a href="/files/SliderMovementExample.zip">example program</a> and play with it. The source is <a href="http://github.com/kylecordes/touch-screen-slider-delphi">also on github</a>.</p>
<p>This example runs on Delphi 2007 (rather old&#8230; but I had it handy on the PC at hand), then used an enhanced version of it in a production application for a touch-screen audio control system. My secondary intention was to use it as a target to create an AJAX control with the same behaviour.  Anyone want to write that?</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/slider-control-for-touch-screen-applications/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

