24 February 2014

When Did The Delphi Language First Support ...?

If you're like me and try to write library code that's compatible with several different versions of Delphi you have probably had cause to ask "When did Delphi first support XXX feature?"

I have. A lot. And then I forget and have to research it all over again. So, I've created a small table of various language and other features of Delphi along with the version where they were introduced.

I've had the page for a while now for my own use, but it occurs to me that others may find it useful. If you're interested, view it here.

Now, I'm not guaranteeing it's 100% accurate, and it's far from complete.

And now the ask. If you know of any other features and the version when the were first introduced please leave a comment and I'll add it to the list.

Also, if I've made a mistake, leave a comment about that too so I can fix it.

19 February 2014

New blog for CodeSnip stuff

Up to now lots of news about my CodeSnip program has been posted on this blog. That's really been off-topic in that I first conceived this blog to be a place to post some occasional musing on programming.

So, Ive now set up the new CodeSnip blog that I'll use for CodeSnip announcements and the like. I'm intending for this blog to become the central hub of all CodeSnip news in future.

Therefore if you've subscribed here mainly for the CodeSnip stuff, it would be best to subscribe to the new blog instead or as well.Sorry if that inconveniences you.

16 February 2014

Workaround for a bug in SourceForge's Blog RSS feed

I've just been setting up a new blog for CodeSnip on SourceForge (of which more later).

On setting up a FeedBurner feed for the blog I've come across a bug in the SourceForge news RSS feed that breaks FeedBurner.

The problem is that FeedBurner (correctly) treats the value of the SF feed's <guid> tags as valid URLs and uses them as destination URLs of some links. Unfortunately the <guid> tags in the SF feed are not valid URLs and this causes FeedBurner to generate bad links.

The RSS specification states that <guid> tags should signal whether or not they contain valid URLs by means of an isPermaLink attribute. The tag's value must be a valid URL if isPermaLink is true but must not to be treated as a URL if the value is false. The attribute's default value, when not present, is true. An here's the problem: SF doesn't provide an isPermaLink attribute and so FeedBurner assumes the value of the <guid> tag is a valid URL when in fact it's not.

This suggests a solution: we need to transform the SF feed, adding an isPermaLink with value false to every <guid> tag in the feed. This will cause FeedBurner to disregard the <guid> tag.

I've written a little PHP script to performs the required transformation. I can't modify the feed at source, so the next best thing is to read it in, modify it and make the modified feed available via a new URL.

Here's the script:

<?php
/*
  Fix for SF RSS feed bug: https://sourceforge.net/p/allura/tickets/6687/
  Reads RSS source code from SourceForge and re-renders it, adding an
  isPermaLink=false attribute to every <guid> tag.
*/

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_language('uni');
mb_regex_encoding('UTF-8');
ob_start('mb_output_handler');

class SFBlogFeedConverter {

  private $feedURL;   // URL of SourceForge RSS feed
  private $rssDOM;    // RSS DOM

  public function __construct($feedURL) {
    $this->rssDOM = new DOMDocument();
    $this->feedURL = $feedURL;
  }

  public function RenderRSS() {
    if ( !@$this->rssDOM->Load($this->feedURL)) {
      $code = 500;
      $desc = 'Internal Server Error';
      header("HTTP/1.0 $code $desc");
      header("Status: $code $desc");
      header('Content-Type: text/html; charset=utf-8');
      echo "<!DOCTYPE html>\n"
        . "<html>\n"
        . "<head>\n"
        . "<meta charset=\"utf-8\">\n"
        . "<title>$code $desc</title>\n"
        . "</head>\n"
        . "<body>\n"
        . "<h1>$code $desc</h1>\n"
        . "<p>Can''t open CodeSnip blog feed on SourceForge</p>\n"
        . "</body>\n"
        . "</html>\n";
      return;
    }

    $guidNodes = $this->rssDOM->getElementsByTagName('guid');
    foreach ($guidNodes as $guidNode) {
      $guidNode->setAttribute('isPermaLink', 'false');
    }
    header('Content-Type: application/xml; charset=utf-8');
    $xml = $this->rssDOM->saveXML();
    header('Content-Length: ' . strlen($xml));
    echo $xml;
  }
}

$blogXML = new SFBlogFeedConverter(
  // Replace [PROJECT] below with the required project name
  'http://sourceforge.net/p/[PROJECT]/blog/feed'
);
$blogXML->RenderRSS();
?>

Get the code from GitHub

First off we just make sure we use UTF-8 encoding.

The main code is wrapped up in the SFBlogFeedConverter class. There's a constructor that takes the URL of the feed we're converting as a parameter and stores it. It also creates a DOM object to use later.

The meat of the code is in the RenderRSS method. We try to load the RSS from the URL passed to the constructor. If that fails we create an error 500 response and exit. If the DOM loads OK we get all the <guid> nodes and give each one an isPermaLink attribute with the value False. Finally we write the required headers followed by the converted XML.

The last bit of code just creates a SFBlogFeedConverter instance with the required feed URL and then calls RenderRSS to perform the conversion.

To use the script, upload it to a web server and make it accessible via a URL. Then point FeedBurner (etc.) at the new URL and all should be fine.

I modified FeedBurner in this way for the CodeSnip blog feed and now everything works fine.

EDIT - I no longer have this blog on SF, so I can't show you the fix in action.

If you're experiencing the same problem please feel free to use the script until such time as SF fix the bug.

01 February 2014

Considering changing license of Code Snippets Database snippets

I'm considering changing, or more accurately clarifying, the license that applies to the snippets in the Code Snippets database.

At present the code is covered by this rather vague statement that is written to the top of any unit generated by CodeSnip or the online database reader app:

{
 * This unit may be freely distributed and used on the condition that this
 * comment is not removed from the unit.
 *
 * ...
 * 
 * The source code contained in this unit is made available on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. The code is used
 * entirely at your own risk.
 *
 * ...
}

While a slightly different statement appears in any exported snippet: here's an example:

{
 * This code snippet was generated by DelphiDabbler CodeSnip Release 4.8.5 on
 * Sat, 01 Feb 2014 14:02:09 GMT. It is made available on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. The code is used
 * entirely at your own risk.
}

And the CodeSnip about box just says:

The source code in the database may be used freely, but is made available on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. The code is used entirely at your own risk.

At first sight dedicating the code to the public domain seemed a good choice but, from what I've read, there are risks with this. What is more, public domain is not a license and isn't approved by the Open Software Initiative.

OK, not public domain then, so which license to use? I want to satisfy the following criteria as far as possible:

  1. The open source nature of the code should be protected - no-one should be able to make it closed source.
  2. The code should be compatible with as many open source projects that use other licenses as possible.
  3. The license should be as permissive as possible without contravening points 1 and 2.
  4. There should be a disclaimer of warranty (as publisher I want some protection!)
  5. We shouldn't add to the problem license proliferation, so no custom or obscure licenses.
  6. Minimum onus should be placed on the user for making source code available or for giving credit - these are only little snippets of code after all.

Because of item 2 above, I've rejected any of the GPL/LGPL, strong copyleft, licenses because they're viral and mean the code can't be used with many other popular open source licenses. Conversely, item 2 also requires that the code must be able to be used in GPL/LGPL projects.

Having reviewed several popular licenses I think that the MIT License (a.k.a the X11 license) meets my criteria the best: it's very permissive, compatible with the GPL etc., disclaims warranty and is not too onerous to comply with.

I'm proposing to make the copyright statement read "© Peter Johnson (www.delphidabbler.com) and contributors".

Note that this proposal applies only to code currently in the database, all my future contributions, and that submitted using the CodeSnip Code Submission Wizard. In future I am planning to let contributors specify their own license.

Any comments welcome. In the absence of comments I'm proposing to roll this out in March 2014. Update: Well not March then, since it's now Sept and I still haven't made the change!