<?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; Presentations</title>
	<atom:link href="http://kylecordes.com/category/presentation/feed" rel="self" type="application/rss+xml" />
	<link>http://kylecordes.com</link>
	<description>Software, Business, and Life</description>
	<lastBuildDate>Sun, 05 Sep 2010 15:00:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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.
This is an x.264 video, shown [...]]]></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_6cd42864e708e95ea443a4639ece1253" 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>
<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>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:

The SaaS talk handout as a PDF
The SaaS talk slides as a PDF (also shown below)
Transcript of the Talk, with slides, as a PDF
Audio recording of the SaaS talk
A [...]]]></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>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://kylecordes.com/files/Cordes-2010-Inno-SaaS.mp3">Audio recording of the SaaS talk</a></li>
<li><a href="http://kylecordes.com/2010/saas-video">A <strong>video</strong> recording, which I finally got online in June.</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://kylecordes.com/files/Cordes-2010-Inno-SaaS.mp3" length="46577370" type="audio/mpeg" />
		</item>
		<item>
		<title>To the Clouds and Back (Cloud User Group talk)</title>
		<link>http://kylecordes.com/2010/to-the-clouds-and-back</link>
		<comments>http://kylecordes.com/2010/to-the-clouds-and-back#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:05:45 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=409</guid>
		<description><![CDATA[On Jan. 21, I gave one of the talks at the inaugural St. Louis Cloud Computing User Group meeting. I don&#8217;t think there is any video or audio (I forgot my audio recorder), but the slides are on SlideShare:
To the Clouds and Back

or for download as a PDF.
  ]]></description>
			<content:encoded><![CDATA[<p>On Jan. 21, I gave one of the talks at the inaugural <a href="http://stlcloudusers.org/">St. Louis Cloud Computing User Group</a> meeting. I don&#8217;t think there is any video or audio (I forgot my audio recorder), but the slides are on SlideShare:</p>
<div id="__ss_3026414" style="width: 425px; text-align: left;"><a style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="To the Clouds and Back" href="http://www.slideshare.net/kylecordes/to-the-clouds-and-back">To the Clouds and Back</a><object style="margin: 0px;" 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=kylecloudexperiences-100129165309-phpapp02&amp;stripped_title=to-the-clouds-and-back" /><param name="allowfullscreen" value="true" /><embed style="margin: 0px;" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=kylecloudexperiences-100129165309-phpapp02&amp;stripped_title=to-the-clouds-and-back" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
</div>
<p>or for <a href="http://kylecordes.com/files/KyleCloudExperiences.pdf">download as a PDF</a>.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/to-the-clouds-and-back/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factor Talk at the Lambda Lounge</title>
		<link>http://kylecordes.com/2009/factor-ll-talk</link>
		<comments>http://kylecordes.com/2009/factor-ll-talk#comments</comments>
		<pubDate>Fri, 03 Apr 2009 14:39:29 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[factor]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=255</guid>
		<description><![CDATA[Last night (April 2, 2009) at the St. Louis Lambda Lounge I gave a 45-minute talk on the Factor programming language. I&#8217;ve uploaded the handout and example code here. I apologize in advance to anyone in the Factor community who reads it and laughs at my &#8220;newbie&#8221; mistakes and misstatements.
Appistry again provided space and pizza &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Last night (April 2, 2009) at the St. Louis <a href="http://lambdalounge.org/">Lambda Lounge</a> I gave a 45-minute talk on the <a href="http://factorcode.org/">Factor programming language</a>. I&#8217;ve uploaded the <a href="http://kylecordes.com/files/FactorHandout.pdf">handout and example code here</a>. I apologize in advance to anyone in the Factor community who reads it and laughs at my &#8220;newbie&#8221; mistakes and misstatements.</p>
<p><a href="http://www.appistry.com/">Appistry</a> again provided space and pizza &#8211; thanks guys! (Appistry is our locally-grown but widely-known cloud infrastructure software maker &#8211; they&#8217;d been cloudy for years before the term entered wide use.)</p>
<p>The talk appeared to go over well. There were many important things about factor that I&#8217;d love to talk about but didn&#8217;t have time. Nonetheless, I think 45 minutes is a good talk length, and I think the format (short talks) is a key part to the Lambda Lounge&#8217;s success so far.</p>
<p>Speaking of the Lambda Lounge,  next month there is a &#8220;language shootout&#8221; &#8211; if you want to participate, be sure to join the <a href="http://groups.google.com/group/lambda-lounge/">mailing list</a> and <a href="http://groups.google.com/group/lambda-lounge/web/language-shootout">look over the participants</a>. (You need to join the list, to be able to get to the wiki with that page.) I might submit an entry myself, using Factor or another language.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/factor-ll-talk/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Git Talk at the STL JUG</title>
		<link>http://kylecordes.com/2008/jug-git-talk</link>
		<comments>http://kylecordes.com/2008/jug-git-talk#comments</comments>
		<pubDate>Fri, 10 Oct 2008 21:56:59 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[source-control]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2008/10/10/jug-git-talk/</guid>
		<description><![CDATA[Yesterday (Oct. 9, 2008), I gave a talk on Git at the St. Louis Java User Group. Rather than a typical &#8220;intro&#8221; talk, instead I showed a dozen or so common usage scenarios, then answered questions with additional ad-hoc demos. As with some other recent talks, I eschewed PowerPoint in favor of a printed handout. [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday (Oct. 9, 2008), I gave a talk on Git at the St. Louis Java User Group. Rather than a typical &#8220;intro&#8221; talk, instead I showed a dozen or so common usage scenarios, then answered questions with additional ad-hoc demos. As with some other recent talks, I eschewed PowerPoint in favor of a printed handout. The text of the handout follows below, or you can <a href="/files/Kyle-Cordes-Git-Tour-Talk.pdf">download the PDF</a>. I also recorded the <a href="/files/2008-10-10-git-JUG-talk.wma">audio of the talk</a>, but without video, so the general discussion portions are worthwhile but the demo portions are not.<br />
<span id="more-184"></span></p>
<h4>Introduction and Agenda</h4>
<p>Linus Torvalds wanted a replacement for BitKeeper. He wrote the first version of Git in a few weeks. A few years later, Git is now the leading contender among distributed source control tools: <a href="http://kylecordes.com/%3Ehttp://git.or.cz/">http://git.or.cz/</a></p>
<p>This will not be a typical “introduction” talk; there are ample introductions to Git on the WWW. Instead, I’ll wander through some source control use cases, pointing out Git features, strengths, and weaknesses along the way.</p>
<p>I use Git on both Linux and Windows, and I use both the command line and GUI tools. For this presentation, I will show how it works on Windows, and mostly use the included GUI tools.</p>
<p>We’ll end a bit early, to leave time for questions and ah doc demos.</p>
<h4>Why Git?</h4>
<p>Git promises to keep your files exactly as they are, and uses hashes to make it happen.</p>
<p>Git is very fast; speed matters a lot more than you might think.</p>
<p>Git is distributed and local, it works very well offline as well as online.</p>
<p>Git handles the realities of branching and merging.</p>
<p>Git has an enormous set of very useful features.</p>
<p>Git is clearly a tool made by people who love great tools.</p>
<h4>Get Git</h4>
<p>Deb/Ubuntu:   apt-get install git-core</p>
<p>Windows:        http://code.google.com/p/msysgit/</p>
<h4>Version Some Files, Look at Them</h4>
<p>git init                      git add                    git-gui</p>
<p>git commit                .gitignore                                gitk</p>
<h4>Use Git with Eclipse</h4>
<p>There is a git-Eclipse project in development:</p>
<p>http://repo.or.cz/w/egit.git</p>
<p>However, I will show how to use Git and Eclipse without any integration. This turns out to be much less problematic than you might initially guess, and has advantages:</p>
<p>If you use git with multiple IDEs, you only need to learn one interface.</p>
<p>You can use the tool in ways that the IDE does not anticipate, such as by versioning a whole workspace as a unit.</p>
<h4>Branch and Merge</h4>
<p>git branch                                git checkout -b newbranch</p>
<p>git diff                                     git merge</p>
<h4>Rebase</h4>
<p>The <strong>best</strong> thing in the world, a <strong>great</strong> capability.</p>
<p>The <strong>world</strong> thing in the world, <strong>never</strong> do this.</p>
<p>My advice: Have it in your toolbox, but be careful.</p>
<h4>Review and Search History</h4>
<p>The sample repos from tonight’s demo don’t have much history to show; but with git, and without relying on a network connection, we can see git’s review and search capabilities on projects “in the wild”.</p>
<h4>Rearranging Files</h4>
<p>Git tracks content, and will follow that content as it moves around, without you telling it about the moves. This is extremely helpful if you have a pile of files to rearrange.</p>
<p>http://kylecordes.com/2008/07/18/rearrange-file-svn-git/</p>
<h4>Blame!</h4>
<p>Poll: <strong>Do you use Blame</strong>? How often? Does it help?</p>
<p>Blaming is a terrible way to interact with other people… but get over the name, because “blame” is a <strong>fantastic</strong> source control feature.</p>
<h4>Host Your Repo on Your Server</h4>
<p>Git has a built in ability to host repos, and also includes gitweb.</p>
<p>Gitosis is also a great tool: http://eagain.net/gitweb/?p=gitosis.git</p>
<h4>GitHub</h4>
<p>Don’t want to mess with hosting?  http://github.com/</p>
<h4>Enterpriseynessility</h4>
<p>Git does not have all the same feature as whatever enterprisey tool you may be using. It has a different set of features. YMMV, but in my opinion it is a “disruptive innovation”.</p>
<h4>Git-SVN</h4>
<p>Git makes a great front end for SVN; I use it this way regularly on Linux. Msysgit does not currently include git-svn, so no demo.</p>
<h4>Tips</h4>
<p>Initial Setup:</p>
<p>git config &#8211;global color.diff auto</p>
<p>git config &#8211;global color.status auto</p>
<p>git config &#8211;global color.branch auto</p>
<p>export PS1=&#8221;\u@\h \W\$(git-branch 2&gt; /dev/null | grep -e &#8216;\* &#8216; | sed &#8217;s/^..\(.*\)/ {\1}/&#8217;)\$ &#8221;</p>
<p>Remove from source control, the files you have removed from the file system:</p>
<p>git ls-files -z &#8211;deleted | git update-index -z &#8211;remove &#8211;stdin</p>
<h4>Using Git in a Closed Team</h4>
<p>There are many ways to use Git; you can think of it as mostly a superset of what other systems do. You can use Git to achieve many possible workflows. Here is one way to use it effectively:</p>
<p>Set up a server everyone can pull from and push to.</p>
<p>Use Gitosis or similar.</p>
<p>Have one(+) repo per developer, and one(+) for leads to all push to.</p>
<p>Everyone pushes to their repo.</p>
<p>Leads pull from others’ repos, and push to the main repo.</p>
<p>Server performance is not important, a slow machine can serve many users.</p>
<p>Backup is not all that important, you will not actually lose anything if the machine dies.</p>
<p>Make your initial repo fork for each person, on the server, for speed and space sharing.</p>
<h4>Using Git for Open Source</h4>
<p>Clone the project’s repo.</p>
<p>Hack.</p>
<p>Push your changes to your public repo (perhaps on Github)</p>
<p>Get someone to pull them.</p>
<p>git format-patch, if you want to send them.</p>
<h4>Problems in the Git World</h4>
<p>On Linux, things are going very well. But on Windows, not so well: the Windows port itself  is advancing nicely, but it appears to suffer somewhat badly from the “I am just doing this for fun, if you want it fix, make a patch” problem.</p>
<p>My opinion: to really thrive on Windows, Git needs a firm to create a commercial offering around it, and feed lots of core fixes back to the project.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/jug-git-talk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Brief Introduction to Distributed Version Control</title>
		<link>http://kylecordes.com/2007/intro-dvcs</link>
		<comments>http://kylecordes.com/2007/intro-dvcs#comments</comments>
		<pubDate>Fri, 12 Oct 2007 00:16:14 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[source-control]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/10/11/intro-dvcs/</guid>
		<description><![CDATA[Last night at SLUUG, I have a talk on distributed source control tools. It was quite introductory, but the notes (below) may still be helpful. These notes were on a handout at the talk, as usual I didn&#8217;t use slides.
Unfortunately I didn&#8217;t get an audio recording of this talk, so no transcript either.
About 30 people [...]]]></description>
			<content:encoded><![CDATA[<p>Last night at <a href="http://www.sluug.org/">SLUUG</a>, I have a talk on distributed source control tools. It was quite introductory, but the notes (below) may still be helpful. These notes were on a handout at the talk, as usual I didn&#8217;t use slides.</p>
<p>Unfortunately I didn&#8217;t get an audio recording of this talk, so no transcript either.</p>
<p>About 30 people were in attendance. Nearly 100% were familiar with CVS and SVN, and perhaps 20% with other tools (ClearCase, SourceSafe, and others). <strong>Only 4 had ever used branch/merge in any project or tool</strong>!</p>
<p><strong>A Brief Introduction to Distributed Version Control</strong></p>
<h2>You Branch and Merge.</h2>
<p>A fundamental truth: every time you edit a file you are branching, and every time you reconcile with another developer you are merging. In most tools you get one easy branch and merge locus: your local working directory. All other branching is a Big Deal.</p>
<p>It does not have to be this way.</p>
<h2>A Short Tour of 3 tools</h2>
<p>bzr: <a href="http://bazaar-vcs.org/">http://bazaar-vcs.org/</a></p>
<p>hg: <a href="http://www.selenic.com/mercurial/">http://www.selenic.com/mercurial/</a></p>
<p>git: <a href="http://git.or.cz/">http://git.or.cz/</a></p>
<p>Also, check your distro&#8217;s package system.</p>
<p>(At this point in the talk I demonstrated the basic features of each)</p>
<h2>What is a DVCS? Why Use a DVCS?</h2>
<p>Peer-to-peer design</p>
<p>Everyone gets all the features, rather than the interesting features limited to a high priest class.</p>
<p>Make use of the massive CPU and disk capacity on dev machines.</p>
<p>No central server needed, though many projects nominate a machine for this purpose.</p>
<p>Use a &#8220;dumb&#8221; storage location for a repository, if desired. Or a &#8220;smart server&#8221; for performance and security.</p>
<p>Work offline, with full history, branches, merges.</p>
<p>No central administrator is needed, potentially a cost savings.</p>
<p>Very cheap branching, in some cases immediate, even for large projects.</p>
<p>Very good merging, because you merge all the time.</p>
<p>Commit-then-merge, not merge-then-commit.</p>
<p>Repeated merge without havoc.</p>
<p>Merge keeps both sides of history, which is important because you merge a lot. This varies by tools, for example apparently bzr keeps this history less effectively than some others.</p>
<p>Depending on what you are coming from and which tool you choose, the speed gain can be so remarkable that it help every developer every day.</p>
<h2>Some SVN Nitpicks</h2>
<p>It is easy and tempting to pick on SVN. Linus does so vigorously in his online talk. I don&#8217;t hate it as much as he does but, these things bother me:</p>
<p>SVN is slow for large projects.</p>
<p>Branching in SVN sounds clever as you read its cheap copy story. It&#8217;s a great story. But actually using it is ridiculous; both in the URL-crazy syntax and utter lack of merge history.</p>
<p>We don&#8217;t need a better CVS, we need something much better than CVS.</p>
<p>.svn directories scattered all over are a pointless pain.</p>
<p>.svn directories are enormous, sometimes larger than the entire project history in git or hg!</p>
<h2>Security</h2>
<p>Security is a weak area in terms of out-of-the-box features and tutorials, because these tools come from the open source world where the default is for everyone to be able to see all code. However, with a little effort you can set up whatever security you like:</p>
<p>If you&#8217;re serving over HTTP, you can use Apache mod_whatever to control access.</p>
<p>Tunnel over SSH (in the box, in most cases) to avoid ever sending code in the clear.</p>
<p>Even a &#8220;dumb&#8221; storage location can be secured with SFTP.</p>
<p>Scripts can be used for per-branch and other fine grained access control, akin to what you can do with svn-access.conf. There are examples online.</p>
<h2>I Can&#8217;t Use a DVCS Because:</h2>
<p><em>SOX/HIPPA/CMM/etc. requires a centralized tool.</em></p>
<p>SOX/HIPPA/CMM/etc, is the standard reason why anyone can&#8217;t do anything. Some of these tools facilitate much stronger guarantees about the provenance of the source code than you get from a centralized tool, because they have credible and straightforward ways to verify that centralized store has not been compromized.</p>
<p><em>We are all in one place, therefore a DVCS makes no sense.</em></p>
<p>Actually many of the features in these tools are as useful in the same building as in a worldwide team.</p>
<p><em>Tool ZZZ is our corporate standard.</em></p>
<p>Then you should use it, don&#8217;t get fired. However, many people are using a DVCS in front of their corporate standard tool.</p>
<h2>DVCS vs DVCS:</h2>
<p>Many DVCS tools treat each repo/workspace as a branch and vice versa, so if you use many branches you will have many workspaces.</p>
<p>bzr can use shared files to reduce the bloat from this.</p>
<p>git handles many branches much better, with arbitrarily many per repo/workspace.</p>
<p>My feeling is that hg and git are more mature than bzr.</p>
<p>git does not work well on windows yet.</p>
<h2>Other DVCS to Consider</h2>
<p><strong>Monotone</strong> – has some slick features, but does not appear to scale well to large projects. It stores information in a SQLite DB. Monotone, unlike any others I&#8217;ve seen, replicates all branches by default, which is nice.</p>
<p style="margin-left: 9pt">An aside &#8212; there are fascinating thoughts on how to a data synchronization system can work, in the Monotone docs / presentations.</p>
<p><strong>arch</strong> / tla &#8212; one of the early DVCSs that started all this. I have heard it is mystifying to use.</p>
<p><strong>darcs</strong> &#8212; everyone loves its &#8220;cherry picking&#8221;, but I have not triedit.</p>
<p><strong>SVK</strong> &#8212; optimized for being a better svn client, with offline history and merging that works. Stores merge history in SVN attribute.</p>
<h2>More git Merging</h2>
<p>Depending on time, I will show more of the branch / merge facilities in git, as well as its gitk GUI.</p>
<h2>Other Resources</h2>
<p>http://wiki.sourcemage.org/Git_Guide</p>
<p>http://www.adeal.eu/</p>
<p><strong>Update:</strong> the following appeared a few days after my talk, it is very good, aside from slightly bogus listings in the &#8220;disadvantages&#8221; section:<br />
<a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/">http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/</a></p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/intro-dvcs/feed</wfw:commentRss>
		<slash:comments>3</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://kylecordes.com/files/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://kylecordes.com/files/SAASTalk.mp3" length="35758325" type="audio/mpeg" />
		</item>
		<item>
		<title>St. Louis Code Camp, May 5 2007</title>
		<link>http://kylecordes.com/2007/code-camp-2007</link>
		<comments>http://kylecordes.com/2007/code-camp-2007#comments</comments>
		<pubDate>Sat, 07 Apr 2007 22:17:57 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/04/07/code-camp-2007/</guid>
		<description><![CDATA[It&#8217;s time for the second (annual) St. Lous Code Camp on May 5, 2007. There&#8217;s no actual camping (unlike some other ___ camps out there), just one day of sessions. Think of it as a mini-conference. See Brian&#8217;s announcement for more details. If you&#8217;ve been thinking of giving user group talks and never gotten around [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s time for the second (annual) <a href="http://stlcodecamp.org/">St. Lous Code Camp on May 5, 2007</a>. There&#8217;s no actual camping (unlike some other ___ camps out there), just one day of sessions. Think of it as a mini-conference. See <a href="http://www.agileprogrammer.com/oneagilecoder/archive/2007/03/12/22458.aspx">Brian&#8217;s announcement</a> for more details. If you&#8217;ve been thinking of giving user group talks and never gotten around to it, Code Camp is a great place to start.</p>
<p>I&#8217;m in for two <a href="http://stlcodecamp.org/content/sessions">sessions</a> this year, assuming enough slots are available for both:</p>
<p><strong>Flying Boxes</strong></p>
<p>It&#8217;s surprisingly easy, with Java and Swing, to build animated drag-and-drop “direct manipulation” user interfaces. I covered the overall topic in a talk at the Java User Group, and found that my “flying boxes” demo and code walk-through were by far the most interesting part. I&#8217;ll repeat that demo and explanation here, with more careful (and thus helpful) coverage of the issues involved in getting good results. As “filthy rich” GUIs become more popular, the ability to build such interfaces has become important in commercial business applications, not only in demos and games. The code <a href="http://kylecordes.com/2005/09/09/direct-swing/">can be downloaded from my web site</a>.</p>
<p><strong>Selling your Software as a Hosted Service</strong></p>
<p>For the last few years my (other) firm has been selling an application as an Application Service Provider, charging a monthly fee for use of software that we develop, host, and support. (This is sometimes called the “Salesforce.com” model, but it predates them by decades.) Of course we have much still to learn, but in this talk I&#8217;ll share some experiences, tips, and advice on how (and whether) to use this business model for your own ventures. The last portion of the session will be a roundtable discussion,  I&#8217;d like to learn from you too.</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/code-camp-2007/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="/files/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 (My experience is with the enormous wealth of free and inexpensive widgets available for Delphi)</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&#038;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>
		</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 [...]]]></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>St. Louis Code Camp &#8211; Lua Talk Notes and Source Code</title>
		<link>http://kylecordes.com/2006/code-camp-lua</link>
		<comments>http://kylecordes.com/2006/code-camp-lua#comments</comments>
		<pubDate>Wed, 10 May 2006 03:22:09 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[lua]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/05/09/code-camp-lua/</guid>
		<description><![CDATA[At the St. Louis Code Camp on May 6, I gave a talk that was somewhat poorly titled &#8220;Painless Scripting with Lua&#8221;.  The topic more mostly about the overall use of scripting as a configuration and extension mechanism, with Lua as an example language.
The talk had no slides, only code and a 1-page handful with [...]]]></description>
			<content:encoded><![CDATA[<p>At the <a href="http://www.stlcodecamp.org/">St. Louis Code Camp</a> on May 6, I gave a talk that was somewhat poorly titled &#8220;Painless Scripting with Lua&#8221;.  The topic more mostly about the overall use of scripting as a configuration and extension mechanism, with Lua as an example language.<br />
The talk had no slides, only code and a 1-page handful with some notes.  You can download the source code: <a href="/files/2006_code_camp_lua.zip">2006_code_camp_lua.zip</a>   and the notes follow:</p>
<p><strong>Alternate Hard and Soft Layers</strong></p>
<p>This is a Pattern from the C2 Wiki: <a href="http://c2.com/cgi/wiki?AlternateHardAndSoftLayers">http://c2.com/cgi/wiki?AlternateHardAndSoftLayers</a></p>
<p>In a system built with &#8220;hard&#8221; code (not in the sense of difficulty, rather in the sense of statically typed, statically compiled languages), organize that code in to layers, and between those hard layers, put &#8220;soft&#8221; layers in the form of scripts written in a dynamic, runtime modifying languages.  AHSL is closely related to the idea of scriptable applications, with the additional notion of layering, rather than ad hoc extension.</p>
<p>&#8220;hard layer&#8221; languages:</p>
<ul>
<li>C</li>
<li>C#</li>
<li>C++</li>
<li>Delphi (*)</li>
<li>Java</li>
</ul>
<p>&#8220;soft layer&#8221; languages:</p>
<ul>
<li>bash</li>
<li>BeanShell</li>
<li>Emacs Lisp</li>
<li>Groovy</li>
<li>JavaScript</li>
<li>Lua (*)</li>
<li>Python</li>
<li>Ruby</li>
<li>Tcl</li>
</ul>
<p>This talks&#8217; examples are in Delphi (hard) and Lua (soft).  Delphi is a mostly static language, essentially similar in certain ways to C, C++, and Java, but with a Pascalish syntax.</p>
<p>Key Points about Lua:</p>
<ul>
<li>An easily learned, dynamic programming language</li>
<li>Small, highly embeddable (~ 100 KB)</li>
<li>Multi-platform (highly portable C code)</li>
<li>Well suited to “Alternate Hard and Soft Layers”</li>
<li>Free and open source</li>
<li>Stable and mature</li>
<li>Safe and Sandboxed</li>
<li>Actively developed and maintained</li>
</ul>
<p>Recommendation on Scripting:</p>
<ul>
<li>If you&#8217;re building a Java system, the most appealing scripting language is JavaScript, because it will be &#8220;in the box&#8221; in Java 6.</li>
<li>If you&#8217;re building a .NET system, use a .NET-centric scripting mechanism</li>
<li>If you&#8217;re building a Win32 system with a lot of COM in it, use the Windows Scripting Host and expose your system&#8217;s feature to the scripts via COM.</li>
<li>If you&#8217;re building a system with a &#8220;hard&#8221; (very static) language, and want to keep your options open for cross-platform development / deployment, than Lua is an excellent choice, it is small, fast, proven, COM-free, and cross-platform.</li>
</ul>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/code-camp-lua/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SD 2004 Disconnected Data Handling Talk &#8211; Slides Available</title>
		<link>http://kylecordes.com/2004/sd-data-talk-slides</link>
		<comments>http://kylecordes.com/2004/sd-data-talk-slides#comments</comments>
		<pubDate>Mon, 26 Apr 2004 13:00:00 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2004/04/26/sd-2004-disconnected-data-handling-talk-slides-available/</guid>
		<description><![CDATA[At SD2004, I gave a talk on data handling in disconnected mode (mobile / wireless) applictions.  The ideas here apply to wireless / mobile applications running on notebook PCs, PDAs, even smaller devices like &#8220;SmartPhones&#8221;.
Slides: sd04_disconnected.ppt
Source Code: disc-data-ex.zip
  ]]></description>
			<content:encoded><![CDATA[<p>At SD2004, I gave a talk on data handling in disconnected mode (mobile / wireless) applictions.  The ideas here apply to wireless / mobile applications running on notebook PCs, PDAs, even smaller devices like &#8220;SmartPhones&#8221;.</p>
<p>Slides: <a href="/files/sd04_disconnected.ppt">sd04_disconnected.ppt</a></p>
<p>Source Code: <a href="/files/disc-data-ex.zip">disc-data-ex.zip</a></p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2004/sd-data-talk-slides/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upcoming talk at SD 2004</title>
		<link>http://kylecordes.com/2003/sd-data-talk</link>
		<comments>http://kylecordes.com/2003/sd-data-talk#comments</comments>
		<pubDate>Fri, 14 Nov 2003 19:00:00 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2003/11/13/upcoming-talk-at-sd-2004/</guid>
		<description><![CDATA[I'm giving a talk on data handling in a disconnected mode appliction next year at SD Expo 2004.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m giving a talk on data handling in a disconnected mode appliction next year at SD Expo 2004.  This applies to wireless / mobile applications running on notebook PCs, PDAs, even smaller devices like &#8220;SmartPhones&#8221;.</p>
<p>Details are <a href="http://www.cmpevents.com/SDw/a.asp?option=G&amp;V=3&amp;id=229492">here</a></p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2003/sd-data-talk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript Talk at St. Louis OOSIG</title>
		<link>http://kylecordes.com/2003/oosig-javascript-talk</link>
		<comments>http://kylecordes.com/2003/oosig-javascript-talk#comments</comments>
		<pubDate>Mon, 20 Oct 2003 01:45:00 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2003/10/18/javascript-talk-at-st-louis-oosig/</guid>
		<description><![CDATA[Notes from my OOSIG talk on JavaScript, a classless (prototype-based) OO language]]></description>
			<content:encoded><![CDATA[<p>On October 16, 2003, I spoke on &#8220;Objects without Classes&#8221;, the non-class-based object model implemented by JavaScript and some other OO languages.   The (brief) presentation is available here:</p>
<p><a href="http://kylecordes.com/files/JavaScriptOOSIG.ppt">Talk in Powerpoint format</a></p>
<p>The plain text of the slides (which is, frankly, plenty good enough) follows:</p>
<p><span id="more-20"></span></p>
<h4>Objects without Classes &#8211; JavaScript</h4>
<p>An Alternative Object Model</p>
<p>Kyle Cordes</p>
<p>Oasis Digital Solutions Inc.</p>
<p>St. Louis OOSIG</p>
<p>Oct. 16, 2003</p>
<h4>Yet Another “About Me” Slide</h4>
<p>*   Developer, Architect, Consultant, PM, etc.</p>
<p>*   Learned OO in C++, early 1990s</p>
<p>*   Many other OO languages since: Java, Delphi, C#, Python, Ruby,<br />
JavaScript, etc.)</p>
<p>*   Oasis Digital Solutions Inc.</p>
<p>¨ Outsourced development</p>
<p>¨ Services to help teams write better software</p>
<p>*   <strong>kylecordes.com</strong></p>
<h4>Assumptions</h4>
<p>*   You write software</p>
<p>¨ Not necessarily a lot of software</p>
<p>*   You use an OO language</p>
<p>¨ It’s hard to find one that isn’t nowadays</p>
<p>*   (More technical than some OOSIG talks)</p>
<h4>Agenda</h4>
<p>*   Objects and Classes</p>
<p>*   Classless OO</p>
<p>*   Very Brief Introduction to JavaScript / ECMAScript</p>
<p>*   Examples</p>
<h4>The Point</h4>
<p>*   Object Oriented does not necessarily mean Classes.</p>
<p>*   Classless OO is a useful model, in surprisingly widespread<br />
use, though not in mainstream enterprise development.</p>
<p>*   Nonetheless, understanding classless OO can help you create<br />
better designs in the language you use now.</p>
<h4>Class-based OO</h4>
<p>*    C++, Java, C#, Smalltalk, Eiffel, Delphi, many more.</p>
<p>*    Objects are divided into types, and don’t change type</p>
<p>*    The properties of a set of objects of the same class<br />
are specified in a class definition</p>
<p>*    Classes are abstract thing, instances are specific</p>
<p>*    Class relationship is static</p>
<p>*    This is the only way it can be done, right?</p>
<h4>Classless Objects</h4>
<p>*   Some OO langages don’t have classes</p>
<p>¨ Called Classless or Prototype-based</p>
<p>*   Objects share behavior by sharing a common prototype object.</p>
<p>*   All objects are instances</p>
<p>*   “Class” relationship is dynamic</p>
<p>*   Classless OO can be used to build class-based OO, it is more<br />
inclusive</p>
<h4>For Example…</h4>
<p>*   A few years ago, this would be of academic interest only</p>
<p>*   But…</p>
<p>*   JavaScript (ECMAScript) is in widespread use, and has classless<br />
OO</p>
<p>¨ “Dice Index” of 964</p>
<p>¨ That’s more than C#, for example</p>
<h4>Intro to Javascript</h4>
<p>*   Not much to do with Java</p>
<p>¨ Name came about from Netscape cashing in on initial Java excitement</p>
<p>*   Standardized as ECMAScript</p>
<p>*   Current spec version is 1.5.</p>
<h4>Where is JavaScript Used?</h4>
<p>*   Most commonly, in client-side web scripting</p>
<p>*   Web server implementations</p>
<p>*   Very interesting Web Services toolkit from IBM</p>
<p>*   In .NET, ships “in the box”</p>
<h4>JavaScript Implementations</h4>
<p>*   Initial Netscape Implementation</p>
<p>*   Rhino (written in Java)</p>
<p>¨ Easy to add script scripting to Java apps</p>
<p>*   Mozilla</p>
<p>*   IE (JScript)</p>
<p>*   Opera etc.</p>
<p>*   JScript.NET</p>
<h4>JavaScript Features</h4>
<p>*   Dynamic typing, “duck typing”</p>
<p>*   Type-safe (dynamic != unsafe)</p>
<p>*   Single Inheritance</p>
<p>*   Compiled to intermediate representation</p>
<p>¨ Can JIT to machine code, Jscript.NET</p>
<p>*   No Classes, Prototype-based</p>
<p>*   Functions are first-class objects</p>
<h4>A Constructor is just a Function</h4>
<p>*   function Employee () {<br />
this.name = &#8220;&#8221;;<br />
this.dept = &#8220;general&#8221;;<br />
}</p>
<p>*   var x = new Employee;  // instance</p>
<h4>Constructor Parameters</h4>
<p>*   function Employee (name, dept) {<br />
this.name = name;<br />
this.dept = dept;<br />
}</p>
<h4>Methods</h4>
<p>*   function WFW() {<br />
return this.wage * weeks;<br />
}</p>
<p>*   Employee.WageForWeeks = WFW;</p>
<h4>Tighter Syntax for Methods</h4>
<p>*   function Employee () {<br />
this.name = &#8220;&#8221;;<br />
this.dept = &#8220;general&#8221;;</p>
<p>this.WageForWeeks =<br />
function (weeks) {<br />
return this.wage * weeks;<br />
}<br />
}</p>
<h4>Subclasses</h4>
<p>*   function Manager () {<br />
this.reports = [];<br />
}<br />
Manager.prototype = new Employee;</p>
<p>*    function WorkerBee () {<br />
this.projects = [];<br />
}<br />
WorkerBee.prototype = new Employee;</p>
<h4>Subclasses (deeper)</h4>
<p>*   function SalesPerson () {<br />
this.dept = &#8220;sales&#8221;;<br />
this.quota = 100;<br />
}<br />
SalesPerson.prototype = new WorkerBee;</p>
<p>*   It dynamic, we can change it later (example)</p>
<h4>Add A Property</h4>
<p>*   Add to an instance:<br />
var jim = new Employee;<br />
jim.years_of_service = 12;</p>
<p>*   Add to all instances:<br />
Employee.prototype.phone = “”;</p>
<p>*   (example)</p>
<h4>AOP</h4>
<p>*   Aspect Oriented Programming</p>
<p>*   With a prototype-based, dynamic language, we can add wrapper<br />
/ “advice” etc. without needing new language features or compilers.</p>
<h4>Singletons etc.</h4>
<p>*   There are many times in class based languages where you define<br />
many of classes and create 0 or 1 instances of each, to hold some bit of code.</p>
<p>*   With prototype-based OO, many of these situations get much<br />
simpler.</p>
<h4>OK, So It’s Different, So What?</h4>
<p>*   Classless teaches us to think about objects first, then classes<br />
later</p>
<p>¨ Behavior, not just data</p>
<p>¨ Sequence Diagrams before Class Diagrams</p>
<p>*   I have been building better designs sooner, since learning<br />
JavaScript, even though I don’t use it much.</p>
<h4>Back to The Point</h4>
<p>*   Object Oriented does not necessarily mean Classes.</p>
<p>*   Classless OO is a useful model, in surprisingly widespread<br />
use, though not in mainstream enterprise development.</p>
<p>*   Nonetheless, understanding classless OO can help you create<br />
better designs in the language you use now</p>
<h4>Links</h4>
<p>*<br />
xhref=&#8221;http://devedge.netscape.com/central/javascript/&#8221; mce_href=&#8221;http://devedge.netscape.com/central/javascript/&#8221;&gt;http://devedge.netscape.com/central/javascript/</p>
<h4>Talk Offer</h4>
<p>*   I need practice giving talks!</p>
<p>*   I’ve give this talk, or one like it</p>
<p>¨ In your organization</p>
<p>¨ For Developers, For Managers</p>
<p>¨ No Cost (in town), No Obligation</p>
<h4>The End</h4>
<p>Slides will be on my site:</p>
<p>*   <strong>http://kylecordes.com</strong></p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2003/oosig-javascript-talk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wiki Talk at CCSL</title>
		<link>http://kylecordes.com/2003/wiki-ccsl-talk</link>
		<comments>http://kylecordes.com/2003/wiki-ccsl-talk#comments</comments>
		<pubDate>Wed, 15 Oct 2003 13:00:00 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2003/10/15/wiki-talk-at-ccsl/</guid>
		<description><![CDATA[On Oct. 14 gave a talk on Wiki technology, as a tool for faciliating collaborative content creation at low cost, at the Computer Consultants of St. Louis.]]></description>
			<content:encoded><![CDATA[<p>On Oct. 14 2003, I gave a talk on Wiki technology, as a tool for faciliating collaborative content creation at low cost, at the Computer Consultants of St. Louis. You can download the PowerPoint presentation:</p>
<p>Wiki PowerPoint Presentation: <a href="http://kylecordes.com/files/WikiCCSL.ppt">WikiCCSL.ppt</a></p>
<p>Or read the text of it:</p>
<hr /><span id="more-22"></span></p>
<h4>Wiki: Low Threshold Online Collaboration</h4>
<p>Kyle Cordes</p>
<p>Oasis Digital Solutions Inc.</p>
<p>CCSL</p>
<p>Oct. 14, 2003</p>
<h4>Yet Another “About Me” Slide</h4>
<p>*    Developer, “Architect”, Consultant, Trainer, Project<br />
Manager, etc.</p>
<p>*    Java, EJB, Oracle, SQL Server, Delphi, C++, Python,<br />
Ruby, EJB, XML, multi-tier, etc.</p>
<p>*    Proponent of agile, iterative development</p>
<p>*    Oasis Digital Solutions Inc.</p>
<p>¨  Outsourced development and other services</p>
<p>*    <strong>kylecordes.com</strong></p>
<h4>Agenda</h4>
<p>*   What is a Wiki?</p>
<p>*   Examples</p>
<p>¨ Instant Intranet</p>
<p>¨ Web Site</p>
<p>¨ Documentation</p>
<p>*   Details and Implementations (the bits)</p>
<p>*   Online Collaborative Communities</p>
<h4>What is Wiki?</h4>
<p>*    “<em>The simplest online database that could possibly<br />
work.”</em> – Ward Cunningham</p>
<p>*    “Wiki is a piece of server software that allows users<br />
to freely create and edit Web page content using any Web browser. … has a<br />
simple text syntax for creating new pages and crosslinks between internal<br />
pages on the fly.”</p>
<p>*    Like a CMS, but simpler</p>
<h4>Get To The Point</h4>
<p>*   Wiki is not the perfect solution to many problems, maybe none<br />
at all</p>
<p>*   Wiki is a good solution to many problems</p>
<p>*   You can use Wiki to create lots of value for yourselves and<br />
your customers, with tiny startup effort … and starting is often the hardest<br />
thing to do.</p>
<h4>Example 1 – Instant Intranet</h4>
<p>*   Vague, but strong need for a way to share information in a<br />
team / company</p>
<p>¨ No Time</p>
<p>¨ No Budget</p>
<p>¨ No Person to assign to do a bunch of work</p>
<p>*   Lots of miscellaneous information</p>
<p>¨ Knowledge Base / FAQs</p>
<p>¨ Developer Data Dump</p>
<h4>Non-Solutions</h4>
<p>*    Lotus Notes?</p>
<p>¨  None of us knew how to use it</p>
<p>¨  Noone in our office had rights to do anything</p>
<p>¨  Hours of meetings to ask and get it</p>
<p>¨  Easier to just forget it</p>
<p>*    Official Intranet?</p>
<p>¨  Each change required manual effort from IT</p>
<p>¨  IT too busy to do it, not cost-justified</p>
<p>¨  Easier to just forget it</p>
<h4>Solution: a Wiki</h4>
<p>*    Install a Wiki</p>
<p>¨  20 minutes, on my own PC, later on a server</p>
<p>*    Learn something, type it, share it</p>
<p>¨  it was expensive to learn these things, and really cheap to save<br />
the next person the effort</p>
<p>*    Someone asks a question, answer it</p>
<p>¨  “It’s on the Wiki”</p>
<p>¨  “Here is the answer, I added it to the Wiki”</p>
<p>*    Other people joined in after a couple weeks</p>
<p>¨  Grew to hundreds of pages</p>
<h4>Example 2 – Need a Web Site</h4>
<p>*   No Time, No Budget, Noone to assign a bunch of work</p>
<p>*   Multiple contributors with a few minutes here and there</p>
<p>*   Not yet sophisticated enough for a real CMS</p>
<h4>Solution: a Wiki</h4>
<p>*   XPSTL.org</p>
<p>*   Can turn off public editing if desired</p>
<p>*   Get the info online <strong>now</strong></p>
<p>*   Add and edit the content over time</p>
<p>¨ Discover the structure also</p>
<p>*   Later, a web designer can make it in to a real web site</p>
<h4>Example 3 &#8211; Documentation</h4>
<p>*   Our software / services / procedures need to be documented!</p>
<p>¨ No Time</p>
<p>¨ No Budget</p>
<p>¨ No Person to assign to do a bunch of work</p>
<p>*   Open Word, start typing?</p>
<p>¨ I can do that, but it’s unlikely the next person will open and add to<br />
it.</p>
<h4>Solution: a Wiki</h4>
<p>*   Power users (and others) can contribute a bit at a time as<br />
they work</p>
<p>*   For internal apps, create Wiki links right in the software</p>
<p>*   Eventually, hand the accumulated information over to a doc<br />
writer</p>
<p>¨ But still keep a Wiki around to accumulate new information</p>
<h4>Where Did Wiki Come From?</h4>
<p>*   Ward Cunningham created “The” Wiki</p>
<p>¨ “WikiWikiWeb”, Psuedo-Hawaiian for “Quick”</p>
<p>¨ First embryonic version ca. 1991</p>
<p>¨ Lots more broad use ca. 1995</p>
<p>¨ Portland Pattern Repository</p>
<p>¨ Community of Extreme Programming ideas</p>
<p>¨ The Wiki: c2.com/cgi/wiki</p>
<p>¨ Ward is a very, very smart guy.</p>
<h4>Wiki Implementations</h4>
<p>*   Hundreds of them out there</p>
<p>¨ Mostly free</p>
<p>¨ Any language you can think of</p>
<p>¨ Some very easy to install</p>
<p>¨<br />
xhref=&#8221;http://c2.com/cgi/wiki?WikiEngines&#8221; mce_href=&#8221;http://c2.com/cgi/wiki?WikiEngines&#8221;>http://c2.com/cgi/wiki?WikiEngines</p>
<p>*   Try some out, decide which features you came about, choose<br />
one that has them.</p>
<h4>Wiki Implementations</h4>
<p>*    Ward’s Perl implementation</p>
<p>*    UseMod – one Perl file, very easy setup</p>
<p>*    TWiki – extremely featureful</p>
<p>*    TikiWiki – part of a big package, like “____Nuke”</p>
<p>*    ASP.Net Wiki</p>
<p>*    PHPWiki</p>
<p>*    Hundreds more, many homegrown also</p>
<p>¨  Creating a Wiki is a common “learn a new language” project</p>
<h4>Text Formatting Rules</h4>
<p>*    Paragraphs:</p>
<p>¨  Do not indent, use blank line as separatorTab before</p>
<p>*    Horizontal Lines: &#8212;-</p>
<p>*    Lists: &lt;tab&gt;* item, use more tabs to nest</p>
<p>*    Font: indent one space for fixed width font</p>
<p>*    “”words”” “““words””” etc for various bold ital etc.</p>
<p>*    Some wikis support tables, some HTML, etc.</p>
<h4>Links: WikiWords</h4>
<p>*   PutWordsTogether to automatically create links</p>
<p>*   Some users hate that, so some implementation lets you do this<br />
instead: [Link Text Here]</p>
<h4>Links</h4>
<p>*   URLs become links</p>
<p>*   Image URLs are shown as the image</p>
<h4>Inter Wiki Link</h4>
<p>*   Haven’t had much use for this myself</p>
<h4>Community Issues</h4>
<p>*   Malicious Users</p>
<p>*   Reluctant Contributors</p>
<p>¨ Many people who would be too shy to improve a public page in a CMS, do<br />
so in a Wiki.</p>
<p>*   “Mind Wipes”</p>
<h4>Anyone Can Edit Anything!</h4>
<p>*    This can’t possibly work!</p>
<p>¨  But it does work surprisingly well</p>
<p>*    Well suited in small groups</p>
<p>*    Remarkably, often works well in larger communities</p>
<p>*    Changes are recorded (many impls.)</p>
<p>*    Plenty of security options in other implementations</p>
<p>¨  Choose the minimal level that works for you, to keep the usage threshold<br />
low</p>
<h4>The Wiki Mind Wipe</h4>
<p>*   Sometimes a user will decide to remove everything they’ve<br />
ever said.</p>
<p>*   If it was useful, someone else will probably put it back.</p>
<p>¨ Local Connection: Jeff Grigg</p>
<h4>Wiki Vandals</h4>
<p>*   Some users will post lots of irrelevant, caustic, obscene,<br />
etc. junk</p>
<p>*   Others users will remove it</p>
<p>*   Ban IPs</p>
<p>*   If it happens a lot, use login security, or require changes<br />
to be approved by a trusted user</p>
<h4>Wiki Spam</h4>
<p>*    Users will post advertising as Wiki pages (or in existing<br />
ones)</p>
<p>*    Other users, who watch RecentChanges, will delete them</p>
<p>*    Logs IPs.  Ban them.</p>
<p>*    If it happens a lot, use login security, or require<br />
changes to be approved by a trusted user</p>
<h4>Wiki Bots</h4>
<p>*   Malicious Users will write scripts to add lots of junk to<br />
Wiki</p>
<p>*   Many Wiki implementations throttle the rate of changes from<br />
an IP to slow this.</p>
<p>¨ But an eager miscreant can get around that</p>
<p>*   If it happens a lot, use the same solutions as before</p>
<h4>Back To The Point</h4>
<p>*   Wiki is not the perfect solution to many problems, maybe none<br />
at all</p>
<p>*   Wiki is a good solution to many problems</p>
<p>*   You can use Wiki to create lots of value for yourselves and<br />
your customers, with tiny startup effort … and starting is often the hardest<br />
thing to do.</p>
<h4>Talk Offer</h4>
<p>*   I need practice giving talks!</p>
<p>*   I’ve give this talk, or one like it</p>
<p>¨ In your organization</p>
<p>¨ For Developers, For Managers</p>
<p>¨ No Cost (in town), No Obligation</p>
<h4>The End</h4>
<p>*   Kyle Cordes</p>
  ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2003/wiki-ccsl-talk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
