<?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/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>Kevin W. Gisi</title>
	<atom:link href="http://www.kevingisi.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kevingisi.com</link>
	<description>Ruby Developer</description>
	<lastBuildDate>Thu, 04 Mar 2010 17:09: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>Building Slides with Ease</title>
		<link>http://www.kevingisi.com/2010/03/building-slides-with-ease/</link>
		<comments>http://www.kevingisi.com/2010/03/building-slides-with-ease/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 14:00:42 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[slideshow]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=766</guid>
		<description><![CDATA[Presentations have a very big limitation - they're fleeting. As passionate as you may be, you need to ensure that the content you're trying to pass along stays with your audience. For some talks, a video recording may be sufficient. In my particular area, code snippets and slide handouts are almost a necessity.

As an ideal, I'd like to be able to take my <em>content</em>, and be able to painlessly derive:
<ul>
<li>A presentable set of slides</li>
<li>A slidedeck that can be hosted to be reviewed later</li>
<li>An outline view of the presentation content</li>
<li>A PDF of slides that can be printed and distributed</li>
<li>A code repository for any demos</li>
<li>A text file of any code snippets used in the presentation</li>
<li>Incidental thumbnail images and description text</li>
</ul>

Much of this can be done using free services like GitHub and Heroku, so we'll postpone talking about headless Firefox and Selenium, and spend the first half of the tutorial examining just how we can begin creating an integrated environment.]]></description>
			<content:encoded><![CDATA[<p><em>I received my first blog request recently &#8211; earlier, I posted an article called <a href="http://www.kevingisi.com/2009/11/a-curious-use-for-selenium-slideshows/">A Curious Use for Selenium: Slideshows</a>, where I discussed how I had set up a continuous build environment to manage slide creation. I was asked if I might provide a more in-depth tutorial on how to achieve a similar setup, so away we go!</em></p>
<p>Presentations have a very big limitation &#8211; they&#8217;re fleeting. As passionate as you may be, you need to ensure that the content you&#8217;re trying to pass along stays with your audience. For some talks, a video recording may be sufficient. In my particular area, code snippets and slide handouts are almost a necessity.</p>
<p>As an ideal, I&#8217;d like to be able to take my <em>content</em>, and be able to painlessly derive:</p>
<ul>
<li>A presentable set of slides</li>
<li>A slidedeck that can be hosted and reviewed later</li>
<li>An outline view of the presentation content</li>
<li>A PDF of slides that can be printed and distributed</li>
<li>A code repository for any demos</li>
<li>A text file of any code snippets used in the presentation</li>
<li>Incidental thumbnail images and description text</li>
</ul>
<p>Much of this can be done using free services like GitHub and Heroku, so we&#8217;ll postpone talking about headless Firefox and Selenium, and spend the first half of the tutorial examining just how we can begin creating an integrated environment.</p>
<h2>Slide Markup</h2>
<p>The flaw with software like PowerPoint and Keynote is simple &#8211; they&#8217;re <em>presentation</em> based. You start with a blank slide, and start dragging items onto it &#8211; images, text, charts &#8211; in a way that you hope will be visually appealing. But your talk is really about the <em>content</em>. Aesthetics should be used to enhance and emphasize your talk, not the other way around.</p>
<p>What&#8217;s missing here is <strong>semantic markup</strong>. We use semantic markup to write web pages (HTML), documents and tutorials (DocBook), or really anything we want (XML). The key to these formats is that we describe <em>what</em> the content is, rather than <em>how</em> it should be displayed. Here are a few options for how to represent slides in a similar way:</p>
<h3><a href="http://www.w3.org/Talks/Tools/Slidy">Slidy</a></h3>
<p><strong>Slidy</strong> is a tool that allows you to define your presentation using XHTML. By using CSS and JavaScript, Slidy presents a series of &lt;div&gt; tags as different slides. By applying different classes to each &lt;div&gt;, you can control the manner in which Slidy displays the content. Additional goodies include a table-of-contents, and an outline view.</p>
<h3><a href="http://github.com/nakajima/slidedown">Slidedown</a></h3>
<p><strong>Slidedown</strong> uses a similar approach to Slidy &#8211; using HTML to describe slides. However, Slidedown uses special syntax,  called <strong>Markdown</strong> (for more information, take a look at the <a href="http://daringfireball.net/projects/markdown/">Markdown site</a>, to actually create the HTML. The Markdown file then gets processed by Ruby libraries into regular HTML that operates in a similar way to Slidy. Here&#8217;s an example of what that might look like:</p>
<pre class="wrap">!SLIDE
# Introduction to Slidedown
## Presented by [Kevin Gisi](http://www.kevingisi.com)

!SLIDE
# Code example
@@@ ruby
    def foo
       puts "Welcome from Slidedown"
    end
@@@
</pre>
<p>This code could then be processed using Slidedown in order to generate HTML slides. Furthermore, Slidedown uses <strong>Pygments</strong>, a Python tool, to automatically syntax highlight code snippets. This tool provides a very quick way to generate slide content. However, Slidedown has no outline display, and no method of navigating over a table-of-contents.</p>
<h3><a href="http://slideshow.rubyforge.org/">Slide Show (S9)</a></h3>
<p><strong>Slide Show</strong> is my personal favorite, and the option that we&#8217;ll be using for the rest of this tutorial. Like Slidedown, it uses Markdown syntax, but it provides more visual options, better syntax highlighting, and some additional options. Slide Show doesn&#8217;t require any <code>!SLIDE</code> keywords &#8211; it assumes you want a new slide when you create a new header. A few noticeable downsides &#8211; there&#8217;s no way to bookmark specific slides (the other options use anchor tags in the URL. Additionally, the Slide Show pages will not render in Internet Explorer.</p>
<p><em>Note: You can still follow along with this tutorial in order to create your build environment using a different semantic tool, but you&#8217;ll have to modify some steps to generate the slides themselves.</em></p>
<h2>Step 1: Creating a Slideshow</h2>
<p>Let&#8217;s create a sample slide using the Markdown format Slide Show requires. In an empty project folder, create a file called <strong>slides.md</strong>. Inside there, we&#8217;ll define the content for our presentation:</p>
<pre class="wrap">
# Introduction to Slide Down
## By KevinGisi.com

# Here's a Demo Slide
This is a simple example of how to create a presentation using Slide Show.

# Thanks!
Hope you enjoyed the presentation!
</pre>
<p>To convert the Markdown file into a slideshow, we&#8217;ll need to install the Slide Show gem:</p>
<pre>$ gem install slideshow</pre>
<p><em>Note: If you don&#8217;t have RubyGems installed, head over to the <a href="http://docs.rubygems.org/">RubyGems documentation page</a> for instructions.</em></p>
<p>With the gem installed, we can simply run:</p>
<pre>$ slideshow slides.md</pre>
<p>Open up the <strong>slides.html</strong> page that was generated, and you&#8217;ve created your first slideshow using semantic markup!</p>
<h2>Step 2: Hosting with GitHub</h2>
<p>GitHub is a great way to make your slides accessible to your audience, and other people who may not be fortunate enough to attend your talk. GitHub provides great tutorials on installing Git and setting up your account at their <a href="http://help.github.com/">help page</a>. Once you&#8217;ve set up Git, create a new project. You will receive instructions on how to push out your code. Here&#8217;s an example of what it might look like:</p>
<pre>$ git init
$ git add .
$ git commit -m "Initial checkin"
$ git remote add origin git@github.com:gisikw/slides.git
$ git push origin master</pre>
<p>Once this is done, you&#8217;ll have a code repository sitting available where anyone can get access to your slide content &#8211; but it&#8217;s not quite hosted yet!</p>
<h2>Processing with Sinatra on Heroku</h2>
<p>While we&#8217;ve got the code hosted so that anyone can build the slidedeck for themselves, it would be nice to actually generate the content right away. Ideally, we could write an application that could grab the code from our repository, and build the HTML slides automatically. </p>
<h3><a href="http://help.github.com/post-receive-hooks/">GitHub&#8217;s Post-Receive Hook</a></h3>
<p>GitHub actually has the ability to fire off notifications whenever it receives a commit. The link above actually shows the documentation on what information they send to a URL we can specify. GitHub sends a JSON post with information regarding the repository &#8211; like the name and owner &#8211; and the commit itself &#8211; like the message.</p>
<p>Well this is great! All we need to do is create a small site that can accept the JSON, clone a copy of the repository, generate the content, and host it indefinitely. Heroku is where we go next.</p>
<h3><a href="http://heroku.com">Heroku Hosting</a></h3>
<p>Heroku is an absolutely phenomenal <strong>free</strong> cloud-hosting provider. They provide very easy support for Rails and Rack-based applications, which means we can host a small <a href="http://www.sinatrarb.com">Sinatra</a> application to handle these slides. There are a few concerns we need to be aware of:</p>
<p>1. Heroku is not a fan of File I/O. In fact, they provide a <em>nearly</em> read-only file system. The exception to this is the <code>tmp</code> directory. We&#8217;ll be using the <code>tmp</code> directory to store our generated slide resources. <em>Note: The <code>tmp</code> directory is wiped out each time we deploy a new version of our application, so if we make a change, we&#8217;ll need to ensure the slides get re-generated.</em></p>
<p>2. Heroku isn&#8217;t a VPS (Virtual Private Server), which means we don&#8217;t have normal command-line access. While some commands, such as <code>git clone</code>, we can execute with regular system calls, we&#8217;ll need to generate the Slideshow itself by digging into the gem and executing it from within Sinatra, rather than the command-line calls we may be used to on a local machine.</p>
<p>With these two things in mind, it is actually relatively easy for us to write a small Sinatra application to get things rolling.</p>
<h2>Step 3: A Small Sinatra Handler</h2>
<p>Create an empty project folder, and drop the following code into <code>app.rb</code>: </p>
<pre class="scrolling">require 'rubygems'
require 'json'
require 'slideshow'

AUTHORIZED_USERS = %w{gisikw}
ROOT = Dir.pwd
IGNORE = Dir.glob("#{ROOT}/tmp/*")

# Sinatra Actions
get '/*' do
  if File.exist?("#{ROOT}/tmp/#{params[:splat]}") &#038;&#038; !File.directory?("#{ROOT}/tmp/#{params[:splat]}")
    send_file "#{ROOT}/tmp/#{params[:splat]}", :disposition => :inline
  else
    (Dir.glob("#{ROOT}/tmp/*")-IGNORE).collect{|x|File.basename(x)}.collect{|x|"&lt;a href='/#{x}/slides.html'&gt;#{x}&lt;/a&gt;"}.join("&lt;br&gt;")
  end
end

post '/' do
  @push = JSON.parse(params[:payload])
  return "Repository not authorized" unless AUTHORIZED_USERS.include? @push["repository"]["owner"]["name"]
  process
end

# Process Method
def process
  clone_repository
  generate_slides
end

# Helper Methods
def clone_repository
  `git clone #{@push["repository"]["url"]}.git #{ROOT}/tmp/#{@push["repository"]["name"]}`
end

def generate_slides
  Slideshow::Gen.new.run(["#{ROOT}/tmp/#{@push["repository"]["name"]}/slides.md","-o","#{ROOT}/tmp/#{@push["repository"]["name"]}"])
end</pre>
<p><strong><em>Note: You&#8217;ll notice that I have an array of authorized users at the top of this file &#8211; be sure to change it to contain your GitHub username &#8211; the application is deliberately filtering to make sure any contents that get sent in come from your repositories alone</em></strong></p>
<p>This is all we need to support the functionality! We won&#8217;t delve into Sinatra, as their <a href="http://www.sinatrarb.com/documentation.html">documentation</a> is absolutely fantastic. Suffice it to say, all we need is two actions. First, a <code>post '/'</code>, which responds to the JSON sent by GitHub whenever they receive a push. Second, we have a <code>get '/'</code> action, which both renders files directly out of our <code>tmp</code> directory, and generates a list of available slideshows instead of displaying a 404 page.</p>
<p>However, there are two other files that Heroku will need &#8211; a <code>config.ru</code> file (that instructs Heroku on how to run the application), and a <code>.gems</code> file (so we can ensure that the Slideshow gem is installed).</p>
<p>The <code>config.ru</code> file is pretty straightforward:</p>
<pre>require 'rubygems'
require 'sinatra'
require 'app'
run Sinatra.application</pre>
<p>And finally, the <code>.gems</code> file:</p>
<pre>slideshow</pre>
<p>And we&#8217;re ready to go! Make sure that you sign up for an account with Heroku, because we&#8217;re about to push this out to the cloud. If you don&#8217;t have the Heroku gem installed, be sure to grab it with:</p>
<pre>$ gem install heroku</pre>
<p>Once that&#8217;s installed, we can push our application out by creating a new Git repository:</p>
<pre>$ git init
$ git add app.rb config.ru .gems
$ git commit -m "Initial commit"
$ heroku create <em>APPNAME</em>
$ git push heroku master</pre>
<p>If this is your first time using the Heroku gem, you&#8217;ll likely get prompted for your email and password. Once you do this, the Heroku gem will automatically upload your SSH key, so you won&#8217;t have to do this again. Open up your browser to the new application, and you should see absolutely nothing!!</p>
<h2>Step 4: Adding a Post-Commit Hook</h2>
<p>Time to finish the job. Head over to your GitHub page, and look at your slide project. Click on &#8220;admin&#8221;, and then &#8220;Service Hooks.&#8221; You&#8217;ll see a text field where you can enter in a post-receive URL. Throw in the link to your new Heroku application. For me, that was <a href="http://slides.heroku.com">http://slides.heroku.com</a>, but yours will depend on what application name you chose.</p>
<p>Finally, do another push of your original slides:</p>
<pre>$ git commit --allow-empty -m "Build system test"
$ git push origin master</pre>
<p>Give it a few seconds to send the POST to your Heroku application, and before you know it, you have your slides sitting there, automatically generated for you. <a href="http://slides.heroku.com/SampleSlides/slides.html">Take a look at my example!</a></p>
<h2>Summary</h2>
<p>It took a little bit of work to get set up with our integrated build system, but now that it&#8217;s up and running, we can add as many new slide decks as we like. We simply need to add the Heroku URL to each GitHub project we want built! In this way, we can make modifications to the original source file, which is really focused on content, and not ever have to worry about rebuilding the visual version &#8211; just check things into the repository. We can also offer a persistent link now that permanently display the updated version of our slides for all to see.</p>
<p>In Part 2 of this tutorial, we&#8217;ll examine how we can expand the Sinatra application to generate additional content, grab our code snippets, and even generate handouts, so stay tuned. In the mean time, happy presenting!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2010/03/building-slides-with-ease/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Hands-Free Slide Decks]]></series:name>
	</item>
		<item>
		<title>Applying Agile to Time Management</title>
		<link>http://www.kevingisi.com/2010/01/applying-agile-to-time-management/</link>
		<comments>http://www.kevingisi.com/2010/01/applying-agile-to-time-management/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 17:30:31 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[pomodoro]]></category>
		<category><![CDATA[task-management]]></category>
		<category><![CDATA[time-management]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=665</guid>
		<description><![CDATA[Note: Earlier this week I wrote a post on The Problem With Pomodoro, where I described my own concerns with the Pomodoro Technique. This post is designed to discuss positive alternatives that still employ an agile perspective.
While shrinking your time into 25-minute focused chunks might not work for you (whether because of your work environment, [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: Earlier this week I wrote a post on <a href="http://www.kevingisi.com/2010/01/pomodoro/">The Problem With Pomodoro</a>, where I described my own concerns with the Pomodoro Technique. This post is designed to discuss positive alternatives that still employ an agile perspective.</em></p>
<p>While shrinking your time into 25-minute focused chunks might not work for you (whether because of your work environment, or the way you manage focus), there are certainly techniques that you can apply to improve the way you spend your time.</p>
<h2>Determining Features</h2>
<p>As a young kid, I used to have a terrible time keeping my room clean. We&#8217;d have long weekends where I&#8217;d sit in my room, unable to make any progress because the work to be done was so daunting. The floor was buried in clothes; the clothes were buried in toys; and the toys were buried in books. It was almost impossible to get anything done. But once my parents suggested &#8220;Just get your desk clean; worry about the rest later,&#8221; things started to click.</p>
<p>I hardly knew it at the time, but I was beginning to take an agile approach to the room-cleaning project. And that strategy continues now &#8211; when I&#8217;ve got a long email to write, it can be intimidating. Instead of trying to spend a long chunk of time struggling through, I hit &#8220;Compose&#8221;, and quickly write out:</p>
<div style="margin-left: 20px; font-style: italic">
Dear Jack,</p>
<p>THANKS</p>
<p>WHAT I TOOK AWAY, NEED FOR MORE INFORMATION</p>
<p>REQUEST</p>
<p>Thanks so much for your time and consideration. I look forward to hearing from you,</p>
<p>-Kevin W. Gisi
</p></div>
<p>Effectively what I&#8217;ve done here is divided a large &#8220;project&#8221; into three key &#8220;features&#8221;, just like you would with an Agile project, but on a micro level. I now have three small features that need to be completed &#8211; specifically, writing three paragraphs, from the small caps-lock cues I gave myself. These tasks themselves will take only a few minutes to complete. While I may not complete them all at once, I will get a sense of satisfaction each step of the way.</p>
<p>The central conceit of this technique is that we are always pleased when we get <em>something</em> done. Unlike the Pomodoro Technique, where the achievement is the completion of an arbitrary quantity of work-time, we instead have a deliverable (be it a paragraph of an email, a passing test in an application, or a clean desk), that we can take satisfaction in.</p>
<h2>Managing Focus</h2>
<p>I find that trying to control my mind can be stressful &#8211; we are actively bombarded with new information every day, and are passively trained to have a very short attention span. Actively trying to force ourselves to focus on a solitary activity can be a real and damaging additional stressor. Focus is important, but balancing it with an Agile approach to time-management can result in a less stressful lifestyle.</p>
<p>When you choose to divide your projects into micro-tasks, consider whether or not you get distracted. To what extent can you effortlessly focus? Some of us can write a chapter of a book without distraction. For some, writing an email is the best we can do. Some of us get distracted mid-tweet. The key to successful Agile task-management is a good understanding of how much you can focus before it becomes a stressful challenge.</p>
<p>Divide your tasks into chunks that you can handle. Personally, I&#8217;m quite scatterbrained, and so dividing emails into paragraphs gives me the flexibility I need to avoid fighting with my own thought process. The key is to objectively look at the times when being focused becomes a stressful activity, rather than a productive one, and to adjust your tasks accordingly. To the extent you can work at a consistent, yet comfortable pace, you can be productive, without having to force yourself into mental habits that go against your regular brain activity.</p>
<h2>Agile Time Management&mdash;A Misnomer</h2>
<p>The lesson here is that time-management does not offer us an intrinsic reward. As humans, we get intrinsic pleasure from accomplishing tasks, and so the real term should be <em>task-management</em>. So make sure to follow these steps if you&#8217;re looking to improve your productivity:</p>
<ul>
<li>
Consider your ability to focus without stress
</li>
<li>
If anything is beyond your focus range, split it into smaller features
</li>
<li>
Take pride in having deliverables whenever you work
</li>
<li>
Enjoy the focus you have, and keep things stress-free
</li>
</ul>
<p>Enjoy your work, and keep it manageable, and you&#8217;ll be productive!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2010/01/applying-agile-to-time-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Problem With Pomodoro: A Perspective</title>
		<link>http://www.kevingisi.com/2010/01/pomodoro/</link>
		<comments>http://www.kevingisi.com/2010/01/pomodoro/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 04:57:13 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[creativity]]></category>
		<category><![CDATA[pomodoro]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=597</guid>
		<description><![CDATA[The Pomodoro Technique, for those unfamiliar, is a method used to improve productivity throughout the day. I encourage you to visit the site to find out more about the process, but to oversimplify: you work in 25 minute cycles (called pomodoros), taking short breaks in between. After several of these, you take an extended break.
This [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://pomodorotechnique.com">Pomodoro Technique</a>, for those unfamiliar, is a method used to improve productivity throughout the day. I encourage you to visit the site to find out more about the process, but to oversimplify: you work in 25 minute cycles (called <em>pomodoros</em>), taking short breaks in between. After several of these, you take an extended break.</p>
<p>This sounds like a perfectly reasonable way to try and improve our productivity at work, and it&#8217;s seems in line with many newer techniques in the field of software development and human resource management. <span class="callout">The number of pomodoros completed is the metric for success</span>However, the Pomodoro Technique focuses on the completion of it&#8217;s own unit, the <em>pomodoro</em>, as the metric for success. While some struggle with productivity, often this stems from a lack of motivation &#8211; which can result in intentional, or even unconscious procrastination. Finally, what side effects can result from micro-management of our time?</p>
<h2>Is Pomodoro Agile?</h2>
<p>The Pomodoro Technique seems to fit quite nicely with <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile</a> project management trends &#8211; Pomodoro creates a micro-form of the agile timebox, and treats that as an atomic piece of work.</p>
<p>Pomodoro also falls in line with <a href="http://en.wikipedia.org/wiki/Scrum_(development)">Scrum</a> practices &#8211; being honest about where time is being invested, catching issues early, and understanding that the rate of work is constant. You should never be inclined to &#8220;work a harder pomodoro&#8221;, but you should consider whether your goals are too ambitious for your available time.</p>
<p>However, there&#8217;s one key distinction &#8211; at the end of a pomodoro, you might not be done. You record that you completed 25 minutes of work, whether or not the task you were working on is complete. <span class="callout">Pomodoro requires no deliverables</span>In a traditional agile development, the goal is that there is a deliverable product each iteration. The client, and the programmer, can take a small pride in having fully completed a certain set of features. This is not always the case with the Pomodoro Technique &#8211; the focus is on boxing the time, not the product.</p>
<h2>Is Pomodoro Motivating?</h2>
<p>One of the reasons for implementing the Pomodoro Technique is that &#8220;excitement decreases when complexity is high.&#8221; This happens to come straight out of the <i>Pomodoro Technique Illustrated</i>. This seems like a strong argument for the Pomodoro Technique as a tool to help fix a motivation deficit.</p>
<p><a href="http://www.danpink.com/">Dan Pink</a>, argues that &#8220;Rewards can deliver a short-term boost&mdash;just as a jolt of caffeine can keep you cranking for a few more hours. But the effect wears off&mdash;and, worse, can reduce a person&#8217;s longer-term motivation to continue the project&#8221; in his latest book on motivation, <a href="http://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594488843/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1263258835&#038;sr=1-1">Drive</a>.</p>
<p>The completion of the pomodoro is just such a reward &#8211; while completing one can provide a sense of satisfaction, it is an abstract concept that has no intrinsic value. <span class="callout">We are intrinsically motivated to complete tasks</span>What Pink discusses in his book is the concept that we are motivated to complete tasks, independent of artificial or substantial rewards &#8211; perhaps the Pomodoro Technique can do harm by overemphasizing the need for another abstract reward system. The accomplishment of tasks alone can be great motivation in the right environment.</p>
<h2>What is the cost?</h2>
<p><a href="http://twitter.com/pragmaticandy">Andy Hunt</a>, in his book <a href="http://pragprog.com/titles/ahptl">Pragmatic Thinking &#038; Learning</a>, discusses the importance of right-brain thinking, especially with regard to increasingly creative fields like computer science. It&#8217;s no coincidence that so many successful developers in the perceived math-laden, algorithmic field are also accomplished musicians and artists. Because the right-brain is responsible for the creative solutions we so often need to perform our jobs, it is vital that we encourage creativity.</p>
<p>The Pomodoro Technique can threaten this need. Andy tell us &#8220;Answers and insights pop up independently of your conscious activities, and not always at a convenient time&hellip;you need to be ready to capture any insight or idea twenty-four hours a day, seven days a week, no matter what else you might be involved in.&#8221;</p>
<p>While focusing on the task-at-hand is important, an exclusive focus can prohibit creative thinking. The Pomodoro Technique needs to be used with caution, so that it does not prevent the spontaneity and free-form nature of the creative process.</p>
<h2>What To Apply</h2>
<p>While the Pomodoro Technique might have some flaws, it does encourage some very good practices, namely:</p>
<ul>
<li>
Really examine where you spend time
</li>
<li>
Make sure to take honest breaks
</li>
<li>
Record your time investments objectively
</li>
<li>
Use trends to illustrate places to improve
</li>
<li>
Spend your time deliberately (<a href="http://www.iwillteachyoutoberich.com/blog/conscious-spending-how-my-friend-spends-21000year-on-going-out/">like your money</a>)
</li>
</ul>
<p>Consider the usefulness of good time-management, but take caution not to allow it to limit your own process.</p>
<p><em>Note: I have a great deal of respect for Francesco Cirillo&#8217;s work, and highly recommend that you take a look over at <a href="http://www.pomodorotechnique.com/">http://www.pomodorotechnique.com</a>. I also recommend examining Staffan Nöteberg&#8217;s Pragmatic Bookshelf release, <a href="http://pragprog.com/titles/snfocus/pomodoro-technique-illustrated">Pomodoro Technique Illustrated</a> for more information.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2010/01/pomodoro/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Go is a Series of Tubes</title>
		<link>http://www.kevingisi.com/2009/12/go-is-a-series-of-tubes/</link>
		<comments>http://www.kevingisi.com/2009/12/go-is-a-series-of-tubes/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 02:32:16 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[channels]]></category>
		<category><![CDATA[go routines]]></category>
		<category><![CDATA[parallelism]]></category>
		<category><![CDATA[tubes]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=580</guid>
		<description><![CDATA[Go, the brand-spanking new language from Google that arrived November 10, 2009, is a compiled, concurrent, threaded systems language &#8212; the first systems language of this decade!
The intent was to produce a language that had performance comparable to C, but developer satisfaction comparable to that of Python or Ruby. The language features some impressive ideas, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://golang.org">Go</a>, the brand-spanking new language from Google that arrived November 10, 2009, is a compiled, concurrent, threaded systems language &mdash; the first systems language of this decade!</p>
<p>The intent was to produce a language that had performance comparable to C, but developer satisfaction comparable to that of Python or Ruby. The language features some impressive ideas, including type inference, shorthand for declaration, initialization, and assignment, and interfaces, but I&#8217;d like to talk about my favorite features &#8211; Go routines and channels.</p>
<h2 style="padding-bottom:0px">&#8220;Hey Joey, look at the f***in&#8217; tubes!&#8221;</h2>
<h2 style="text-align: right; padding-top:0px"><em>~George Carlin</em></h2>
<p><img src="http://kevingisi.com.s3.amazonaws.com/tubes.jpg" width=480px /></p>
<p><strong>Go Routines</strong><br />
Rather than using threads, Go supplies a mechanism called a Go routine. While these operate in a similar manner to threads, they have the benefit of being load-balanced internally across real threads by the Go language.</p>
<pre><code>func threadedThing(){
  // Do some stuff
}

func main() {
  go threadedThing();
  // Continue without blocking!
}</code></pre>
<p>Go routines can also be declared anonymously, like so:</p>
<pre><code>func main() {
  go func() {
    // Do some stuff
  }(); // <- parentheses to call the function
  // Continue without blocking!
}</pre>
<p></code></p>
<p><strong>Channels (Tubes)</strong><br />
Go calls them channels, I call them tubes! Channels form the basis of how we can communicate between Go routines. Take the following example:</p>
<pre><code>func printer(input chan int){
  var a int;
  for {
    a <- input;
    fmt.println("Receieved: ",a);
  }
}

func main() {
  tube := make(chan int);
  go printer(tube);
  for i:=0; i < 10; i++ {
    tube <- i;
  }
}</code></pre>
<p>In the above example, the <code>printer</code> will block until it receives an item from the input channel (<code>a <- input</code>), and then print it  out. Meanwhile, the <code>main</code> send values through the channel (<code>tube <- i</code>) - and it also blocks. However, if we change the declaration of the channel to include a buffer...</p>
<pre><code>tube := make(chan int, 10)</code></pre>
<p>...the <code>main</code> can continue to loop, simply dropping things into the channel buffer.</p>
<p><strong>When is a tube not a tube?</strong><br />
Consider the following example:</p>
<pre><code>func main() {
  killswitch := make(chan int);
  go server(killswitch);
  // Do some work
  <- killswitch;
}</pre>
<p></code><br />
Here we see an example of how you might "join" another "thread", but in Go terms. Rather than using the channel to communicate data, we simply await any communication from the channel, and then quit. Since reading from the channel is a blocking operation, the <code>server</code> Go routine can simply write any value to the <code>killswitch</code> channel, and the <code>main</code> will read it, discard it, and terminate.</p>
<p>Channels can be used for a variety of different purposes - to transmit data, to acts as a termination signal, and even as semaphores. The flexibility of a language like Go makes it a treat to work with, and I encourage you to head over to <a href="http://golang.org">http://golang.org</a> and take a look for yourself!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/12/go-is-a-series-of-tubes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RubyConf Part Three: This is Why</title>
		<link>http://www.kevingisi.com/2009/11/rubyconf-part-three-this-is-why/</link>
		<comments>http://www.kevingisi.com/2009/11/rubyconf-part-three-this-is-why/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 01:13:05 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Conferences and Code Camps]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubyconf]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=558</guid>
		<description><![CDATA[


The final day of RubyConf 2009 was a poignant reminder of _Why: why we love Ruby, why we go to conferences, and why the Ruby community is unlike any collection of developers. This was perhaps embodied best by the Programming with the Stars event which ran during the lunch period of each day of the [...]]]></description>
			<content:encoded><![CDATA[<div style="margin-bottom:10px">
<img src="http://kevingisi.com.s3.amazonaws.com/why.png" width=480px />
</div>
<p>The final day of RubyConf 2009 was a poignant reminder of _Why: why we love Ruby, why we go to conferences, and why the Ruby community is unlike any collection of developers. This was perhaps embodied best by the <em>Programming with the Stars</em> event which ran during the lunch period of each day of the conference.</p>
<p>Developers passionately watched as pairs competed in a paired-programming event to demonstrate good coding practices and refactor things for the better. Every individual in the room was excited and involved in considering best practices for development in Ruby&mdash;in what other community are individuals so excited about not only getting work done, but doing it in the best way possible? A big thanks to Corey Haines (<a href="http://twitter.com/coreyhaines">@coreyhaines</a>) for organizing this event!</p>
<p>The day had several great talks as well. </p>
<ul>
<li>
Stuart Holloway urged Rubyists to consider what their next language was going to be&mdash;specifically, by discussing things he loved about Clojure. Stuart reminded us that we&#8217;re passionate developers, and our enthusiasm doesn&#8217;t need to be constrained to a specific language domain&mdash;get out there and have fun with something new.
</li>
<li>
Aaron Patterson (<a href="http://twitter.com/tenderlove">@tenderlove</a>) and Ryan Davis brought the house down with their <em>Worst. Ideas. Ever</em> presentation. Some of the fantastic topics included optimizing web performance by writing in assembly, <span class="callout">&#8220;Ruby doesn&#8217;t scale&#8230;but XML scales like a boss!&#8221;</span>using PHP for Rails views, and making Ruby more &#8220;enterprise&#8221; by converting it to XML (because, as everyone knows, Rails doesn&#8217;t scale, but XML does). The mentioned that they actually did encounter a few bugs in Nokogiri and other libraries, just in writing the samples for this project&mdash;bugs that likely could have gone unchecked otherwise. The overall message: do stupid stuff; play with fire; having fun with a language is hardly something to be avoided&mdash;even if the overall product might not have any real value.
</li>
</ul>
<p>As the _why-esque art from the RubyConf whiteboard&mdash;along with all the presentations from the event&mdash;remind us, Ruby is fun, Ruby is never finished, and there are always people who look forward to working with you in the community.</p>
<p>Thanks to everyone involved for a truly phenomenal RubyConf 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/11/rubyconf-part-three-this-is-why/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[RubyConf 2009]]></series:name>
	</item>
		<item>
		<title>RubyConf Part Two: Principles and Progress</title>
		<link>http://www.kevingisi.com/2009/11/rubyconf-part-two-principles-and-progress/</link>
		<comments>http://www.kevingisi.com/2009/11/rubyconf-part-two-principles-and-progress/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 04:26:48 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Conferences and Code Camps]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=545</guid>
		<description><![CDATA[

http://commons.wikimedia.org/wiki/File:GoldenGateBridge-001.jpg / CC BY 2.5

Day two of RubyConf 2009 was just as exciting as the first. Unfortunately, I slept through a piece of it! I woke up around 9:30AM&#8212;just short of making it to Ben Scofield (@bscofield)&#8217;s presentation on non-relational databases. Ben gave a really fantastic presentation at Windy City Rails 2009, where he described [...]]]></description>
			<content:encoded><![CDATA[<div style="margin-bottom:10px">
<img src="http://kevingisi.com.s3.amazonaws.com/sfgg.png" width=480px /></p>
<div xmlns:cc="http://creativecommons.org/ns#" about=""><a rel="cc:attributionURL" href="http://commons.wikimedia.org/wiki/File:GoldenGateBridge-001.jpg">http://commons.wikimedia.org/wiki/File:GoldenGateBridge-001.jpg</a> / <a rel="license" href="http://creativecommons.org/licenses/by/2.5/">CC BY 2.5</a></div>
</div>
<p>Day two of RubyConf 2009 was just as exciting as the first. Unfortunately, I slept through a piece of it! I woke up around 9:30AM&mdash;just short of making it to Ben Scofield (<a href="http://twitter.com/bscofield">@bscofield</a>)&#8217;s presentation on non-relational databases. Ben gave a really fantastic presentation at <a href="http://windycityrails.com">Windy City Rails</a> 2009, where he described particular problem domains that don&#8217;t lend themselves to standard relational modeling&mdash;specifically cross-bred animals like Ligers when trying to model classifications of species, or worse, the incredibly confusing situation regarding comic books. From talking to Ben, the presentation he gave today would have been a great followup to that talk &#8211; as he demonstrated some of the non-relational tools that developers are beginning to use for persistence. I&#8217;m very sorry I missed his talk, but thankfully, all the presentations are being recorded!</p>
<p>Great talks continued throughout the day; some of the highlights included:</p>
<ul>
<li>
Jim Weirich (<a href="http://twitter.com/jimweirich">@jimweirich</a>)&#8217;s talk on SOLID Ruby covered the idea that as developers, we still have a really hard time discussing what good code design is. The SOLID principles were laid out as objective means of evaluating static languages&mdash;but that doesn&#8217;t mean there isn&#8217;t great use for them as guides for developing Ruby code. <span class="callout">SOLID, while written for static languages, is a good guide for Ruby</span>Most notably, Jim talked about how Java developers consistently try to &#8220;program to the interface&#8221;, because the abstraction layer of interfaces allows for increased modularity. With Ruby, this isn&#8217;t necessary&mdash;objects are objects. However, in order to maintain the modularity, clients who use functions that expect a certain type of object need to know what the input specs are. Therefore, it&#8217;s incredibly important to discuss the virtual concept of &#8220;protocol&#8221; between methods, in documentation.
</li>
<li>
Chris Wanstrath (<a href="http://twitter.com/defunkt">@defunkt</a>) presented on Python&mdash;specifically looking at ideas that the Ruby community could learn from or take away. He gave a brief overview of the language, and a brief description of some of the cool libraries that Ruby doesn&#8217;t quite have, or could improve upon. Chris&#8217; ultimate message was that adopting new languages is a practice that should be encouraged, because communities have a lot to learn from each other, and it&#8217;s never good to get too comfortable at any one thing for too long.
</li>
<li>
Noah Thorpe (<a href="http://twitter.com/aquabu">@aquabu</a>) gave a demonstration of various audio libraries in Ruby. He discussed how music could be generated from mathematical constants, using various technologies. However, Ruby does have the limitation of being an interpreted language, so real-time audio is a bit crippled. He did suggest, however, that JRuby might help to fix this problem. Several of the <a href="http://github.com/aquabu/snorkle">demos</a> were very exciting, and I can&#8217;t wait to play around with the code myself.
</li>
</ul>
<p>Day two of the conference ended with a hasty rush to the Startup Crawl&mdash;a tour of open-house events hosted by Ruby startups in the San Francisco area. While I decided not to attend, many developers are currently traveling between such wonderful companies as Scribd, Engine Yard, Heroku, Justin.tv, Apture, Yammer, HeyZap, Pivotal Labs, SocialCast, Sauce Labs, ZenDesk, Shop It To Me, Chargify, BigTent, Airbnb, Plato&#8217;s Forms, and Dropbox. </p>
<p>Recent Twitter updates suggest some transportation hiccups, but it appears to be a great event!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/11/rubyconf-part-two-principles-and-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[RubyConf 2009]]></series:name>
	</item>
		<item>
		<title>RubyConf Part One: Education and Ideals</title>
		<link>http://www.kevingisi.com/2009/11/rubyconf-part-one-education-and-ideals/</link>
		<comments>http://www.kevingisi.com/2009/11/rubyconf-part-one-education-and-ideals/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 10:23:47 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Conferences and Code Camps]]></category>
		<category><![CDATA[edd]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubyconf]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=528</guid>
		<description><![CDATA[

http://www.flickr.com/photos/cnbattson/ / CC BY-NC-ND 2.0

Way out in San Francisco, I&#8217;m attending RubyConf 2009 from November 19 through November 21, and JRubyConf 2009 on November 22. It was a pretty significant financial investment (many attendees receive corporate travel funds) but I managed to make it out to San Francisco early Wednesday.
For me, the experience actually started [...]]]></description>
			<content:encoded><![CDATA[<div style="margin-bottom:10px">
<img src="http://images.kevingisi.com/sf.png" width=480px /></p>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/cnbattson/192162591/"><a rel="cc:attributionURL" href="http://www.flickr.com/photos/cnbattson/">http://www.flickr.com/photos/cnbattson/</a> / <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/">CC BY-NC-ND 2.0</a></div>
</div>
<p>Way out in San Francisco, I&#8217;m attending <a href="http://rubyconf.org">RubyConf</a> 2009 from November 19 through November 21, and <a href="http://jrubyconf.com">JRubyConf</a> 2009 on November 22. It was a pretty significant financial investment (many attendees receive corporate travel funds) but I managed to make it out to San Francisco early Wednesday.</p>
<p>For me, the experience actually started just after I switched planes &#8211; I discovered that I had actually been sat next to the department head of the computer science department at Michigan Tech. My usual social-anxiety-ridden self, I sat and read for a while, listening to music. Then, in the spirit of RubyConf, I decided I had a duty to be outgoing. She and I talked for the majority of the flight about the structure of their program, difficulties faced in CS education, and the gamut of subjects. She really got me to reconsider whether I&#8217;ll be looking at grad school when my undergrad career is over.</p>
<p>Then, of course, I arrived in San Francisco, took the shuttle to the hotel, and discovered that the hotels are quite segregated. After about two hours of walking, I managed to find a little downtown area, bought some Subway, and it was a good day.</p>
<p>RubyConf began with Matz&#8217; keynote &#8211; he discussed the idea of a &#8220;true&#8221; language. Matz (<a href="yukihiro_matz">@yukihiro_matz</a>) discussed the idea of creating a language that can solve 80% of the worlds&#8217; problems &#8211; naming it ZPET (Zero-Point-Eight True). He argued that Ruby needs to improve on distributed systems, and needs to provide better solutions for functional programming, but that ultimately, Ruby could be the ZPET that the world needs.</p>
<p>There were some fantastic presentations throughout the day:</p>
<ul>
<li>
Several Japanese Ruby developers gave talks expressing their concern about the communication gap between US and Japanese Rubyists, noting that the core team of developers working on the Ruby implementation conduct their work in Japanese &#8211; making collaboration difficult. They discussed some of the activities the Japanese Ruby community is involved in, and invited everyone to attend RubyKaigi in 2010.
</li>
<li>
Sarah Mei <a href="http://twitter.com/sarahmei">@sarahmei</a> gave a talk about her experience teaching Ruby to high-school girls. Using the Shoes framework as a platform, she was able to give some impressive insight into what students found easy, difficult, or just plain fun. She pointed out the fact that the stereotypes surrounding programming need to be updated, as programming &#8220;has more to do with language than with math.&#8221;
</li>
<li>
Nathan Talbott <a href="http://twitter.com/ntalbott">@ntalbott</a> spoke out against reliance on TDD/BDD alone to make a project succeed&mdash;it&#8217;s simply not the case. Nate identified a possible cause&mdash;that features requested by clients (or determined by developers) are not always perfect. <span class="callout">We&#8217;re good at solving problems, but not knowing which problems to solve</span>As developers, we&#8217;ve become very good at solving problems, but not great at determining which problems to solve. He discussed the idea of Experiment Driven Development (EDD) to help address this issue. Using new frameworks like <a href="http://j.mp/LHqq6">Vanity</a>, which was just released today by <a href="http://twitter.com/assaf">@assaf</a>, we can take a baseline product, and test conversion rates on different projected features &#8211; this helps direct developers into solving the correct problems, rather than arguing over which features need to be implemented, or have a net effect on the user experience.
</li>
<li>
Oh yes, and there were flying robots!<br />
<img src="http://images.kevingisi.com/flying_robots.jpg" width=200px />
</li>
<p>After the regular sessions ended, I meandered on over to Kincaid&#8217;s Bayhouse, which featured a fantastic dinner, with some new friends. Truly, this has already been a fantastic experience, and I can&#8217;t wait for tomorrow&#8217;s sessions!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/11/rubyconf-part-one-education-and-ideals/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<series:name><![CDATA[RubyConf 2009]]></series:name>
	</item>
		<item>
		<title>A Curious Use For Selenium &#8211; Slideshows</title>
		<link>http://www.kevingisi.com/2009/11/a-curious-use-for-selenium-slideshows/</link>
		<comments>http://www.kevingisi.com/2009/11/a-curious-use-for-selenium-slideshows/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 17:31:04 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[s9]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[slideshow]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=517</guid>
		<description><![CDATA[As a cheap, and tech-agnostic developer, I&#8217;ve particularly enjoyed using the Slideshow (S9) gem to create my slidedecks for various presentations I&#8217;ve given. Thanks to some phenomenal jQuery, I&#8217;m able to write up my talks in Markdown, generate an HTML page, and give my talk directly from the browser.
But I&#8217;m a lazy, cheap, tech-agnostic developer. [...]]]></description>
			<content:encoded><![CDATA[<p>As a cheap, and tech-agnostic developer, I&#8217;ve particularly enjoyed using the <a href="http://slideshow.rubyforge.org/">Slideshow (S9)</a> gem to create my slidedecks for various presentations I&#8217;ve given. Thanks to some phenomenal jQuery, I&#8217;m able to write up my talks in Markdown, generate an HTML page, and give my talk directly from the browser.</p>
<p>But I&#8217;m a lazy, cheap, tech-agnostic developer. To make things a bit easier, I went to the trouble of creating a continuous build system on my private git repository, that creates my HTML page when I commit the Markdown file, pushes it out to http://slides.kevingisi.com/<emph>presentation</emph>, and no manual building for me anymore.</p>
<p>There was a problem, however. While S9 will gracefully degrade into an outline format, there was no real way for me to display a nice thumbnail version of the slides. I was left with no distributable of my slidedeck. And sadly, Internet Explorer users were unable to view my slides, because S9 is utterly incompatible with IE (read: S9 was written in the past 10 years).</p>
<p>Enter Selenium! After a bit of setup, I was able to get Selenium working with Firefox-headless, to grab a screenshot of each slide in the slidedeck. <span class="callout">Selenium, Firefox-headless, and Xvbf let me grab snapshots of each of my slides, and ImageMagick created a PDF</span>To make this easy, I took a copy of <a href="http://twitter.com/jeffrafter">@jeffrafter</a>&#8217;s <a href="http://github.com/jeffrafter/crocodile">Crocodile</a> gem, made a few modifications (mainly, executing Javascript calls to advance slides before taking screenshots), set up the X virtual frame buffer out on my server (big thanks to this tutorial: <a href="http://www.alittlemadness.com/2008/03/05/running-selenium-headless/">Running Selenium Headless</a>), and boom! Now, I&#8217;ve got PNG images of every slide in the deck, ready and available. Throw in a little ImageMagick (<code>convert slide_*.png slide.pdf</code>), and now I&#8217;ve got a fine distributable that can be uploaded to SlideShare, printed off, copied, and viewed by Internet Explorer users. Just take a look at the results!</p>
<div class="slide" style="padding:10px; background-color:#fff">
<h2>Ruby on Rails: The Third Age</h2>
<div class="description">
<a href="http://slides.kevingisi.com/RubyThirdAge"><img src="http://images.kevingisi.com/RubyThirdAge_001.png"/></a>The Ruby on Rails framework is going through some radical changes. Not only are we on the cusp of Rails 3, but new technologies like InheritedResources and Formtastic allow us to do things we never could have dreamed of before. Have you seen Ryan Bates&#8217; tutorial on building a blog in 15 minutes in Rails? Let&#8217;s cut that down to five.</p>
<p>Together, we&#8217;ll take a look at some of the new gems and plugins that have been released, along with some of the upcoming changes with Rails 3 to see how this technology can make your development experience even easier.
</p></div>
<div class="info">
<div class="associated">
<strong>Associated Resources</strong><br />
Slides: <a href="http://slides.kevingisi.com/RubyThirdAge">HTML</a> | <a href="http://slides.kevingisi.com/RubyThirdAge/RubyThirdAge.pdf">PDF</a><br />
<a href="http://speakerrate.com/talks/1624-ruby-on-rails-the-third-age">SpeakerRate</a>
</div>
<div class="additional">
</div>
<div class="where">
<strong>Dates and Locations</strong><br />
Chippewa Valley Code Camp&mdash;November 14, 2009
</div>
</div>
</div>
<p>Selenium has notoriously been used for integration testing, and @jeffrafter used it to grab screenshots of submissions for the Rails Rumble 2009, but this modification makes browser-based Slideshows even more accessible!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/11/a-curious-use-for-selenium-slideshows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Firefox Extension Under New Management</title>
		<link>http://www.kevingisi.com/2009/10/firefox-extension-under-new-management/</link>
		<comments>http://www.kevingisi.com/2009/10/firefox-extension-under-new-management/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 01:28:23 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Firefox Extensions]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[publications]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=467</guid>
		<description><![CDATA[Last Friday, I received a phone call from The Pragmatic Programmers, my publisher on the Firefox Extensions: Tools for Productivity book. Unfortunately, they decided it was no longer in their best interest to continue with my book, so Prags and I are parting ways.
I&#8217;d like to thank Dave &#38; Andy for their support as I [...]]]></description>
			<content:encoded><![CDATA[<p>Last Friday, I received a phone call from The Pragmatic Programmers, my publisher on the <b>Firefox Extensions: Tools for Productivity</b> book. Unfortunately, they decided it was no longer in their best interest to continue with my book, so Prags and I are parting ways.</p>
<p>I&#8217;d like to thank Dave &amp; Andy for their support as I began developing this book, and their helpful feedback as I&#8217;ve gone through various revisions. I would also really like to extend my appreciation to my editor Susannah Pfalzer, who was extremely helpful in guiding me toward reshaping the book toward a more effective product. While I wish that we could continue working together, your help was extremely valuable and appreciated.</p>
<p>I am pleased to announce that I <strong>will continue writing the Firefox Extension book as planned</strong>. I&#8217;ll be moving the existing content into DocBook, and continue writing. I&#8217;m looking forward to seeing this book come to fruition, and I&#8217;ve got a number of supportive individuals who are eager to review and refactor. While I&#8217;m currently on the prowl for a new publisher, I&#8217;m prepared to self-publish this book if that doesn&#8217;t happen.</p>
<p>If anyone would be interested in helping edit or review, as I push forward with this text, it would be much appreciated&mdash;let me know in the comments. Thanks in advance for your support!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/10/firefox-extension-under-new-management/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kindness in the Development Community</title>
		<link>http://www.kevingisi.com/2009/10/kindness-in-the-development-community/</link>
		<comments>http://www.kevingisi.com/2009/10/kindness-in-the-development-community/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 19:03:00 +0000</pubDate>
		<dc:creator>Kevin W. Gisi</dc:creator>
				<category><![CDATA[Conferences and Code Camps]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[code camps]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[tccc]]></category>

		<guid isPermaLink="false">http://www.kevingisi.com/?p=448</guid>
		<description><![CDATA[I gave my presentation, No More Excuses: Test Your Javascript!, at the Twin Cities Code Camp yesterday, October 24, 2009. We left town at 6 AM, and managed to get to the conference with plenty of time to spare.
I discovered, once I had found the room, set up my laptop, gotten the display working&#8230;I couldn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I gave my presentation, <a href="http://slides.kevingisi.com/TestYourJavaScript">No More Excuses: Test Your Javascript!</a>, at the Twin Cities Code Camp yesterday, October 24, 2009. We left town at 6 AM, and managed to get to the conference with plenty of time to spare.</p>
<p>I discovered, once I had found the room, set up my laptop, gotten the display working&#8230;<span class="callout">I couldn&#8217;t get to my slides!</span>the servers at the University of Minnesota were down &#8211; I couldn&#8217;t get to my slides. I panicked, having only 15 minutes to try and fix the situation before I had to present. As the talk drew nearer, I finally opened up Notepad, grew the font, and listed the title, contact information, and slide url &#8211; along with an apology for the network issues. </p>
<p>Assuring my audience that my slides were &#8220;awesome&#8221;, &#8220;flawless&#8221;, and otherwise &#8220;perfect,&#8221; I preceded to begin my talk. Fortunately, I had decided to refocus my talk from a description of particular Javascript libraries, to a discussion of why we need to address current Javascript practices. Using the whiteboard as best as possible, I gave a brief overview of the topics I was going to lightly touch on&mdash;Javascript performance, Javascript functionality, and progressive enhancement.</p>
<p>Then, an extraordinary thing happened&mdash;one of the audience members (<a href="http://twitter.com/joelknighton">@joelknighton</a>) jumped up and began the process of tethering my laptop to his phone. When he discovered I didn&#8217;t have the necessary drivers, he checked in with other audience members who had laptops, and found one that was appropriately set up. All of this while I continued my presentation.</p>
<p>My slides were up and running within about five minutes, and I was able to seamlessly transition over, without losing the audience&#8217;s focus, and without having to be particularly redundant. I was able to finish the presentation, and went extremely well. A few things to take away:</p>
<h2>Have a local copy of everything</h2>
<p>This ought to be a no-brainer, and I was sure that I had a local copy. Furthermore, there had been multiple wifi hotspots last time, so what risk was I really taking? You&#8217;ve got to plan for the worst &#8211; keep things local, no matter what&mdash;nobody likes egg on their face.</p>
<h2>Practice slideless talks</h2>
<p>Despite not having my slides available for the first 20 minutes or so, I was able to communicate relatively effectively about my topic. Granted, I did have a more difficult time moving through things procedurally, but I was able to get the discussion points across. This is definitely something worth practicing, because if your computer explodes, your slides get deleted, you need to be able to speak on your topic without the visual aids you might have otherwise leaned on.</p>
<h2>The development community is fantastic</h2>
<p>It would have been extremely easy for individuals to react poorly to my preparation failure. People could have walked out; people could have tweeted cynical comments; people could have glared and tuned out&mdash;and I really couldn&#8217;t have blamed them. Instead, the audience remained receptive and respectful, sympathized with the situation, and actively helped me fix the problem. I&#8217;m extremely humbled and honored to be a member of the development community.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevingisi.com/2009/10/kindness-in-the-development-community/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
