<?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>Steve Heffernan's Blog</title>
	<atom:link href="http://blog.steveheffernan.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.steveheffernan.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 25 May 2010 16:25:02 +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>Tutorial: How to Build an HTML5 Video Player</title>
		<link>http://blog.steveheffernan.com/2010/04/how-to-build-an-html5-video-player/</link>
		<comments>http://blog.steveheffernan.com/2010/04/how-to-build-an-html5-video-player/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 23:54:45 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Video Encoding]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=350</guid>
		<description><![CDATA[UPDATE: This tutorial has been rolled into an open source html5 video player.
This is a tutorial on building an HTML5 video player in Javascript. It&#8217;s meant to give you a basic understanding of the different options you have with the new video tag in HTML5, and the javascript needed to create some of the typical [...]]]></description>
			<content:encoded><![CDATA[<p>UPDATE: This tutorial has been rolled into an open source <a href="http://videojs.com">html5 video player</a>.</p>
<p>This is a tutorial on building an HTML5 video player in Javascript. It&#8217;s meant to give you a basic understanding of the different options you have with the new video tag in HTML5, and the javascript needed to create some of the typical video controls you&#8217;d find in other players. It&#8217;s library agnostic, meaning you don&#8217;t need a library like jQuery to create it, however once you understand how everything works it can definitely be simplified/improved on. I&#8217;m always open for feedback if you have suggestions.</p>
<p>
<h3><a href="http://www.steveheffernan.com/html5-video-player/demo-video-player.html" target="_blank">View the final result.</a></h3>
</p>
<p><span id="more-350"></span></p>
<h2>Setup</h2>
<p>Download these movies for testing.<br />
<a href="http://zencoder-demo.s3.amazonaws.com/trailer_test.mp4">trailer_test.mp4</a><br />
<a href="http://zencoder-demo.s3.amazonaws.com/trailer_test.ogg">trailer_test.ogg</a><br />
(c) copyright Blender Foundation | <a href="http://www.bigbuckbunny.org">www.bigbuckbunny.org</a>
</p>
<p>To speed things along, copy the source of the following link.</p>
<p><a href="http://www.steveheffernan.com/html5-video-player/start.html" target="_blank">start.html </a></p>
<p>&#8230;and create a file in the same folder as the downloaded movies. The page has the html for the video tag, controls, and some basic javascript variables set up. Hopefully it&#8217;s straight forward enough without going into too much more detail. Afterwards you can easily restyle everything to make it look however you want. </p>
<h2>HTML5 Video Tag</h2>
<p>The &lt;video&gt; tag is basically a new tag introduced in HTML5 that allows you to embed video in a web page without having to use Flash or another embeddable plugin, and instead use a player that&#8217;s built into the browser. It&#8217;s only supported by advanced browsers like Firefox, Safari, Chrome, and Opera. Not Internet Explorer, though IE9 is supposed to support it. For your video to work in all the advanced browsers, it has to be converted into at least 2 formats: h.264 (Safari and Chrome) and Ogg (Firefox and Opera). VP8, a new codec from On2/Google, may eventually remove the need for multiple versions, but that could take some time.</p>
<p>I&#8217;ve already set up the video tag in the example code, and I&#8217;m not going to go into the specific attributes of the video tag beyond what&#8217;s needed for this tutorial, but if you&#8217;re looking for some good resources on using the video tag specifically, start with Kroc Camen&#8217;s <a href="http://camendesign.com/code/video_for_everybody">Video for Everybody</a>.</p>
<p>Ok, getting on to it.</p>
<h2>Controller Setup</h2>
<p>The controller html has already been created, but it needs to be positioned and revealed. The showController method is simple, but can be expanded on if you want to add effects.</p>
<pre class="brush: jscript;">
function showController(){
  controls.style.display = &quot;block&quot;;
}
</pre>
<p>The positionController function moves the controller to the bottom left of the video and makes it as wide as the video.</p>
<pre class="brush: jscript;">
function positionController(){
  controls.style.top = (video.offsetHeight - controls.offsetHeight) + &quot;px&quot;;
  controls.style.left = &quot;0px&quot;;
  controls.style.width = video.offsetWidth + &quot;px&quot;;
  sizeProgressBar();
}
</pre>
<p>We also want to resize the progress section so the controls fill the width of the video. The numbers being subtracted from the widths are specific to the example design, and will change if you create your own.</p>
<pre class="brush: jscript;">
function sizeProgressBar(){
  progressControl.style.width = (controls.offsetWidth - 125) + &quot;px&quot;;
  progressHolder.style.width = (progressControl.offsetWidth - 80) + &quot;px&quot;;
}
</pre>
<p>Once these functions are created we need to add them to the bodyLoaded function. The show function has to come first for the positioning to work.</p>
<pre class="brush: jscript;">
var bodyLoaded = function(){
  ...
  showController();
  positionController();
}
</pre>
<h2>Play/Pause</h2>
<p>To play and pause the video, we can use the play() and pause() methods of the video element. Create functions that will call these methods.</p>
<pre class="brush: jscript;">
function playVideo(){
  video.play();
  playControl.className = &quot;pause control&quot;;
}

function pauseVideo(){
  video.pause();
  playControl.className = &quot;play control&quot;;
}
</pre>
<p>I&#8217;ve also added lines that update the class of the play button to switch it between the play and pause icons.</p>
<p>Next we have to add an event listener for the play button to handle when a user clicks it. We need to add it to bodyLoaded method so it waits for the play button to be available. We&#8217;ll use the &#8216;paused&#8217; attribute to decide which method to call.</p>
<pre class="brush: jscript;">
playControl.addEventListener(&quot;click&quot;, function(){
  if (video.paused) {
    playVideo();
  } else {
    pauseVideo();
  }
}, true);
</pre>
<h2>Play Progress</h2>
<p>Next we&#8217;ll want to show the progress of the video as it plays. To do this we&#8217;ll need to set an interval that continually updates the progress bar width. We only want the interval to run when the video is playing however, so we&#8217;ll also create a function that stops the interval, that will be called whenever the video is paused.</p>
<pre class="brush: jscript;">
function trackPlayProgress(){
  playProgressInterval = setInterval(updatePlayProgress, 33);
}

function stopTrackingPlayProgress(){
  clearInterval(playProgressInterval);
}
</pre>
<p>The updatePlayProgress function uses the video&#8217;s current time to total time (duration) ratio, to resize the progress bar based on the progress bar holder&#8217;s width. The &#8220;- 2&#8243; is to account for the border on the progressHolder.</p>
<pre class="brush: jscript;">
function updatePlayProgress(){
  playProgressBar.style.width = ((video.currentTime / video.duration) * (progressHolder.offsetWidth - 2)) + &quot;px&quot;;
}
</pre>
<p>Now that we have these functions in place, we need to add them to the play and pause functions to trigger them.</p>
<pre class="brush: jscript;">
function playVideo(){
  ...
  trackPlayProgress();
}

function pauseVideo(){
  ...
  stopTrackingPlayProgress();
}
</pre>
<p>We&#8217;ll also add the updatePlayProgress method to the sizeProgressBar method, so whenever the progress bar is resized, the current progress is updated as well.</p>
<pre class="brush: jscript;">
function sizeProgressBar(){
  ...
  updatePlayProgress();
}
</pre>
<h2>Time Display</h2>
<p>Next we&#8217;ll want to update the time display (to the right of the progress bar) to show the exact time through the video. I&#8217;m using the formatTime method to convert seconds into a MM:SS format.</p>
<pre class="brush: jscript;">
function updateTimeDisplay(){
  currentTimeDisplay.innerHTML = formatTime(video.currentTime);
  if (video.duration) durationDisplay.innerHTML = formatTime(video.duration);
}

function formatTime(seconds) {
  seconds = Math.round(seconds);
  minutes = Math.floor(seconds / 60);
  minutes = (minutes &gt;= 10) ? minutes : &quot;0&quot; + minutes;
  seconds = Math.floor(seconds % 60);
  seconds = (seconds &gt;= 10) ? seconds : &quot;0&quot; + seconds;
  return minutes + &quot;:&quot; + seconds;
}
</pre>
<p>After we have these functions, we need to add them to updateTimeDisplay to the updatePlayProgress method, so it&#8217;s called at the same time.</p>
<pre class="brush: jscript;">
function updatePlayProgress(){
  ...
  updateTimeDisplay();
}
</pre>
<h2>Progress Bar Scrubbing</h2>
<p>Now that we&#8217;re showing the progress through the video, we want to make it so you can click and drag on the progress bar to move around in the video&#8217;s timeline. For this we&#8217;ll need a few new functions.</p>
<p>The setPlayProgress uses a click X value to tell where on the bar the user clicked or dragged. The Math.max and Math.min functions are used to make sure the video time is never set to a point outside of 0-100% of the duration.</p>
<pre class="brush: jscript;">
function setPlayProgress(clickX) {
  var newPercent = Math.max(0, Math.min(1, (clickX - findPosX(progressHolder)) / progressHolder.offsetWidth));
  video.currentTime = newPercent * video.duration
  playProgressBar.style.width = newPercent * (progressHolder.offsetWidth - 2)  + &quot;px&quot;;
  updateTimeDisplay();
}
</pre>
<p>The blockTextSelection and unblockTextSelection methods are used so when the user is dragging the mouse, it&#8217;s not selecting the elements under it.</p>
<pre class="brush: jscript;">
function blockTextSelection(){
  document.body.focus();
  document.onselectstart = function () { return false; };
}

function unblockTextSelection(){
  document.onselectstart = function () { return true; };
}
</pre>
<p>The findPosX function is used to determine an object&#8217;s x value in relation to the edge of the page. This is required to compare the user&#8217;s click to the location of the progress bar.</p>
<pre class="brush: jscript;">
function findPosX(obj) {
  var curleft = obj.offsetLeft;
  while(obj = obj.offsetParent) {
    curleft += obj.offsetLeft;
  }
  return curleft;
}
</pre>
<p>Now that we have these functions, we need to add a couple of event listeners (in the bodyLoaded function) to handle when a user clicks and drags on the progress bar. We&#8217;ll use the videoWasPlaying variable to keep track of the status of the video, so we can pause the video while the user is scrubbing, and start it again when they stop if it was playing before.</p>
<pre class="brush: jscript;">
progressHolder.addEventListener(&quot;mousedown&quot;, function(){
  stopTrackingPlayProgress();

  if (video.paused) {
    videoWasPlaying = false;
  } else {
    videoWasPlaying = true;
    video.pause();
  }

  blockTextSelection();
  document.onmousemove = function(e) {
    setPlayProgress(e.pageX);
  }

  document.onmouseup = function() {
    unblockTextSelection();
    document.onmousemove = null;
    document.onmouseup = null;
    if (videoWasPlaying) {
      video.play();
      trackPlayProgress();
    }
  }
}, true);

progressHolder.addEventListener(&quot;mouseup&quot;, function(e){
  setPlayProgress(e.pageX);
}, true);
</pre>
<h2>Volume Control</h2>
<p>For the volume, we&#8217;ll create a function to set the volume and a function to update the volume display. The setVolume function is similar to the setPlayProgress function. It uses the mouse&#8217;s x position over the volume control to calculate the new volume. In this case, instead of using the Math.max and Math.min function to limit the volume number, I&#8217;m using a simple if/else.</p>
<pre class="brush: jscript;">
function setVolume(clickX) {
  var newVol = (clickX - findPosX(volumeControl)) / volumeControl.offsetWidth;
  if (newVol &gt; 1) {
    newVol = 1;
  } else if (newVol &lt; 0) {
    newVol = 0;
  }
  video.volume = newVol;
  updateVolumeDisplay();
}
</pre>
<p>The volume display used here is specific to this example. It uses bottom borders on &lt;li&gt;s to create the look of bars. The function is used to updated the color of each bar.</p>
<pre class="brush: jscript;">
function updateVolumeDisplay(){
  var volNum = Math.floor(video.volume * 6);
  for(var i=0; i&lt;6; i++) {
    if (i &lt; volNum) {
      volumeDisplay.children[i].style.borderColor = &quot;#fff&quot;;
    } else {
      volumeDisplay.children[i].style.borderColor = &quot;#555&quot;;
    }
  }
}
</pre>
<p>Now that we have these, we need to add event listeners to bodyLoaded to handle when a user clicks and drags on the volume control.</p>
<pre class="brush: jscript;">
volumeControl.addEventListener(&quot;mousedown&quot;, function(){
  blockTextSelection();
  document.onmousemove = function(e) {
    setVolume(e.pageX);
  }
  document.onmouseup = function() {
    unblockTextSelection();
    document.onmousemove = null;
    document.onmouseup = null;
  }
}, true);

volumeControl.addEventListener(&quot;mouseup&quot;, function(e){
  setVolume(e.pageX);
}, true);
</pre>
<p>We&#8217;ll also call updateVolumeDisplay directly so the volume display is updated when the page is loaded.</p>
<pre class="brush: jscript;">
updateVolumeDisplay();
</pre>
<h2>Full Screen (or Full Window) mode</h2>
<p>Browsers don&#8217;t yet have the capability for us to expand the video to the full screen like you can in Flash video. The best we can get is expanding it to the size of the browser window. You could also potentially resize the window to be larger, but this doesn&#8217;t work in all browsers and can be annoying for the user.</p>
<p>The fullScreenOn function changes the video to a &#8216;fixed&#8217; positioning, puts it at 0,0 in the browser window, and stretches it to the width of the window. It then repositions the controller at the bottom. I&#8217;m also adding a &#8220;fs-active&#8221; class to the button to change the look of the fullscreen icon.</p>
<pre class="brush: jscript;">
function fullScreenOn(){
  videoIsFullScreen = true;
  videoOrigWidth = video.offsetWidth;
  videoOrigHeight = video.offsetHeight;

  video.style.width = window.innerWidth + &quot;px&quot;;
  video.style.height = window.innerHeight + &quot;px&quot;;
  video.style.position = &quot;fixed&quot;;
  video.style.left = 0;
  video.style.top = 0;
  controls.style.position = &quot;fixed&quot;;
  positionController();

  fullScreenControl.className = &quot;fs-active control&quot;;
}
</pre>
<p>The fullScreenOff function resets the video to the original position, width, and height.</p>
<pre class="brush: jscript;">
function fullScreenOff(){
  videoIsFullScreen = false;
  video.style.width = videoOrigWidth + &quot;px&quot;;
  video.style.height = videoOrigHeight + &quot;px&quot;;
  video.style.position = &quot;static&quot;;
  controls.style.position = &quot;absolute&quot;;
  positionController();
  fullScreenControl.className = &quot;control&quot;;
}
</pre>
<p>Next we need to add an even listener to handle clicks on the full screen button.</p>
<pre class="brush: jscript;">
fullScreenControl.addEventListener(&quot;click&quot;, function(){
  if (!videoIsFullScreen) {
    fullScreenOn();
  } else {
    fullScreenOff();
  }
}, true);
</pre>
<h2>Conclusion</h2>
<p>If you&#8217;ve found this useful I&#8217;d appreciate a link or a tweet. And if you can expand on or improve this I would love to hear about it. Thanks! </p>
<p><a href="http://www.steveheffernan.com/html5-video-player/demo-video-player.html" target="_blank">Final code version.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2010/04/how-to-build-an-html5-video-player/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
<enclosure url="http://zencoder-demo.s3.amazonaws.com/trailer_test.mp4" length="3711807" type="video/mp4" />
<enclosure url="http://zencoder-demo.s3.amazonaws.com/trailer_test.ogg" length="3478496" type="video/ogg" />
		</item>
		<item>
		<title>Transcoding as a Service Providers (TaaS)</title>
		<link>http://blog.steveheffernan.com/2010/01/transcoding-as-a-service-providers-taas/</link>
		<comments>http://blog.steveheffernan.com/2010/01/transcoding-as-a-service-providers-taas/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 05:13:26 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[Video Encoding]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=340</guid>
		<description><![CDATA[This is a list of online video transcoding providers in no particular order. More for my own reference.

Pure Transcoders:
FlixCloud &#8212; On-Demand Video Encoding Powered by On2 Flix Engine, Amazon EC2 and Zencoder
Encoding.com &#8212; On Demand Video Encoding
HeyWatch! &#8212; Video encoding web service
HDCloud &#8212; Video Encoding and Video Transcoding In The Cloud
Zencoder &#8212; Online Video Encoding
Closer [...]]]></description>
			<content:encoded><![CDATA[<p>This is a list of online video transcoding providers in no particular order. More for my own reference.<br />
<span id="more-340"></span></p>
<h2>Pure Transcoders:</h2>
<p><a href="http://www.flixcloud.com">FlixCloud</a> &mdash; On-Demand Video Encoding Powered by On2 Flix Engine, Amazon EC2 and Zencoder<br />
<a href="http://encoding.com">Encoding.com</a> &mdash; On Demand Video Encoding<br />
<a href="http://heywatch.com">HeyWatch!</a> &mdash; Video encoding web service<br />
<a href="http://hdcloud.com">HDCloud</a> &mdash; Video Encoding and Video Transcoding In The Cloud<br />
<a href="http://zencoder.tv/">Zencoder</a> &mdash; Online Video Encoding</p>
<h2>Closer to Platforms</h2>
<p><a href="http://mpoint.net/">mPOINT</a> &mdash; Online Video Transcoding and Syndication<br />
<a href="http://www.multicastmedia.com">Multicast</a> &mdash; Live Internet broadcast leader. Online video platform.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2010/01/transcoding-as-a-service-providers-taas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Switch to dot com, or just redirect?</title>
		<link>http://blog.steveheffernan.com/2010/01/switch-to-dot-com-or-just-redirect/</link>
		<comments>http://blog.steveheffernan.com/2010/01/switch-to-dot-com-or-just-redirect/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 06:19:47 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Video Encoding]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=335</guid>
		<description><![CDATA[For a long time Zencoder has had the domain zencoder.tv. Since then we&#8217;ve purchased the dot com version from the original owner. The question now is whether to completely switch over to the dot com version, or just redirect dot com requests to dot tv.

Some things to consider if switching to dot com:
Links from other [...]]]></description>
			<content:encoded><![CDATA[<p>For a long time Zencoder has had the domain <a href="http://zencoder.tv">zencoder.tv</a>. Since then we&#8217;ve purchased the dot com version from the original owner. The question now is whether to completely switch over to the dot com version, or just redirect dot com requests to dot tv.<br />
<span id="more-335"></span><br />
Some things to consider if switching to dot com:<br />
Links from other sites &mdash; we can 301 redirect from dot tv to make sure we don&#8217;t lose links. Also, people may just assume dot com.<br />
Domain age / Backlink Age &mdash; zencode.com is actually older than dot tv, though it never had any links to it. I doubt it would give us any benefit.<br />
Switching emails and calendars &#038;mdash while these can probably be redirected, it would still be a pain to update everything and everyone.</p>
<p>It would probably be best to switch to the dot com, just to make it easier on everyone for the long run, and sooner rather than later.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2010/01/switch-to-dot-com-or-just-redirect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two O&#8217;Ten starts in Silicon Valley</title>
		<link>http://blog.steveheffernan.com/2010/01/two-oten-starts-in-silicon-valley/</link>
		<comments>http://blog.steveheffernan.com/2010/01/two-oten-starts-in-silicon-valley/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 05:46:35 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Goals]]></category>
		<category><![CDATA[One Post Per Day]]></category>
		<category><![CDATA[Video Encoding]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/2010/01/two-oten-starts-in-silicon-valley/</guid>
		<description><![CDATA[I&#8217;ve started the decade by moving up to Silicon Valley. Los Gatos, CA to be specific. Myself and two other founders of Zencoder are here to do some focused work and hopefully raise some capital for further development.

At the moment I&#8217;m alone in a house deep in the woods. The other two guys don&#8217;t show [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve started the decade by moving up to Silicon Valley. Los Gatos, CA to be specific. Myself and two other founders of <a href="http://zencoder.tv">Zencoder</a> are here to do some focused work and hopefully raise some capital for further development.<br />
<span id="more-334"></span><br />
At the moment I&#8217;m alone in a house deep in the woods. The other two guys don&#8217;t show up until tomorrow. </p>
<p>It&#8217;s super quiet except for the occasional house noise, or distant truck struggling up a hill. A little creepy. I&#8217;m fighting the urge to think of scenes from The Shining. It probably didn&#8217;t help that I drank some caffeine then went to bed early.</p>
<p>Last year around this time I started writing one post every day. Even though I only made it through a few months, it was a great excercise, so I&#8217;m trying it again. It should be a little easier this time since i&#8217;m so secluded.</p>
<p>Also my beautiful girlfriend <a href="http://www.jennibrownwrites.com">Jenni</a> will be staring up her regular blogging as well, so check it out. </p>
<p>Until tomorrow&#8230;if I make it through the night, muahahaha! &#8230;frik  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2010/01/two-oten-starts-in-silicon-valley/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe AIR: Opening external links in another browser</title>
		<link>http://blog.steveheffernan.com/2009/08/adobe-air-opening-external-links-in-another-browser/</link>
		<comments>http://blog.steveheffernan.com/2009/08/adobe-air-opening-external-links-in-another-browser/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 23:48:36 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=327</guid>
		<description><![CDATA[I&#8217;ve moved this post to the Sevenwire blog:
http://sevenwire.com/blog/2009/08/26/adobe-air-opening-external-links-in-another-browser.html
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve moved this post to the Sevenwire blog:</p>
<p><a href="http://sevenwire.com/blog/2009/08/26/adobe-air-opening-external-links-in-another-browser.html">http://sevenwire.com/blog/2009/08/26/adobe-air-opening-external-links-in-another-browser.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2009/08/adobe-air-opening-external-links-in-another-browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Snorkel Sale!</title>
		<link>http://blog.steveheffernan.com/2009/07/first-snorkel-sale/</link>
		<comments>http://blog.steveheffernan.com/2009/07/first-snorkel-sale/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 01:43:34 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=319</guid>
		<description><![CDATA[
Last weekend a friend and I put a little more work into our snorkel website. We&#8217;ve still got a ways to go, but it&#8217;s looking a million times better than it did. Apparently it paid off because today I got an email that we made a sale! We sold a pink Kapitol Reef Snorkel interestingly [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="/2009/07/first-snorkel-sale/"><img src="http://blog.steveheffernan.com/wp-content/uploads/kapitol-reef-snorkel-koral-pink_1_medium.png" alt="kapitol-reef-snorkel-koral-pink" title="kapitol-reef-snorkel-koral-pink" width="75" height="240" class="aligncenter" /></a></p>
<p>Last weekend a friend and I put a little more work into our <a href="http://www.prosnorkel.com">snorkel website</a>. We&#8217;ve still got a ways to go, but it&#8217;s looking a million times better than it did. Apparently it paid off because today I got an email that we made a sale! We sold a <a href="http://www.prosnorkel.com/products/kapitol-reef-snorkel-koral-pink">pink Kapitol Reef Snorkel</a> interestingly enough. We only sell Kapitol Reef snorkels at this point, but pink is the last color I expected.<span id="more-319"></span></p>
<p>Soon we&#8217;ll be branching out into other upcoming Kapitol Reef products, including masks, fins, and a pretty slick package that contains everything you need to snorkel like a pro. We really like Kapitol Reef products because they&#8217;re reliable and technologically advanced, but if things go well enough we&#8217;ll look into selling other snorkel brands as well.</p>
<p>We built the store using <a href="http://www.shopify.com/">Shopify</a>, a pretty nice online store system that was built using Ruby on Rails (the language/framework <a href="http://sevenwire.com">Sevenwire</a> uses for web apps). Their template system is probably the best I&#8217;ve seen. The only downsides so far is that we don&#8217;t make enough yet to justify upgrading our plan to get some features we want. Namely coupons and user reviews. User reviews is actually a separate plugin that costs $30/month, which would double how much we&#8217;re paying for Shopify. I doubt we&#8217;ll ever make enough to justify spending $30/month for reviews, and coupons is the only feature we&#8217;d want from the next higher up plan. If we start selling enough it might be worth it, but we&#8217;ll see.</p>
<p><a href="http://www.prosnorkel.com">Buy Kapitol Reef Snorkels Online</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2009/07/first-snorkel-sale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can&#8217;t video chat in iChat</title>
		<link>http://blog.steveheffernan.com/2009/06/cant-video-chat-in-ichat/</link>
		<comments>http://blog.steveheffernan.com/2009/06/cant-video-chat-in-ichat/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 15:37:31 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=310</guid>
		<description><![CDATA[
I recently solved an annoying issue with iChat video not working. Just posting it here incase it&#8217;s helpful to anyone else.

Every day Sevenwire has a standup meeting to go over the status of all of our projects. Our office is in Wisconsin, and I&#8217;m in California, so I video conference in using I iChat. For [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/2009/06/cant-video-chat-in-ichat/" style="display:block; text-align: center;"><img src="http://blog.steveheffernan.com/wp-content/uploads/ichat_av_icon.png" alt="ichat_av_icon" title="ichat_av_icon" width="128" height="128" class="aligncenter size-full" align="center" /></a></p>
<p>I recently solved an annoying issue with iChat video not working. Just posting it here incase it&#8217;s helpful to anyone else.<br />
<span id="more-310"></span><br />
Every day <a href="http://sevenwire.com">Sevenwire</a> has a standup meeting to go over the status of all of our projects. Our office is in Wisconsin, and I&#8217;m in California, so I video conference in using I iChat. For the last few days iChat has been giving me an error every time I try to connect using video or audio. </p>
<p>Error -8 (Did not receive a response from &#8230;&#8230;&#8230;&#8230;&#8230; )</p>
<p>I looked all over and didn&#8217;t find anything that worked. There&#8217;s no where to download and reinstall iChat as far as I can tell, unless you do a custom install from the install disks that came with your computer, which I&#8217;m not sure where those ended up and doubted that would work anyway.  The closest <a href="http://discussions.apple.com/thread.jspa?messageID=9448990">Apple support discussion</a> suggested changing your Quicktime streaming settings:</p>
<p>System Preferences > Quicktime > Streaming to 1.5Mbps and restart iChat</p>
<p>That didn&#8217;t work for me, but in the same post the guys mentioned that &#8220;Error 8 covers things like ports not being open in a firewall&#8230;&#8221;. That reminded me that recently I had turned on Internet Sharing to share my wireless internet to a computer connected by Ethernet. I figured that might be messing with the ports, so I turned it off and wah lah! Fixed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2009/06/cant-video-chat-in-ichat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testing Roommate App</title>
		<link>http://blog.steveheffernan.com/2009/06/testing-roommate-app/</link>
		<comments>http://blog.steveheffernan.com/2009/06/testing-roommate-app/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 05:23:00 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Apps]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=308</guid>
		<description><![CDATA[Just posted on the Roommate App blog about testing. Trying to get back into posting regularly.
]]></description>
			<content:encoded><![CDATA[<p>Just posted on the Roommate App blog about <a href="http://development.roommateapp.com/2009/06/testing-roommate-app/">testing</a>. Trying to get back into posting regularly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2009/06/testing-roommate-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tumblon &#8211; Best Parenting Website</title>
		<link>http://blog.steveheffernan.com/2009/04/tumblon-best-parenting-website/</link>
		<comments>http://blog.steveheffernan.com/2009/04/tumblon-best-parenting-website/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 03:10:17 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=299</guid>
		<description><![CDATA[
Today is my sister&#8217;s birthday, and for her gift I&#8217;m moving her new baby&#8217;s website from Totsites to Tumblon, and getting her a year of the premium subscription. Both sites allow you to blog about your child, post photos, notify family members, etc., but Totsites has super cheesy templates while Tumblon is really clean. Not [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img src="http://blog.steveheffernan.com/wp-content/uploads/tumblon_logo_vertical_full_aspect_medium.png" alt="tumblon_logo_vertical_full_aspect_medium" title="tumblon_logo_vertical_full_aspect_medium" width="200" height="58" class="aligncenter size-full wp-image-300" /></p>
<p>Today is my sister&#8217;s birthday, and for her gift I&#8217;m moving her new baby&#8217;s website from Totsites to <a href="http://tumblon.com">Tumblon</a>, and getting her a year of the premium subscription. Both sites allow you to blog about your child, post photos, notify family members, etc., but Totsites has super cheesy templates while Tumblon is really clean. Not to mention it&#8217;s owned by a friend of mine from <a href="http://zencoder.tv">Zencoder</a>, <a href="http://twitter.com/jondahl">John Dahl</a>.<br />
<span id="more-299"></span><br />
The process went smoothly enough. My sister only had about 5 blog entries, and those were easy enough to cut and past over. The only issue there is I couldn&#8217;t change the date of the new post, so I had to add an &#8220;Originally posted&#8221; line.</p>
<p>Photos were a bit of a challenge. My sister had over 100 photos on the old site, most with captions. I needed to download each and move them over to Tumblon. Luckily I&#8217;m currently staying with my friend Justin, a programming super stud. He saw me tirelessly copying each one at time, scolded me for not doing it programatically, then helped me write a Ruby script that would parse image URLs from Totsites, download them to my computer, and name them with their captions for easy importing into Tumblon (which has an awesome multi-photo uploader). I should probably give that script to Tumblon.</p>
<p>I did run into an issue with the Tumblon photo uploader when I tried adding more photos than the 50 that my free account allowed for the month. It stalled in the middle of the group and then wouldn&#8217;t let me delete or edit the ones that had been uploaded. I sent a letter to support, but I upgraded to the premium account and that fixed everything anyway.</p>
<p>Tumblon has some awesome developmental info built into the service. I can&#8217;t quite use it myself, but I think my sister will appreciate it. Anyway, I don&#8217;t want to give out my sister&#8217;s page, but here&#8217;s mine. <img src='http://blog.steveheffernan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://heffernan.tumblon.com/">http://heffernan.tumblon.com/</a></p>
<p><a href="http://tumblon.com">Best Parenting Website</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2009/04/tumblon-best-parenting-website/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Adding to Wikipedia for the first time</title>
		<link>http://blog.steveheffernan.com/2009/04/adding-to-wikipedia-for-the-first-time/</link>
		<comments>http://blog.steveheffernan.com/2009/04/adding-to-wikipedia-for-the-first-time/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 22:21:42 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Video Encoding]]></category>
		<category><![CDATA[Websites]]></category>

		<guid isPermaLink="false">http://blog.steveheffernan.com/?p=288</guid>
		<description><![CDATA[
I wanted to add both Zencoder and Flix Cloud to a list of video editing software on Wikipedia, but Wikipedia is pretty picky about external links. My links got erased after only a day.

To make it more legit, I created these pages: Zencoder, Flix Cloud. I&#8217;ll be interested to see how long they last. I [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img src="http://blog.steveheffernan.com/wp-content/uploads/picture-11.png" alt="picture-11" title="picture-11" width="151" height="159" class="aligncenter size-full wp-image-289" /></p>
<p>I wanted to add both <a href="http://zencoder.tv">Zencoder</a> and <a href="http://www.flixcloud.com">Flix Cloud</a> to a <a href="http://en.wikipedia.org/wiki/List_of_video_editing_software">list of video editing software</a> on Wikipedia, but Wikipedia is pretty picky about external links. My links got erased after only a day.<br />
<span id="more-288"></span><br />
To make it more legit, I created these pages: <a href="http://en.wikipedia.org/wiki/Zencoder">Zencoder</a>, <a href="http://en.wikipedia.org/wiki/Flix_Cloud">Flix Cloud</a>. I&#8217;ll be interested to see how long they last. I don&#8217;t think there&#8217;s anything wrong with the pages I created, in fact I used references more than most other pages I&#8217;ve seen, but since my motivation was more on the side of promotion I&#8217;m a little nervous. It makes me wonder how any other page about a specific company got on to the wiki if it wasn&#8217;t for self promotion. Are there actually people out there who care enough about the completeness of the info that they&#8217;ll spend their time doing the necessary research? </p>
<p>Even if there is, it&#8217;s still up to the company to maintain the page and make sure no slanderous material gets in there. At <a href="http://www.apu.edu">APU</a> we used to have to fix changes from Biola students saying we weren&#8217;t a Christian university anymore.</p>
<p>Anyway, I&#8217;m gonna keep an eye on those pages, and hopefully nobody finds an issue with them.</p>
<p>UPDATE</p>
<p>Um, well, next day:</p>
<p>&#8220;A tag has been placed on Flix Cloud, requesting that it be speedily deleted from Wikipedia. This has been done under the criteria for speedy deletion, because the article seems to be blatant advertising that only promotes a company, product, group, service or person and would need to be fundamentally rewritten in order to become an encyclopedia article. Please read the general criteria for speedy deletion, particularly item 11, as well as the guidelines on spam.<br />
If you can indicate why the subject of this article is not blatant advertising, you may contest the tagging. To do this, please add {{hangon}} on the top of Flix Cloud and leave a note on the article&#8217;s talk page explaining your position. Please do not remove the speedy deletion tag yourself, but don&#8217;t hesitate to add information to the article that would help make it encyclopedic, as well as adding any citations from independent reliable sources to ensure that the article will be verifiable. Feel free to leave a note on my talk page if you have any questions about this. Jim Ward (talk·stalk) 23:56, 16 April 2009 (UTC)&#8221;</p>
<p>I&#8217;ll admit, I did a slightly better job on the Zencoder entry, which seems to be surviving. I still used independent resources as references, but I didn&#8217;t have any thing like &#8220;Founded in 2008 by blah blah&#8221;. Oh well. I&#8217;ll try again later.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.steveheffernan.com/2009/04/adding-to-wikipedia-for-the-first-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
