############################################################################### # AmphetaDesk (c) 2000-2004 Disobey # # CHANGELOG http://www.disobey.com/amphetadesk/ # ############################################################################### 0.93.2 (released ) - extras/ directory added, and createpods.pl finalized. - first draft of all pod documentation is finished. - Pragma: and Cache-control: headers are spit out for every request AmphetaDesk serves, for proxy refreshing (thanks Ram Chandar). - bugfix: we now require at least 2.50 of CGI.pm (which is the version that included Vars for the first time. rare, but frequent enough to get sick of answering it). Kudos to David Magda for being the last straw. - the opening of the logfile has moved from AmphetaDesk.pm to Utilities.pm, and is controlled by a new set_logfile() routine (which receives a new setting, "files_log", from Settings.pm). more command line loving. - choosable ports for the web server now live in "user_webserver_ports" and are comma spliced, allowing users to define as many ports as they want. generically, this is more flexible, but also restricts this simple setting to one instance (instead of (primary|secondary|tertiary)). - likewise, "user_webserver_address" now exists, which allows people with local network problems to change the URL AmphetaDesk will automatically launch their browser with. previously, they had to modify $OS.pm itself. - the block of the mySettings.xml has been removed, leaving just the block. these were legacy settings from an older Ampheta, and never really belonged. only settings are written out. - the "check to see if required directories" exist code has been moved from Settings.pm into AmphetaDesk.pm and remains there, disabled. this keeps Settings.pm a strict settings module, and not a "check integrity" module. this facilitates using AmphetaDesk as modules, not as an application. the checks will be reinstated eventually. - AMPHETAHOME can be used as an environment variable to specify where your /data/, /docs/, and /templates/ directory are. this is a prelude to offering full support for $HOME usage (soon, hopefully). - POD documentation for Settings.pm first draft finished. - bugfix: settings are now correctly loaded without needing to call load_setting before hand (this caused some problems with command line uses, most notably not setting User-Agent parameters correctly). thanks Aaron Straup Cope for discovery. (note: this won't be fully perfect until we move to $HOME, which will be in this release and soon). - bugfix: fixed a problem in our "is this or ?" code where neither was chosen if an 's version="" was on a different line. we now don't check for version at all. why did we in the first place? - bugfix: http referers are no longer configurable. they're abuse. - moved utf-8 bom removal for old expats into Utilities.pm as "remove_utf8_bom". makes more sense in here too. - the "add targets to links" code from Channels.pm has been moved into Utilities.pm - just a smarter place there. after checking with a number of feeds, we think we've fixed the "some links don't properly target". - initial starting progress on PODing all modules. - bugfix: files ending in .css are returned as text/css. since we were fiddling with this, all files not .html? or images are now returned as text/plain. (thanks Martin Sutherland for bringing up the text/css mime type issue concerning Mozilla). 0.93.1 (released October 31st, 2002) - swapped out quasi's "$toencode = ~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;" for URI::Escape's "$toencode = uri_escape($toencode, "^a-zA-Z0-9_.-");". this performs the same thing, but is crossplatform for MacPerl/MacOS. - an rss feed's email is now saved in the channel opml. - subscription data for a channel is now updated after each parse. - if using the default settings, immediately save a mySettings.xml. fixes a dumb minor (out of date?) bug where I had to pre-instruct people to "Save My Settings" before they could follow mySettings.xml hacking instructions. - we now save our channels and settings before shutting down. - added frontends to start_radio_webserver and http_referer. - awesome: mac classic version is working correctly (thanks Axel!). - awesome: win95 version is working correctly (requires seperate download). - bugfix: the Win32 gui now correctly maximizes the window when opening from the systray, and we've moved it over to a doubleclick not a single. - bugfix: if we have matching filenames, we now randomize to four places not just two. this solves a rare circumstance where someone could subscribe to 99 or more Moreover feeds - it's now 9999 (thanks, Kearney) - feature: support for Radio Userland coffee mug icons. off by default. - featurette: implemented geomisk's old "tidy_house" routine as MyChannels::remove_old_channel_files. thanks again, geomisk. - bugfix: we weren't correctly defaulting to "index.html" on a directory webserver request within Win32 (we forgot \\ in our regexp). - we no longer @EXPORT head() from AmphetaDesk::WWW. the explanation is one of fickleness, but it comes down to removing a warning about redefining CGI.pm's head(). This shouldn't be that much of a problem anyways since head() was ONLY used within WWW.pm, and people can still suck it in with "use AmphetaDesk::WWW qw/head/" if they absolutely need to. chalk this one up to my analness. - moved webserver code from amphetadesk.pm to webserver.pm. - removed the following code: BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] unless (caller())[0] =~ /Win/; } }. This was being used to stop copious Win32::GUI warnings. These have been fixed in the latest Win32::GUI download. Thanks Aldo Capini! - templates: the index.html, my_channels.html, and add_a_channel.html were changed over to a new to_browser/send_to_browser system that cuts out the zillions of concat's we were doing before. since perl handles joining arrays better than concating strings, this should increase speed of those pages, plus reduce memory usage. small template things (like the headers, the popup, the settings page, etc.) send directly to $OUT as usual, since the array gains would be infintesimal. - bugfix: added 'use lib' to wrapper script for explicit inclusion into the Win32 version (stupid perl2exe, argh). Thanks, deus_ex. - featurette: added ReuseAddr to our HTTP::Daemon for address uh, reuse. - moved the template parsing code into the new AmphetaDesk::Templates. - featurette: support for from mod_content. - docs: kudos moved from news page to its own, and was updated. - bugfix: removed our ugly img onClick hack, and replaced it with a proper a/href, with "return false" set on the js for non-js browsers. - bugfix: importing feeds no longer clobbers existing attributes if the feed already exists (we append imported attributes to existing entries). - bugfix: we no longer crash on feeds that have more than one . - docs: lots of changes to the finding_more.html page, including adding a stronger bookmark, fixing the broken FoRK example, warning about Sherch's age, and adding new entries: RacingNewsOnline.com, NWFusion.com, Mail-Archive.com, Daypop.com, fyuze.com, Snewp.com, and Yahoo Finance. - docs: add kudos.html to move it off the news page. - featurette: now supports authenticated proxies (Ian Dash and others). - bugfix: we handle the rss 2.0 "id" attributes on item (XML::Simple turns id's automatically into another tree level), and also no longer die if there is only one item in a channel (Jeremy Zawodny). - code shui: removed a level of indentation in our AmphetaDesk.pm by "next unless defined $connection" instead of "if ()". - bugfix: under win32, we set our "already clicked" menu item checker for "Open Browser" immediately, as opposed to after the browser has been opened. this fixes a race condition where an impatient user could request to "Open Browser" before the first one finishes. - bugfix: amphetadesk now spits out http headers (thanks Dave Beckett). - featurette: png images may now be displayed. - security fix: you can now choose whether to allow AmphetaDesk to accept outside (nonlocal) connections. This is determined by a new user_allow_nonlocal_conn setting, and defaults to "no". - security fix: URLs are now checked for funny business. - converted some more date instances to HTTP::Date. - bugfix: we no longer die on a myChannels.opml with only one channel. - bugfix: 404 pages no longer divulge the full path on the HD (Eric). - updated the README.txt to suggest expat 1.95.3 instead of .2. - bugfix/win32: worked around segfault concerning UTF-8 BOMs. - bugfix/os x: updated to expat 1.95.3 to fix UTF-8 BOM segfault. - bugfix: our shutdown() to the webserver wasn't formatted correctly. - bugfix: fixed "Argument "" isn't numeric in bitwise or" error on line 53 of the Mac OS X gui. $flags was '', but now starts out as 0. - bugfix: we don't echo that we're loading the OPML file twice anymore. - bugfix: os x wrapper comments no longer echo if we run from the shell. - bugfix: the AmphetaDesk.log was opened in ~ and not the install dir. 0.93 (released June 13th, 2002) - updated to the latest XML::Simple and Text::Template. - documentation updates. lots. still more to do. - all images changed over to the new set done by Eric Vitiello. Rock. - fixed minor bug where invalid scriptingNews would say there were no parsable items as opposed to an xml parsing error. - to prevent our popup delete window from bring the view back to the top of the page, we moved the onClick to the image itself, and used a cursor style to duplicate the UI element. see for crossplatform notes: http://developer.netscape.com/evangelism/docs/articles/cursor/ - added email icons to the headers of the templates. - tweaked the index.html template a bit to prevent runaway
    tags, and to make the entire page load faster (thanks redmonk).
  - lots of Classic Mac fixes here and there.
  - added toplevel README.txt's for the subdirectories.
  - added encode_to_dec into AmphetaDesk::Utilities, which fixes the
    issue of del_urls not working properly when the channels URL
    has it's own query string (their query string was being read as ours).
  - proxy configuration via mySettings.xml has been added.
  - final round of alpha testing begins.
  - quickie drop in of environment proxy code (thanks Klaus).
  - Compress::Zlib added to AmphetaDesk.pl. Preparation for v0.94.
  - the channel_count is now spit out into the log so much.
  - moved special globals from "vars" to "my" instead.
    "vars" is deprecated for 5.6.0+, but we're not
    going to "our" since we want perl 5.004 compat.
  - moved all our stupid date code in MyChannels.pm to use
    the matching functions from HTTP::Date. Much nicer.
  - Radio Userland, AmphetaDesk, and similar OPML files can now be
    imported from a URL via "add_url". Since these files can be
    HuuUGe, we don't download the channels at the time of the
    import, but rather on the next restarting of AmphetaDesk.
  - Radio Userland mySubscriptions.opml imports are now possible,
    assuming you rename to myChannels.opml and stick in data/.
  - added "user_channels_check_interval" which AmphetaDesk will use
    to repetitively check for new channels every X minutes. The minimum
    setting (which can not be changed) is 2 minutes.
  - added an email/envelope graphic to the templates page, which
    will only show if we can figure out an email from the feed.
  - CDATA'd rdf:values from RSS 1.0's mod_content are now shown.
  - scriptingNews support has been added back in, same data structure.
  - instead of using Cwd (current working directory), we now use FindBin
    to figure out where we are in the file system, making relative
    directories much safer to use. this fixes a bug where AmphetaDesk
    could be installed in /usr/bin, but would break if a user tried
    it from the /tmp directory (since the relative paths would be
    to /tmp and not /usr/bin). This was really only an issue on Linux.
  - default template has moved to templates/default, and gui/ has moved to
    templates/default/gui, allowing future support for template subdirs.
    also did some quick edits in Settings.pm to support the new subdir.
  - strip_newlines_and_tabs data in myChannels.opml.
  - cleaned up some uninit warnings in strip_newlines_and_tabs.
  - the my_settings.html now works correctly.
  - if a channel has no items to display, then we show an error in the HTML.
  - second round of alpha testing has begun.
  - added popup window for deleting off the main page, thanks to eric.
  - errors in the RSS feed are now passed to the template for display.
  - switched over to http::daemon and cgi.pm as opposed to homebrew.
  - template system has been made more generic, and there are now
    no "special" template names, like add_a_channel.html or my_channels.html.
    "index.html" is, however, required if you want auto-directory serving.
  - fixed up the various GUI libraries.
  - get_response and set_response have been added to ::Utilities,
    which are quickie routines to set messages to be displayed
    in the HTML pages. The header template has also been updated
    to show these messages if they exist. Once their shown, they're
    permanently removed until the next set_response is triggered.
  - we no longer need the "id" attribute in our OPML, as we've
    moved to using the xmlurl as the unique id (a safer choice).
  - ?del is now ?del_url to more closely match ?add_url.
    likewise, a ?del_urls now exists as well to match ?add_urls.
  - if get_my_channels_data isn't passed a $setting to retrieve,
    then it will return a hash ref of all settings. this allows the
    templates to be slimmer (less calls to that routine).
  - updated README.txt to be remotely applicable.
  - stopped Win32 DoEvents from logging thousands of warnings.
  - first round of alpha testing has begun.

  - split the template pages into header/footers.
  - added "title" attributes to most of the template pages.
  - fixed the UserAgent string so it's more in line with others.
  - added "last modified" and "added" dates to my_channels.html
  - more good code from eric, which involves checking for duplicate
    filenames and URLs, as well as fixing a moreover title bug that
    caused duplicate filenames to be a regular issue.
  - eric vitello jumps on as a developer. contributes good code to
    getting MyChannels.pm up to snuff. this has now been moved over to
    Text::Template and is much smarter code. Usability wise, people now
    "check" to delete the item, instead of unchecking. The opposite of
    what existed before, but makes a bit more sense (the old way only
    existed like that because of lazy programming).
  - we no longer consult the filesystem for the last time a channel
    has been downloaded (we now consult date_downloaded, which is a
    new attribute in our myChannels.opml file) mirror() still checks
    against the filesystem, but that's normal / intentional.
  - "request_timeout" added a setting, and "strict_xml" removed.
  - added {app}->{os}, which gets spitout in the logfile.
  - we no longer need to ship a mySettings.xml file, as one is
    created at runtime if none can be found. this helps upgrades too
    as we will no longer have to worry about overwriting. this has
    also been addressed with myChannels.opml.
  - we now use File::Spec to figure out paths, not $dlmtr;
  - our logfile is now opened FIRST. the logfile location has
    changed to the root directory for ease of finding and sending.
    logfiles are now kept around until they're over 250k.
  - error() is now just a wrapper around note() since we can
    be pretty sure that the logfile is opened correctly.
  - modularization has begun.

  - modified the URLs so that they are relative, making it easier for
    AmphetaDesk to be used over a network (previously links referred
    back to the user's local machine, not necessarily the Ampheta box).
  - when minimizing the window on Win32, it now goes directly to the
    Systray, as opposed to going to the taskbar, and doing weird stuff.
  - fixed bug where the channel count wouldn't be updated after a
    modification of the user's myChannels.opml. the counting should
    probably move into the actual create routine.
  - installed INTerrupt handler so that users who Ctrl-C in a Linux
    or OSX terminal will have the webserver shut down properly.
  - added Simon's Kittle code to stop Linux from crashing on add channel.
  - fixed bug that would cause the myChannels.opml to be erased if
    bad GET based data was passed off to it. its still affected by POST.
  - the socket read timeout error is much more userfriendly now.
  - README.txt updated with upgrade notes and Linux install walkthrough.
  - added a number of user quotes to the docs/news.htm page, and
    included a quick little blurb about them on the docs/index.htm.
    likewise, reworded some of the docs/index.htm options to be less scary.
  - we've changed how we handle CDATA sections. previously, we would
    remove any CDATA tags when "fix XML" was turned on. now, we leave
    them alone, but add a conditional to not encode links if we see
    a CDATA in the feed (previously, we "fixed" links that were not
    properly encoded - this caused problems with CDATA sections,
    where the links could be unencoded). this does not effect
    any  parsing (thanks Steve Yost).
  - old versions added to docs/index.htm.
  - added README.txt as "Installation" notes to docs/index.htm.
  - added OS X note concerning "which version?" to docs/index.htm.
  - added "shared libs" and "README.txt" docs/to files_and_dirs.htm.
  - the screenshots.htm now loads the ss- images from disobey.com.
    this is so we don't have to ship them in the archive files, as
    they were taking up an awful lot of space.
  - a simple docs/README.txt file has been added.
  - original Artistic License replaced with NcFTP revision.
  - build instructions (docs/build.htm) have been added.


0.92 (released October 5th, 2001)
  - sigh. Mac GUI has been put on hold again. show stopping bug.
  - some more Mac GUI fixes. it doesn't scale very well though (at
    120 channels, which is my selection, it slows to a insane crawl).
  - went through the TODO and move a bunch of stuff to "after 1.0" so
    that we can hurry up and get a flippin' release out.
  - removed spitout of http headers and how they were parsed.
  - fixed bug where files name like picture$2312 (a common Manilla
    construct) would cause us to die if they were used in a relative
    link and not as an absolute.
  - fixed "broken pipe" program killer that happened when we tried to
    read from an image file that didn't exist locally (caused due to
    relative links within an rss feed).
  - fixed some core problems with how we handle entity encoding. now,
    we only encode entities if the channel has failed an initial parse
    using XML::Simple. This allows unencoded entities from US-ASCII
    types to be properly shown in AmphetaDesk (thanks again to
    Karl Ove Hufthammer for being the pesky foreign user and making
    sure we get this crap right). we do, however, encode some
    entities that are common when people are using the 'windows'
    encoding.
  - fixed a problem with 's having an attribute (for example
    xml:lang="eng"), which would cause the <title> tag to not display.
    now, if we find something similar, we check a bit deeper and
    try to rectify the situation. we only do this for title, and not
    description (description gets far too fun with possible attributes,
    possible unencoded HTML, etc). Thanks again to the ever observant
    Karl Ove Hufthammer.
  - added a "strict_xml" configuration setting. turning this setting
    on (via manual editting of mySettings.xml) will cause AmphetaDesk
    to not try ANY fixing of common problems with XML feeds. basically,
    we sent the feed unchanged to the parser and hope the user got it
    right. this is more conducive to "if the XML is wrong, then the
    parser should not display" ideal.
  - after going through all of the logfiles that people have sent, we've
    fixed a number of minor errors: <br>'s are now converted to <br />
    because it's simple to do; ´'s are now converted to apostraphes
    (search for ´ in the code if you want more info); Happily enough,
    most of the display errors in v0.91 have been fixed with the change
    in parsing of this version.
  - the webserver will now try to jump onto three ports before dying.
    these are all configurable, of course, and the doc's have been updated.
    there was a change in logic - {urls}->{port} includes the currently
    chosen and running port of AmphetaDesk. likewise, the new {port_default},
    {port_secondary} and {port_tertiary} point to the three possible
    port choices.
  - fixed some comment in the various OS libraries.
  - we now correctly close the logfile and webserver before exiting.
  - fixed silly != / ne bug in Linux.pl.
  - fixed an infinite loop when an http server redirects us repeatedly.
  - in channel display, we no longer show blank entries or HASH(ddddd)
    entries (which can manifest because of unencoded HTML).
  - warnings / notes improved upon. most user logging has been configured
    to spit out the program name and to report the error to the program's
    email address. other warnings and so forth have been tightened as well.
  - drastically reduced the amount of "quit AmphetaDesk" error messages -
    instead, we try to continue on with limited functionality. now, we only
    die if one of required files or directories can not be found, if we
    can't load the myChannels.opml, and if we couldn't start the webserver.
    We no longer quit when the myChannels.opml file can't be saved,
    when we can't load the channel list, when a valid URL wasn't passed,
    or when we can't find a template file (as any file that is not
    defined internally could become a template file, such as relative
    links within an RSS file, etc.).
  - Error messages now come with more verbiage containing a possible
    solution. All admonish the user to report the error to {app}->{email}
    when the problem is more than just a file missing (reinstall, bucko!).
  - fixed line feed issues in our log files on the Mac.
  - added "letter_next" and "letter_prev" for use within the
    "add a channel" page. this allows quicker browsing than having
    to hunt and peck the right letter and screw up.
  - cleaned up some bad error messages in the "add unknown channel"
    code, as well as added a log message to the GUI window when
    the channel was successfully added.
  - the title column of the "add a channel" and "my channels"
    pages has been set to 200 pixels to prevent annoying resizing.
  - new html-in-rss parser has been added, which listens only to
    encoded HTML tags (i sincerely doubt we'll ever support unencoded
    HTML, cos that's just so anti-RSS that it drives me nuts).
  - show stopping entries like <xml> and <title> are now fixed.
  - all links now listen to the users target= preference.
  - added &gui_after_html_display, necessary for the Macintosh GUI;
    stubs have been added to the Windows and Linux GUI libraries.
  - added "Tools" menu to the Windows GUI.
  - we now correctly close our logfile at the end of a run.
  - various minor html documentation changes for IE6 beta viewing.
  - minor template changes for better viewing in Opera and IE6 beta.
  - standardized all documentation to use "AmphetaDesk" and not
    any derivatives there of (like "amphetaDesk" or "Amphetadesk").
  - first attempt at Macintosh GUI has been committed.
  - added screenshots and pirillo's custom skin to documentation.
  - added the bottom navigation bar to docs to match ui templates.
  - added NewsIsFree.com, Sherch.com and Network54.com to finding_more.htm.


0.91 (released July 2nd, 2001)
  - fixed bug where we wouldn't close if our child process was still
    hanging around (caused by forking to run a browser different than
    the default and then not killing the bastard).
  - fixed a silly bug that stopped encoded characters in a URL from
    being accepted as part of a typed website address for the
    "add an unknown channel" feature. this fix makes
    NewsIsFree.com integration possible (and nifty!).
  - AmphetaDesk no longer crashes when Opera has been set as the
    default browser (it worked fine when the path to Opera was
    specified in mySettings.xml). The bug was caused by Opera's
    reliance on Multiple Document Interface (or so some more
    knowledgable people have told me).
  - finally stopped resizing in the Windows gui.
  - added right click menu to the systray icon for the Windows gui.
  - added "refresh channels" and "open window" to the systray
    icon for the Windows gui. and "exit" too, but that's boring.
  - fixed some minor template problems with new channel listings.
  - fixed a minor template form issue with Mozilla.
  - changed the default letter to "0" in the "add a channel"
    page. that just makes more sense, since it's first in our nav.
  - updated the three master channel lists.
  - fixed bug in version check code that would get confused with
    different types of line returns in the Macintosh version.
  - we now check for duplicate entries in the "add a channel" list
    based on xml url, not the title as we had previously done. this
    fixes an obscure bug where channels with the same name would
    be lumped (and by default, checked) into one entry.
  - stderr is now redirected to our logfile. we also sleep after
    spitting out any message for 10 seconds so that the DOS
    window on Windows doesn't disappear too quickly.
  - moved most of the divider lines into the respective routines.
  - added a lot more logging information to help debug.
  - added an error message for when the webserver dies. this lets
    the Windows 2000 people know what the problem is and that we
    know about it.
  - in our &process_initial_request routine, we know check to see
    if $url is defined before sending the results back. if $url
    is undefined, we set it to the main page of AmphetaDesk (which
    should work around some random browser idiocies when it actually
    makes a request to the server, but a url can't be determined).
  - server timeouts have been removed from &head and &get, as well
    the timeout was lowered from 20 seconds to 10 seconds.
  - we now print out the remote server headers if it doesn't contain
    Content-Length or Last-Modified headers. that's just weird.
  - Added $TEMPLATE->{total_my_channels}, $TEMPLATE->{total_channel_items},
    and $TEMPLATE->{total_channels} which just provide various counts.
    Find more information in the skinning.htm documentation.
  - Some minor template changes after usability testing - removed some
    of the more obscure terms, added some more whitespace, and duplicated
    the navigation at the bottom of the page. Eventually, they'll be a
    template that will remove all this "helpful" crap for people who
    know it all.
  - Reduced the head() request to 512 bytes, instead of 2096.
  - Added {app}->{url} into all HTTP User-Agent lines.
  - Our checks for server headers in head() are now case insensitive.


0.90 (released May 29th, 2001)
  - added UTF-8 character encoding meta tag to all XHTML documents,
    thanks to Karl Ove Hufthammer for bringing this to us.
  - template variables that were specifically used in the list_item
    pages are now prefaced with "list_"... this is to prevent
    confusion about template variables having the same name,
    but different meanings based on what page was being shown.
  - fixed <link_target>. instead of undef'ing, it defaults to
    "_blank". if someone wants links to open in the same window,
    we set it to "_parent". that's a good solution. yeah.
  - the settings <gui> was moved into <names>. it makes more sense.
  - 'echofactor' removed from the "finding_more.htm" page.
  - the 'www' directory has been renamed to 'templates'.
  - "news and update" page added to the documentation. the
    matching rss feed added to the default channel lists.
  - <added> added to the service lists - in conjunction, we now show
    channels which have been added in the past month in a different
    background color, based on this value.
  - <link_target> added to user preferences.
  - More entries added to the finding_more.htm docs.
  - Template changes: channel_title.html is now called
    channel_header.html. likewise, channel_footer.html is now displayed
    only if it exists. All template filenames have been renamed to
    .html, and channel_list_item_new.html has been added (which is
    displayed if the currently nonexistant <added> tag is newer than a
    month). There has also been tons of template variable changes, as
    well as the addition of a rather mediocre skinning.htm to the
    documentation.
  - Fixed bug where network timeouts would happen twice.
  - Added mySettings.xml workaround for Netscape and other browsers that
    don't automatically open up - the user can now enter a full file
    path of the browser, and we'll attempt to open that app, while
    passing it the URL requested.
  - mySettings.xml frontend has been integrated and related
    documentation has been added (xml_my_settings.htm).
  - Morbus, being bored one day, looked at every single line of
    code all over again, and tweaked and hemmed and hawed. tons
    of myriad comment updatings, space cleansing, and so forth.
  - We've added a Timeout of .1 second to our internal webserver, The
    Timeout will ensure that the webserver is nonblocking (moving on in
    the infinite loop after 1/10 second), which helps the GUI listen for
    requests.
  - We now override xml::simple's xmldeclaration with our own, which
    solves the xml syntax error with [version='1'] when it should
    be [version="1.0"].
  - Error messages and name related data that was hardcoded has been
    moved to its $SETTINGS equivalents for better customization.
    Eventually error messages should live in mySettings.xml as well,
    but that will come later.
  - Because of the improved $SETTINGS configuration, we now have
    better error checking for missing files (like the various
    template files and myChannels.opml, etc.).
  - The logfile is now opened again in the main script - only the
    filehandle is referenced in Miscellaneous.pl. Our problem with
    the log not being written because of a crash was because we
    didn't autoflush the buffer in our old code. This is fixed.
  - Tons of variable name changes in line with improved $SETTINGS
    and $TEMPLATE changes - the whole thing has basically been redone
    for better support of mySettings.xml and distribution power.
  - One channel bug resolved (we still need to check some of the
    uninit'd values that seem to pop up every now and then).
  - Added the tidy_house() routine to clean out old channel files
  - files_and_dirs.htm added to documentation.
  - Tons of minor documentation fixes and additions.
  - Micropayment links secretly added. Let's see if they'll notice.
  - Turned (back) on the service list download - if the recent channels
    list hasn't been updated for a week, we check for a new one. If it
    doesn't exist, we download it (which allows us to not ship that at
    the expense of a longer first startup for users).
  - Only newly added channels are downloaded from the "add a channels"
    screen now - previously, we would recheck all our myChannels.
  - Artistic license added to docs.
  - Because the XML parser has been nicely tested and the only errors
    that show up are due to mismatched tags, we no longer spit out
    xml error messages to the user, we just send them to the log.
  - We now display an error message when there are no channels to display
    on the initial page (ie. all channels timed out and no local files).
  - The version check actually works now.
  - ¬e split up into ¬e/&gui_note.
  - Various default channel changes, including the removal of
    The Motley Fool and the addition of Lockergnome...


0.24 (released March 19th, 2001)
  - chose an almost entirely new set of default channels.
  - fixed bug where numerically named services would never show.
  - a simple error message is now displayed when no channels exist
    under a chosen letter in the "add a channel" page.
  - fixed bug where our parse_template routine thought that a "0"
    was a nonexistant value, even though it could be (ie. a "0" could
    mean that we want to see all services matching a number.)
  - stuck the "display_home_page" routine back where it belongs, but
    still as a routine. reasoning being it's the only block of code
    called more than once in the main file, and it'd be lonely being
    the only routine at the bottom of the file.
  - documentation updated to match new <header> block within service
    list, as well as to be more organized and crosslinked.
  - cleanup changes to ServiceMaintenance.pl to make it more useful.
  - added timeout setting using IO::Select of 20 seconds. this combat
    slow networks, and should fix Geomisk's nephew's crappy connection.
  - documentation can now be served/read by the webserver.
  - "add channel from url" feature has been added.
  - the large channel list is no longer loaded when people go
    to "My Channels" and delete a channel (this saves a few seconds
    if the user hadn't requested to see the channel list earlier).
  - "xmlUrl" and "htmlUrl" from myChannels.opml have been changed
    to "xmlurl" and "htmlurl" respectively. our code will read both
    but only write the lowercase versions.
  - naming.htm added to documentation.
  - history.htm added to the documentation, as well as documentation
    links added to the default templates. Just integrating help.
  - removed Red Herring from myChannelsDefault.opml.


0.23 (released March 6th, 2001)
  - fixed stupid misspelling in check_version.
  - removed all global variable passing.
  - program name is now a variable (and is now used in all socket calls).
  - channel downloading within download_my_channels is now more
    informative, and allows us to more easily troubleshoot missing
    channels (and dead/failing ones).
  - the "unlink" on the filename has been secured, since technically
    it's outside data (people could modify the myChannels.opml). We
    leave the unlinks on the log file deletions alone though, since
    the directory comes from Cwd and the filename internally.
  - invalid xml entities/characters are now encoded when the channel
    fails to be loaded the first time around. this should fix almost
    all "invalid entity" errors (hopefully). there will still be
    errors concerning missing tags, but we don't care about those.
  - make_valid_xml moved into Miscellaneous.pl.
  - large channel lists added, along with alphabetical breakdowns by page.
    the current channel lists are not all that we know of on the net, but
    enough to be a proof of concept. the list will be expanded in the
    future.
  - scriptingNews regexps are now eval'd.
  - Development moved to SourceForge.
  - ServiceMaintenance.pl added - creates and maintains service lists.
  - "xml_services_lists.htm" added to documentation.
  - "xml_my_services.htm" added to documentation.
  - removed "text" from myChannels.opml - it was a throwback to
    Winer's mySubscriptions.opml, and has been replaced with "title".
  - we now add "&go=1" onto the end of the delete url's so that
    IE 5.5 on the PC won't think that it should display an
    xml file because of the extension in "?del=filename.xml". The
    "&go=1" is ignored by AmphetaDesk.
  - fixed bug where "weekdayword" and "weekdaywordabbr" were never
    being correctly set. this eventually caused undef errors in
    &unencode_some_html and &strip_newlines_and_tabs.
  - channels that have no items to display are no longer
    displayed (previously, we saw just the title of the channel).
  - make_valid_xml improved with better fixing for the <xml>
    statement not being on the first line of the passed data.
  - all empty elements within the channel xml are now suppressed
    via &load_channel_data - this should fix some rather random,
    but confusing bugs (and probably introduce some more, but hey...)
  - new logo and slightly larger globe added. all images compressed.
  - &load_channel_data has been added - this understands both
    raw xml data, as well as a filename... likewise, make_valid_xml
    understands either raw xml data, or a filename.
  - delete_channels now removes the filename from data/channels.
  - delete references channel filename as opposed to xml-url.
  - more html changes - icon key is now in header.
  - fixed the stupid logic error in this file.


0.22 (released January 21st, 2001)
  - unencode_certain_html added - converts "/lt/gt to "<>.
  - changed the delete code to reference xmlUrl and not htmlUrl.
  - changed the delete code from "delete.ahtml?del=" to
    "my_channels.ahtml?del=" - the main reason for this is that
    delete.ahtml will never exist as a template file, so we
    shouldn't define it.
  - tons of html changes to clean the ui.
  - added delete from home page feature.
  - lots of routines now use the global variables instead of passing.
  - download_channels_in has been renamed to download_my_channels.
  - loading of the channel list is now cached for quicker access.
  - lots of new routines to make the script even more blackboxed:
    create_channel_filename, load_my_channels, sort_my_channels_by_filename,
    strip_newlines_and_tabs, load_channel_list, and write_my_channels.
  - comment and code cleaning - general gold plating.
  - merged myChannels into the big list and checked them off.
  - fixed the Netscape/Mozilla bug where POST requests would
    never be properly resolved (due to erroneous content-length).


0.21 (released January 15th, 2001)
  - we now only load filenames that are defined in myChannels.opml.
  - make_valid_xml no longer dies if the file can't be opened.
  - < and > are changed to < and > in our item descriptions
    so that anyone who properly encodes HTML will show correctly.
  - Our template channel items are now undef'ed each time through
    to fix a bug where a <description> from item 1, would appear
    on all further items that didn't have a <description>.
  - Removed flocking. Really only a one user system.
  - Fixed bug where the submit button became a new channel.
  - Fixed bug with Windows freezing / force-quitting.
  - Downloading after channel add has occurs after the page displays,
    not before (as before). This is so the page displays without an
    overly lengthy delay. This simulates "background downloading".
  - Cleaned up some uninit's when the channel $html wasn't there.
  - Content-length and POST changed so more browsers will work.
    This has currently been tested on: NS 4.7.x (Mac), IE 5 (Mac),
    iCab 2.x (Mac) and IE 5 (Win).
  - Timeout for socket connection has been moved to 15 seconds.
    People like me who have 40 channel subscriptions will wait
    forever (quite rightly so) to download them all. Non -
    responding sites are a pain waiting to timeout.


0.20 (released January 13th, 2001)
  - Add and remove channel code has been added.
  - myChannelsDefault is no longer referenced in the code.
  - Channel list is now updated once a day.
  - Globe and XML image added to HTML templates.
  - Filenames are now part of the OPML file.
  - HTML and XML urls are now available in channel title display.
  - Timeouts for downloads changed to 30 seconds.
  - Tweaking of ¬e output - lot cleaner output to the user,
    and more helpful output to our log file. How slow is this?


0.17 (released January 12th, 2001)
  - Channels and lists are only downloaded if the saved versions
    are older than 1 hour. This makes the script even quicker.
  - GET/POST now properly parsed for form data.
  - List items and channel news are stripped of newlines and tabs.
  - channel list is optimized but it's kludgey. needs fixing.
  - .opml and .xml added to content-type extensions.
  - HTML cleaned up a bit, and section names finalized.
  - The old log is deleted before a new log starts.
  - &mirror now supports modification dates and works so much nicer.
  - Version checking is now mirrored.
  - The main $socket loop is now autoflushed.
  - ¬e and &error moved to Miscellaneous.pl.
  - Date stamp on logging shortened, since we overwrite each run.
  - All code switched to the rewritten LWP routines.
  - All routines are now labeled with what they can return, as well
    as the conditions for those situations. Most routines are non-fatal;
    if something bad happens, then the script will just keep on going.
  - The only routines that can kill the script are the parse_template
    routine (cos if we can't parse templates, we won't be able to show
    anything to the user), and the error routine (whose sole purpose is
    to kill the script anyways).
  - Timeouts during downloads are set to 45 seconds.


0.16 (released January 9th, 2001)
  - All LWP functions rewritten using non-module code (besides
    IO::Socket). This was mainly because a *compiled* runtime
    on the Mac would fail on every LWP routine besides get().
  - Channel download is now sorted alphabetically.
  - Channel news display is now sorted by last modified.


0.15 (released January 7th, 2001)
  - Removed unneccesary junk from the OPML.
  - Versioning code has been added.
  - Finalized logo appearance.
  - Fixed the annoying corrupted image problem for Windows.
  - We now use mirror() instead of getstore() for downloading.
  - Cleaned up comments for parse_file.
  - Directories now skipped when searching for channels.
  - Initialize.pl changed to Miscellaneous.pl.
  - We now check to see if all our directories exist.
  - Delimiter choosing cleaned up.
  - Removed tainting.
  - Port set to 8888 to reduce conflicts.
  - OS specific libraries added.
  - Stupid delimiter error fixed.
  - Library handling changed a bit.
  - Quick code to display all news headines added.
  - Quick code to download all channels in the subscriptions.
  - Simple, default mySubscriptionsDefault.opml added.
  - Added simplistic &error, which is just a die-ing shell to ¬e.
  - WebServer.pl and Initialize.pl appear.


0.1 (released January 5th, 2001)
  - First public release.