Rather than relying on the older format of cookies; Rollator’s administrative interface is now closely-knit with PHP’s session management. I’ll most likely create a bit more of an abstract layer for handling all of this.

As it stands, I’m now nearly cookie free, with everything nice and encrypted, mostly server-side. All that’s transmitted after the initial login is your cookie ID for PHP’s internal session management.

As an additional (read: useless) module to add to LiveJournal was quite easy, however WebLogs is not quite the same to parse with it’s semi-proprietary format.

The following trivial code snippit uses PHP’s (now) native XML routines to parse this format and make it human-readable. Feel free to steal, use, or adapt as you need – you’ll notice that it’s quite, ah… inelegant.

WebLogs Parsing Test
<?php
  parse_webblogs();
  // print_r($parsedlogs);
  while (list($number, $stuff) = each ($parsedlogs)) {
    echo "Entry $number: " . nicetime("$stuff[WHEN]") . " ago $stuff[NAME] [<a href='$stuff[URL]'>RSS</a>]<br />";
  }
  function nicetime($arg = "") {
    // Boy is this ugly.  I'll have to fix it later.
    if ($arg < 60)
      return $arg . "s";
    if ($arg > 60 && $arg < 3600)
      return round(($arg / 60)) . "m";
    if ($arg > 3600)
      return round(($arg / 3600)) . "h";
  }
  function parse_webblogs() {
    global $parsedlogs;
    $fp = @fopen('http://www.weblogs.com/rssUpdates/changes.xml', 'rB');
    if (! $fp)
      return false;
    $data = fread($fp, 1000000);
    $data = str_replace("\\r", '', $data);
    $data = str_replace("\\n", '', $data);
    $xp = xml_parser_create();
    xml_set_element_handler($xp, '_simple_xml_startElement', '_simple_xml_endElement');
    xml_parse($xp, $data, true);
    xml_parser_free($xp);
    return $parsedlogs;
  }
  function _simple_xml_startElement($xp, $element, $attr) {
    global $parsedlogs;
    if (strcasecmp('weblog', $element)) {
      return;
    }
    $parsedlogs[] = $attr;
  }
  function _simple_xml_endElement($xp, $element) {
    global $parsedlogs;
    return;
  }
?>

Aside from cleaning up a bit of the internals to my filemanager; I’ve extended it just a bit more. Observe, for example, Bliss:

Download: Bliss-1.6.1.pkg.sit [379.6k] · GPG SIG MD5: 800c6be363db1238057637318221d54a Version: 1.6.1 · Uploaded on 25.10.03/4:12pm. Stats: 150 downloads, last: 23.04.04/2:01am.

Now the filemanager records the number of downloads, and the time of the last download.

Sure, it was trivial to add, but I think it makes it look a bit more professional.

The way it works is quite simple. When you click a download link to my files, it is transparently sent through my file manager, which then executes an SQL query to update the tally of downloads, as well as the current time. No other things, such as IP address, is saved, as I don’t believe in any real form of user tracking (aside from a valid email address to signup for my forums), and those metrics are quite useless to me.

What happens, is I have specific keywords translated through the magic of Apache’s mod_rewrite, which forwards information about your download query to my filemanager, which then checks the validity of the file, compares it to my stored information, then sends you the file, after updating the download and time numerics. Pretty neat, huh?

Of course, I’ve also added the ability to store information on when I uploaded the file, so you may now how ‘fresh’ it is, if you are so inclined. A few of my older software ports have similar timestamps due to the fact that I moved servers last year, and I used the localized numerics from this server. There is no ‘last download’ for software which is officially deprecated. It’s unnecessary.

MyPasswordSafe is a straight-forward, easy-to-use password manager that maintains compatibility with Password Safe. Your ‘safes’ are encrypted when stored to disk, and passwords never have to be seen as they are copied to the clipboard. It will even generate random passwords for you.

This is a MacOS X port utilizing the Qt/Mac Free frameworks. The Qt framework is included within the application, so you do not need to install Qt to use it.

Feel free to download it from my software page.