<?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>Barnabas Kendall &#187; Programming</title>
	<atom:link href="http://bkendall.biz/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://bkendall.biz</link>
	<description>Technology Consultant</description>
	<lastBuildDate>Fri, 15 Jul 2011 14:56:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>CodeIgniter Starter project</title>
		<link>http://bkendall.biz/2011/07/codeigniter-starter-project/</link>
		<comments>http://bkendall.biz/2011/07/codeigniter-starter-project/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 19:44:33 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=312</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2011/07/codeigniter-starter-project/" title="CodeIgniter Starter project"></a>Update: As requested, here&#8217;s a demo site. In preparation for a new CodeIgniter project starting very soon, I prepared a new project template. While CI gives you a great library and framework, out of the &#8220;box&#8221; it is missing a few &#8230;<p class="read-more"><a href="http://bkendall.biz/2011/07/codeigniter-starter-project/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2011/07/codeigniter-starter-project/" title="CodeIgniter Starter project"></a><p><strong>Update: </strong><a title="CI-Starter demo" href="http://ci-starter.bkendall.biz/" target="_blank">As requested, here&#8217;s a demo site.</a></p>
<p>In preparation for a new <a href="http://codeigniter.com/">CodeIgniter</a> project starting very soon, I prepared a new <a title="CI Starter project on GitHub" href="https://github.com/Barnabas/CI-Starter" target="_blank">project template</a>. While CI gives you a great library and framework, out of the &#8220;box&#8221; it is missing a few things that are necessary for 90% of web applications. Specifically, user registration and authentication, menus, templates, a CSS base, etc. Other frameworks, such as Yii or Django, address this with generators. I think there is some value in creating one&#8217;s own. A fine alternative would be to go with another CI-based project framework, especially <a href="http://www.getfuelcms.com/" target="_blank">FUEL CMS</a>, or perhaps <a href="http://www.pyrocms.com/" target="_blank">PyroCMS</a>.</p>
<p>I am very intrigued by the <a href="http://getsparks.org" target="_blank">Sparks</a> initiative also; I think it&#8217;s a great idea and a good way to let developers like me pick and choose open libraries, as well as give back. So my first shot at this involves setting up Sparks, integrating a few useful ones, and making a basic site with templates, navigation, registration and login. Everything else will be project-specific, I imagine.</p>
<p>In any event, here&#8217;s what I included in my first version:</p>
<ul>
<li><a href="http://downloads.codeigniter.com/reactor/CodeIgniter_2.0.2.zip">CodeIgniter 2.0.2</a></li>
<li>Phil Sturgeon&#8217;s Asset library</li>
<li>David McReynolds&#8217; <a href="http://www.getfuelcms.com/user_guide/libraries/menu">Menu library from Fuel CMS</a> (update: <a href="http://getsparks.org/packages/menu/versions/HEAD/show" target="_blank">I converted this to a spark too</a>)</li>
<li><a href="http://getsparks.org/">Sparks</a>, with the following sparks installed:
<ul>
<li>ion_auth 1.4.0</li>
<li>formbuilder 1.3.0</li>
<li>template 1.8.0</li>
</ul>
</li>
<li>Login controller to run ion_auth, using formbuilder</li>
<li>Basic CSS and layout files based on HTML5 template</li>
<li>Static page controller with nice 404 handling</li>
<li>Dropdown menu 0.7.2 CSS from <a href="http://lwis.net/free-css-drop-down-menu/">Live Web Institute</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2011/07/codeigniter-starter-project/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PyroCMS Modules</title>
		<link>http://bkendall.biz/2011/06/pyrocms-modules/</link>
		<comments>http://bkendall.biz/2011/06/pyrocms-modules/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 04:48:29 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=304</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2011/06/pyrocms-modules/" title="PyroCMS Modules"></a>At White Lion, we had use of an in-house framework built on Kohana that made starting a new site very easy. Since I&#8217;m back on my own I can&#8217;t use their framework for my own projects but I see the &#8230;<p class="read-more"><a href="http://bkendall.biz/2011/06/pyrocms-modules/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2011/06/pyrocms-modules/" title="PyroCMS Modules"></a><p><a href="http://www.pyrocms.com/"><img class="alignright size-full wp-image-307" title="pyrocms-logo" src="http://bkendall.biz/wp-content/uploads/2011/06/pyrocms-logo-127x150.png" alt="" width="127" height="150" /></a>At White Lion, we had use of an in-house framework built on Kohana that made starting a new site very easy. Since I&#8217;m back on my own I can&#8217;t use their framework for my own projects but I see the value of using a full-blown CMS system as a starter, not just a framework. There are a few CodeIgniter-based CMS projects with some traction, but <a href="http://www.pyrocms.com">PyroCMS</a> and <a href="http://www.getfuelcms.com/">Fuel CMS</a> both grabbed my attention. PyroCMS won out because it&#8217;s reached 1.2 and module development is very simple, and I&#8217;m a fan of <a href="http://philsturgeon.co.uk/">Phil Sturgeon</a>.</p>
<p>I have so far tried my hand at developing two modules for PyroCMS: one is a sitemap module which outputs both a human readable and search engine friendly XML sitemap of all pages and blog posts, and the second is a blog importer, mainly for moving my content on this blog from WordPress to PyroCMS. I dutifully submitted both to the add-on store, <del>but both haven&#8217;t been accepted after a week or so of sitting around &#8220;waiting for approval&#8221;. So, temporarily, I will offer both downloads here as a trial</del>: (these are now live on the add-on section, links have been updated)</p>
<ul>
<li><a href="http://www.pyrocms.com/store/details/importer">Importer Module</a></li>
<li><a href="http://www.pyrocms.com/store/details/sitemap">Sitemap Module</a></li>
</ul>
<p>If you&#8217;re a PyroCMS user or developer, please check them out and let me know what you think <a href="http://www.pyrocms.com/forums/view/7">on the forum</a>. As for future plugins, I&#8217;m thinking of doing a Lucerne search plugin, or a simple Google Checkout/Cart module, or maybe a call-me widget based on Twilio&#8217;s API.</p>
<p>I am a freelance web developer, and if you want to hire me to build something for your website, please get in touch.</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2011/06/pyrocms-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>White Lion Home Page</title>
		<link>http://bkendall.biz/2011/06/white-lion-home-page/</link>
		<comments>http://bkendall.biz/2011/06/white-lion-home-page/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 21:12:53 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=298</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2011/06/white-lion-home-page/" title="White Lion Home Page"></a>For two months this spring I had an awesome time working at White Lion in Austin, Texas. Steve Kahle has a fine group of people working for him over there, and there were many interesting projects to complete. I certainly &#8230;<p class="read-more"><a href="http://bkendall.biz/2011/06/white-lion-home-page/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2011/06/white-lion-home-page/" title="White Lion Home Page"></a><p><a href="http://wlion.com" alt="White Lion Internet Agency"><img src="http://bkendall.biz/wp-content/uploads/2011/06/wlion.gif" alt="" title="wlion" width="257" height="129" class="alignright size-full wp-image-300" /></a>For two months this spring I had an awesome time working at <a href="http://wlion.com">White Lion</a> in Austin, Texas. Steve Kahle has a fine group of people working for him over there, and there were many interesting projects to complete. I certainly hope I&#8217;ll be able to work with them again. Sadly, we couldn&#8217;t stay in Austin due to health issues and so we&#8217;re back in Wisconsin right now.</p>
<p>One interesting project I spent a few hours on was to see if there was anything to do about the White Lion home page. It is currently an eye-catching Flash image of thumbnails of different clients and case studies. When you hover over one, the thumbnail image moves about while the others fade out. It seemed to me there was nothing about it that specifically required Flash other than the monochrome effect, and even that&#8217;s technically possible without Flash. I set about trying to implement the same effect with JavaScript, HTML, and CSS. <a href="http://bkendall.biz/files/wlion_home2.html">Here is a static version of my effort.</a></p>
<p>While it looks and behaves similarly to the current home page, the difference is apparent on every page load after the first, especially if you use the back button. My version is nearly instant while the Flash version always does some reloading. Why? In the current site, the Flash element does not contain any images. Instead, when loaded it always makes another network call to http://wlion.com/home/portfolios, which returns some XML that is then parsed to build the image grid. While this means White Lion can change the home page portfolio listing easily, it also slows down the whole page. The Flash element will not start loading images until after it has itself finished loading, and has retrieved and parsed the protfolio XML.</p>
<p>In my version, the images are just normal IMG tags. If you turn off JavaScript, it still looks and functions similarly, except there&#8217;s no movement and the mouse over is a little strange. The advantage is that the images start loading right after the HTML is parsed. On a normal connection, this alone shaves two seconds off the overall load. I believe it would be possible to keep the current design but get the initial page load down to less than 1 second with a few more tricks, such as image spriting and using a CDN host for static assets, or even just using <a href="http://www.cloudflare.com/">CloudFlare</a> as a reverse proxy. While White Lion decided to keep the Flash element in place for now, certain .htaccess changes also sped things up too, like using GZip and enabling expiration.</p>
<p>The takeaway is that there may be ways to shave precious seconds from your home page load without altering the design. <a href="http://searchengineland.com/google-now-counts-site-speed-as-ranking-factor-39708">Building a snappy first page is a good investment.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2011/06/white-lion-home-page/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BigCommerce and LoganCreekSoap.com</title>
		<link>http://bkendall.biz/2010/09/bigcommerce/</link>
		<comments>http://bkendall.biz/2010/09/bigcommerce/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 18:35:53 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[bigcommerce]]></category>
		<category><![CDATA[shopify]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=264</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2010/09/bigcommerce/" title="BigCommerce and LoganCreekSoap.com"></a>I recently set up and relaunched LoganCreekSoap.com using the BigCommerce store hosting platform. I have to say: e-commerce (and web applications in general) has come a long way in the last decade. The previous platform and setup that they were using before &#8230;<p class="read-more"><a href="http://bkendall.biz/2010/09/bigcommerce/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2010/09/bigcommerce/" title="BigCommerce and LoganCreekSoap.com"></a><p><img class="alignright size-full wp-image-266" title="bigcommerce-logo" src="http://bkendall.biz/wp-content/uploads/2010/09/bigcommerce-logo.png" alt="" width="291" height="65" />I recently <a title="Logan Creek Soap" href="http://www.LoganCreekSoap.com">set up and relaunched LoganCreekSoap.com</a> using the <a href="http://www.bigcommerce.com/1173-0-1-23.html">BigCommerce store hosting platform</a>. I have to say: e-commerce (and web applications in general) has come a long way in the last decade. The previous platform and setup that they were using before was simply awful for both usability and aesthetically. It really was a shame because they make beautiful handcrafted soap and their store simply didn&#8217;t reflect their high quality product.</p>
<p>BigCommerce offered many features that were especially convenient for them to manage as store owners, such as a nice back-end management interface, lots of reports, plug-ins to several third-party systems (like Google Base and Facebook) and a great order fulfillment process flow. As a developer, I was fascinated by the API and started working on a little project to make buying postage a little easier (using <a href="http://www.stamps.com/pdk/">Stamps.com&#8217;s API</a>), but I was highly disappointed that the BigCommerce API is presently read-only. This is a tiny downside in the vast upside that is BigCommerce. Customers will get many shopping features that they frankly expect, such as seeing order status and history, wish lists, instant shipping and tax estimates, and coupons.</p>
<p>The serious competitor to BigCommerce is <a href="http://www.shopify.com">Shopify</a> right now. Shopify&#8217;s API is better and their app store is highly enticing to me as a developer (nothing like that currently exists for BigCommerce sadly). I couldn&#8217;t recommend Shopify for Logan Creek Soap, however, mainly because Shopify takes a percentage of each sale in addition to their monthly fee, while BigCommerce does not. Personally, I intend to find some more local merchants and see if they&#8217;d like to let me help them upgrade their stores to BigCommerce. If you&#8217;d like my help or advice in setting up your store, <a href="http://bkendall.biz/">please contact me</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2010/09/bigcommerce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenVBX Launched</title>
		<link>http://bkendall.biz/2010/06/openvbx-launched/</link>
		<comments>http://bkendall.biz/2010/06/openvbx-launched/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 19:04:01 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[openvbx]]></category>
		<category><![CDATA[twilio]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=254</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2010/06/openvbx-launched/" title="OpenVBX Launched"></a>I am very pleased that Twilio&#8217;s OpenVBX launched today. This is a project that I had the great pleasure of working on last year for several months with the fine folks at Twilio. When I last touched it, I thought &#8230;<p class="read-more"><a href="http://bkendall.biz/2010/06/openvbx-launched/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2010/06/openvbx-launched/" title="OpenVBX Launched"></a><p><a href="http://bkendall.biz/wp-content/uploads/2010/06/openvbx-web-logo.png"><img class="alignleft size-full wp-image-255" title="OpenVBX Logo" src="http://bkendall.biz/wp-content/uploads/2010/06/openvbx-web-logo.png" alt="" width="209" height="54" /></a>I am very pleased that Twilio&#8217;s <a href="http://openvbx.org">OpenVBX</a> launched today. This is a project that I had the great pleasure of working on last year for several months with the fine folks at <a href="http://www.twilio.com">Twilio</a>. When I last touched it, I thought it was 99% ready to go and felt a little frustrated that it wasn&#8217;t launched sooner.</p>
<p>Now that I see what they&#8217;ve been working on in the meantime I understand. A great deal of refinement and documentation has made this product so much better than what it was. They even made <a href="http://www.youtube.com/watch?v=cBDqyvJzRYA">a very Apple-esque intro video</a> to describe what it is and why it is a win for businesses. I am installing it now on my server and will update with my impressions soon.</p>
<p>While not yet advertised anywhere, OpenVBX is based on <a href="http://www.codeigniter.com/">CodeIgniter</a>, a very popular PHP framework. Even if you are more familiar with other frameworks like CakePHP, Kohana, Silverlight, etc., you should find the code easy to understand.</p>
<p>Commenters on this news at <a href="http://news.ycombinator.com/item?id=1432937">HN</a> have been oddly upset over Twilio&#8217;s reasonable per-minute charge, which is not new. &#8220;Why pay 3¢ a minute when you can roll your own PBX with Asterisk and pay 0.0000000000000001¢ per minute with some VOIP provider?&#8221; they ask. Fair enough. But when you go eat a burger for lunch today, ask yourself why you didn&#8217;t raise and slaughter your own beef, grind the meat, and fry your own patties? Why pay a farmer, butcher, grocer, and restauranteur to do what you could have done yourself?</p>
<p>By the way, when it the last time someone has successfully used the word &#8220;restauranteur&#8221; in a sentence?</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2010/06/openvbx-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Free Phone Screen/Interview App With Twilio</title>
		<link>http://bkendall.biz/2009/10/phone-screen-twilio/</link>
		<comments>http://bkendall.biz/2009/10/phone-screen-twilio/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 21:42:26 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[twilio]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=241</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2009/10/phone-screen-twilio/" title="A Free Phone Screen/Interview App With Twilio"></a>I have thoroughly enjoyed working with Twilio for the last 6 months or so on an open-source project that will soon be released (can&#8217;t wait!). Now that my part in that project has wrapped up, I&#8217;ve got some extra time &#8230;<p class="read-more"><a href="http://bkendall.biz/2009/10/phone-screen-twilio/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2009/10/phone-screen-twilio/" title="A Free Phone Screen/Interview App With Twilio"></a><p>I have thoroughly enjoyed working with Twilio for the last 6 months or so on an open-source project that will soon be released (can&#8217;t wait!). Now that my part in that project has wrapped up, I&#8217;ve got some extra time to play around with my own projects and look for my next job. Over on the Twilio support forums, <a href="http://getsatisfaction.com/twilio/topics/using_twilio_to_automate_phone_interviews_please_help">someone recently requested help</a>, and it caught my eye:</p>
<blockquote><p>I have to conduct a lot of phone interviews every year for my company with fairly standard questions. Would there be a way to use Twilio to manage this in an automated fashion? I don&#8217;t want to spend the time actually conducting the interviews but would rather listen to them when I have a chance. [...]<br />
During the call, I would like to have the user enter the # sign or something when they have finished answering the question, to prompt the next question. This way, I could have my 10 standard questions recorded in Mp3, and then have the whole process managed through Twilio ideally where i enter the interviewee&#8217;s phone number and a time for the call ideally.</p></blockquote>
<p>Someone posted a link there that lead me to this service: <a href="http://www.voicescreener.com/">VoiceScreener</a> which starts at $169/month. Yikes! Twilio, on the other hand, is 3¢/minute and $5/month/phone number. I got to thinking: this is incredibly easy to set up with Twilio&#8217;s API; why not just whip it up? So I did.</p>
<p><a href="http://interview.bkendall.biz/">Here&#8217;s a demo</a> where you can try a sample phone interview and <a href="http://interview.bkendall.biz/PhoneInterview.zip">here&#8217;s where you can download the code</a>. To install and customize it, just follow these directions:</p>
<ol>
<li>Unzip the file to a directory on a web server that runs PHP 5</li>
<li>Edit the file inc/config.php with your own Twilio authentication credentials and the email address that will receive reports.</li>
<li>I have included my sample MP3 files in the files directory, but you should replace them with your own. The file names should be self explanatory: <a href="http://interview.bkendall.biz/files/intro.mp3">intro.mp3</a>, <a href="http://interview.bkendall.biz/files/thanks.mp3">thanks.mp3</a>, <a href="http://interview.bkendall.biz/files/conclusion.mp3">conclusion.mp3</a>, and question_XX.mp3, where XX is a two-digit number.</li>
</ol>
<p>As it is written now, this works without any database at all because we can use Twilio&#8217;s REST API to query the call details and list of associated recordings. This project is more of a starter and proof of concept, although for simple interview scenarios it would work just fine. Other possible upgrades (some requiring a database) could be:</p>
<ul>
<li>Account for unanswered questions in the report</li>
<li>Allow interviewers to hang up in the middle of the interview and call back later to pick up where they left off</li>
<li>Allow the interviewer to review their answer and re-record</li>
<li>Allow for question branching, where the user enters a touch-tone response for yes/no on some answers and is asked only relevant questions from then on</li>
<li>Set up multiple types of interviews</li>
<li>Show the text of the question in the interviewer&#8217;s web browser  while they are listening to it on the phone using AJAX</li>
<li>Make the interview conclusion a menu, as in: &#8220;To hear more about the company, press 1. To hear more about this position, press 2&#8230;&#8221;</li>
</ul>
<p>If you are interested in having me work on this for you, please <a href="mailto:barnabas@bkendall.biz">contact me</a> and I&#8217;d be happy to help you out. If you have any suggestions or improvements, please send them my way too.</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2009/10/phone-screen-twilio/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://interview.bkendall.biz/files/intro.mp3" length="763609" type="audio/mpeg" />
<enclosure url="http://interview.bkendall.biz/files/thanks.mp3" length="67529" type="audio/mpeg" />
<enclosure url="http://interview.bkendall.biz/files/conclusion.mp3" length="495613" type="audio/mpeg" />
		</item>
		<item>
		<title>Recording Web Audio</title>
		<link>http://bkendall.biz/2009/05/recording-web-audio/</link>
		<comments>http://bkendall.biz/2009/05/recording-web-audio/#comments</comments>
		<pubDate>Fri, 15 May 2009 00:01:01 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=220</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2009/05/recording-web-audio/" title="Recording Web Audio"></a>Update 6/1/11: WebRTC looks very promising. Update 11/05/09: Looks like this might be possible in Flash 10.1! (via) I&#8217;ve been working on a project recently that would really benefit from the ability to record audio in the browser and upload &#8230;<p class="read-more"><a href="http://bkendall.biz/2009/05/recording-web-audio/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2009/05/recording-web-audio/" title="Recording Web Audio"></a><p><span style="line-height: 18px;"><strong>Update 6/1/11:</strong> <a href="https://sites.google.com/site/webrtc/">WebRTC looks very promising</a>.</span></p>
<p><strong>Update 11/05/09:</strong> <a href="http://www.adobe.com/devnet/logged_in/jchurch_flashplayer10.1.html">Looks like this might be possible in Flash 10.1</a>! (<a href="http://www.getmicrophone.com/?p=85">via</a>)</p>
<p>I&#8217;ve been working on a project recently that would really benefit from the ability to record audio in the browser and upload it to a web server. This would be a better experience than an &#8220;upload your sound file&#8221; dialog, where the user would have to record themselves in another app, find the file, and upload it. Here&#8217;s how I imagine a seamless audio capture experience would work inside a web application. There would be a small widget in the page that would look like this (<a href="http://www.famfamfam.com/lab/icons/silk/">icons from FamFamFam.com</a>):</p>
<p><a href="http://bkendall.biz/wp-content/uploads/2009/05/record_1.png"><img class="alignleft size-full wp-image-221" title="Recorder state 1" src="http://bkendall.biz/wp-content/uploads/2009/05/record_1.png" alt="Recorder state 1" width="98" height="18" /></a> When the widget first shows, only the record button would be enabled. The left side has a line-level indicator that reflects the sound level at all times.</p>
<p><a href="http://bkendall.biz/wp-content/uploads/2009/05/record_2.png"><img class="alignleft size-full wp-image-222" title="Recorder state 2" src="http://bkendall.biz/wp-content/uploads/2009/05/record_2.png" alt="Recorder state 2" width="98" height="18" /></a> While recording, the recording button changes to a stop button.</p>
<p><a href="http://bkendall.biz/wp-content/uploads/2009/05/record_3.png"><img class="alignleft size-full wp-image-223" title="Recorder state 3" src="http://bkendall.biz/wp-content/uploads/2009/05/record_3.png" alt="Recorder state 3" width="98" height="18" /></a> Once the recording is stopped, the stop button changes back to a record button. The play and upload buttons are enabled. Clicking upload at this point saves the file to the server, and the whole control would change to an upload progress bar. Clicking record here starts a new recording and erases the old one.</p>
<p><a href="http://bkendall.biz/wp-content/uploads/2009/05/record_4.png"><img class="alignleft size-full wp-image-224" title="Recorder state 4" src="http://bkendall.biz/wp-content/uploads/2009/05/record_4.png" alt="Recorder state 4" width="98" height="18" /></a> During playback, the record button toggles to a stop button again and the play button toggles to a pause button. The line level reflects the playback volume. It is possible that you don&#8217;t want to allow upload during playback, but I&#8217;m not sure.</p>
<p>I want the control to be slightly customizable for the web developer who&#8217;s embedding it. He/she should be able to specify a maximum recording length and a URL where the sound file will be uploaded, or perhaps disable playback and upload immediately, that sort of thing. Maybe the control itself is actually a 1&#215;1 SWF that has methods and events for play, stop, record, and so on, and the controls would be standard HTML wired up with JavaScript.</p>
<p>I assumed that other, smarter people have already tackled this problem and there is some Flash control I could embed in my page and a little PHP script or something to handle saving the file from a POST. If you&#8217;ve ever searched for this sort of thing before, you already know that it does not yet exist, at least not like I have described it.  Microsoft Silverlight doesn&#8217;t yet have microphone access, and I <del datetime="2009-05-14T21:42:58+00:00">can&#8217;t find a Java applet that does this thing either</del>. (<a href="http://www.javasonics.com/">I found this one</a>, hmmm. Wish it was free/Flash). There are several very nice Flash playback scripts (<a href="http://www.schillmania.com/projects/soundmanager2/">SoundManager 2</a>, <a href="http://developer.yahoo.com/mediaplayer/">Yahoo Media Player</a>, <a href="http://www.longtailvideo.com/players/jw-flv-player/">JW FLV Media Player</a>, <a href="http://www.happyworm.com/jquery/jplayer">JPlayer</a>, <a href="http://www.varal.org/media/niftyplayer/">NiftyPlayer</a>, <a href="http://wpaudioplayer.com/">WordPress Audio Player</a>, etc. etc. etc.), but nothing that handles creating uploading and saving recordings. <strong>Yet</strong>.</p>
<p>Flash allows for audio streaming from the client microphone, but in order to capture the stream you need a server that understands Adobe&#8217;s streaming format called <a href="http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol">RTMP</a> and can do something with it, most likely some kind of crazy-expensive <a href="http://www.adobe.com/products/flashmediaserver/">Flash Media Server</a> or the open source <a href="http://osflash.org/red5/">Red 5 server</a>. Neither solution is exactly straightforward or doable on a simple web host; it&#8217;s huge overkill for this one thing. If your project is meant to be downloaded and run on other servers (like WordPress and my new project) this kind of requirement is deal breaker. Besides, it doesn&#8217;t really allow you to preview the recording before it&#8217;s uploaded. Frustration with Adobe&#8217;s &#8220;closed&#8221; microphone interface has caused some Flash developers to start the <a href="http://www.getmicrophone.com/">Open Mic initiative at GetMicrophone.com.</a> I wish them luck with their effort.</p>
<p>I recently asked my friend <a href="http://www.joeybetz.com/">Joey Betz</a> (a very talented Flash programmer who works for <a href="http://armorgames.com/">Armor Games</a>) if what I describe above is possible. He said that up until Flash 9 it is impossible, but he could imagine that with new access to microphone sound data in Flash 10, it may be possible to get the byte stream of the sound and base-64 encode and post it to a web script. I guess nobody has the combined need, interest and Flash/PHP chops to make it happen &#8211; I have all but the Flash bit. I&#8217;m not sure anyone knows the actual format of the byte stream: is it just raw sound like a WAV or what? Can you turn around and replay that byte stream through Flash? How do you turn it into an MP3/OGG stream? Even if the byte stream is something odd or uncompressed, perhaps the PHP script could do the heavy lifting to re-encode it; many servers also have FFMPEG or Mencode or something like them installed. Alternatively, what about a web service with an API where I can stream data to a Flash Media Server or something like it and get back a URL to the resulting MP3? I just don&#8217;t think recording a few seconds of sound and saving it to a file requires a separate server daemon and all that entails. Real-time voice/video chat &#8212; sure, but that&#8217;s not what I&#8217;m after.</p>
<p>Unless someone can convince me that this is still not possible, I will be happy to offer some of my time and server bandwidth, hosted now at MediaTemple, to help a creative Flash programmer get the server-side bit of this working. I&#8217;d like to release this widget/script as open source to the web community. I am looking especially to the creators of any of the aforementioned Flash playback scripts. Can you help make this happen?</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2009/05/recording-web-audio/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Open Geographic Tagging</title>
		<link>http://bkendall.biz/2009/04/geohash/</link>
		<comments>http://bkendall.biz/2009/04/geohash/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 08:41:29 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=205</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2009/04/geohash/" title="Open Geographic Tagging"></a>I had an idea for making open geographic tags over the weekend so I hacked out a quick proof of concept in JavaScript. If you hate reading, you can skip to my demo here and play with it now. You &#8230;<p class="read-more"><a href="http://bkendall.biz/2009/04/geohash/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2009/04/geohash/" title="Open Geographic Tagging"></a><p>I had an idea for making open geographic tags over the weekend so I hacked out a quick proof of concept in JavaScript. If you hate reading, <a href="/GeoHash.html">you can skip to my demo here and play with it now</a>.</p>
<p>You may have read the recent noise about URL shortening services being &#8220;<a href="http://www.inquisitr.com/22264/url-shorteners-the-herpes-of-the-web/">the herpes of the web</a>&#8220;. <em>Please.</em> I think this comes down to tagging being a closed system, but <a href="http://bkendall.biz/2009/04/open-url/">it&#8217;s not easy to fix</a> and I doubt these kinds of things will ever go away.</p>
<p>It got me thinking, though: links to geographic information could benefit from shortening, and selectively loosing information could even be an advantage. Latitude and longitude is expressed as a pair of numbers, traditionally divided up by degrees, minutes, and seconds, but digitally expressed as floating numbers between -90/90 and -180/180 respectively. For example, a beach near my home is at 33.54240,-117.78559. For example, say I wanted to tell my friends that I&#8217;m at the beach, and my Twitter client could access my GPS and append my location to the message (yes I know about <a href="http://tapulous.com/twinkle/">Twinkle</a>). That&#8217;s 19 characters out of 140 and it&#8217;s very public. Also it&#8217;s a single point, not a whole area, and how do I search for other people near me?</p>
<p>My idea is to create a new kind of geographic code that specifies areas, not points, and is constructed in a text-search friendly way. Here&#8217;s how it works. First divide the world into a grid of 36 x 36, or 1,296 squares. Assign each row a number or letter using 0-9 and A-Z, that&#8217;s why 36. If we specify one of these grids by coordinates, such as &#8220;o6&#8243; for example, that would specify a rather large part of the earth, as you can see below. If we were then to reference a point using a further 36 x 36 subdivision of this grid, we could specify an area even further, such as &#8220;o6p7&#8243;, which would be smaller still, and so on and so forth, all the way down to &#8220;o6p7iy6z&#8221;, the  rough equivalent of the 19-character coordinates above in only 8 characters.</p>

<a href='http://bkendall.biz/2009/04/geohash/geohash-o6/' title='geohash-o6'><img width="150" height="150" src="http://bkendall.biz/wp-content/uploads/2009/04/geohash-o6-150x150.jpg" class="attachment-thumbnail" alt="geohash-o6" title="geohash-o6" /></a>
<a href='http://bkendall.biz/2009/04/geohash/geohash-o6p7/' title='geohash-o6p7'><img width="150" height="150" src="http://bkendall.biz/wp-content/uploads/2009/04/geohash-o6p7-150x150.jpg" class="attachment-thumbnail" alt="geohash-o6p7" title="geohash-o6p7" /></a>
<a href='http://bkendall.biz/2009/04/geohash/geohash-o6p7iy/' title='geohash-o6p7iy'><img width="150" height="150" src="http://bkendall.biz/wp-content/uploads/2009/04/geohash-o6p7iy-150x150.jpg" class="attachment-thumbnail" alt="geohash-o6p7iy" title="geohash-o6p7iy" /></a>
<a href='http://bkendall.biz/2009/04/geohash/geohash-o6p7iy6z/' title='geohash-o6p7iy6z'><img width="150" height="150" src="http://bkendall.biz/wp-content/uploads/2009/04/geohash-o6p7iy6z-150x150.jpg" class="attachment-thumbnail" alt="geohash-o6p7iy6z" title="geohash-o6p7iy6z" /></a>

<p>The more specific you want to be about your location, the more subdivisions your code would include, although using base 36, four levels is about the size of a house, three levels is a few blocks, two levels is about an hour&#8217;s drive, and one level is a day&#8217;s drive. That sizing feels right to me, but perhaps if this ever gets used people will standardize on different subdivisions, such as base 16 or base 24. Anyway, if you&#8217;re sharing your location but want to protect your privacy, leaving your location general and loosing a little specificity is a good thing. The subdivisions function like decimal places in that case. &#8220;o6&#8243; means somewhere in SoCal, while &#8220;o6p7iy6z&#8221; means a certain spot by the volleyball nets on Main Beach in Laguna Beach, California.</p>
<p>When looking for proximity, you can see at a glance if a code is near you. In my case, I wouldn&#8217;t bother with things that don&#8217;t start with &#8220;o6p7&#8243;, although I might look at &#8220;06p8&#8243; or &#8220;o6q7&#8243;, which are adjacent. A text search engine could find nearby items tags a wildcard search pattern (&#8220;06p7*&#8221;).</p>
<p>One other major benefit of a protocol like this is that it would be open. It&#8217;s not perfect; you may live close to the boundary of a big grid, and there&#8217;s an up-front hassle in figuring out exactly what grid you&#8217;re presently in unless your device can calculate your geo tag for you. Once in place, no single company would be the gatekeeper for the information that makes the tags meaningful, as in the case of URL shorteners. A unified location tag protocol could open up many interesting mashups between location aware devices and services, not just Twitter et al.</p>
<p>If someone&#8217;s already done something like this, then I wasn&#8217;t able to find it and I apologize, please let me know. If you want to fix it up and build upon this idea, by all means go for it but please link back here. Please <a href="/GeoHash.html">view the source of the HTML demo file</a> for implementation details and send any errors or suggestions. I think it&#8217;s not a perfect square because of the distortion from the map projection, but I could have flubbed something too.</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2009/04/geohash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open &amp; Distributed URL Shortening</title>
		<link>http://bkendall.biz/2009/04/open-url/</link>
		<comments>http://bkendall.biz/2009/04/open-url/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 23:18:33 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[services]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=202</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2009/04/open-url/" title="Open &amp; Distributed URL Shortening"></a>Update 8/20: tr.im has since threatened to shut down (then not), and bit.ly has proposed the FDIC of shortners. I look back on my post below and concede that the hashing thing will never happen, but the central backup surely &#8230;<p class="read-more"><a href="http://bkendall.biz/2009/04/open-url/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2009/04/open-url/" title="Open &amp; Distributed URL Shortening"></a><p><strong>Update 8/20:</strong> tr.im has since <a href="http://blog.tr.im/post/159369789/tr-im-r-i-p">threatened to shut down</a> (then <a href="http://blog.tr.im/post/160697842/tr-im-resurrected">not</a>), and <a href="http://blog.bit.ly/post/159843105/301working">bit.ly has proposed</a> the <a href="http://301works.org/">FDIC of shortners</a>. I look back on my post below and concede that the hashing thing will never happen, but the central backup surely should occur, and 301works.org is the best chance it will come about. <em>Any service that claims protecting your &#8220;privacy&#8221; prevents them from backing up their link archive with a 3rd party is lying or misunderstands the purpose of a central repository and shouldn&#8217;t be trusted with your links anyway.</em></p>
<p>The latest <a href="http://www.techcrunch.com/2009/04/06/are-url-shorteners-a-necessary-evil-or-just-evil/">brouhaha over URL shorteners</a> is <a href="http://joshua.schachter.org/2009/04/on-url-shorteners.html">overblown</a>. Are they evil or unnecessary? Who cares? They&#8217;re not going away. Proclaiming the death of &#8220;unnecessary&#8221; institutions is a tired cliché. I&#8217;m all for self-documenting pretty URLs like the next guy, but come on.</p>
<p>I feel that the core argument boils down to discomfort with the opaqueness of the the whole thing. Where does a shortened link go? You don&#8217;t know until you&#8217;re there. What kind of permanence does the shortening service itself have? This kind of worry is an echo of the greater distrustful zeitgeist though &#8211; if AIG and GM can teeter on the edge, what hope can we have for TinyURL? That&#8217;s probably how Philistine foot soldiers felt when Goliath fell.</p>
<p>It appears that many shorteners use an auto-incrementing database key to store link references. Thus the first link is http://example.com/1, and the second is http://example.com/2, and by using all letters of the alphabet (using base 36) then link number 999,999,999 will only be http://example.com/GJDGXR, six extra characters. Since they&#8217;re not all using the same database, then the true link for http://shortenerA.com/GJDGXR does not relate to http://shortenerB.com/GJDGXR. If Shortner A looses their database (<a href="http://ma.gnolia.com/">it happens</a>) then goodbye all links. Thus, shortening services are opaque and creaky by design, namely big-honkin&#8217; private central database.</p>
<p>If the digerati can&#8217;t abide secrets, then they should gather up their pitchforks and demand that their favorite shortening and bookmarking services transition away from private, proprietary incrementing keys to an open URL shortening hashing scheme and distributed URL repository for backup. How would this work? Well, <a href="http://news.netcraft.com/archives/2009/03/15/march_2009_web_server_survey.html">Netcraft reported that there were 224,749,695 servers on the Internet in March 2009</a>. Let&#8217;s just round that up to 250 million and say that each site has an average of 200 URLs, which is 50 billion, or MYWPIWW &#8212; just seven characters &#8212; in base-36. You could normalize and hash any URL through a 40-bit hashing function and format that number to a base-36 string. All participating open shortening services would have to use the same hashing method and synchronize their URLs with a central repository. By using a hash function, each service could defer repository synchronization and use it as an insurance policy. The central repository would be queried only when a hash doesn&#8217;t exist locally such as when a competing service goes dark or offline. Storage of 5 billion URL records in the repository (assuming each record is 1kb) would require 4.65 TB of storage, not quite doable with Amazon SimpleDB just yet. Nevertheless, I can easily imagine two guys hacking up a robust shortened URL repository at this scale over a weekend using tools like Amazon&#8217;s EC2, SDB, and <a href="http://aws.amazon.com/sqs/">SQS</a> and charging per-use fees to the services for a syncing API. The repository has the added benefit of being a neutral third party that can validate and lengthen links for security.</p>
<p>I have no illusions that this system will ever actually be built, or if it is, that it will be used widely. You&#8217;re welcome anyway.</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2009/04/open-url/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How ThisLineIsSecure.com was built</title>
		<link>http://bkendall.biz/2009/03/how-tlis-was-built/</link>
		<comments>http://bkendall.biz/2009/03/how-tlis-was-built/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 23:09:08 +0000</pubDate>
		<dc:creator>Barnabas</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[kohana]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bkendall.biz/?p=181</guid>
		<description><![CDATA[<a href="http://bkendall.biz/2009/03/how-tlis-was-built/" title="How ThisLineIsSecure.com was built"></a>Here is a quick rundown of how my recently launched site ThisLineIsSecure.com was built. First of all, it would not have been possible without the Twilio API. Besides that: Written in PHP 5 using the Kohana Framework, the able successor to &#8230;<p class="read-more"><a href="http://bkendall.biz/2009/03/how-tlis-was-built/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://bkendall.biz/2009/03/how-tlis-was-built/" title="How ThisLineIsSecure.com was built"></a><p>Here is a quick rundown of how my recently launched site <a href="http://ThisLineIsSecure.com">ThisLineIsSecure.com</a> was built. First of all, it would not have been possible without the <a href="http://www.twilio.com/">Twilio API</a>. Besides that:</p>
<ul>
<li>Written in <a href="http://www.php.net/">PHP 5</a> using the <a href="http://www.kohanaphp.com/">Kohana Framework</a>, the able successor to CodeIgniter.</li>
<li>Hosted at <a href="http://www.mediatemple.net/go/order/?refdom=thislineissecure.com">MediaTemple</a> using the Grid Service (like this blog).</li>
<li>Developed on my iMac using <a href="http://www.activestate.com/komodo_edit/">Active State&#8217;s Komodo Edit</a>.</li>
<li>Graphics done using <a href="http://www.pixelmator.com/">Pixelmator</a>, stock art from <a href="http://us.fotolia.com/partner/201009234">Fotolia</a>.</li>
<li>Web Template adapted from <a href="http://www.nuviotemplates.com/template.php?template=impress-05">Impress 05</a> <a href="http://www.nuviotemplates.com/">Nuvio</a>.</li>
<li>Some icons taken from the <a href="http://wefunction.com/2008/07/function-free-icon-set/">Function Icon Set</a>.</li>
<li>Using the <a href="http://wpaudioplayer.com/standalone">Standalone version of the WordPress Audio Player</a>.</li>
<li><a href="https://checkout.google.com/">Google Checkout</a> &amp; <a href="http://www.google.com/analytics/index.html">Google Analytics</a> for payments.</li>
<li>Version control and issue tracking via <a href="http://unfuddle.com/">Unfuddle&#8217;s free version</a>, which is enough for me. I have used this on huge projects, though, it&#8217;s very good. Think Basecamp + Beanstalk.</li>
<li>SFTP uploads via the finest Mac shareware FTP client available, <a href="http://cyberduck.ch/">Cyberduck</a>. The &#8220;synchronize&#8221; option is golden.</li>
</ul>
<p>I need to tally up my expenses, but besides my time I&#8217;m probably out less than $200 for this whole thing so far. Unbelievable. I think that the Kohana project, Nuvio, the WordPress Audio Player, and Cyberduck each deserve at least a $20 donation, which will be forthcoming.</p>
]]></content:encoded>
			<wfw:commentRss>http://bkendall.biz/2009/03/how-tlis-was-built/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

