<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>0xDECAFBAD - Tag: python</title>
    <link href="http://decafbad.com/blog/atom.xml" rel="self"/>
    <link href="http://decafbad.com/blog"/>
    <updated>2011-11-16T16:29:50+00:00</updated>
    <id></id>
    <author>
        <name></name>
        <email>l.m.orchard@pobox.com</email>
    </author>
    

    <entry>
        <title>Badger 2: Return of the Mustelidae</title>
        <link href="http://decafbad.com/blog/2011/07/18/badger2"/>
        <updated>2011-07-18T15:03:13+00:00</updated>
        <id>http://decafbad.com/blog/2011/07/18/badger2</id>
        <content type="html">&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: &lt;em&gt;A year ago, I said I wanted to build a badging service
for the Mozilla community, so we could all celebrate how awesome we
all are. Well, I putzed around and didn't get far, so I'm starting
over with something more immediately useful.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;{{ site.baseurl }}/images/badger-logo-working.png&quot; style=&quot;width:98%; display: block&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(This is an awesome illustration by &lt;a href=&quot;http://seanmartell.com/&quot;&gt;Sean
Martell&lt;/a&gt;, used entirely without permission.
I'll take it down if anyone gets mad.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Almost a year ago, &lt;a href=&quot;http://decafbad.com/2010/07/badger-article/&quot;&gt;I wrote about building a badging service for
all of Mozilla&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In a nutshell, I left the &lt;a href=&quot;http://www.flickr.com/photos/gen/4784616521/&quot;&gt;2010 Mozilla Summit&lt;/a&gt;
wanting to build a tool that empowered people to craft social objects
representing achievement and gratitude, and give them to each other.&lt;/p&gt;

&lt;p&gt;Since then, I've &lt;a href=&quot;https://github.com/lmorchard/badger&quot;&gt;played around with a prototype in Django with
Pinax&lt;/a&gt;.  But, I abandoned that thing due to getting super
busy with the Firefox 4 release. It also didn't help that I was a
Django newb and that I got caught up in screwing around with shiny
things like &lt;a href=&quot;http://pinaxproject.com&quot;&gt;Pinax&lt;/a&gt; and &lt;a href=&quot;http://lettuce.it&quot;&gt;Lettuce&lt;/a&gt; and neglected the actual feature
set.&lt;/p&gt;

&lt;p&gt;So now, finally, &lt;a href=&quot;https://github.com/lmorchard/badger2&quot;&gt;I'm picking the thread back up again&lt;/a&gt;. This
time, with a little less ambition and a few more practical aims.&lt;/p&gt;

&lt;h3&gt;Make something more useful right away&lt;/h3&gt;

&lt;p&gt;While I &lt;em&gt;have&lt;/em&gt; spent some dangerous time screwing around with shinies like
&lt;a href=&quot;http://vagrantup.com&quot;&gt;Vagrant&lt;/a&gt;, &lt;a href=&quot;http://pupetlabs.com&quot;&gt;Puppet&lt;/a&gt;, and &lt;a href=&quot;https://github.com/mozilla/playdoh&quot;&gt;Playdoh&lt;/a&gt;, I think I've gotten that
mostly out of my system and have gotten down to work &lt;a href=&quot;https://github.com/lmorchard/badger2/commits/master&quot;&gt;as of last
night&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Rather than build a Grand Central Station for badges, I've reset my
goals to a progression of practical results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a reusable Django app that supports some basic use cases of
creating and awarding badges to users.&lt;/li&gt;
&lt;li&gt;Add &lt;a href=&quot;http://activitystrea.ms&quot;&gt;Activity Stream&lt;/a&gt;s narrating &lt;a href=&quot;http://wiki.activitystrea.ms/w/page/27189812/Badge&quot;&gt;badge claims&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add support for &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; with Badger activity streams&lt;/li&gt;
&lt;li&gt;Add a REST API, maybe with OAuth&lt;/li&gt;
&lt;li&gt;Accept badges for local users, via &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PuSH&lt;/a&gt; from
external sites&lt;/li&gt;
&lt;li&gt;See what the &lt;a href=&quot;https://wiki.mozilla.org/Badges&quot;&gt;Open Badges Project&lt;/a&gt; is up to, and how Badger can
fit in with their goals.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The idea here is to make Badger a practical, reusable, drop-in app for
existing sites—preferably (but not necessarily) the
&lt;a href=&quot;https://github.com/mozilla/playdoh&quot;&gt;Playdoh&lt;/a&gt;-flavored sites we're building at Mozilla. Then,
incrementally and optionally empower a Badger-enabled site to become a
badge hub by accepting reports of badge claims from other
Badger-enabled sites.&lt;/p&gt;

&lt;h3&gt;Take baby steps to federation&lt;/h3&gt;

&lt;p&gt;So, for example, let's say we dropped Badger into a few sites like
these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.mozilla.org&quot;&gt;http://developer.mozilla.org&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.mozilla.com&quot;&gt;http://support.mozilla.com&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://addons.mozilla.org&quot;&gt;http://addons.mozilla.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;At first, Badger would just augment those sites with badging
facilities for their respective user bases. That could fill some needs
right away.&lt;/p&gt;

&lt;p&gt;Then, say we built a site that offered personal profiles to members of
the Mozilla community.  With the &lt;a href=&quot;http://activitystrea.ms&quot;&gt;Activity Stream&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PuSH&lt;/a&gt;
augmentations, users could connect their profiles with each of the
other Mozilla sites they use.  That way, whenever they claim a badge
out there, it gets delivered to their community profile.&lt;/p&gt;

&lt;h3&gt;Why bother federating at all?&lt;/h3&gt;

&lt;p&gt;If the only cross-site goal to build an all-in-one display case for
badges on a community profile, I could just build JSON feeds and wrap
them in a JS-based widget. In fact, &lt;a href=&quot;http://activitystrea.ms/specs/json/1.0/&quot;&gt;a JSON-formatted Activity
Stream&lt;/a&gt; will work nicely for that. Drop that into the profile
page, and we're done.&lt;/p&gt;

&lt;p&gt;There are lots of reasons to federate. But, at least one thing not supported by
this solution are &lt;a href=&quot;http://decafbad.com/2010/07/badger-article/#section-105&quot;&gt;meta-badges&lt;/a&gt;. That is, badges awarded for badges.&lt;/p&gt;

&lt;p&gt;Let's say you close 100 bugs on Bugzilla, answer 100 questions on
SUMO, edit 100 pages of documentation on MDN, and author 100 add-ons.
And, let's say you get badges on the respective sites for all of those
activities.&lt;/p&gt;

&lt;p&gt;Well, now, I'd like to give you a badge on your community profile for
being a &lt;strong&gt;Mozilla Superhero&lt;/strong&gt;. I could just do that by hand, having
observed all your greatness. But, I'd rather the system just do that
automatically.&lt;/p&gt;

&lt;p&gt;If your community profile treated all your badges from your chosen affiliated
sites as first-class citizens, then I could build the meta-badge
trigger right there.&lt;/p&gt;

&lt;p&gt;Of course, I could also write a program that monitors badge feeds from
various sites. Then, use the community profile site's Badger API to
issue a badge when the conditions are met. But, as maintainer of the
monitoring program, I'd have to keep track of what feeds where count
for which people, which could be a mess.&lt;/p&gt;

&lt;p&gt;There's still some thinking to do here.&lt;/p&gt;

&lt;h3&gt;What about identity and co-opting badges?&lt;/h3&gt;

&lt;p&gt;I'm still thinking through how someone connects a profile to other
sites. As in, how can Badger ensure that the owner of the community
profile is also the owner of a badge claim feed on MDN?  Maybe some
kind of OAuth dance that results in a &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PuSH&lt;/a&gt; subscription between
sites?&lt;/p&gt;

&lt;p&gt;Consider the least-capable federation case: a Badger-compatible feed
hosted as a static file on Amazon S3. And, by Badger-compatible, I
mean an &lt;a href=&quot;http://activitystrea.ms&quot;&gt;Activity Stream&lt;/a&gt; that contains &lt;a href=&quot;http://wiki.activitystrea.ms/w/page/27189812/Badge&quot;&gt;badge claims&lt;/a&gt;. You
shouldn't need my specific implementation of Badger-in-Django to
produce one of those.&lt;/p&gt;

&lt;p&gt;Although &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PuSH&lt;/a&gt; is still the ideal case (I think), occasional
polling of an &lt;a href=&quot;http://activitystrea.ms&quot;&gt;Activity Stream&lt;/a&gt; feed should still be supported. If a
user connects that up to their community profile, we just have to take
their word for it. We'd rely on community members to
flag stinkers trying to claim badge feeds that aren't theirs.&lt;/p&gt;

&lt;p&gt;Beyond that, there's probably some crypto-voodoo we can invoke here,
for cases where badge claim validity really matters—as opposed to the
fun and games I have in mind for Mozilla.&lt;/p&gt;

&lt;h3&gt;What about the Open Badges Project?&lt;/h3&gt;

&lt;p&gt;From various conversations over the past year, it sounds to me like
the &lt;a href=&quot;https://wiki.mozilla.org/Badges&quot;&gt;Open Badges Project&lt;/a&gt; is getting the parts in place to do even
more interesting federation of badges that gives ownership of the
badge hub to the user.&lt;/p&gt;

&lt;p&gt;In that scenario, you have a backpack in your browser and can carry
your badge claims with you between sites with no prior coordination
between the sites themselves.&lt;/p&gt;

&lt;p&gt;This sounds like something in which Badger should be able to
participate, eventually. If not as a hub, Badger should at least offer
the tools to create and award badges that work with the user-owned hub
scheme.&lt;/p&gt;

&lt;h3&gt;So, what next?&lt;/h3&gt;

&lt;p&gt;Now that I've written all this out, I need to hack on it. If you're
interested in this stuff, let me know. That way, it'll look like
someone might actually find this stuff handy when I get something
working!&lt;/p&gt;

&lt;!-- vim: set wrap wm=5 syntax=mkd textwidth=70: --&gt;




&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-256743407&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=afd2a7efeaad01509a571bae031dfc5c&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;David Boswell&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-256743407&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-07-19T01:18:24&quot;&gt;2011-07-19T01:18:24&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Very cool to see an update on Badger.  I'm definitely interested in this and would love to see something like this show up in the Mozillians phonebook that will be ready soonish :)

David&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-257292756&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://briks.si&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=29e2f1888cdcc9c451d32ab902d5a19c&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://briks.si&quot;&gt;Brian King&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-257292756&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-07-19T15:12:01&quot;&gt;2011-07-19T15:12:01&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Over at the Mozilla Reps program, we are discussing the possible use of badges - https://wiki.mozilla.org/ReMo&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-257331862&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://kanai.net/weblog/&quot;&gt;&lt;img src=&quot;http://disqus.com/api/users/avatars/gkanai.jpg&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://kanai.net/weblog/&quot;&gt;Gen Kanai&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-257331862&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-07-19T15:48:22&quot;&gt;2011-07-19T15:48:22&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Agreed with DBos. Would love to see Badger as an official service, especially with the new Campus Reps program that Jason Haas is rebooting as well as with the Mozilla Representatives program. Also you might get a badge for contributing to the Join Mozilla program? So many great uses for us.&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-278082903&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://disqus.com/api/users/avatars/interstar.jpg&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;interstar&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-278082903&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-08-05T03:15:39&quot;&gt;2011-08-05T03:15:39&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Hi Les,

Very very interesting. 

I was just thinking that there needed to be something like the Open Badges project today. (I'd even got as far as knocking up a data-model in web2py.) And then I saw this.

I quickly cloned and tried out your app with an ordinary Django project but it's blowing up without jingo and I guess other Playdoh related modules. Are you committed to Playdoh for Badger2 ?

&lt;/div&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-278514925&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://decafbad.com/&quot;&gt;&lt;img src=&quot;http://disqus.com/api/users/avatars/lmorchard.jpg&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://decafbad.com/&quot;&gt;Les Orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-278514925&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-08-05T18:05:31&quot;&gt;2011-08-05T18:05:31&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;I'm committed to Playdoh insofar as my initial users will probably be my co-workers at Mozilla, who are all building Playdoh-based sites.

But, there's no reason why it shouldn't eventually work with vanilla Django. It's using core template loaders and shortcuts, so switching over to standard stuff shouldn't be an issue for the views and models.

I'm hoping at some point to put together some more Django-conventional template tags and templates toward that end, unless someone gets to it before me in a pull request (patches welcome!). Really, I think the template tags are the more important thing, since any templates out of the box will likely get overridden on a real site.&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-301119028&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.integrating-technology.org/&quot;&gt;&lt;img src=&quot;http://disqus.com/api/users/avatars/nelliemuller.jpg&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.integrating-technology.org/&quot;&gt;Dr. Nellie Deutsch&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-301119028&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2011-09-02T14:07:45&quot;&gt;2011-09-02T14:07:45&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;I love the idea, Leslie.  I've been heading a self-funded organization that provides free online professional development workshops for educators around the world since 2006. We need badges for our graduates.  Let me know how I can be of help. &lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>Firefox Sync server on Google App Engine</title>
        <link href="http://decafbad.com/blog/2010/07/05/firefox-sync-server-on-google-app-engine"/>
        <updated>2010-07-05T23:00:56+00:00</updated>
        <id>http://decafbad.com/blog/2010/07/05/firefox-sync-server-on-google-app-engine</id>
        <content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;a href=&quot;http://github.com/lmorchard/firefox-sync-appengine&quot;&gt;I built an implementation&lt;/a&gt; of the &lt;a href=&quot;https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API&quot;&gt;Firefox Sync server API&lt;/a&gt; for &lt;a href=&quot;http://appengine.google.com/&quot;&gt;Google App Engine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mozilla.com/en-US/firefox/sync/&quot; style=&quot;float: right; padding: 0 0 0em 0em; display: block; text-decoration: none; border: none&quot;&gt;&lt;img src=&quot;http://mozcom-cdn.mozilla.net/img/firefox/sync/sync-background.png&quot; style=&quot;border: none&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To celebrate &lt;a href=&quot;http://en.wikipedia.org/wiki/Independence_Day_%28United_States%29&quot;&gt;Independence Day&lt;/a&gt;, I figured I might take a shot at liberating &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/sync/&quot;&gt;Firefox Sync&lt;/a&gt; from the tyranny of &lt;a href=&quot;https://services.mozilla.com/&quot;&gt;Mozilla's servers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thus, over the past few days, I've &lt;a href=&quot;http://github.com/lmorchard/firefox-sync-appengine&quot;&gt;built a sync server&lt;/a&gt; using the &lt;a href=&quot;https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API&quot;&gt;1.0 Sync API&lt;/a&gt;, hosted on &lt;a href=&quot;http://appengine.google.com/&quot;&gt;Google App Engine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I lied about the &lt;em&gt;tyranny&lt;/em&gt; thing, though—I just wanted to say something clever about the holiday. In reality, with respect to &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/sync/&quot;&gt;Firefox Sync&lt;/a&gt;, Mozilla has done all of the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Published &lt;a href=&quot;https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API&quot;&gt;the Sync API spec&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Released &lt;a href=&quot;http://hg.mozilla.org/services/sync-server/&quot;&gt;the source code for the server used in-house&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Explicitly included the option to use a custom server when setting up sync in the browser.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;This means that, although Mozilla offers servers to go along with &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/sync/&quot;&gt;Firefox Sync&lt;/a&gt;, you're totally free to take your data elsewhere. Since your sync data is encrypted and practically opaque to the server, there's no direct profit for Mozilla in offering free sync hosting—not even through any clandestine data mining for devious purposes. It's just that sync makes Firefox a better browser, and &lt;em&gt;somebody&lt;/em&gt; has to run some servers to make it work.&lt;/p&gt;

&lt;p&gt;So, there's every incentive to make it easy for you to switch sync providers and &lt;em&gt;stop freeloading&lt;/em&gt; on Mozilla's servers. Building a server on &lt;a href=&quot;http://appengine.google.com/&quot;&gt;Google App Engine&lt;/a&gt; means I can freeload on &lt;em&gt;Google's&lt;/em&gt; servers!&lt;/p&gt;

&lt;p&gt;I kid, of course. No one's really complaining about freeloaders, and App Engine has quotas in place to head off any serious mooching—which is why I'm not telling you where to find &lt;em&gt;my&lt;/em&gt; sync server deployed on Google App Engine, by the way.&lt;/p&gt;

&lt;p&gt;No, I did this because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firefox Sync and Google App Engine are interesting and important technologies;&lt;/li&gt;
&lt;li&gt;I've already done a bit of work on the PHP-based Firefox Sync server at Mozilla;&lt;/li&gt;
&lt;li&gt;I really wanted to take a break from PHP and spend some time with my old friend Python.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There are, of course, a number of bugs in this server. But, it seems to be working between a number of machines and browser profiles I have at home. Things are really in need of optimization, it suffers from my inexperience with App Engine, and I keep running into those aforementioned App Engine resource limits—especially when updating or deleting large numbers of items (ie. 1000's to 10000's of items).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/lmorchard/firefox-sync-appengine&quot;&gt;&lt;em&gt;Pull requests and issue reports on GitHub are welcome!&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A next step I'd like to take with this thing is to revisit another old friend, the &lt;a href=&quot;http://www.decafbad.com/twiki/bin/view/Main/DesktopWebAppServer&quot;&gt;desktop web app server&lt;/a&gt;. (Also known as the &lt;a href=&quot;http://www.scripting.com/davenet/2001/01/04/desktopWebsites.html#4&quot;&gt;desktop website&lt;/a&gt;.) It seems to me that it would be interesting to scale this server down to a household appliance—say, just for use by my wife and I.&lt;/p&gt;

&lt;p&gt;I'd be especially happy if the work I'm doing for a Google-hosted app could be self-hosted at home. Seeing as the development environment for App Engine runs on my laptop, I'm willing to bet I can hack the whole shebang into a simple, special-purpose app to download and double-click on a home desktop PC for use as your sync hub.&lt;/p&gt;

&lt;p&gt;Anyway, &lt;a href=&quot;http://github.com/lmorchard/firefox-sync-appengine&quot;&gt;check it out&lt;/a&gt; and let me know what you think.&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088097&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://coffeeonthekeyboard.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=8371744716a9335eb3dcae228fd9d996&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://coffeeonthekeyboard.com/&quot;&gt;James Socol&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088097&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T01:28:02&quot;&gt;2010-07-06T01:28:02&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Assuming you already had a network and a Mac Mini or something at home, it would be pretty interesting to run your own small Sync server just to keep your home computers together. Maybe even use localtunnel for when you're away.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088102&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://morgamic.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=65b020128dafcdb4ef1e5e53c00ed37a&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://morgamic.com/&quot;&gt;Mike&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088102&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T01:36:37&quot;&gt;2010-07-06T01:36:37&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;You are a real-life hero!&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088105&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088105&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T01:52:00&quot;&gt;2010-07-06T01:52:00&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@James: Yup, exactly that. Maybe even roll in some SSL and UPnP port forwarding for easier setup behind a home router. And, if there were a Windows version, it could run on that cruddy desktop back in the spare room.&lt;/p&gt;

&lt;p&gt;@Mike: Naw... this guy is the real hero, &lt;a href=&quot;http://twitter.com/johnolilly/status/17765272082&quot; rel=&quot;nofollow&quot;&gt;even John Lilly agrees&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blogs.denverpost.com/celebritybull/2008/09/09/greatest-american-hero-coming-to-the-big-screen/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://blogs.denverpost.com/celebritybull/files/2008/09/gah.jpg&quot; alt=&quot;Greatest American Hero&quot; title=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088106&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=1d18681d9fa9b5d50b209a2a926dfe7d&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Crash&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088106&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T09:20:54&quot;&gt;2010-07-06T09:20:54&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Is there already a App Id for this tool?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088107&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088107&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T10:18:57&quot;&gt;2010-07-06T10:18:57&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@Crash: Sure, there's an app ID for &lt;em&gt;my&lt;/em&gt; instance of this sync server. But, as I said in the blog post, I'm not sharing it. At least, not until or unless I get the quota usage down to a point that I wouldn't exhaust the free hosting limits.&lt;/p&gt;

&lt;p&gt;It's pretty easy to deploy your own sync server on AppEngine with the source, though.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088108&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=85283c3d40ca2b1a70a0f877a570107c&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Peter Petrov&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088108&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T13:18:11&quot;&gt;2010-07-06T13:18:11&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@Leslie: The app ID of your instance is visible in app.yaml, so you've shared it anyway :)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088113&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088113&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-06T17:18:47&quot;&gt;2010-07-06T17:18:47&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@Peter hah! Right you are! But, at least you had to look at the source of the app first to figure that out :) That is mostly the point of this blog entry after all. Anyone who does that and then uses my installation anyway will probably be sad when I regularly blow away data and eventually make it invite only&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088115&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=4fd1acfa0c7bd0767a90a30fbba73bfb&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Tobias&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088115&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-07T00:24:41&quot;&gt;2010-07-07T00:24:41&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Neat! TyphoonAE http://typhoonae.googlecode.com might help you to build your household appliance.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088117&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=3e7e975f0fa432f4ae6604f72c132309&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Kumar McMillan&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088117&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-07T20:59:25&quot;&gt;2010-07-07T20:59:25&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Hey Les, this is super cool!  Google App Engine's Datastore API is still very shaky though.  In fact, it's been so bad lately that I've been considering porting one of my heavily used apps over to something else.  Thankfully, this post suggests that fixing the Datastore is their top priority: http://googleappengine.blogspot.com/2010/06/datastore-performance-growing-pains.html&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088119&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://home.kairo.at/blog/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=59d914ad47e5c3fcd4c89668adcd43a2&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://home.kairo.at/blog/&quot;&gt;Robert Kaiser&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088119&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-07-07T21:21:51&quot;&gt;2010-07-07T21:21:51&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Well, I actually feel more comfortable with my data being on Mozilla servers than on Google servers - even with the decreased trust I have in the Mozilla organization, I'd trust it more than Google any day! ;-)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221088120&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.chrisarndt.de&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=02653ae22d36044e6870c17cf3d5a005&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.chrisarndt.de&quot;&gt;Chris Arndt&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221088120&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2010-09-28T11:06:55&quot;&gt;2010-09-28T11:06:55&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Instead of porting GAE to your desktop, why don't you just port your app to plain Django? Django should run off your desktop with no problems.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>A Curmudgeon Playing with the Zend Framework</title>
        <link href="http://decafbad.com/blog/2007/07/09/a-curmudgeon-playing-with-the-zend-framework"/>
        <updated>2007-07-09T20:21:41+00:00</updated>
        <id>http://decafbad.com/blog/2007/07/09/a-curmudgeon-playing-with-the-zend-framework</id>
        <content type="html">&lt;p&gt;Because it's been awhile since I last surveyed the landscape, I played around a bit with web frameworks this weekend.  Mainly, I tried getting something simple working with the &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt;.  After intermittent play and much studying of documentation between Saturday and Sunday, I got to &quot;hello world.&quot;&lt;/p&gt;


&lt;p&gt;Unlike other web frameworks of late, Zend Framework doesn't come with any magical CLI tools to build out directory trees and / or generate code.  Being somewhat suspicious and curmudgeonly about that sort of magic to begin with, this actually struck me as an attractive thing about ZF.  In fact, what I really liked about ZF at first glance is that it's less of a monolithic &lt;b&gt;system&lt;/b&gt; and more of a bucket of parts from a single source that fit together decently.&lt;/p&gt;


&lt;p&gt;And, all my favorite parts are there:  Among other things there's &lt;a href=&quot;http://framework.zend.com/manual/en/zend.config.html&quot;&gt;config&lt;/a&gt;, &lt;a href=&quot;http://framework.zend.com/manual/en/zend.log.html&quot;&gt;logging&lt;/a&gt;, &lt;a href=&quot;http://framework.zend.com/manual/en/zend.controller.html&quot;&gt;a front controller&lt;/a&gt; with &lt;a href=&quot;http://framework.zend.com/manual/en/zend.controller.router.html&quot;&gt;URL routing&lt;/a&gt;, template-system agnostic &lt;a href=&quot;http://framework.zend.com/manual/en/zend.view.html&quot;&gt;view support&lt;/a&gt;, and somewhat non-magical &lt;a href=&quot;http://framework.zend.com/manual/en/zend.db.html&quot;&gt;DB / model support&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;These were all things I'd grabbed from &lt;a href=&quot;http://pear.php.net/&quot;&gt;PEAR&lt;/a&gt; for &lt;a href=&quot;http://decafbad.com/svn/trunk/Cuckoo/lib/MiniFramework.php&quot;&gt;my more recent PHP mini-framework&lt;/a&gt; play, but I figured there should be some benefit from finding them in a unified collection like the Zend Framework.&lt;/p&gt;


&lt;p&gt;The experience was somewhat similar to rolling my own, though.  I stumbled through some docs and eventually found some blog entries and a tutorial.  It's all very loosely-coupled and somewhat DIY, which is actually what I wanted.  The experience has left me wondering if I really &lt;b&gt;should&lt;/b&gt; have wanted it, but I'm guessing it'll go easier from here on out.&lt;/p&gt;


&lt;p&gt;In the meantime, though, I feel like I have a decent grasp on what all those loosely-coupled parts are doing.  I've skimmed through code, traced wires, broken things and watched the errors.&lt;/p&gt;


&lt;p&gt;See, my problem with a lot of modern magic-imbued web frameworks is that I have a deep distrust of what they're doing.  They come with a lot of moving parts doing things that I don't see - and when I do finally see them, I tend to run into decisions with which I disagree.  I see abstraction where I think the gritty concrete needs to be left bare.  I often see lots of astronaut acrobatics that just have to be burning tons of cycles.  I see further acrobatics done to compensate, unrolling loops and pre-parsing config files - which requires further layers of magical tools to generate code and caches.&lt;/p&gt;


&lt;p&gt;Too many moving parts wherein assumptions can hide, later to bite me when we're hundreds of miles into the post-launch desert and trying to fight scaling fires or develop a new feature with some weird angles to it.&lt;/p&gt;


&lt;p&gt;For example, consider &lt;a href=&quot;http://www.symfony-project.com/&quot;&gt;Symfony&lt;/a&gt; for PHP.  Their configuration system runs PHP code that results in YAML.  Parsing that YAML, along with cascading layers of other generated YAML, then drives a PHP code generation stage, composing all the static code necessary to bootstrap the framework with each request.  There's an amazing amount of flexibility exposed by that system, and it's quite clever -&amp;nbsp;but my curmudgeonly side catches whiffs of insanity.&lt;/p&gt;


&lt;p&gt;Maybe that's really the issue -&amp;nbsp;I've been doing this stuff long enough to have written my own one of everything, so I've got my own opinions and I like to have a grasp on everything.  I've written front controllers, templating systems, and model abstraction layers.  I've worked in a half-dozen or so languages doing all the above.  I don't yet accept that web app development has &lt;a href=&quot;http://mengwong.livejournal.com/38969.html&quot;&gt;passed the da Vinci point&lt;/a&gt; -&amp;nbsp;a single developer should be able to grasp the structure of a web framework in mind without getting lost in too many fractal branchings.&lt;/p&gt;


&lt;p&gt;Anyway, I'm rambling like an old grouch, but I think I've reached my point.  Hopefully more actual experimentation soon.&lt;/p&gt;

</content>
    </entry>
    
    

    <entry>
        <title>Smarty is on my evil list</title>
        <link href="http://decafbad.com/blog/2006/01/08/smarty-is-on-my-evil-list"/>
        <updated>2006-01-08T01:33:47+00:00</updated>
        <id>http://decafbad.com/blog/2006/01/08/smarty-is-on-my-evil-list</id>
        <content type="html">&lt;p&gt;Although I have &lt;a href=&quot;http://decafbad.com/blog/2005/12/18/not-so-deep-php-thoughts&quot;&gt;my grousing about PHP in general&lt;/a&gt;, I have to say that it makes much better template language as-is before pulling something like &lt;a href=&quot;http://smarty.php.net&quot;&gt;Smarty&lt;/a&gt; into the mix.&lt;/p&gt;

&lt;p&gt;At this point, I consider &lt;a href=&quot;http://smarty.php.net&quot;&gt;Smarty&lt;/a&gt; to be evil—though I'm willing to admit that I haven't grokked it fully yet.  And this is coming from &lt;a href=&quot;http://decafbad.com/blog/2005/09/25/templates-good-or-evil&quot;&gt;a templating addict&lt;/a&gt; who has been at times in love with &lt;a href=&quot;http://www.template-toolkit.org/&quot;&gt;Template Toolkit&lt;/a&gt; in Perl,  &lt;a href=&quot;http://jakarta.apache.org/velocity/&quot;&gt;Velocity&lt;/a&gt; in Java, and &lt;a href=&quot;http://www.cheetahtemplate.org/&quot;&gt;Cheetah&lt;/a&gt; and &lt;a href=&quot;http://twisted.sourceforge.net/TwistedDocs-1.2.0rc3/howto/woven.html&quot;&gt;Woven&lt;/a&gt; and &lt;a href=&quot;http://www.owlfish.com/software/simpleTAL/&quot;&gt;ZPT/TAL&lt;/a&gt; in Python.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPress&lt;/a&gt; seems to have put native-PHP-as-templating to good use, so I've already got a favorite for comparison.  But the use of &lt;a href=&quot;http://smarty.php.net&quot;&gt;Smarty&lt;/a&gt; in &lt;a href=&quot;http://www.reblog.org/&quot;&gt;reBlog&lt;/a&gt; rubs me the wrong way.  Of course, &lt;a href=&quot;http://www.reblog.org/&quot;&gt;reBlog&lt;/a&gt; has a lot of highly-abstracted MVC architecture going on.  And this, itself, is something I haven't much in my PHP explorations thus far.  (In fact, I almost hate to see PHP chopped up in this J2EE-esque fashion, but that's another story.  Oh, and &lt;a href=&quot;http://www.reblog.org/&quot;&gt;reBlog&lt;/a&gt; rocks, by the way.)&lt;/p&gt;

&lt;p&gt;But either way, &lt;a href=&quot;http://smarty.php.net&quot;&gt;Smarty&lt;/a&gt; makes this right-handed hacker feel like he's writing with his left.  It seems to have a lot of weird conventions and terminology for which neither knowledge of PHP nor knowledge of other templating systems in general seem much help.  It could just be a learning curve, but to me it seems like an odd &lt;em&gt;sideways&lt;/em&gt; curve at the moment.&lt;/p&gt;

&lt;p&gt;In fact, you know what?  &lt;a href=&quot;http://smarty.php.net&quot;&gt;Smarty&lt;/a&gt; reminds me a lot of &lt;a href=&quot;http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.html&quot;&gt;DTML in Zope&lt;/a&gt;.  I hate &lt;a href=&quot;http://www.zope.org/Documentation/Guides/DTML-HTML/DTML.html&quot;&gt;DTML&lt;/a&gt;—it, also, is most firmly on my evil list.&lt;/p&gt;

&lt;p&gt;Yuck.  Again, it could be just that I haven't known &lt;a href=&quot;http://smarty.php.net&quot;&gt;Smarty&lt;/a&gt; long enough to like it... but yuck.&lt;/p&gt;

&lt;!-- tags: templating php smarty dtml python perl cheetah webdev programming syndication reblog wordpress evil --&gt;




&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082526&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://luka.kladaric.net/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=78b0e32da6ce10e17db345a9aa8cde78&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://luka.kladaric.net/&quot;&gt;Luka Kladaric&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082526&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-08T11:55:40&quot;&gt;2006-01-08T11:55:40&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I agree with you... I used Smarty in one project and am now using it in another work-in-progress... and I have to say, the decision to use it with the second was a bad one... Smarty is pretty cool for simple templating, but when you need raw power, it leaves you shipwrecked... I had to turn to some really black magic to get things done... Anyway, a rewrite of the first project is in negotiations and I'm 100% sure I will &lt;em&gt;NOT&lt;/em&gt; be using Smarty there, either.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082527&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://laughingmeme.org&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=01457d1a0f0e533062cd0d1033fb4d7a&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://laughingmeme.org&quot;&gt;kellan&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082527&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-08T14:34:57&quot;&gt;2006-01-08T14:34:57&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Agreed.  Using a templating languages with PHP makes no sense. (though I'm not sure the fact that WP does or doesn't do something makes it good design)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082528&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082528&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-08T15:03:33&quot;&gt;2006-01-08T15:03:33&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Kellan:  Oh, no, WordPress isn't an automatic gold standard for me...  There's plenty that could be better about WP.  (Not having checked out 2.0 yet)  But, I just had a much better time setting up the templates for this blog than I have had in hacking around with templates implemented in Smarty.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082529&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://sporkmonger.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=56ee28134dd0776825445e3551979b14&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://sporkmonger.com/&quot;&gt;Bob Aman&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082529&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-08T17:41:17&quot;&gt;2006-01-08T17:41:17&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Me, I just wish there was a templating system for Ruby for me to fall in love with.  With all due respect to the Rails people, ERb just doesn't really do it for me.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082530&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://plasmasturm.org/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e17949267bbfe21a0fadf1bbf00592b4&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://plasmasturm.org/&quot;&gt;Aristotle Pagaltzis&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082530&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-08T21:04:14&quot;&gt;2006-01-08T21:04:14&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;&lt;a href=&quot;#comment-3388&quot; rel=&quot;nofollow&quot;&gt;Bob&lt;/a&gt;: port &lt;a href=&quot;http://kid.lesscode.org/language.html&quot; rel=&quot;nofollow&quot;&gt;Kid&lt;/a&gt; to Ruby. :-&lt;i&gt;&lt;/i&gt;)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082532&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://talideon.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e698f564ac90c4c248f1f678caafd624&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://talideon.com/&quot;&gt;Keith Gaughan&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082532&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-08T21:28:05&quot;&gt;2006-01-08T21:28:05&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;What's moronic is that people go to all this trouble building templating systems when all you really need is extract(). Sad, really.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082533&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.ntwizards.net/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=cb564795a1912c36f9fa1399fd22ce29&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.ntwizards.net/&quot;&gt;Bryce&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082533&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-12T13:33:10&quot;&gt;2006-01-12T13:33:10&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;PHP as a template engine is more evil than Smarty. The main issue is that template authors may not be trustworthy. Once you include or eval() a PHP template the app is no longer in control and I don't see any way of structuring a PHP app such that it cannot be subverted from within. &lt;/p&gt;

&lt;p&gt;The only defense seems to be using the tokenizer functions to build a PHP parser that validates templates against a &quot;whitelist&quot; of allowed operations. Savant's Restricted Compiler is about the only implementation out there, but it's not quite complete and seems to be more of a proof-of-concept than battle-tested code.&lt;/p&gt;

&lt;p&gt;Whatever Smarty's faults, it solves the untrusted templates problem nicely.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082534&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082534&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-12T14:27:42&quot;&gt;2006-01-12T14:27:42&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Bryce: Oh, I totally understand the implications of offering too much capability to template authors.  That's just how much I dislike Smarty—I'm willing to risk it, rather than put up with that particular implementation.  On the other hand, in my situation, I'm on the same team with the template developers, so we're all on the same team to sink or swim.  I know it's not that simple, in principle, but it covers the 80% of the 80/20 equation.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082536&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://dougal.gunters.org/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=81717a172b6918071fbea1a52483294b&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://dougal.gunters.org/&quot;&gt;Dougal Campbell&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082536&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-12T15:25:25&quot;&gt;2006-01-12T15:25:25&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Yeah, I was never able to get into Smarty either, and I've never been able to put my finger on why. Philosophically, I like the idea of using template engines, particularly if you're collaborating with a non-programming designer. I even wrote one (albeit a &lt;em&gt;very simple&lt;/em&gt; one) myself, once. But I've never used any of the PHP template packages that I've looked at.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082537&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://sporkmonger.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=56ee28134dd0776825445e3551979b14&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://sporkmonger.com/&quot;&gt;Bob Aman&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082537&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-13T01:10:16&quot;&gt;2006-01-13T01:10:16&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Aristotle: When TurboGears first came out, I almost did, believe it or not.  But then I remembered that FeedTools eats all of the time I have available for open-source projects, and I figured someone else would probably do it for me anyways...&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082538&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://plasmasturm.org/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e17949267bbfe21a0fadf1bbf00592b4&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://plasmasturm.org/&quot;&gt;Aristotle Pagaltzis&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082538&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-13T09:02:38&quot;&gt;2006-01-13T09:02:38&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Hehe. Well, I plan to port it to Perl, in any case. :&lt;i&gt;&lt;/i&gt;-)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082539&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=31475c246f5521e40d92a29ec0e36aa8&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Brian Grayless&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082539&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-19T16:00:24&quot;&gt;2006-01-19T16:00:24&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Smarty is really a waste of time. Some food for thought....&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.fudnik.com/main/tiki-read_article.php?articleId=7&quot; rel=&quot;nofollow&quot;&gt;Smarty for Dummies?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just write better code!!!&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082540&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=bdbf6409528370f5549e8470caf6ba30&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Tali Banana&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082540&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-02-01T07:33:41&quot;&gt;2006-02-01T07:33:41&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Well, quite opinionated I see.&lt;/p&gt;

&lt;p&gt;Smarty solves some fantastic problems and the cacheing system is beyond fabulous at this level.&lt;/p&gt;

&lt;p&gt;I've used Smarty on several projects and have been using it now exclusively for 4 years.  Of course, I used others but it was getting sick coming to a new phase in a project and finding out the template system had become RIP....abandoned before their time.&lt;/p&gt;

&lt;p&gt;Smarty has done two great things for me, and I'll speak about them until the day that PHP is abolished:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Smarty has reduced my code to a reasonably sized, scan-able, masterpiece.  Having the logic and presentation seperate is so nice.  I recently rewrote one of my old projects using smarty and all of a sudden it made sense!  No more php in the html and no more html in the php.  And that's something you can't solve without templates for you juniors out there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Smarty's caching has turned monster db queries into non issues.  Consider this.  A top 10 list from all-time sales.  I'm talking about searching a db with sales spanning 6 years for all items purchased and creating a top sales page.  Easy!  Smarty does it once and caches the results until I decide they need to be refreshed.  Took a 4 second execution time down to less than 0.4 seconds.  And all without having to implement a CMS or otherwise.  Even if you have limitless resources to buy new hardware, caching like this still makes sense.  And the intermediate php/html cache is brilliant.  Everything is so much faster with smarty.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I can't deny, I love Smarty.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082542&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082542&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-02-01T11:43:36&quot;&gt;2006-02-01T11:43:36&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Tali: I'm usually opinionated, but I try to listen &amp;amp; learn :)&lt;/p&gt;

&lt;p&gt;The benefits you describe with Smarty would seem to come with any decent web development system.  Separating logic and presentation are the general idea behind templating, and some sort of caching is a must no matter what you're using as a presentation-side tool.  My beef is that, out of all the templating systems I've used, Smarty is one of the ugliest.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082543&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=bdbf6409528370f5549e8470caf6ba30&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Tali Banana&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082543&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-02-01T17:30:03&quot;&gt;2006-02-01T17:30:03&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Smarty does need some standards redesign on the interface, as does php itself which has been well documented but slow going.&lt;/p&gt;

&lt;p&gt;Coming from the PERL background and previous php template systems I've been very happy with Smarty in general, even if there are a few things that could be done to speed up the learning curve.&lt;/p&gt;

&lt;p&gt;May be worthwhile jumping on the dev team and making some suggestions.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082544&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://plasmasturm.org/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e17949267bbfe21a0fadf1bbf00592b4&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://plasmasturm.org/&quot;&gt;Aristotle Pagaltzis&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082544&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-02-02T01:30:31&quot;&gt;2006-02-02T01:30:31&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;But why would you need a template system when you’re already working with PHP, which is itself a template system? Why do You don’t have to have different languages to be able to put the business logic in one file and the display logic in another.&lt;/p&gt;

&lt;p&gt;Perl (not PERL), btw, has the Template Toolkit on the CPAN, which is the spiritual father of Smarty. (And it’s vaguely more defensible in Perl’s case becase Perl is not a template system; though constrated with Perl the deficiencies of TT’s mini language are just all the more painfully obvious.)&lt;/p&gt;

&lt;p&gt;By all of which I mean to say that whether people use languages in stupid ways does not mean the language is the problem; not in either PHP’s or Perl’s case.&lt;/p&gt;

&lt;p&gt;I also don’t see why you need a templating system to implement caching; in fact, having caching coupled with the template engine sounds like a bad distribution of responsibilities. (Indeed, Template Toolkit has no such facilities.) But there’s the Cache::Cache family of modules on the CPAN, which you can use to cache things completely independently of &lt;em&gt;what&lt;/em&gt; is being cached – whether it be the output of a template, or the query results themselves, or anything else, which might not even have anything to do without any output you generate.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082546&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=bab1c370ad7b246023e23e87c8e206c4&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;M.&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082546&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-02-16T14:13:18&quot;&gt;2006-02-16T14:13:18&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I've good experiences with the Expose PHP template engine (www.kwasd.nl/expose). It doesn't require you to learn a new language, because it uses plain PHP and still offers security, because it contains a tokenizer and, in fact, a small compiler. I used it for some projects and it really offered all I needed. &lt;/p&gt;

&lt;p&gt;And for people who wonder why one would need a template engine: I work with designers and I don't want them to mingle application code. By setting up a shared folder which contains the templates, they can safely work on design and never need to touch my controller or module files. Especially since this template engine has a tokenizer/compiler, they can't call unsafe PHP functions (only those that you, the programmer, register).&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221082549&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://mike.teczno.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e3b46099c3fd3844c4539b27f143fd97&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://mike.teczno.com&quot;&gt;Michal Migurski&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221082549&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-03-05T23:16:25&quot;&gt;2006-03-05T23:16:25&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Smarty appealed to us because it offered a (relatively) clean way to separate the code from the HTML output. It's definitely got its problems. A large part of the choice was based on my perception of Smarty as having much thought &amp;amp; effort behind it, plus I like the idea of templates caching down to plain PHP. I've done a few PHP projects where I used PHP as the templating language, and frequently succumbed to the temptation to stash app logic into the templates where it didn't really belong. Smarty has a pretty extensive vocabulary, but has (so far) resisted the pull to incorporate more real-language features, like PHP did. It's worth remembering that PHP was originally supposed to be a template language for &quot;real&quot; code to be written in C. &lt;em&gt;shudder&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When we forked Reblog from Feed On Feeds, we were starting with raw-PHP display code mixed in with database calls, and it was a freaking disaster. One of my first design goals was to make it hacker-friendly, clarifying and documenting as many seams as possible so people could make localized changes more easily. I'd like to be using Python under the hood with Smarty on top, though there's a lot to be said for using commonly-known tools like Smarty in apps where you want to encourage modifications.&lt;/p&gt;

&lt;p&gt;And Wordpress.... oh, Wordpress. My eyes roll back in my head when I'm forced to touch its convoluted innards. I pushed hard for a Reblog plug-in API specifically so I could cheerfully deprecate the old-style Wordpress plug-in. =)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>Not-so-deep PHP thoughts</title>
        <link href="http://decafbad.com/blog/2005/12/19/not-so-deep-php-thoughts"/>
        <updated>2005-12-19T03:50:25+00:00</updated>
        <id>http://decafbad.com/blog/2005/12/19/not-so-deep-php-thoughts</id>
        <content type="html">&lt;p&gt;You know, not that I've been at it for long, but I've had an long-running observation about PHP:&lt;/p&gt;

&lt;p&gt;As a language and an API, &lt;a href=&quot;http://www.netalive.org/swsu/archives/2004/09/why_php_still_s.html&quot;&gt;PHP kinda stinks&lt;/a&gt;.  It's got more crud than I left behind in Perl, but without all the meta-magic that made it worth it.  And, I get a little nervous tic when I think about it in relation to Python and Ruby.&lt;/p&gt;

&lt;p&gt;On the other hand, it's ubiquitous and cheap—and because it's in the hands of people with all levels of skill, most popular PHP apps have by necessity managed a high standard of easy install and simplicity.  The languages with more meta-magic tend to attract eggheads (myself included) who can forget about keeping things simple.&lt;/p&gt;

&lt;p&gt;And, did I mention PHP is ubiquitous?&lt;/p&gt;

&lt;!-- tags: php webdev perl python ruby --&gt;




&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083537&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.whump.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=152a649080e99c313ecae9a34c60d11d&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.whump.com/&quot;&gt;Bill Humphries&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083537&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-12-19T06:38:33&quot;&gt;2005-12-19T06:38:33&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;ol&gt;
&lt;li&gt;PHP has some future-proofing in that almost everyone doing web development knows it or can pick it up. That reduces risks for IT adoption.&lt;/li&gt;
&lt;li&gt;$5/month web hosts have it installed.&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221083539&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://wdogsystems.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=6e24f47aa88626872c16e0f740739e8a&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://wdogsystems.com&quot;&gt;Tim Howland&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221083539&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2006-01-10T14:27:54&quot;&gt;2006-01-10T14:27:54&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;While I don't care for the crappy structure that the language seems to revel in (SQL in your HTML? WTF?), what I despise about PHP is how hard it is to build and deploy it with a ny extensions to the basic feature set.&lt;/p&gt;

&lt;p&gt;If you need to do images, you compile in LibGD, if you want to render text, you get the freetype libraries, if you need something that isn't mysql, you compile that in- and then off you go trying to find the version of libJpeg from 1993, because the ancient version of libGD that's bundled with PHP doesn't work with anything more recent.&lt;/p&gt;

&lt;p&gt;Plain-vanilla PHP is ubiquitous, but trying to roll your own on an arbitrary box somewhere and do something that doesn't come with the default PHP that ships with your distribution is a huge and unnecessary pain in the ass. Perl can be annoying, but at least it isn't a monolithic binary- the library system drastically reduces the cross-component dependencies that PHP suffers from.&lt;/p&gt;

&lt;p&gt;PHP sucks, and it amazes me that it is so ubiquitous. On the otherhand, so is Microsoft Windows.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>IPython as networked command shell on XBMC?</title>
        <link href="http://decafbad.com/blog/2005/10/25/ipython-as-networked-command-shell-on-xbmc"/>
        <updated>2005-10-25T16:28:01+00:00</updated>
        <id>http://decafbad.com/blog/2005/10/25/ipython-as-networked-command-shell-on-xbmc</id>
        <content type="html">&lt;p&gt;Just in case it's already been done, or I don't get around do doing it, hear me oh &lt;a href=&quot;http://www.lazyweb.org/&quot;&gt;LazyWeb&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;I want to cobble together a version of &lt;a href=&quot;http://ipython.scipy.org/&quot;&gt;IPython&lt;/a&gt; (or at least an &lt;a href=&quot;http://docs.python.org/lib/module-code.html&quot;&gt;InteractiveConsole&lt;/a&gt;) that runs on a network socket for access via telnet.  I then intend to upload this to my &lt;a href=&quot;http://decafbad.com/blog/2005/09/26/making-the-xbox-maker-friendly&quot;&gt;XBMC-equipped Xbox&lt;/a&gt; and run it as a command shell there for access from my LAN.  It seems like an idea that should work, since XBMC packs a Python install.&lt;/p&gt;

&lt;!-- tags: python xbmc xbox lazyweb --&gt;




&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087779&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://edey.org&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=6558a34bd2590143d0e945e7020b49bf&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://edey.org&quot;&gt;mike&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087779&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-26T02:59:28&quot;&gt;2005-10-26T02:59:28&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I don't have such a toy to play with but I'm wondering why the question wasn't asked, and answered, with ssh+screen?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087782&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087782&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-26T03:36:57&quot;&gt;2005-10-26T03:36:57&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@Mike: Because XBMC doesn't run ssh+screen, only a Python interpreter embedded in an entertainment center media dashboard. (ie. Not an OS like Linux)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087784&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://thoughts.keenspace.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=adb573897a5fbaeda0d049a803a33c3f&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://thoughts.keenspace.com/&quot;&gt;kaolin fire&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087784&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-26T06:37:55&quot;&gt;2005-10-26T06:37:55&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;when you say 'like telnet' you mean just opening up port 23 and listening on it and executing said instructions?  I don't know Python (though coincidentally I had to debug some 2-3yo python today; that was interesting), but I presume it makes it not-so-hard to open server sockets and listener sockets, and then execute the dynamic code in a readloop... but then I don't know XBMC beyond the above link you posted, so this is probably just all optimistic hot air. ;)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087786&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087786&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-26T10:44:00&quot;&gt;2005-10-26T10:44:00&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;@kaolin: Oh, yeah, I think it would / will be about as easy as that.  I've just been too busy or lazy to have done it yet, and hoped that someone somewhere had already done something whizbangy with a Python shell-on-a-socket.  :)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087789&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=740b38f7d90076fee1dd8aac4459b354&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Chris&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087789&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-27T11:50:52&quot;&gt;2005-10-27T11:50:52&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Perhaps PYRO (Python Remote Objects) is a choice, I might give it a try
on weekend (on my xbox of course). Though I cannot imagine any real use
so far.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087792&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=d7875f8cfd8ba9262bfff2bf6f6f9b35&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Itamar Shtull-Trauring&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087792&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-27T18:02:14&quot;&gt;2005-10-27T18:02:14&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;twisted.conch lets you hook up a python interpreter to a telnet or ssh server (which are implemented in Python, of course).&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087794&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=2377f34a68801b861c3e54e1301f0dce&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.decafbad.com&quot;&gt;l.m.orchard&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087794&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-27T19:18:32&quot;&gt;2005-10-27T19:18:32&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Hmm, it's been a year or so since last I tinkered with Twisted...  It's tempting, since I remember all the nifty toys I played with in that environment-- and an Xbox with XBMC is just the place for it, since it doesn't have a shell or much OS infrastructure.  Though, I was kinda looking for something that used the core Python modules so I didn't have to plunk down a lot of code on the HD.&lt;/p&gt;

&lt;p&gt;On the other hand...  Twisted could let me do a lot of things on that little box without installing Linux.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087796&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://highearthorbit.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=a25421f6c79d5f381fab65c82abf85e8&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://highearthorbit.com&quot;&gt;Andrew&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087796&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-11-13T23:17:37&quot;&gt;2005-11-13T23:17:37&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;What about looking at Nokia's Python btconsole. I run the python script on my phone, and then open a screen to the /dev/tty.NokiaBTSocket and am presented with a console on the phone itself.&lt;/p&gt;

&lt;p&gt;I imagine you could grab the btconsole.py or simplebtconsole.py and set it up on XBMC. Depends on what modules are available.&lt;/p&gt;

&lt;p&gt;I'm running a REALLY old version of XBMP (predecessor/sibling to XMBC) and have happily been running Xebian and MythTV frontend. However, recently came across the MythTV front-end with XMBC as well as all these new features so will upgrading it myself. However, the fiance' doesn't much like me messing with her &quot;Tivo&quot;.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>Trac rocks like a really rocking thing</title>
        <link href="http://decafbad.com/blog/2005/09/30/trac-rocks-like-a-really-rocking-thing"/>
        <updated>2005-09-30T16:11:09+00:00</updated>
        <id>http://decafbad.com/blog/2005/09/30/trac-rocks-like-a-really-rocking-thing</id>
        <content type="html">&lt;p&gt;Say hello to &lt;a href=&quot;http://decafbad.com/trac/&quot;&gt;my new Trac installation&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;For a couple of years now, I've been meaning to take a serious look at &lt;a href=&quot;http://projects.edgewall.com/trac/&quot;&gt;Trac&lt;/a&gt;.  But, general level of busy, as well as random obstacles to getting it up and running kept me from getting very far.  Such is so often the story with me.&lt;/p&gt;

&lt;p&gt;Finally, though, I've gotten &lt;a href=&quot;http://decafbad.com/trac/&quot;&gt;an instance&lt;/a&gt; running on our server here.  All I can say is, &quot;&lt;strong&gt;Wow!&lt;/strong&gt;&quot;  This package does everything I ever wanted to cobble together using &lt;a href=&quot;http://twiki.org/&quot;&gt;TWiki&lt;/a&gt;, &lt;a href=&quot;http://moinmoin.wikiwikiweb.de/&quot;&gt;MoinMoin&lt;/a&gt;, &lt;a href=&quot;http://www.kwiki.org/&quot;&gt;kwiki&lt;/a&gt; &lt;a href=&quot;http://viewcvs.sourceforge.net/&quot;&gt;viewcvs&lt;/a&gt;, and any other pieces I ever looked at (ie. &lt;a href=&quot;http://www.bugzilla.org&quot;&gt;Bugzilla&lt;/a&gt;, &lt;a href=&quot;http://www.bestpractical.com/rt/&quot;&gt;Request Tracker&lt;/a&gt;, etc)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://projects.edgewall.com/trac/&quot;&gt;Trac&lt;/a&gt; has an amazingly dead-simple macro and plugin system which puts &lt;a href=&quot;http://twiki.org/&quot;&gt;TWiki&lt;/a&gt; and possibly &lt;a href=&quot;http://www.kwiki.org/&quot;&gt;kwiki&lt;/a&gt; to shame.  Just take a look at the &lt;a href=&quot;http://projects.edgewall.com/trac/wiki/MacroBazaar&quot;&gt;MacroBazzar&lt;/a&gt; and this &lt;a href=&quot;http://trac-hacks.swapoff.org/&quot;&gt;hacks collection&lt;/a&gt;.  And, the system seems pretty cleanly architected—templates pages, simple extension points, SQLite database.  I've already been able to easily wade in and make some tweaks of my own under the hood, as well as fix a few macro/plugins which were broken between v0.8 / v0.9 revisions.&lt;/p&gt;

&lt;p&gt;Your mileage may vary, of course, but I think I've found my new favorite web app.  It's now a replacement for the wiki and SVN repository browser I used to have running on 0xDECAFBAD v3.&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090855&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://simon.incutio.com/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=de99266e9eaac8b6946541f8661afbd8&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://simon.incutio.com/&quot;&gt;Simon Willison&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090855&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-09-30T16:19:27&quot;&gt;2005-09-30T16:19:27&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I couldn't agree more - Trac is an absolute gem. It's even written in Python :)&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090856&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=a0b347907bfaf05694805210ec595d6c&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Martin Atkins&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090856&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-09-30T18:54:02&quot;&gt;2005-09-30T18:54:02&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;My favourite thing is that you can use Wiki markup in the commit log. Sure, it doesn't work if you're not viewing it through Trac, but Wiki markup tends to be unobtrusive anyway.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090857&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=cb8d1a00f46e0382a9e9c2f36fcedb5f&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Brandon Pierce&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090857&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-02T19:31:27&quot;&gt;2005-10-02T19:31:27&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;My only complaint about Trac is how difficult it is to get installed and going. I consider myself a power user, though I'm not exactly a code whiz, and I still had a rough time getting it going on my OS X machine (and quite frankly never really did get it fully going). I suppose I'm spoiled by all of the great double-clickable installers that people make for these kinds of packages. :) If I knew more I'd figure out how to make one for Trac.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090858&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.brunningonline.net/simon/blog/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=02b2184590d81d2280d2c9802b05fe83&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.brunningonline.net/simon/blog/&quot;&gt;Simon Brunning&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090858&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-04T13:47:23&quot;&gt;2005-10-04T13:47:23&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;Re Trac on OSX - anyone tried http://trac.darwinports.com/ ?&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221090860&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://esc.web.com&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=1d648b96ed56c22d316154432e12967c&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://esc.web.com&quot;&gt;Richard Bogle&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221090860&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2005-10-09T23:06:50&quot;&gt;2005-10-09T23:06:50&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;&lt;p&gt;I had the same grief with getting Trac running and then &lt;a href=&quot;http://www.cvsdude.com/&quot; rel=&quot;nofollow&quot;&gt;CVSDude&lt;/a&gt; offered it all nicely hosted for me. :)  The price is right and the system works and it's exactly what I wanted.&lt;/p&gt;&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>Cross-breeding XSLT and ZPT</title>
        <link href="http://decafbad.com/blog/2004/12/03/crossbreedingxsltzpt"/>
        <updated>2004-12-03T01:15:52+00:00</updated>
        <id>http://decafbad.com/blog/2004/12/03/crossbreedingxsltzpt</id>
        <content type="html">&lt;p&gt;I've recently been doing some side work involving Zope and, along with the rest of the suite of technologies it offers, I've been happy to be working with &lt;a href=&quot;http://dev.zope.org/Wikis/DevSite/Projects/ZPT/FrontPage&quot;&gt;Zope Page Templates&lt;/a&gt; again.  I dabbled with them a bit when they first came out, and a Zope-free implementation named &lt;a href=&quot;http://www.owlfish.com/software/simpleTAL/&quot;&gt;SimpleTAL&lt;/a&gt; was one of the core components of the iteration of my news aggregator which came before FeedReactor.&lt;/p&gt;

&lt;p&gt;Out of all the templating and content generation approaches I've used, Zope Page Templates are my favorite yet.  Pretty expressive, yet unobtrusive; nicely powerful, yet not quite something with which you'd want to write an entire application (&lt;a href=&quot;http://naeblis.cx/rtomayko/2004/12/02/a-note-on-template-design&quot;&gt;and that's a feature, not a bug&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I've yet to be in a work-a-day team that uses ZPT-- but I can see where a lot of production, delegation, and integration issues would have gone much smoother had I used ZPT instead of &lt;a href=&quot;http://www.template-toolkit.org/&quot;&gt;Template Toolkit&lt;/a&gt; for the web app framework I created at a previous company.  (Though I do have to say TT2 is &lt;em&gt;very&lt;/em&gt; nicely done!)  And where I am now, I spend most of my days trying to pummel ASP 3.0 pages into some semblance of logic/presentation separation-- I would certainly dive at the chance to dump VBScript and &lt;code&gt;&amp;lt;% cruft %&amp;gt;&lt;/code&gt; for a bit of Python and ZPT.  (But, you know, &lt;em&gt;it's a living&lt;/em&gt;.)&lt;/p&gt;

&lt;p&gt;A close second favorite is XSLT.  I've really been hot on it lately, having worked it into the core of FeedReactor in place of SimpleTAL.  And in &lt;a href=&quot;http://www.decafbad.com/blog/2003/09/02/xsl_scraper&quot;&gt;other&lt;/a&gt; &lt;a href=&quot;http://www.decafbad.com/blog/2004/06/16/wishofthemonthclub1&quot;&gt;hacks&lt;/a&gt;, I've really come to appreciate it's role as a filter segment in pipelines between REST web services and &lt;a href=&quot;http://udell.roninhouse.com/bytecols/2001-08-15.html&quot;&gt;URL-as-command-line&lt;/a&gt; invocations.&lt;/p&gt;

&lt;p&gt;Granted, both ZPT and XSLT very different technologies, but they are often used in similar contexts.  More than once, I've wished that XSLT was as simple as ZPT (i.e. less verbose and intrusive, more document centered), and I've wished that ZPT had some of the features of XSLT (i.e. ability to be used as a transforming filter).&lt;/p&gt;

&lt;p&gt;Reading &lt;a href=&quot;http://naeblis.cx/rtomayko/2004/11/30/pythonic-xml-based-templating-language&quot;&gt;Ryan Tomayko's description of Kid&lt;/a&gt; got me thinking, and googling.  One thing I turned up from a mailing list archive asked about an &amp;#8220;&lt;a href=&quot;http://mail.zope.org/pipermail/zpt/2002-January/002651.html&quot;&gt;XSL implementation of TAL?&lt;/a&gt;&amp;#8221;  It struck me as a tad nutty at first, but then I started having inklings that just maybe it could be done.  (Whether it &lt;em&gt;should&lt;/em&gt; be done, well...)  But the kernel of the idea grabbed me: Instead of using &lt;a href=&quot;http://zope.org/Wikis/DevSite/Projects/ZPT/TALES%20Specification%201.3&quot;&gt;TALES path expressions&lt;/a&gt; to look up values in Pythonic space, why not use XPath expressions to look up values from a supplied XML document?&lt;/p&gt;

&lt;p&gt;This strikes me as such an obvious idea that someone has to already have done it and possibly rejected it for good reason.  On the other hand, maybe this is the sort of thing Ryan's thinking about-- I wonder how hard it would be to hack this into Kid?  It would give only a subset of XSLT's capabilities in trade for simplicity, and would only offer the &amp;#8220;&lt;a href=&quot;http://www.dpawson.co.uk/xsl/sect2/pushpull.html&quot;&gt;pull&lt;/a&gt;&amp;#8221; approach, but it would give XML-pipelining to a ZPT-ish technology.&lt;/p&gt;

&lt;p&gt;I think this is something I want to look into a bit further at some point.&lt;/p&gt;

&lt;!--more--&gt;


&lt;p&gt;shortname=crossbreedingxsltzpt&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087930&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.ianbicking.org&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=cc8334869c9d2a9e603017f2da805eb3&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.ianbicking.org&quot;&gt;Ian Bicking&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087930&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-04T17:16:09&quot;&gt;2004-12-04T17:16:09&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;I've been meaning to write about this on my blog, as I've done something similar.

Instead of using XSLT, I've used ZPT for the transformations.  It was an application where the user created a document in a WYSIWYG editor, then we wanted to pull information out of the content -- like a table of contents, or a title.

To do this I parsed the content into a DOM, then put some objects in the ZPT namespace that manipulated it.  For instance, the ToC object took a tag name (through getitem) and returned a list of the content and id of those tags (it created ids if necessary, modifying the content).  Then you could easily create a ToC by looking through and creating anchor tags from, say, all the  tags in the document.  It should be easy to expand with other transformations (all coded in Python, of course).  The actual code was only like 20 lines of Python, maybe less, and easy to understand from both sides (ZPT and Python).&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087932&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=14076d6ce3d0e8a0fd751a36d9912df5&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Petri Savolainen&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087932&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-13T05:21:41&quot;&gt;2004-12-13T05:21:41&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;See http://zope.org/Members/DaddyGravity/PT_XPath

It would be great to have that in SimpleTAL, too.&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087935&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.ianbicking.org&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=cc8334869c9d2a9e603017f2da805eb3&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.ianbicking.org&quot;&gt;Ian Bicking&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087935&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-13T11:43:33&quot;&gt;2004-12-13T11:43:33&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Another thing you might want to look at: in the last few days there's been discussion on the ZPT mailing list about an extension to stylesheets (TERSE) for ZPT that introduces transformations.&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087937&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://codeconsult.ch/bertrand&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=d244e495717742bd0776b715a45877eb&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://codeconsult.ch/bertrand&quot;&gt;Bertrand Delacretaz&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087937&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-13T15:15:55&quot;&gt;2004-12-13T15:15:55&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;FYI, people from the Apache Cocoon and BXE projects are working on similar stuff, in the opposite direction: we're taking TAL-like templates and converting them to XSLT, adding simple &quot;match&quot; templates for declarative rules. It's only prototypes and experiments for now, but the results look promising.

More info at
http://wiki.apache.org/cocoon/HtmlToXsltExperiments
and
http://blog.bitflux.ch/archive/further-improvements-on-xsl-tal.html&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087939&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.manuzhai.nl/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=d62bb8855d45ab52fd5a414f0ca47703&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.manuzhai.nl/&quot;&gt;Manuzhai&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087939&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-13T16:07:54&quot;&gt;2004-12-13T16:07:54&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;I like XSLT a lot, myself, and I have advocated it in the past on my weblog, but it just doesn't seem to be very wide-spread. Which is a pity, I think the world would be much easier if more people used this *standard* way of templating.

One of the bigger problems with it seems to be the verbosity, so I've been thinking of a more compact syntax, kind of like RELAX NG has the .rnc compact stuff. I don't know if it's very feasible, but it seems like that would be not very hard; just have some compact syntax which maps onto a real XSLT-sheet (it could be &quot;compiled&quot; and cached, if need be).&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087942&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.owlfish.com/weblog/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=377cef4245e0fcbf76e021d9cd253e35&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.owlfish.com/weblog/&quot;&gt;Colin Stewart&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087942&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-13T23:47:18&quot;&gt;2004-12-13T23:47:18&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Integrating an XPATH implementation into SimpleTAL shouldn't be too hard as the TALES and TAL implementations share a fairly simple interface.  There are 6 methods you'd have to provide to the simpleTAL module and that's about it.

I don't know if XPATH is the right approach though - how would things like tal:define work if the paths were pure XPATH instead of TALES?  Being able to mix XPATH and TALES would work better I think.

A more promising approach would be to integrate ElementTree so that the 'find*' methods were usable from within TALES.  Making it so that '/mydoc/root/find/.//searchElement' works would be fairly easy, but getting '/mydoc/root/find/.//searchElement/attrib/firstAtt' to work would require more co-operation between ElemenTree and SimpleTAL.

I'll have a think about this though as it sounds like a promising approach.&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087946&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=d67eea2ce18dd70f4642cb971c2c5ad2&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Paul Everitt&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087946&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-14T00:45:18&quot;&gt;2004-12-14T00:45:18&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Chapter 11 of Jeni Tennison's &quot;XSLT and XPath On The Edge&quot; book has a section called &quot;Using Page Templates&quot;.  It includes an example of using substitution points.

Like some of the others in this thread, playing with doing merges using DOM IDs and other patterns.  This lets you write &quot;themes&quot; that are simpler than even ZPT, as they contain no non-XHTML namespace elements.

Thanks for the article, which also seems to have brought out some interesting comments and URLs!&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087948&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://webseitz.fluxent.com/wiki&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=8157a5907b244071cda98ba5aa7a9635&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://webseitz.fluxent.com/wiki&quot;&gt;Bill Seitz&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087948&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-14T20:23:08&quot;&gt;2004-12-14T20:23:08&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Don't forget you can run Python within IIS/ASP!

http://webseitz.fluxent.com/articles/PythonViaIis&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221087950&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.owlfish.com/weblog/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=377cef4245e0fcbf76e021d9cd253e35&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://www.owlfish.com/weblog/&quot;&gt;Colin Stewart&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221087950&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-12-15T22:49:30&quot;&gt;2004-12-15T22:49:30&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;I've put together an experimental build of SimpleTAL that integrates ElementTree to provide some of the XPATH syntax.  It's just an experiment, but see what you think.

(More detail here: http://www.owlfish.com/weblog/2004/12/15122004.html#20:59:59)&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    

    <entry>
        <title>dbagg3 code in CVS</title>
        <link href="http://decafbad.com/blog/2004/08/05/dbagg3cvs"/>
        <updated>2004-08-05T23:53:34+00:00</updated>
        <id>http://decafbad.com/blog/2004/08/05/dbagg3cvs</id>
        <content type="html">&lt;p&gt;I've just dumped what code I have into my CVS repository.  So, go ahead and poke fun at it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://www.decafbad.com/cvs/dbagg3/&quot;&gt;http://www.decafbad.com/cvs/dbagg3/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Or, fetch it from CVS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cvs -d:pserver:anoncvs@www.decafbad.com:/cvsroot login
(Logging in to anoncvs@www.decafbad.com)
CVS password: anoncvs
$ cvs -d:pserver:anoncvs@www.decafbad.com:/cvsroot co dbagg3
&lt;/code&gt;&lt;/pre&gt;

&lt;!--more--&gt;


&lt;p&gt;shortname=dbagg3cvs&lt;/p&gt;
</content>
    </entry>
    
    

    <entry>
        <title>Introducing dbagg3, an Atom-powered client/server aggregator</title>
        <link href="http://decafbad.com/blog/2004/08/05/introducing-dbagg3-an-atom-powered-clientserver-aggregator"/>
        <updated>2004-08-05T13:04:56+00:00</updated>
        <id>http://decafbad.com/blog/2004/08/05/introducing-dbagg3-an-atom-powered-clientserver-aggregator</id>
        <content type="html">&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I've just dumped what code I have into my CVS repository.  So, go ahead and poke fun at it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://www.decafbad.com/cvs/dbagg3/&quot;&gt;http://www.decafbad.com/cvs/dbagg3/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Or, fetch it from CVS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cvs -d:pserver:anoncvs@www.decafbad.com:/cvsroot login
(Logging in to anoncvs@www.decafbad.com)
CVS password: anoncvs
$ cvs -d:pserver:anoncvs@www.decafbad.com:/cvsroot co dbagg3
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;p&gt;So, besides the funk, there's a little project in which I've gotten immersed.  Here's a teaser diagram:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/dbagg3-phase1.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It's a feed aggregator, my third attempt at such.  At present, things are roughly close to the diagram above.  Everything is clunky and command-line driven at present--but I've got further plans, like a REST API for feed queries and manipulation of various things such as feed subscriptions and the read/unread state of items.  Pair this with an XSLT-driven browser UI, and the possibility of other clients (not the least of include other Atom-consuming aggregators).&lt;/p&gt;

&lt;p&gt;The goal is to make a &lt;a href=&quot;http://www.intertwingly.net/wiki/pie/ClientServerAggregator&quot;&gt;Client/Server Aggregator&lt;/a&gt;.  Somewhat serendipitously, I just caught Bob DuCharme's xml.com &lt;a href=&quot;http://www.xml.com/pub/a/2004/08/04/tr-xml.html&quot;&gt;article on Amazon.com's web services&lt;/a&gt;, which &lt;a href=&quot;http://www.decafbad.com/blog/2004/06/16/wishofthemonthclub1&quot;&gt;I really like&lt;/a&gt; and have drawn inspiration from in thinking about this new aggregator.  Eventually, I want to offer the same sort of XML+XSL style of service that they've put together, along with some futher inspiration from the &lt;a href=&quot;http://www.atomenabled.org/developers/api/atom-api-spec.php&quot;&gt;Atom API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, as another teaser, check out this early demo involving the XML this thing has been producing, coupled with some experimental XSL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/xsltproc.cgi?xsl=http://www.decafbad.com/2004/08/dbagg3-demo/new.xsl&amp;amp;#38;xml=http://www.decafbad.com/2004/08/dbagg3-demo/demo.xml&quot;&gt;dbagg3 demo page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You'll notice that there are three URLs involved here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/xsltproc.cgi&quot;&gt;An XSLT processor service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/new.xsl&quot;&gt;An XSLT stylesheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/demo.xml&quot;&gt;Some aggregated Atom feeds&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The XSLT expects Atom (plus a few extensions of my own), so you can also do things like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/xsltproc.cgi?xsl=http://www.decafbad.com/2004/08/dbagg3-demo/new.xsl&amp;amp;#38;xml=http://www.diveintomark.org/xml/atom.xml&quot;&gt;Dive Into Mark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/xsltproc.cgi?xsl=http://www.decafbad.com/2004/08/dbagg3-demo/new.xsl&amp;amp;#38;xml=http://www.intertwingly.net/blog/index.atom&quot;&gt;Intertwingly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.decafbad.com/2004/08/dbagg3-demo/xsltproc.cgi?xsl=http://www.decafbad.com/2004/08/dbagg3-demo/new.xsl&amp;amp;#38;xml=http://www.decafbad.com/blog/atom.xml&quot;&gt;0xDECAFBAD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;These are the sorts of tricks I was looking forward to when I started thinking about things like a &lt;a href=&quot;http://www.decafbad.com/blog/2004/05/17/use_atom_for_a_universal_blog_transfer_protocol&quot;&gt;universal blog transfer format&lt;/a&gt; and &lt;a href=&quot;http://www.decafbad.com/blog/2004/05/03/put_on_your_rsscolored_glasses_and_forget_about_atom&quot;&gt;rose-colored glasses&lt;/a&gt;.  XSLT used like this could just as easily produce a blog or RSS 2.0 content.&lt;/p&gt;

&lt;p&gt;Anyway, hoping to get some code into CVS by this weekend that's not entirely embarassing.  So if you're interested in this stuff, stay tuned.  I'm hoping that this thing can provide a base for others interested in feed aggregation--if you just want to play with UI, use the scanning and storage as-is and tinker with XSLT; if you want to play with storage and query, leave the scanning and UI alone; if you want to tinker with parsing... er, &lt;a href=&quot;http://www.feedparser.org/&quot;&gt;talk to Mark Pilgrim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More soon!&lt;/p&gt;

&lt;p&gt;(Oh yeah, and I &lt;em&gt;will&lt;/em&gt; be working on coming up with a better name than &lt;code&gt;dbagg3&lt;/code&gt;.  Unfortunately, I probably won't be coming up with a more visually appealing design for the UI, since what you see is the best I can do.  Heh, heh.  Don't let your programmers do visual design...)&lt;/p&gt;

&lt;div id=&quot;comments&quot; class=&quot;comments archived-comments&quot;&gt;
            &lt;h3&gt;Archived Comments&lt;/h3&gt;
            
        &lt;ul class=&quot;comments&quot;&gt;
            
        &lt;li class=&quot;comment&quot; id=&quot;comment-221084326&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.nur-eine-i.de&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e7368d797917d0df7942c26d4ed2e580&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://blog.nur-eine-i.de&quot;&gt;Benjamin&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221084326&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-08-05T10:22:30&quot;&gt;2004-08-05T10:22:30&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;This is great. It seems that this could be the base, for what I've been dreaming/thinking about the last half year or so. In contrast to you, I haven't come up with any code yet (mostly due to the fact, that I don't python yet, and I found no other reasonably good feed parser, than the Universal Feed Parser), but with a name: Roosster 

Features I'd really like to have in such a ClientServerAggregator are:
(a) search over entries the aggregator has seen to date
(b) add and arbitrary number of notes to any entry
(c) add multiple category-tags to entries
(d) interlink entries (I know this could be solved by some 'Related Entries' stuff, but somtimes I don't trust these &quot;automatic classifiers&quot;)

Can't wait, until I can take a look at the code and see if I can extend it. This would finally be a real reason to learn python.

By the way, I really like the interface. Might be, that's because I'm a programmer too?!&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221084328&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=e1cc8e7103bb0f77a7d7abf91b1a961b&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;&quot;&gt;Christopher Drake&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221084328&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-08-05T18:30:41&quot;&gt;2004-08-05T18:30:41&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Very nice. The demo has me salivating a little.

Oddly enough, I like the UI. If you can slim it down, side-to-side-wise a bit, it would also be a great aggregator to rip whole chunks from and feed to a Palm Pilot or PocketPC, as well. They're not as big as they were in the past, but with decent strides every couple of weeks, they still have a lot of following. Your page-width is dynamic, and that means a lot to me, a Palm user.

A feature I'd like to see is kind of like Bloglines, where you receive a small box of info from the RSS feed, or what-have-you to give you a taste of an article. If going 1 link deep from any link on the aggregator page linked to a small page with such a tidbit, it would make surfing the articles a lot faster. This would allow a PDA or cellphone to drag an aggregator page 1 link deep with specialised software and get all of the highlights from say, 20 blogs.

That could be a major boon, especially for people that connect while at wireless access points on business trips, etc.

Keep it up, this looks like it'll rock when you are done.&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;li class=&quot;comment&quot; id=&quot;comment-221084331&quot;&gt;
            &lt;div class=&quot;meta&quot;&gt;
                &lt;div class=&quot;author&quot;&gt;
                    &lt;a class=&quot;avatar image&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://b4mad.net/datenbrei/&quot;&gt;&lt;img src=&quot;http://www.gravatar.com/avatar.php?gravatar_id=0038a1e9f4492e2f964f0f39d2d0dc7f&amp;amp;size=32&amp;amp;default=http://mediacdn.disqus.com/1320279820/images/noavatar32.png&quot;/&gt;&lt;/a&gt;
                    &lt;a class=&quot;avatar name&quot; rel=&quot;nofollow&quot; 
                       href=&quot;http://b4mad.net/datenbrei/&quot;&gt;Christoph Görn&lt;/a&gt;
                &lt;/div&gt;
                &lt;a href=&quot;#comment-221084331&quot; class=&quot;permalink&quot;&gt;&lt;time datetime=&quot;2004-08-08T12:41:08&quot;&gt;2004-08-08T12:41:08&lt;/time&gt;&lt;/a&gt;
            &lt;/div&gt;
            &lt;div class=&quot;content&quot;&gt;Hi,
 and I will try to plug an jabber/XMPP bot into it, so it will deliver the aggragated content rigth to my beloved IM app...&lt;/div&gt;
            
        &lt;/li&gt;
    
        &lt;/ul&gt;
    
        &lt;/div&gt;



</content>
    </entry>
    
    
</feed>

