<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Funkatron</title>
 
 <link href="http://funkatron.com/" />
 <updated>2012-02-23T13:05:04-05:00</updated>
 <id>http://funkatron.com.com/</id>
 <author>
   <name>Ed Finkler</name>
   <email>coj@funkatron.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/funkablog-atom" /><feedburner:info uri="funkablog-atom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>The MicroPHP Follow-up FAQ</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/HmZ9eS8IKd0/the-microphp-follow-up-faq.html" />
   <updated>2012-02-07T00:00:00-05:00</updated>
   <id>http://funkatron.com/posts/the-microphp-follow-up-faq</id>
   <content type="html">&lt;p&gt;My previous post, &lt;a href="http://funkatron.com/posts/the-microphp-manifesto.html"&gt;The MicroPHP Manifesto&lt;/a&gt;, resulted in much excitement. In between fits of rage and crying, I found some time to answer folks questions, and also discuss the topic on &lt;a href="http://devhell.info"&gt;the /dev/hell podcast&lt;/a&gt; with my cohost &lt;a href="http://littlehart.net"&gt;Chris Hartjes&lt;/a&gt;. To summarize and address some of the common questions, I felt I should write a small FAQ.&lt;/p&gt;

&lt;p&gt;Got a question? &lt;a href="/contact.html"&gt;Ask me&lt;/a&gt;. I&amp;rsquo;ll add additional entries here as things come up.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id="so-you-think-full-stack-frameworks-suck"&gt;So you think full-stack frameworks suck?&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt; I think sometimes they&amp;rsquo;re very appropriate. It depends on your needs: will the pros you get with library/component/framework X outweigh the negatives? If so, it&amp;rsquo;s probably a good choice. If not, it&amp;rsquo;s probably not.&lt;/p&gt;

&lt;h3 id="you-need-a-large-framework-to-enforce-best-practices"&gt;You need a large framework to enforce best practices!&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sometimes you do.&lt;/strong&gt; My experience at FictiveKin has been that our small team is able to work faster, smarter, and more efficiently by minimizing the size of our PHP codebase and removing all unnecessary layers of abstraction. In some cases that meant not doing certain tasks in PHP anymore (almost all HTML generation was moved to the browser). In others, it meant ripping out a bunch of code and replacing it with a simpler solution that required far less boilerplate and replication. We still kept some code that had more dependencies than we&amp;rsquo;d like because the wins we get with it outweigh the downsides.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve certainly seen situations where choosing a popular full-stack framework is a better idea. As teams get larger, enforcement of coding standards and not doing Dumb Shit becomes harder. Hiring and training engineers is usually easier with popular, full-stack frameworks. On the other hand, we&amp;rsquo;ve found that devs coming from non-PHP backgrounds liked how quickly they can be productive with simpler libraries and frameworks. Your mileage may vary.&lt;/p&gt;

&lt;h3 id="so-youre-saying-we-should-write-our-own-frameworklibrariescomponents"&gt;So you&amp;rsquo;re saying we should write our own framework/libraries/components?&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Good God no.&lt;/strong&gt; There is lots of very good, well-written code out there that&amp;rsquo;s already solved the problem you&amp;rsquo;re facing. Most of the time I don&amp;rsquo;t want to try to solve an issue like oAuth request signing, because it makes my brain hurt and I&amp;rsquo;d rather focus on building stuff. So, I&amp;rsquo;ll look for an existing solution that fits my needs first. I sometimes choose to write something from scratch because the existing solutions (that I can find – discovery is a whole other issue) don&amp;rsquo;t fit well with my existing application structure, or I feel it will introduce more maintenance issues than I&amp;rsquo;m comfortable with.&lt;/p&gt;

&lt;h3 id="you-should-check-out-my-microframework"&gt;You should check out my microframework!&lt;/h3&gt;

&lt;p&gt;Sure. Generally I think &lt;strong&gt;people should work on writing libraries/components&lt;/strong&gt;, personally. We have plenty of framework choices. But this is PHP, so you have to write your own framework sometime.&lt;/p&gt;

&lt;h3 id="is-x-a-microframework"&gt;Is &amp;ldquo;X&amp;rdquo; a microframework?&lt;/h3&gt;

&lt;p&gt;Long answer: I tend to believe that the reference implementation of &amp;ldquo;microframework&amp;rdquo; is &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;. Routing, request/response objects, sessions, maybe some hooks for template rendering. Generally I think the inclusion of an ORM is a clear sign of non-micro-ness.&lt;/p&gt;

&lt;p&gt;Short answer: &lt;strong&gt;I don&amp;rsquo;t care&lt;/strong&gt;, really – and you shouldn&amp;rsquo;t either. If it works for you, awesome.&lt;/p&gt;

&lt;h3 id="how-do-you-choose-what-gets-listed-in-the-microphp-code-collectionhttpmicrophporgcodehtml"&gt;How do you choose what gets listed in &lt;a href="http://microphp.org/code.html"&gt;the MicroPHP code collection&lt;/a&gt;?&lt;/h3&gt;

&lt;p&gt;Generally I think about these things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Does it try to solve one task, or a small set of closely related tasks?&lt;/li&gt;
  &lt;li&gt;Would it be easy to use with almost any existing code base?&lt;/li&gt;
  &lt;li&gt;Is the code as short as it can be, while still being clear and easy to follow?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these are hard and fast rules, though. I encourage people to &lt;a href="&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#099;&amp;#111;&amp;#106;&amp;#064;&amp;#102;&amp;#117;&amp;#110;&amp;#107;&amp;#097;&amp;#116;&amp;#114;&amp;#111;&amp;#110;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&amp;#063;&amp;#115;&amp;#117;&amp;#098;&amp;#106;&amp;#101;&amp;#099;&amp;#116;&amp;#061;&amp;#077;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#080;&amp;#072;&amp;#080;"&gt;&amp;#115;&amp;#104;&amp;#097;&amp;#114;&amp;#101;&amp;#032;&amp;#116;&amp;#104;&amp;#105;&amp;#110;&amp;#103;&amp;#115;&amp;#032;&amp;#119;&amp;#105;&amp;#116;&amp;#104;&amp;#032;&amp;#109;&amp;#101;&lt;/a&gt; they think others would find useful.&lt;/p&gt;

&lt;h3 id="why-do-you-hate-rush"&gt;Why do you hate Rush?&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;I don&amp;rsquo;t.&lt;/strong&gt; I like some of their songs, but don&amp;rsquo;t own any of their work. I also think they&amp;rsquo;re incredibly smart, talented musicians. My point was to suggest there are other valid approaches, not to reject complexity outright.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=HmZ9eS8IKd0:wcM6o8pabTc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=HmZ9eS8IKd0:wcM6o8pabTc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=HmZ9eS8IKd0:wcM6o8pabTc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=HmZ9eS8IKd0:wcM6o8pabTc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=HmZ9eS8IKd0:wcM6o8pabTc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=HmZ9eS8IKd0:wcM6o8pabTc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/HmZ9eS8IKd0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/the-microphp-follow-up-faq.html</feedburner:origLink></entry>
 
 <entry>
   <title>The MicroPHP Manifesto</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/3fnJH1V22Xs/the-microphp-manifesto.html" />
   <updated>2012-01-03T00:00:00-05:00</updated>
   <id>http://funkatron.com/posts/the-microphp-manifesto</id>
   <content type="html">&lt;div class="highlight"&gt;
  &lt;p&gt;&lt;strong&gt;Update 2012-01-06:&lt;/strong&gt;&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;The manifesto itself and the collection is now at &lt;a href="http://microphp.org"&gt;MicroPHP.org&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://zdrojak.root.cz/clanky/manifest-miniaturniho-php/"&gt;Here&amp;rsquo;s a Czech translation&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://blog.ircmaxell.com/2012/01/microphp-fallacy.html"&gt;The MicroPHP Fallacy&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://phprocks.com.br/2012/01/05/o-manifesto-micro-php-e-a-macro-discussao/"&gt;O Manifesto Micro Php E A Macro Discussão.&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://eltonminetto.net/2012/01/05/meus-dois-centavos-sobre-o-microphp-manifesto/"&gt;Meus Dois Centavos Sobre O Microphp Manifesto&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://ctankersley.com/2012/01/04/the-microphp-manifesto-what-people-are-overlooking/"&gt;The MicroPHP Manifesto – What People Are Overlooking&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;&lt;strong&gt;Update 2012-01-04:&lt;/strong&gt;&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;I&amp;rsquo;ve started &lt;a href="https://gimmebar.com/loves/funkatron/collection/micro-php"&gt;a collection of lightweight PHP libraries and frameworks&lt;/a&gt; on Gimme Bar [&lt;a href="https://gimmebar.com/api/v0/public/assets/funkatron/micro-php.json"&gt;json&lt;/a&gt;] [&lt;a href="https://gimmebar.com/public/feed/user/funkatron/collection/micro-php"&gt;rss&lt;/a&gt;]. If you have suggestions, &lt;a href="/contact.html"&gt;let me know&lt;/a&gt;!&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;The standard line about the history of Punk is that it was a reaction to the excesses of modern rock, particularly progressive rock of the time. The &lt;a href="http://www.amazon.com/Please-Kill-Me-Uncensored-History/dp/0140266909"&gt;reality&lt;/a&gt; is undoubtedly more complex, but I suspect there is some truth to that. Rock n roll did seem to be the realm of Golden Gods in the late 60s and 70s, inaccessible to average folk. The contrast between bands like Rush and Black Flag –– both supposedly playing &amp;ldquo;rock&amp;rdquo; –– was extreme.&lt;/p&gt;

&lt;p&gt;For fun, let&amp;rsquo;s take a look at Rush drummer Neil Peart&amp;rsquo;s drum kit:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://funkatron.com/media/neil-peart1.jpg" alt="Neil Peart from Rush" /&gt;&lt;/p&gt;

&lt;p&gt;Now, here&amp;rsquo;s Black Flag playing in LA in 1979:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://funkatron.com/media/black-flag-whisky-a-go-go2-590x448.jpg" alt="Black Flag" /&gt;&lt;/p&gt;

&lt;p&gt;You can fit the entirety of Black Flag in the space of Neil Peart&amp;rsquo;s drum kit. And they would still play awesome shit and rock you the fuck out.&lt;/p&gt;

&lt;p&gt;In the past few years, the PHP Zeitgeist seems like it&amp;rsquo;s been moving in the Neil Peart direction. Lots of work by lots of smart people is going into complex, verbose solutions. Lots of files, lots of nested directories, and lots of rules. I frequently see PHP libraries/components that look like this:&lt;/p&gt;

&lt;script src="https://gist.github.com/1555472.js"&gt; &lt;/script&gt;

&lt;noscript&gt;&lt;a href="https://gist.github.com/1555472"&gt;https://gist.github.com/1555472&lt;/a&gt;&lt;/noscript&gt;

&lt;p&gt;All that, just to &lt;em&gt;start&lt;/em&gt; your application.&lt;/p&gt;

&lt;p&gt;It doesn&amp;rsquo;t mean this approach is bad, per se. But when I see it, I have a visceral negative reaction. My brain screams&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size:24pt"&gt;FUCK.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size:24pt"&gt;THAT.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size:24pt"&gt;SHIT.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I can&amp;rsquo;t do it. I don&amp;rsquo;t want it. And I don&amp;rsquo;t think we have to do it this way to do cool things and build awesome stuff.&lt;/p&gt;

&lt;p&gt;The approach I&amp;rsquo;ve been taking lately is to start with as lightweight a foundation as possible, in the form of a &amp;ldquo;microframework.&amp;rdquo; A few of these exist for PHP (of course), including &lt;a href="http://www.slimframework.com/"&gt;Slim&lt;/a&gt;, &lt;a href="https://github.com/jmathai/epiphany"&gt;Epiphany&lt;/a&gt;, &lt;a href="https://github.com/whatthejeff/breeze"&gt;Breeze&lt;/a&gt;, &lt;a href="http://www.limonade-php.net/"&gt;Limonade&lt;/a&gt;, and others. For additional functionality, I pull in lightweight libraries that help me accomplish only the tasks I need. Clarity and brevity are my top considerations.&lt;/p&gt;

&lt;p&gt;My other big consideration is the &lt;strong&gt;commitment&lt;/strong&gt; I make when I use code I didn&amp;rsquo;t write. Typically I don&amp;rsquo;t have time to do a full code audit on libraries, so there&amp;rsquo;s a level of trust that goes with it. And each dependency means more trust. Not just that there aren&amp;rsquo;t bugs (I expect that if they&amp;rsquo;re anything like me), but security issues – both whether they exist, and how they will be handled. Will an announcement go out to a mailing list? How long will security fixes be provided that don&amp;rsquo;t break backwards compatibility? Will I have to upgrade &lt;em&gt;all&lt;/em&gt; my dependencies if I upgrade to the next PHP point release? And all of that assumes the author will have the time and motivation to provide prompt fixes. If they don&amp;rsquo;t, you&amp;rsquo;ve just added a bunch of technical debt to your codebase.&lt;/p&gt;

&lt;p&gt;Finding lightweight libraries that don&amp;rsquo;t pull in lots of additional code dependencies is much harder than it should be. Mostly I think that&amp;rsquo;s attributable to PHP devs being more interested in framework-specific development. Some work is being done to make mature frameworks less monolithic, and many devs on Twitter have recommended Symfony components as an option. Unfortunately, I think my definition of &amp;ldquo;lightweight&amp;rdquo; is not the same as theirs.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the &lt;a href="http://cloc.sourceforge.net/"&gt;&lt;code&gt;cloc&lt;/code&gt;&lt;/a&gt; output for a git clone of the &lt;a href="https://github.com/symfony/HttpKernel"&gt;symfony2 HTTP Kernel component&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mon Dec 26 19:42:23 EST 2011
coj@PsychoMantis ~/Sites &amp;gt; cloc HttpKernel
      94 text files.
      93 unique files.
      12 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (164.0 files/s, 18736.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                             72           1175           3440           4290
Bourne Shell                    10             56            155            252
-------------------------------------------------------------------------------
SUM:                            82           1231           3595           4542
-------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here&amp;rsquo;s the same for the Slim framework:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mon Dec 26 19:42:27 EST 2011
coj@PsychoMantis ~/Sites &amp;gt; cloc Slim
      54 text files.
      51 unique files.
      13 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (82.0 files/s, 17752.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                             31            660           4473           3280
Bourne Shell                    10             56            155            252
-------------------------------------------------------------------------------
SUM:                            41            716           4628           3532
-------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and the Epiphany framework:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mon Dec 26 19:42:30 EST 2011
coj@PsychoMantis ~/Sites &amp;gt; cloc Epiphany
      83 text files.
      70 unique files.
      31 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (102.0 files/s, 5246.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                             40            218            309           1632
Bourne Shell                    10             56            155            252
HTML                             1              0              0              1
-------------------------------------------------------------------------------
SUM:                            51            274            464           1885
-------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When there are more files and lines of code in your component than in my entire base framework, I can&amp;rsquo;t call it &amp;ldquo;lightweight.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;It doesn&amp;rsquo;t mean that stuff is bad, in the grand scheme of things. It doesn&amp;rsquo;t mean it has no value or is the wrong approach for many. But it&amp;rsquo;s the wrong approach for me, for sure. And I don&amp;rsquo;t think I am alone.&lt;/p&gt;

&lt;p&gt;I don&amp;rsquo;t want to be the prog rock superstar, writing a pretentious rock opera. I want to play shitty power chords in a punk rock band that plays shows in a VFW lodge with no stage, and leaves you so fucking pumped that you go out and form your own band. That&amp;rsquo;s the coder I want to be.&lt;/p&gt;

&lt;p&gt;I don&amp;rsquo;t want to be &lt;a href="http://www.drummerworld.com/pics/drum43/neilpeart7.jpg"&gt;Neil Peart&lt;/a&gt;. I want to be &lt;a href="http://synthesis.net/wp-content/uploads/2008/06/greg2.jpg"&gt;Gregg Ginn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So I wrote this. A &amp;ldquo;micro PHP manifesto,&amp;rdquo; if you will. I plan to use it to guide my PHP dev. Maybe you will find it useful as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am a PHP developer&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I am not a Zend Framework or Symfony or CakePHP developer&lt;/li&gt;
  &lt;li&gt;I think PHP is complicated enough&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I like building small things&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I like building small things with simple purposes&lt;/li&gt;
  &lt;li&gt;I like to make things that solve problems&lt;/li&gt;
  &lt;li&gt;I like building small things that work together to solve larger problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I want less code, not more&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I want to write less code, not more&lt;/li&gt;
  &lt;li&gt;I want to manage less code, not more&lt;/li&gt;
  &lt;li&gt;I want to support less code, not more&lt;/li&gt;
  &lt;li&gt;I need to justify every piece of code I add to a project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I like simple, readable code&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I want to write code that is easily understood&lt;/li&gt;
  &lt;li&gt;I want code that is easily verifiable&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=3fnJH1V22Xs:ghHjwCrjQJ0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=3fnJH1V22Xs:ghHjwCrjQJ0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=3fnJH1V22Xs:ghHjwCrjQJ0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=3fnJH1V22Xs:ghHjwCrjQJ0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=3fnJH1V22Xs:ghHjwCrjQJ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=3fnJH1V22Xs:ghHjwCrjQJ0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/3fnJH1V22Xs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/the-microphp-manifesto.html</feedburner:origLink></entry>
 
 <entry>
   <title>Building a Tumblelog with Gimme Bar and PHP</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/9_MpPfYgsY0/building-a-tumblelog-with-gimme-bar-and-php.html" />
   <updated>2011-11-05T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/building-a-tumblelog-with-gimme-bar-and-php</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/rovingi/1641508502/" title="Tumble by rovingI"&gt;&lt;img src="http://farm3.static.flickr.com/2418/1641508502_fb2a1c607b_z.jpg?zz=1" alt="Tumble by rovingI" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the coolest things about working on &lt;a href="http://gimmebar.com"&gt;Gimme Bar&lt;/a&gt; has been the opportunity to build a platform. While most folks interact with our service via the web site, the site is just one application built on top of the Gimme Bar content collection and curation system. Our web site interacts with the system via our &lt;a href="https://gimmebar.com/api/v0"&gt;HTTP API&lt;/a&gt;, which is open to everyone, not just our internal team. That means that anyone can build applications on top of our platform to suit their own needs or interests.&lt;/p&gt;

&lt;p&gt;To demonstrate this, I built &lt;a href="https://github.com/funkatron/GimmeMe"&gt;&lt;strong&gt;GimmeMe&lt;/strong&gt;&lt;/a&gt;, a simple &lt;a href="http://kottke.org/05/10/tumblelogs"&gt;tumblelog&lt;/a&gt;-type web app that&amp;rsquo;s powered by Gimme Bar. It uses methods in our API that don&amp;rsquo;t require authentication, so you don&amp;rsquo;t need to register with us to use it. And it&amp;rsquo;s a drop-in, set-one-option-and-go install, so you don&amp;rsquo;t need to fiddle with a bunch of stuff to use it (but you can if you want).&lt;/p&gt;

&lt;p&gt;I have a running demo on my web server at &lt;a href="http://funkatron.com/GimmeMe"&gt;http://funkatron.com/GimmeMe&lt;/a&gt;. It shows the 50 most recent pieces of content I&amp;rsquo;ve grabbed with &lt;a href="http://gimmebar.com"&gt;Gimme Bar&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;

&lt;p&gt;To install the web app yourself, you&amp;rsquo;ll need a web server with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;PHP 5.2.x or above&lt;/li&gt;
  &lt;li&gt;APC 3.0.8 or above&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Download the source code as a &lt;code&gt;.zip&lt;/code&gt; or &lt;code&gt;.tar.gz&lt;/code&gt; from &lt;a href="https://github.com/funkatron/GimmeMe/downloads"&gt;the project&amp;rsquo;s download page&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Decompress the files somewhere under your web server&amp;rsquo;s document root&lt;/li&gt;
  &lt;li&gt;Edit the &lt;code&gt;$config['username']&lt;/code&gt; value in &lt;code&gt;index.php&lt;/code&gt;
4 .Optionally set the &lt;code&gt;$config['gb_addthis_pubid']&lt;/code&gt; value to include &lt;a href="http://addthis.com"&gt;AddThis&lt;/a&gt; widgets, if you&amp;rsquo;re into that kind of thing&lt;/li&gt;
  &lt;li&gt;Load the appropriate URL in your web browser to view the install on your web server&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="the-code"&gt;The Code&lt;/h3&gt;

&lt;p&gt;If you&amp;rsquo;re a developer type, you&amp;rsquo;ll probably want to poke around &lt;a href="https://github.com/funkatron/GimmeMe"&gt;the source code in the GitHub repo&lt;/a&gt;. The main work is done by &lt;code&gt;libs/GimmeMe.php&lt;/code&gt;, which handles grabbing data from the API, caching it, and rendering the HTML.&lt;/p&gt;

&lt;script src="https://gist.github.com/1341981.js?file=GimmeMe-getAssets.php"&gt;&lt;/script&gt;

&lt;p&gt;In &lt;code&gt;GimmeMe::getAssets()&lt;/code&gt;, we load the data using the &lt;a href="https://gimmebar.com/api/v0#GET--public-assets--username"&gt;&lt;code&gt;GET /public/assets/:username&lt;/code&gt;&lt;/a&gt; method. This returns a JSON object with an array of asset data in the &lt;code&gt;records&lt;/code&gt; propert. We decode the response JSON into a PHP object (the &lt;code&gt;$assets&lt;/code&gt; variable), and add a couple properties that we&amp;rsquo;ll use in the HTML template. Then we cache the object in APC, and return it. Next time around, if the cached object has not expired, it will just pull it from APC and return it, so we don&amp;rsquo;t make more requests to the API than necessary.&lt;/p&gt;

&lt;script src="https://gist.github.com/1341984.js?file=GimmeMe-render.php"&gt;&lt;/script&gt;

&lt;p&gt;The &lt;code&gt;GimmeMe::render()&lt;/code&gt; method loops through the assets we retrieved and makes each one into a &lt;a href="https://github.com/funkatron/GimmeMe/blob/master/libs/GimmeAsset.php"&gt;&lt;code&gt;GimmeAsset&lt;/code&gt;&lt;/a&gt; object. &lt;code&gt;GimmeAsset&lt;/code&gt;s are view objects used by &lt;a href="https://github.com/bobthecow/mustache.php"&gt;the Mustache templating library&lt;/a&gt; to encapsulate display logic, so we set up special methods or data massage in there. After we set those up for each asset, the entire data structure is passed to the Mustache library for rendering, using &lt;a href="https://github.com/funkatron/GimmeMe/blob/master/templates/templates.php#L4"&gt;the &amp;lsquo;page&amp;rsquo; template defined in &lt;code&gt;templates\templates.php&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Right now I also am including a &lt;a href="http://blog.sosedoff.com/2009/09/20/rails-like-php-url-router/"&gt;a simple router class&lt;/a&gt; at &lt;code&gt;vendors\Router.php&lt;/code&gt;. We&amp;rsquo;ll need this for stuff that would involve different URLs, like paging back through assets or loading single-asset pages, but I haven&amp;rsquo;t quite gotten that far.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I&amp;rsquo;d be remiss in not mentioning &lt;a href="http://hereslookingathue.com/"&gt;http://hereslookingathue.com/&lt;/a&gt;, a collection of beautiful imagery collected and organized by Gimme Bar user &lt;a href="https://gimmebar.com/user/hereslookingathue"&gt;hereslookingathue&lt;/a&gt;. It&amp;rsquo;s another cool example powered by our public API methods.&lt;/p&gt;

&lt;p&gt;Hopefully this gives you a taste of what&amp;rsquo;s possible with the Gimme Bar API. Most read-only things, like embeddable widgets or reposting tools, would be easy to do with just the public API methods. Beyond that, the vast majority of our system is exposed through the public API, so powerful collection, replication, and organization applications can be built.&lt;/p&gt;

&lt;p&gt;If you have questions or comments, please hit us up on &lt;a href="http://freenode.net/"&gt;Freenode&lt;/a&gt; at &lt;a href="irc://irc.freenode.net/gimmebar-dev"&gt;#gimmebar-api&lt;/a&gt;, or email us at &lt;a href="&amp;#109;&amp;#097;&amp;#105;&amp;#108;&amp;#116;&amp;#111;:&amp;#097;&amp;#112;&amp;#105;&amp;#064;&amp;#103;&amp;#105;&amp;#109;&amp;#109;&amp;#101;&amp;#098;&amp;#097;&amp;#114;&amp;#046;&amp;#099;&amp;#111;&amp;#109;"&gt;&amp;#097;&amp;#112;&amp;#105;&amp;#064;&amp;#103;&amp;#105;&amp;#109;&amp;#109;&amp;#101;&amp;#098;&amp;#097;&amp;#114;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by &lt;a href="http://www.flickr.com/photos/rovingi/1641508502/"&gt;rovingI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=9_MpPfYgsY0:8g8dnx5mB2Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=9_MpPfYgsY0:8g8dnx5mB2Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=9_MpPfYgsY0:8g8dnx5mB2Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=9_MpPfYgsY0:8g8dnx5mB2Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=9_MpPfYgsY0:8g8dnx5mB2Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=9_MpPfYgsY0:8g8dnx5mB2Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/9_MpPfYgsY0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/building-a-tumblelog-with-gimme-bar-and-php.html</feedburner:origLink></entry>
 
 <entry>
   <title>Stepping Down From Spaz</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/h4dGBwYrkQM/stepping-down-from-spaz.html" />
   <updated>2011-10-07T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/stepping-down-from-spaz</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/paolomargari/4946053155/" title="Tacheles stairs, Berlin"&gt;&lt;img src="http://farm5.static.flickr.com/4093/4946053155_c62e666659_b.jpg" alt="Tacheles stairs, Berlin" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Spaz project has been an very important part of my life for nearly five years now. It’s been extremely rewarding personally and professionally. I’m proud of what we’ve accomplished. In recent months, though, the stress of running the project has become overwhelming. My ability to meet my responsibilities as a father, husband, and member of the FictiveKin team has suffered. So, I’m stepping away from Spaz, and letting others take the reins.&lt;/p&gt;

&lt;p&gt;I’m very pleased to say that &lt;a href="https://github.com/joshthecoder"&gt;Josh Roesslein&lt;/a&gt; (&lt;a href="http://twitter.com/applepie"&gt;@applepie&lt;/a&gt;) has agreed to take over as project lead for Spaz. He’s an excellent coder, very experienced with cross-platform JavaScript applications, and committed to open source. I’m confident that Spaz is in good hands with him.&lt;/p&gt;

&lt;p&gt;I’m still going to have some involvement with Spaz behind the scenes, but it will be very reduced. I’ll probably code a bit here and there, and will continue to maintain existing resources as needed, but I plan on taking a “Project Lead Emeritus” role from here on out.&lt;/p&gt;

&lt;p&gt;To all of the users, supporters, and friends who have made Spaz one of the best experiences of my life: thank you for everything.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;photo by &lt;a href="http://www.flickr.com/photos/paolomargari/4946053155/"&gt;Paolo Margari&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=h4dGBwYrkQM:JS_ORdhuwEs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=h4dGBwYrkQM:JS_ORdhuwEs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=h4dGBwYrkQM:JS_ORdhuwEs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=h4dGBwYrkQM:JS_ORdhuwEs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=h4dGBwYrkQM:JS_ORdhuwEs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=h4dGBwYrkQM:JS_ORdhuwEs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/h4dGBwYrkQM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/stepping-down-from-spaz.html</feedburner:origLink></entry>
 
 <entry>
   <title>HP: To Save The webOS Development Community, You Must Open-Source Enyo Now</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/0omP7x5nFyY/hp%3A-to-save-the-webos-development-community%2C-you-must-open-source-enyo-now.html" />
   <updated>2011-08-20T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/hp:-to-save-the-webos-development-community,-you-must-open-source-enyo-now</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/swimparallel/3391592144/" title="photo by swimparallel"&gt;&lt;img src="http://farm4.static.flickr.com/3658/3391592144_2a21d10f53_z.jpg" alt="Hourglass (86/365)" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve talked previously about why Enyo needs to be FOSS. I won&amp;rsquo;t repeat those arguments here, but I&amp;rsquo;d encourage you to &lt;a href="http://funkatron.com/posts/why-hp-needs-to-make-enyo-open-source-and-cross-platform.html"&gt;read them again&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Done? Good.&lt;/p&gt;

&lt;p&gt;Recent events make this even more important. With HP killing all hardware that runs webOS, and Enyo locked to webOS due to the license&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;, there&amp;rsquo;s no reason for devs to stay. It&amp;rsquo;s a closed platform with no hardware.&lt;/p&gt;

&lt;p&gt;webOS dev wasn&amp;rsquo;t really sustainable commercially anyway. But now, with no hardware and no roadmap, &lt;strong&gt;you&amp;rsquo;re going to lose your dev community entirely.&lt;/strong&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;No matter what, you will lose a large portion of your webOS dev community. But here&amp;rsquo;s why &lt;strong&gt;opening Enyo will allow you to hold onto a core during this transitional period&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It will allow current webOS devs to create desktop and mobile applications that will run on webOS with little or no work.&lt;/li&gt;
  &lt;li&gt;It will likely attract &lt;em&gt;more&lt;/em&gt; developers to Enyo, given that JavaScript development community largely abhors closed-source libraries and frameworks&lt;/li&gt;
  &lt;li&gt;When webOS is up and running with a new hardware partner, these Enyo apps will be able to launch with the new devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Here&amp;rsquo;s what you should do&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Release Enyo under a liberal open source license (Apache, MIT, etc)&lt;/li&gt;
  &lt;li&gt;Provide documentation and examples of using Enyo to develop desktop apps (via Titanium Desktop or AIR Desktop) and cross-platform mobile apps (via PhoneGap)&lt;/li&gt;
  &lt;li&gt;Get your top dev rel folks, like Dave Balmer, talking about Enyo and advocating its use at JS community events&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To be clear: the longer you wait, the more you lose. 6 weeks from now, this is a lost cause. &lt;strong&gt;A quick, decisive move&lt;/strong&gt; here will give webOS devs a reason to stay interested in the platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delay, and you lose them all&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;photo by &lt;a href="http://www.flickr.com/photos/swimparallel"&gt;swimparallel&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class="footnotes"&gt;
  &lt;ol&gt;
    &lt;li id="fn:1"&gt;
      &lt;p&gt;Enyo runs great on any Webkit platform. We make builds of Spaz HD as a desktop app using Titanium Desktop, and I use it on a daily basis – much more than I use the TouchPad builds. We&amp;rsquo;ve also done experimental builds and had success packaging Spaz HD for Android using PhoneGap&lt;a href="#fnref:1" rev="footnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id="fn:2"&gt;
      &lt;p&gt;much of this is because of the incredibly poor wording of the PR coming from HP, but that&amp;rsquo;s another story&lt;a href="#fnref:2" rev="footnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=0omP7x5nFyY:5j5GjN-VYe4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=0omP7x5nFyY:5j5GjN-VYe4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=0omP7x5nFyY:5j5GjN-VYe4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=0omP7x5nFyY:5j5GjN-VYe4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=0omP7x5nFyY:5j5GjN-VYe4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=0omP7x5nFyY:5j5GjN-VYe4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/0omP7x5nFyY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/hp%3A-to-save-the-webos-development-community%2C-you-must-open-source-enyo-now.html</feedburner:origLink></entry>
 
 <entry>
   <title>Why HP Needs to Make Enyo Open Source and Cross-Platform</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/zH3b975viHI/why-hp-needs-to-make-enyo-open-source-and-cross-platform.html" />
   <updated>2011-05-16T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/why-hp-needs-to-make-enyo-open-source-and-cross-platform</id>
   <content type="html">&lt;p&gt;&lt;a href="https://img.skitch.com/20110516-ke64a7h2151jnyiabpbwwe81cc.png" title="Why webOS?"&gt;&lt;img src="https://img.skitch.com/20110516-tcib4nnnqi26phwmxnr7keukkx.png" alt="&amp;quot;Why webOS?&amp;quot;" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yes, I did say &amp;ldquo;needs.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated with more info on PhoneGap support – Monday; May 16, 2011, 4:55 EDT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enyo is a great framework, built by people who understand JavaScript and the nature of the JS community.  It&amp;rsquo;s also a cross-platform framework that runs great on most WebKit engines – HP themselves have repeatedly shown it running within the Chrome browser, and anecdotal reports have it running decently on Android and iOS.&lt;/p&gt;

&lt;p&gt;However, HP has still not made it clear what the licensing terms will be for Enyo. Will it use a liberal open-source license like Apache or MIT? Will devs be allowed to deploy on other webkit platforms (mobile and desktop)? While hundreds of devs are working with Enyo already, HP still hasn&amp;rsquo;t addressed this. &lt;/p&gt;

&lt;p&gt;Enyo an open source, cross-platform dev framework makes a ton of sense. Here&amp;rsquo;s why:&lt;/p&gt;

&lt;h3 id="mobile-devs-dont-want-to-be-locked-into-a-single-platform"&gt;1. Mobile devs don&amp;rsquo;t want to be locked into a single platform&lt;/h3&gt;

&lt;p&gt;There&amp;rsquo;s a reason why people are interested in technologies like PhoneGap and Titanium Mobile: because it allows deployment on multiple mobile platforms. The current mobile landscape doesn&amp;rsquo;t offer an obvious first platform choice, and there&amp;rsquo;s significant revenue to be made from second and third platforms. Bringing an application to market is significantly faster with a cross-platform technology stack.&lt;/p&gt;

&lt;p&gt;webOS particularly can&amp;rsquo;t afford to be an island. Enyo as a webOS-only tech will be regarded as an interesting framework that&amp;rsquo;s impractical for their own use. Enyo as a cross-platform tech – probably combined with PhoneGap – can instead be a serious choice for all mobile devs, and &lt;em&gt;will result in more webOS apps being developed&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id="it-raises-awareness-of-webos-in-the-javascript-community"&gt;2. It raises awareness of webOS in the JavaScript community&lt;/h3&gt;

&lt;p&gt;Most libraries for mobile web/JS mobile app dev don&amp;rsquo;t take webOS into account. If they do, it&amp;rsquo;s a token gesture. They don&amp;rsquo;t because webOS really isn&amp;rsquo;t on their radar as a platform – despite the appeal of a platform built on webkit, v8 and Node.js. Coming out with a top-tier cross-platform app development framework will immediately raise the awareness of webOS, and provide lots of opportunities to position webOS as &lt;em&gt;the&lt;/em&gt; platform for JavaScript app dev.&lt;/p&gt;

&lt;h3 id="javascript-is-driven-by-openness-and-diversity"&gt;3. JavaScript is driven by openness and diversity&lt;/h3&gt;

&lt;p&gt;The thing that JavaScript has thrived upon has been its openness and diversity of platforms. JS runs almost everywhere, and the accessibility of information and libraries is unbeatable. This is because it is an open standard, and driven by open source developers. Openness is in the DNA of JS devs. It is &lt;em&gt;expected.&lt;/em&gt; JS devs are leery of non-open tech.&lt;/p&gt;

&lt;p&gt;To appeal to JS devs, Enyo needs to embrace the nature of the community. That is open and liberally licensed. Devs will love it and run with it, and come up with stuff HP never imagined, to the benefit of both Enyo and its developers.&lt;/p&gt;

&lt;h3 id="it-expands-the-market-for-pay-for-tooling-and-training"&gt;4. It expands the market for pay-for tooling and training&lt;/h3&gt;

&lt;p&gt;With a mature, top-tier cross-platform framework, lots of opportunities open up for commercial tools and training. Being a member of the open source community for 10+ years, I&amp;rsquo;ve found that most FOSS devs will pay for tools and training. This market is &lt;em&gt;much&lt;/em&gt; larger if Enyo is not webOS-only.&lt;/p&gt;

&lt;h3 id="it-demonstrates-that-hppalm-gets-the-web"&gt;5. It demonstrates that HP/Palm &amp;ldquo;gets&amp;rdquo; the Web&lt;/h3&gt;

&lt;p&gt;Under &amp;ldquo;Why webOS&amp;rdquo; on the webOS dev site, HP lists &amp;ldquo;Cross Platform&amp;rdquo; as one of the major attractions. To quote:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The primary webOS app runtime is built on ubiquitous web technologies, so you can write code that runs with minor modifications on other platforms.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Neutering Enyo with legal restrictions seems at best hypocritical. Worse, HP has shown little commitment to improving the state of webOS support with major JS mobile app technologies like PhoneGap and jQuery Mobile&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;. It&amp;rsquo;s understandable that they&amp;rsquo;ll put the most time into homegrown tech, but it will be a major missed opportunity if they don&amp;rsquo;t do everything they can to attract devs interested in cross-platform, web-oriented tech. And webOS can&amp;rsquo;t afford many more missed opportunities, IMHO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Dave Balmer at HP &lt;a href="http://twitter.com/balmer/status/70229567670980608"&gt;reports&lt;/a&gt; that Phonegap 0.9.5 contains significant contributions to improve webOS support, and &lt;a href="http://twitter.com/#!/balmer/status/70230787273924611"&gt;mentions&lt;/a&gt; ongoing efforts to aid other major mobile/touch projects. This is very encouraging, and &lt;strong&gt;I hope HP gives the Dev Relations team the resources needed to do this right&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id="it-doesnt-change-what-makes-webos-special"&gt;6. It doesn&amp;rsquo;t change what makes webOS special&lt;/h3&gt;

&lt;p&gt;What sets webOS apart is not just the framework you develop in: it&amp;rsquo;s the way applications can run simultaneously, interact with one another, and interact with the Web. No other platform does that as well, and nothing in Enyo brings those capabilities to other platforms. webOS is still &lt;em&gt;the&lt;/em&gt; platform that truly embraces the open, interconnected Web.&lt;/p&gt;

&lt;p&gt;We&amp;rsquo;re in the middle of building a new version of &lt;a href="http://getspaz.com"&gt;Spaz&lt;/a&gt; on top of Enyo. My hope is that I will be allowed to use it as &lt;em&gt;the&lt;/em&gt; single codebase for all versions: desktop, mobile, and tablets. But I guarantee you that &lt;strong&gt;Spaz in Enyo will run best on webOS&lt;/strong&gt;, and take advantage of webOS-specific capabilities.&lt;/p&gt;

&lt;p&gt;An open, cross-platform Enyo is a win-win-win: for webOS, for developers, and for users. By not encumbering Enyo with significant legal restrictions, HP will go a long way to ensuring the viability &lt;em&gt;and vitality&lt;/em&gt; of webOS as a platform for years to come.&lt;/p&gt;

&lt;div class="footnotes"&gt;
  &lt;ol&gt;
    &lt;li id="fn:1"&gt;
      &lt;p&gt;For example, HP apparently was unaware of &lt;a href="https://github.com/jquery/jquery-mobile/issues/1337"&gt;serious rendering issues in jQuery Mobile&lt;/a&gt; until the webOS development community raised a stink about it. It also seem that HP has done little to ensure that PhoneGap runs well on, and is well-documented for, webOS – confusing when the company specifically mentions PhoneGap in their literature.&lt;a href="#fnref:1" rev="footnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=zH3b975viHI:DrSvlMFV03A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=zH3b975viHI:DrSvlMFV03A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=zH3b975viHI:DrSvlMFV03A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=zH3b975viHI:DrSvlMFV03A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=zH3b975viHI:DrSvlMFV03A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=zH3b975viHI:DrSvlMFV03A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/zH3b975viHI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/why-hp-needs-to-make-enyo-open-source-and-cross-platform.html</feedburner:origLink></entry>
 
 <entry>
   <title>What's wrong with my brain?</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/DOhFPdx-Tgo/when-your-brain-fails-you.html" />
   <updated>2011-05-03T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/when-your-brain-fails-you</id>
   <content type="html">&lt;p&gt;Warning: this is gonna get whiny, and really rambling.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve been thinking about writing something about my mental illness for a while. I am generally pretty open about it with people I know, but it&amp;rsquo;s not something I&amp;rsquo;ve made a huge deal about publicly. However, today something happened that really makes me think I need to address it.&lt;/p&gt;

&lt;p&gt;I was kind of having a bad morning. I was having a heck of a time getting an application to do what I want. What application and what I wanted to do are not really relevant. The fact that it put me in such a spiral of frustration and anger is, though. One that led me to throw an embarrassing, childish fit on IRC, aimed at someone who was at worst offering a couple suggestions to help. Now I&amp;rsquo;m left wondering why, at 35 years old, I still can&amp;rsquo;t control my emotions properly.&lt;/p&gt;

&lt;p&gt;The most challenging thing with writing this is just how hard it is to articulate what happens to me. I definitely think I feel emotions more strongly than normal, no matter what it is: fear, excitement, happiness, anxiety. When it&amp;rsquo;s at its worst, I&amp;rsquo;m completely crippled and feel unable to control how I react to things. I have to cut myself off from seeing or reading things that will trigger it. There&amp;rsquo;s no way I can be productive when I&amp;rsquo;m like this.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve taken meds for depression since I was 13. Mostly I think they&amp;rsquo;ve helped; without them, things are harder; darker. When I was 27 or so I was diagnosed with adult ADD, so I take something for that too (Strattera, a non-amphetamine treatment). And in the past couple years I&amp;rsquo;ve taken Klonopin as needed for anxiety. Mostly that seems to go pretty well.&lt;/p&gt;

&lt;p&gt;But some days it doesn&amp;rsquo;t. Lately it seems like it&amp;rsquo;s happened more; when I take things ridiculously personally; when I worry far too much about what people think of me. Always had a problem with that; always thinking the worst about it, too, which just leads into more anxiety and fear.  All that stress ends up with me lashing out at strangers on the Internet, and colleagues, and my family.  None of whom deserve it.&lt;/p&gt;

&lt;p&gt;Times like this, I wish more than anything that I hadn&amp;rsquo;t made Spaz, or started speaking at conferences, or any of that. I wish I just had a normal, stable job where I could hide and do what I should do and just be. I&amp;rsquo;ve come close to deleting all my source code repos and web site and just killing all of it, because it feels like an unbearable source of stress. If I get so upset and worried that I&amp;rsquo;m hurting myself and others over it, why do I keep doing it?&lt;/p&gt;

&lt;p&gt;And I wonder whether I&amp;rsquo;m posting this just because I want pity or attention. I suppose I probably do. And that&amp;rsquo;s pretty sad too.&lt;/p&gt;

&lt;p&gt;I just wish my brain didn&amp;rsquo;t work like this.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=DOhFPdx-Tgo:1zG9S-zLulE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=DOhFPdx-Tgo:1zG9S-zLulE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=DOhFPdx-Tgo:1zG9S-zLulE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=DOhFPdx-Tgo:1zG9S-zLulE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=DOhFPdx-Tgo:1zG9S-zLulE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=DOhFPdx-Tgo:1zG9S-zLulE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/DOhFPdx-Tgo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/when-your-brain-fails-you.html</feedburner:origLink></entry>
 
 <entry>
   <title>Spaz Hackathon at the PHP Community Conference</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/2u2_-57zjN8/spaz-hackathon-at-the-php-community-conference.html" />
   <updated>2011-04-12T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/spaz-hackathon-at-the-php-community-conference</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/macq/4628293082/" title="Nerds by Matt M"&gt;&lt;img src="http://farm5.static.flickr.com/4029/4628293082_f73ba6a14e_z.jpg" alt="NERDS by Matt M" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m really excited to announce the next &lt;strong&gt;Spaz Hackathon&lt;/strong&gt;, taking place at the &lt;a href="http://phpcon.org"&gt;PHP Community Conference&lt;/a&gt; in Nashville, TN on April 21 from 5:30p-10:00p EDT (tenatively). It will be part of a larger social tech hackathon sponsored by &lt;a href="https://www.tropo.com/"&gt;Tropo&lt;/a&gt;. Food and drink (non-alcoholic) will be provided. We will have awesome swag provided by &lt;a href="http://developer.palm.com/"&gt;the HP webOS dev relations team&lt;/a&gt; and &lt;a href="http://appcelerator.com/"&gt;Appcelerator&lt;/a&gt;, and we&amp;rsquo;ll be giving away &lt;strong&gt;2 unlocked GSM Pre 2 smartphones&lt;/strong&gt; to the top two Spaz contributions. It&amp;rsquo;s &lt;em&gt;super exciting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As this is a &lt;em&gt;hack&lt;/em&gt;athon, the focus will be on code contributions. We have five different projects you can contribute to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;SpazCore&lt;/strong&gt; &amp;ndash; &lt;em&gt;JavaScript, HTML, CSS&lt;/em&gt;  &lt;br /&gt;
Our base set of JavaScript libraries. These power Spaz and other apps (like the &lt;a href="https://github.com/joindin/joindin-webos"&gt;Joind.in webOS app&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Spaz Desktop&lt;/strong&gt; &amp;ndash; &lt;em&gt;JavaScript, HTML, CSS&lt;/em&gt;  &lt;br /&gt;
A cross-platform, awesomely expandable and customizable desktop microblogging client. Originally built on Adobe AIR, with current development focused on Appcelerator Titanium Desktop. &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Spaz webOS&lt;/strong&gt; &amp;ndash; &lt;em&gt;JavaScript/HTML/CSS&lt;/em&gt;  &lt;br /&gt;
The mobile sibling, available for HP webOS.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Spaz Web APIs&lt;/strong&gt; &amp;ndash; &lt;em&gt;PHP 5.3&lt;/em&gt;  &lt;br /&gt;
RESTful web APIs used by the Spaz clients, built on top of &lt;a href="http://getfrapi.com"&gt;FRAPI&lt;/a&gt;. All PHP 5.3-based, ready for easy hacking.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Documentation and end-user support&lt;/strong&gt;  &lt;br /&gt;
Less nerdy, but just as important. We keep a knowledge base of data available at &lt;a href="http://help.getspaz.com"&gt;help.getspaz.com&lt;/a&gt;. We also need people who can volunteer a small amount of time per week to &lt;a href="http://help.getspaz.com/discussions"&gt;answer user questions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that &lt;strong&gt;all the info is at &lt;a href="http://j.mp/helpspaz"&gt;http://j.mp/helpspaz&lt;/a&gt;&lt;/strong&gt;, including links to all of our repos on GitHub and ticket tracking on Lighthouse. If you&amp;rsquo;re not already boned-up on Git, do so now – we&amp;rsquo;ll only accept code submissions via pull requests.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re planning on attending, I strongly suggest you sign up for the &lt;a href="https://groups.google.com/group/spaz-dev/"&gt;Spaz-dev mailing list&lt;/a&gt; and tell us you&amp;rsquo;re attending: we want to make sure we have enough stuff for everybody.&lt;/p&gt;

&lt;p&gt;If you can&amp;rsquo;t make it to the conference, we &lt;em&gt;will&lt;/em&gt; be on IRC during the hackathon, so people are absolutely welcome to participate that way. We hang out on &lt;a href="http://freenode.net/using_the_network.shtml"&gt;Freenode&lt;/a&gt; in &lt;code&gt;#spaz&lt;/code&gt;. Swag and prizes will only be available to in-person attendees, though. &lt;/p&gt;

&lt;p&gt;We&amp;rsquo;re very excited about this latest Spaz Hackathon, and we hope you are too. I&amp;rsquo;m happy to talk to you about ideas you have on IRC, Identi.ca, Twitter, or email. Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=2u2_-57zjN8:GIAu1eEg1VA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=2u2_-57zjN8:GIAu1eEg1VA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=2u2_-57zjN8:GIAu1eEg1VA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=2u2_-57zjN8:GIAu1eEg1VA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=2u2_-57zjN8:GIAu1eEg1VA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=2u2_-57zjN8:GIAu1eEg1VA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/2u2_-57zjN8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/spaz-hackathon-at-the-php-community-conference.html</feedburner:origLink></entry>
 
 <entry>
   <title>Migrating from ExpressionEngine to Jekyll</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/qdIhubz5Fw4/migrating-from-expressionengine-to-jekyll.html" />
   <updated>2011-04-02T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/migrating-from-expressionengine-to-jekyll</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/noodlefish/864841518/" title="Migration by Noodlefish"&gt;&lt;img src="http://farm2.static.flickr.com/1075/864841518_b67e0849d9_z.jpg" alt="Migration" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve run Funkatron.com on &lt;a href="http://expressionengine.com"&gt;ExpressionEngine&lt;/a&gt; for a long time. It&amp;rsquo;s a strong, flexible, powerful CMS that I recommend to many folks who need to build content-driven sites, especially those where the site will be administered by non-programmers. It&amp;rsquo;s a very solid choice for consultants and freelancers, who can build the relatively small license cost into their fees &amp;ndash; and probably save the client in the long run.&lt;/p&gt;

&lt;p&gt;However, over the years, I&amp;rsquo;ve found ExpressionEngine to be overkill for a blog site. If you&amp;rsquo;re only maintaining one or two types of content (like blog posts and links), the overhead involved in maintaining the system becomes unwieldy. I&amp;rsquo;ve long put off upgrading to EE2 because I dreaded having to convert my templates, find replacements for incompatible addons, and finding all the little bugs that seem to pop up in a major version upgrade.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; is quite the opposite of a system like ExpressionEngine. It&amp;rsquo;s entirely command-line driven, so you &lt;em&gt;have&lt;/em&gt; to be comfortable with the shell and some scripting. It&amp;rsquo;s really aimed at web programmers who want a simple tool to publish a blog, without worrying about all the overhead of databases, web-based administration, and a monster code base. You have very fine-grained control over how everything works.&lt;/p&gt;

&lt;p&gt;The simplicity of Jekyll has been appealing to me since I encountered it when messing around with the &lt;a href="http://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; feature. I never ended up doing a lot with GitHub Pages, but the idea of a simple, script-driven blog generator has continued to be very appealing to me.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I decided I either needed to bite the bullet and either upgrade to EE2, or switch to another system.  I decided to do the latter, and give Jekyll a shot.&lt;/p&gt;

&lt;p&gt;This post won&amp;rsquo;t go into every detail about running a Jekyll site. You should definitely read the docs and get familiar with how it works. I&amp;rsquo;ll just be covering issues of note particular to my move from EE to Jekyll. I also encourage you to check out &lt;a href="https://github.com/funkatron/funkatron.com"&gt;my GitHub repo for funkatron.com&lt;/a&gt;, which contains &lt;em&gt;almost&lt;/em&gt; everything I use for my Jekyll site.&lt;/p&gt;

&lt;h3 id="exporting-posts"&gt;Exporting posts&lt;/h3&gt;

&lt;p&gt;The biggest challenge was sorting out how to get the data out of ExpressionEngine. Each entry in my blog &amp;ldquo;weblog&amp;rdquo; (an EE term for a collection of a content type) consisted of these fields:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;title&lt;/li&gt;
  &lt;li&gt;date&lt;/li&gt;
  &lt;li&gt;author&lt;/li&gt;
  &lt;li&gt;categories&lt;/li&gt;
  &lt;li&gt;slug&lt;/li&gt;
  &lt;li&gt;summary - &lt;em&gt;rarely used&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;post body&lt;/li&gt;
  &lt;li&gt;post body format - &lt;em&gt;a formatter that is applied on output, so you can write posts in textile of markdown and they come out as HTML&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;extended text - &lt;em&gt;rarely used&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;keywords/tags - &lt;em&gt;comma-separated&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From that, I needed to get my posts into flat files, consisting of &lt;a href="https://github.com/mojombo/jekyll/wiki/yaml-front-matter"&gt;some Yaml at the top&lt;/a&gt;, and the post content underneath.&lt;/p&gt;

&lt;p&gt;The typical approach for exporting data from an existing system is to directly query the DB, but this is a bit more complex with EE. EE has a very, very complex schema that&amp;rsquo;s basically a case study in why RDBMSes are not suitable for flexible content storage. So yeah, I could dive into that monster, but I was not excited about doing it.&lt;/p&gt;

&lt;p&gt;Thankfully, a little Googlin&amp;rsquo; turned up a much more sensible solution: Just use EE itself to generate a dump file. Because you can generate just about any kind of content format with EE&amp;rsquo;s templates, you can let the CMS itself do the dirty work of pulling the post content together, and format it as needed.&lt;/p&gt;

&lt;p&gt;I basically followed the approach &lt;a href="http://contentdivergent.blogspot.com/2008/01/exporting-from-expression-engine.html"&gt;Robin Fay suggests in her blog&lt;/a&gt;. She&amp;rsquo;s dumping data out to import into Movable Type, though, so I had to do things a little differently.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I made a template group in ExpressionEngine called &lt;code&gt;exp&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;I created a template in the &lt;code&gt;exp&lt;/code&gt; group called &lt;code&gt;comments&lt;/code&gt;.
  &lt;script src="https://gist.github.com/874509.js?file=comments.html"&gt; &lt;/script&gt;
  Yes, this will output the comments as HTML. More on that later.&lt;/li&gt;
  &lt;li&gt;I created a template in the &lt;code&gt;exp&lt;/code&gt; group called &lt;code&gt;posts_jekyll&lt;/code&gt;.
  &lt;script src="https://gist.github.com/874507.js?file=export_jekyll.html"&gt; &lt;/script&gt;
  Here I am generating the Yaml &amp;ldquo;front matter&amp;rdquo; to include some required stuff (like &lt;code&gt;layout&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt;) and also include some custom properties, like &lt;code&gt;author&lt;/code&gt; and &lt;code&gt;old_entry_id&lt;/code&gt;. I&amp;rsquo;m also spitting out &lt;code&gt;category&lt;/code&gt; in the Yaml-prescribed way to do an array of items. Some of these custom properties I didn&amp;rsquo;t end up needing, but I think it&amp;rsquo;s much better to have more data than less, especially when I wasn&amp;rsquo;t 100% sure of what I&amp;rsquo;d need.&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
  I&amp;rsquo;m also generating &lt;code&gt;body&lt;/code&gt; and &lt;code&gt;extended&lt;/code&gt; after the Yaml, without any wrapping HTML – these properties will be output post-formatting filters, so they&amp;rsquo;ll already be HTML. Finally, if the post has comments, I embed that &lt;code&gt;comments&lt;/code&gt; template we created to spit them out as HTML.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finally, I pulled the data down with curl and into a local file    &lt;/p&gt;

    &lt;pre&gt;&lt;code&gt;curl http://funkatron.com/exp/posts_jekyll &amp;gt; ee_posts.txt&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I iterated and refactored this export dump a lot, because I had to be sure it contained all the data I needed. I was dealing with nearly 1000 posts, so fixing them afterwards if I had missed something would have been a huge pain. Depending on your own ExpressionEngine setup, you may have more or less to worry about. Be prepared to experiment.&lt;/p&gt;

&lt;h3 id="how-to-handle-comments"&gt;How to handle comments&lt;/h3&gt;

&lt;p&gt;Note that in my dump, I just have the comments embedded at the end of the posts as HTML. I did this because:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I didn&amp;rsquo;t want to lose the comments&lt;/li&gt;
  &lt;li&gt;I didn&amp;rsquo;t want to allow commenting anymore&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So basically, I wanted to keep what was there for posterity, but I wasn&amp;rsquo;t going to include commenting ability in the new setup. That made things easier for me. If you want to keep comments, you might look into &lt;a href="https://gist.github.com/202802"&gt;dumping your comment data into Disqus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking back, I probably could have delineated the comments section better. I&amp;rsquo;m not sure I&amp;rsquo;m 100% happy with how I did it, but it&amp;rsquo;s acceptable.&lt;/p&gt;

&lt;h3 id="splitting-up-the-dump-file"&gt;Splitting up the dump file&lt;/h3&gt;

&lt;p&gt;So I&amp;rsquo;ve generated one big text file with all my post data. Jekyll wants each post in its own file, so I needed to sort out how to split the dump file. Anticipating this, I included a bit of HTML at the end of each post to mark the end:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!-- end of post --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jekyll is also rather picky about how the files are names, so I needed to parse the Yaml to generate the filename.&lt;/p&gt;

&lt;p&gt;I looked into several bash scripting approaches, but I had trouble adapting them to what I needed. In the end I went with what I know, and wrote a small PHP shell script to split the files as I needed:&lt;/p&gt;

&lt;script src="https://gist.github.com/874502.js?file=split_ee_jekyll_output.php"&gt; &lt;/script&gt;

&lt;p&gt;This script pulls in the contents of the file, splits it based on my post delimiter, and then iterates over each post in the &lt;code&gt;$split&lt;/code&gt; array, pulling out the Yaml data and using &lt;code&gt;preg_match()&lt;/code&gt; to grab the &lt;code&gt;date&lt;/code&gt; and &lt;code&gt;url_title&lt;/code&gt; properties to build the filename. It then writes out the post file with that filename.&lt;/p&gt;

&lt;p&gt;Now I had a bunch of Jekyll-format post files. I put these in the &lt;code&gt;_posts&lt;/code&gt; directory.&lt;/p&gt;

&lt;h3 id="site-layouts"&gt;Site layouts&lt;/h3&gt;

&lt;p&gt;Probably the hardest bit of this process was figuring out the templating system. There aren&amp;rsquo;t any examples or best practices described in the Jekyll docs, so I ended up futzing around a lot. What helped the most was finding a couple folks who put &lt;a href="https://github.com/al3x/al3x.github.com/"&gt;their entire blog up on GitHub&lt;/a&gt;, so I could see exactly how they did it and &lt;strike&gt;rip them off&lt;/strike&gt; borrow their approaches.&lt;/p&gt;

&lt;p&gt;Things made a lot more sense when I realized that the templates themselves can have Yaml at the top, and they can use other templates as a &amp;ldquo;parent.&amp;rdquo; So in my setup, I have a base layout called &lt;a href="https://github.com/funkatron/funkatron.com/blob/master/_layouts/default.html"&gt;&lt;code&gt;default.html&lt;/code&gt;&lt;/a&gt;, and a &lt;a href="https://github.com/funkatron/funkatron.com/blob/master/_layouts/post.html"&gt;&lt;code&gt;post.html&lt;/code&gt;&lt;/a&gt; which uses &lt;code&gt;default.html&lt;/code&gt; as its parent. When &lt;code&gt;post.html&lt;/code&gt; is parsed, its content is injected into the &lt;code&gt;default.html&lt;/code&gt; template in the &lt;a href="https://github.com/funkatron/funkatron.com/blob/master/_layouts/default.html#L61"&gt;&lt;code&gt; placeholder&lt;/code&gt;&lt;/a&gt;. I also have a &lt;code&gt;page.html&lt;/code&gt; layout template for non-post, informational pages (like &amp;ldquo;About&amp;rdquo;). So in my &lt;code&gt;_posts&lt;/code&gt; files, I put &lt;code&gt;layout: post&lt;/code&gt; in the Yaml, and it will use the &lt;code&gt;post.html&lt;/code&gt; layout. In my other pages, I use &lt;code&gt;layout: page&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Getting my site looking the way I wanted was a bit of a challenge, because Jekyll will regenerate the entire site every time you republish. It didn&amp;rsquo;t help that I am using &lt;a href="http://lesscss.org/"&gt;Less&lt;/a&gt;, which also requires a conversion step. If I make one change to a template, it will have to process nearly 1000 posts. Making changes was a bit of a chore because of this. Two things helped here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Use the &lt;a href="https://github.com/mojombo/jekyll/wiki/configuration"&gt;server feature of Jekyll&lt;/a&gt; to get your layout and design stuff sorted locally, before you push it up to your server.&lt;/li&gt;
  &lt;li&gt;keep only a few posts in your &lt;code&gt;_posts/&lt;/code&gt; directory while refactoring page design. This makes the generation time much more tolerable.&lt;/li&gt;
  &lt;li&gt;Using tools that let me test design changes on a &amp;ldquo;live&amp;rdquo; site. I used  &lt;a href="http://macrabbit.com/cssedit/"&gt;CSSEdit&lt;/a&gt; a lot for this, and it was very helpful.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="redirecting-old-urls-to-new"&gt;Redirecting old URLs to new&lt;/h3&gt;

&lt;p&gt;Depending on your previous setup, you may need to redirect old URLs to the new ones on your Jekyll site. I do this with an &lt;code&gt;.htaccess&lt;/code&gt; file on my server (not maintained in Jekyll, although it could be). It handles more than just stuff for Jekyll, but here&amp;rsquo;s the pertinent bits for redirecting:&lt;/p&gt;

&lt;script src="https://gist.github.com/899813.js?file=.htaccess"&gt; &lt;/script&gt;

&lt;h3 id="automating-build-tasks-and-deployment"&gt;Automating build tasks and deployment&lt;/h3&gt;

&lt;p&gt;In my Jekyll directory I have a &lt;code&gt;_bin/&lt;/code&gt; folder that contains a few scripts. The most important one is &lt;code&gt;rebuild.sh&lt;/code&gt;, which is what I run when I have finished a post and I&amp;rsquo;m ready to make it live. The file contains some private info so it&amp;rsquo;s not in &lt;a href="https://github.com/funkatron/funkatron.com"&gt;my GitHub repo&lt;/a&gt;, but I included it here with the juicy bits redacted:&lt;/p&gt;

&lt;script src="https://gist.github.com/899793.js?file=rebuild.sh"&gt; &lt;/script&gt;

&lt;p&gt;In order, this script:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code&gt;cd&lt;/code&gt;s to my local Jekyll site directory&lt;/li&gt;
  &lt;li&gt;runs a short PHP script to generate a page from an RSS feed&lt;/li&gt;
  &lt;li&gt;generates the site.css file from the .less file&lt;/li&gt;
  &lt;li&gt;runs &lt;code&gt;jekyll&lt;/code&gt;, which regenerates the site in the &lt;code&gt;_site&lt;/code&gt; directory&lt;/li&gt;
  &lt;li&gt;when &lt;code&gt;jekyll&lt;/code&gt; finishes, &lt;code&gt;rsync&lt;/code&gt;s the contents of &lt;code&gt;_site&lt;/code&gt; up to the server hosting funkatron.com.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So when I&amp;rsquo;m happy with this post, I&amp;rsquo;ll just run &lt;code&gt;_bin/rebuild.sh&lt;/code&gt;, and everything is generated and deployed for me. It&amp;rsquo;s very clean, very reliable, and I know everything that happens. That&amp;rsquo;s nice.&lt;/p&gt;

&lt;p&gt;One warning: DO NOT use &lt;code&gt;rsync&lt;/code&gt;&amp;rsquo;s &lt;code&gt;--delete&lt;/code&gt; option if you&amp;rsquo;re deploying into a directory that has other, non-Jekyll-maintained content. I blew away a bunch of files this way, but thankfully had backups. &lt;/p&gt;

&lt;p&gt;Another minor issue is that the RSS feed that is used to generate &lt;a href="http://funkatron.com/items.html"&gt;&lt;code&gt;items.html&lt;/code&gt;&lt;/a&gt; updates way more often than I rebuild the blog, so it&amp;rsquo;s woefully out of date after a day or so. It would probably be better to generate this page in particular with its own cron job, but I haven&amp;rsquo;t been bothered to address this yet. Folks can just &lt;a href="http://funkatron.com/feeds/itemsofinterest"&gt;subscribe to the RSS feed&lt;/a&gt; if they&amp;rsquo;re really compelled.&lt;/p&gt;

&lt;p&gt;I consider the move from ExpressionEngine to Jekyll for my blog a pretty big success. It removed a lot of unnecessary overhead and maintenance tasks. It also kinda reminded me that publishing content doesn&amp;rsquo;t have to be a complex process. You don&amp;rsquo;t have to make an &lt;em&gt;application&lt;/em&gt; just to publish stuff online. You just need some HTML pages, and maybe a few scripts to make the tedious stuff a bit easier.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/funkatron/funkatron.com"&gt;GitHub Repo for Funkatron.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=qdIhubz5Fw4:qW-B1KqyGVk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=qdIhubz5Fw4:qW-B1KqyGVk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=qdIhubz5Fw4:qW-B1KqyGVk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=qdIhubz5Fw4:qW-B1KqyGVk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=qdIhubz5Fw4:qW-B1KqyGVk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=qdIhubz5Fw4:qW-B1KqyGVk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/qdIhubz5Fw4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/migrating-from-expressionengine-to-jekyll.html</feedburner:origLink></entry>
 
 <entry>
   <title>Questions for Spaz Project contributors about communication mediums</title>
   <link href="http://feedproxy.google.com/~r/funkablog-atom/~3/uzHCJjuxtVo/questions-for-spaz-project-contributors-about-communication-mediums.html" />
   <updated>2011-03-26T00:00:00-04:00</updated>
   <id>http://funkatron.com/posts/questions-for-spaz-project-contributors-about-communication-mediums</id>
   <content type="html">&lt;p&gt;If you&amp;rsquo;re a &lt;a href="http://getspaz.com"&gt;Spaz Project&lt;/a&gt; contributor, or have &lt;a href="http://help.getspaz.com/kb/general-25/contribute"&gt;thought about becoming one&lt;/a&gt;, I&amp;rsquo;d &lt;em&gt;really&lt;/em&gt; appreciate it if you&amp;rsquo;d fill out this very short survey. Thanks!!&lt;/p&gt;

&lt;iframe src="https://spreadsheets.google.com/embeddedform?formkey=dGZVaW5ydkFVc1JraWxHWDRRcl85dkE6MQ" width="600" height="857" frameborder="0" marginheight="0" marginwidth="0"&gt;Loading...&lt;/iframe&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=uzHCJjuxtVo:u_gZSsxvoyQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=uzHCJjuxtVo:u_gZSsxvoyQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=uzHCJjuxtVo:u_gZSsxvoyQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?i=uzHCJjuxtVo:u_gZSsxvoyQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=uzHCJjuxtVo:u_gZSsxvoyQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/funkablog-atom?a=uzHCJjuxtVo:u_gZSsxvoyQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/funkablog-atom?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/uzHCJjuxtVo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://funkatron.com/posts/questions-for-spaz-project-contributors-about-communication-mediums.html</feedburner:origLink></entry>
 
 
<entry><title type="text">Links for 2010-12-15 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/MjvMBdJ9aSk/funka7ron" /><updated>2010-12-16T00:00:00-08:00</updated><id>http://del.icio.us/funka7ron#2010-12-15</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kolber.github.com/audiojs/"&gt;audio.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/MjvMBdJ9aSk" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-12-15</feedburner:origLink></entry><entry><title type="text">Links for 2010-11-30 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/G4XCDleuIUU/funka7ron" /><updated>2010-12-01T00:00:00-08:00</updated><id>http://del.icio.us/funka7ron#2010-11-30</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;A successful Git branching model &amp;raquo; nvie.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/G4XCDleuIUU" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-11-30</feedburner:origLink></entry><entry><title type="text">Links for 2010-11-20 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/Bnh7PmonCbc/funka7ron" /><updated>2010-11-21T00:00:00-08:00</updated><id>http://del.icio.us/funka7ron#2010-11-20</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dev.lithify.me/lithium_textmate"&gt;A TextMate Bundle for Lithium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/Bnh7PmonCbc" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-11-20</feedburner:origLink></entry><entry><title type="text">Links for 2010-11-19 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/ODbLi44JTeg/funka7ron" /><updated>2010-11-20T00:00:00-08:00</updated><id>http://del.icio.us/funka7ron#2010-11-19</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.bofh.org.uk/2010/11/18/higher-order-javascript"&gt;Higher Order Javascript&lt;/a&gt;&lt;br/&gt;
&amp;quot;In the presentation I asked for a show of hands from people who’d done higher ordered programming before. A scattering of hands went up. Then I asked who’d used jQuery’s $.each(function {...}) and most hands in the room went up. Which means that most of the people in the room had used higher order programming and never realised it.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/ODbLi44JTeg" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-11-19</feedburner:origLink></entry><entry><title type="text">Links for 2010-11-18 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/lXwkqqd8i58/funka7ron" /><updated>2010-11-19T00:00:00-08:00</updated><id>http://del.icio.us/funka7ron#2010-11-18</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lifehacker.com/5693309/how-to-install-android-on-an-iphone-in-six-easy-steps"&gt;How to Install Android on an iPhone in Six Easy Steps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/lXwkqqd8i58" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-11-18</feedburner:origLink></entry><entry><title type="text">Links for 2010-11-12 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/9qDIs-FXDD8/funka7ron" /><updated>2010-11-13T00:00:00-08:00</updated><id>http://del.icio.us/funka7ron#2010-11-12</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mathjax.org/"&gt;MathJax | Beautiful math in all browsers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://plupload.com/"&gt;Plupload - A tool for uploading files using Flash, Silverlight, Google Gears, HTML5 or Browserplus&lt;/a&gt;&lt;br/&gt;
&amp;quot;Allows you to upload files using HTML5 Gears, Silverlight, Flash, BrowserPlus or normal forms, providing some unique features such as upload progress, image resizing and chunked uploads.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/9qDIs-FXDD8" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-11-12</feedburner:origLink></entry><entry><title type="text">Links for 2010-10-28 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/funkablog-atom/~3/rse-C8IEg2o/funka7ron" /><updated>2010-10-29T00:00:00-07:00</updated><id>http://del.icio.us/funka7ron#2010-10-28</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://knockoutjs.com/"&gt;Knockout : Home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/funkablog-atom/~4/rse-C8IEg2o" height="1" width="1"/&gt;</content><feedburner:origLink>http://del.icio.us/funka7ron#2010-10-28</feedburner:origLink></entry></feed>

