Tango: Learning to Dance

Well, OK. Not really that kind of dance…

The new look here at we3geeks is a WordPress theme that I have been working on (or more correctly, off and on) for the past couple of months. Called “Tango” (hence the dance comment), it is based in large part on the colors, presentation, and icons of the Tango Desktop Project’s work. It is definitely still a work in progress, and my intent is to continue to clean it up and make it work (and look!) better in the coming weeks. It has taken what seems like forever to get it even to this point, where I could roll it out, in part due to an almost complete lack of time to play with it, and because this is my first (admittedly feeble) attempt at putting together a WordPress theme.

There are still a fair number of rough bits (e.g., I know that the layout is kind of dorked up in IE) that I need to work through and clean up. Keep watching.

Cleaner RSS Feeds in TiddlyWiki

After playing a bit with TiddlyWiki, I decided that I wanted a cleaner RSS feed from it. It has always bothered me a little that any tiddler I changed always ended up in the RSS stream that TW generates, even tiddlers that a “normal” reader of a TW-based site wouldn’t (and probably shouldn’t) care about. So I tweaked the generateRss() function from version 1.2.35 (look for it down around line 2500 of the TW source) to provide some control over which tiddlers end up being included.

My hacked version of the generateRss() function (below) differs only in the section that generates the “body” of the RSS feed. If each tiddler is tagged specifically for RSS inclusion OR is tagged for neither exclusion from the TW lists nor from the RSS stream, it is included in the RSS stream. This logic is based on case-insensitive checking for the presence of the includRSS, excludeLists, excludeRSS tags on the tiddler. I have submitted this tweak to Jeremy Ruston, the author and maintainer of TW, for incorporation into TW.

function generateRss()
{
  var s = [];

  var d = new Date();
  var u = store.getTiddlerText("SiteUrl",null);
  // Assemble the header
  s.push("< " + "?xml version=\"1.0\"?" + ">");
  s.push("<rss version=\"2.0\">");
  s.push("<channel>");
  s.push("<title>" + store.getTiddlerText("SiteTitle","").htmlEncode() + 
    "</title>");
  if(u)
    s.push("<link>" + u.htmlEncode() + "</link>");
  s.push("<description>" + store.getTiddlerText("SiteSubtitle","").htmlEncode() + 
    "</description>");
  s.push("<language>en-us</language>");
  s.push("<copyright>Copyright " + d.getFullYear() + " " + 
    config.options.txtUserName.htmlEncode() + "</copyright>");
  s.push("<pubdate>" + d.toGMTString() + "</pubdate>");
  s.push("<lastbuilddate>" + d.toGMTString() + "</lastbuilddate>");
  s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
  s.push("<generator>TiddlyWiki " + version.major + "." + 
    version.minor + "." + version.revision + "</generator>");
  // The body
  var tiddlers = store.getTiddlers("modified");
  var n = 0; // Count of tiddlers included in RSS
  var t = tiddlers.length - 1; // Tiddler index
  while ((n < config.numRssItems) && (t >= 0))
  {
    var tTags = tiddlers[t].getTags().toLowerCase();
    // If this tiddler is flagged specifically for inclusion OR this tiddler
    // is not specifically flagged for exclusion (either by the "excludeLists"
    // or "excludeRSS" tag)...
    if ((tTags.indexOf("includerss") >= 0) || 
       ((tTags.indexOf("excludelists") == -1) && 
       (tTags.indexOf("excluderss") == -1)))
    {
      s.push(tiddlers[t].saveToRss(u)); // Generate the RSS entry for this tiddler
      n++; // Increment the count of tiddlers in the feed
    }
    t--;    // Next tiddler...
  }
  // And footer
  s.push("</channel>");
  s.push("</rss>");
  // Save it all
  return s.join("\n");
}

More TiddlyWiki

I have been using a TiddlyWiki to keep track of a bunch of loosely-organized information and statistics about the junior high school boys soccer teams that I am coaching this Fall. Using Alan Hecht’s WebView plugin, I decided to publish it for the players on the team (and their parents), so that they can keep track of what’s going on and coming up.

I have been using TW for several weeks now, both at home and at work (see my earlier post) to keep track of a variety of different things. The more I use it, the more I am impressed!

Time Sinks

Over the past few weeks, I have been playing with a couple of different window managers on one or more of my Linux boxes for reasons that are diametrically opposed. I want a desktop that is easy to use, stable, responsive, easily configured and customizable, reasonably polished in appearance, and is (again, reasonably) consistent across all of the applications that I really care about.

Fluxbox: I used to run Fluxbox on my Mandrake boxes, primarily because of its very low overhead and speed. I hadn’t played with it in nearly a year (since switching to Ubuntu). Still very fast, very customizable, lots of themes available (and those themes are very easy to tweak). The one piece that it seems to be missing (and this probably says more about my own idiosyncracies than any real shortcomings of the project) is support for SVG icons. It does support icons on its menus, but until it provides SVG support, those menus will never look good for anyone (like me) who can’t design decent icons at small (e.g., 24×24) sizes.

Enlightenment: I looked briefly at Enlightenment DR16 a while back, but couldn’t ever really find a way to get DR17 running at that point. I recently came across several posts on the Ubuntu forums about DR17, and in fact someone has established a repository that put me in a position of being able to very easily get E DR17 installed and running via synaptic. Impressive, heavy on the eye candy, and very usable at this point. It’s drawback (and, again, this is probably more about me than the project): I can’t figure out how to configure nearly anything there — the menus, the applications available on the iBar at the bottom of the screen.

At this point, however, I am back to my Gnome desktop. Why? It just works, looks good, and is consistent across applications (at least the ones I use and care about). I have enough horsepower on all of the boxes I am currently using for Linux that Gnome is responsive enough to be satisfactory. I found myself spending so much time tweaking, twiddling, and looking for help, that I wasn’t getting anything done, and ultimately, I need my desktop to help me get work done. It needs to be a means to an end, not an end in and of itself (at least for now).

TiddlyWiki

I spent some time this past week playing with a very interesting little… hmmm… not sure what to call it. It’s called TiddlyWiki, and it blurs the line between a Web page/site and a Web application. Think of it as a self-modifying Web page, written in XHTML, CSS, and JavaScript. It appears to me to be a tour de force of standards-based Web development, and provides a simple, elegant means of setting up a standalone micro-Wiki very quickly. Its plumbing supports extensive customization, extensions, macros, and modifications, and the tool is even capable of generating its own RSS feed. It’s kind of a wierd concept to get your head around. Definitely worth playing with. It seems perfectly suited for putting together small documentation projects (e.g., we are using it for our Subversion procedures and notes within my development team).

One of the contributors to this project, a young man named Clint, worked as an intern in our department at work, and has several mentions on the main TiddlyWiki site. Do take a look at some of the customization work Clint has done with changing the appearance and layout of the tool.