Software and People

The squelch of mud under feet, crumpled clothes, strange noises in the night, bugs in the supplies, agonizing decisions about whether you really need to go right now, or whether it can wait 'til morning :)

It's "fresh air", it must be healthy, right?

It's "half term" (a week off school in the middle of term) here, so I'm taking Margaret and the girls camping for a few days. The weather forecast is "mixed". the internet access forecast is "unlikely", so don't be surprised if there's not much blogging for a bit!

There's quite a lively discussion about what software to install on a system for teaching Java going on at the Java Ranch Big Moose Saloon at the moment. I'd really welcome any extra input!

After a recommendation from Marcus Green I went and downloaded Moodle, an open source "virtual learning environment" written in PHP with active development and a thriving community.

Getting it working has been a wild ride for a day or so. I came on the scene just as a new (1.3) release hit the downloads, and was at the forefront of some pretty weird configuration issues. After some TLC from Howard Miller (a very knowledgeable guy in Glasgow) my local installation is now up and running sweetly. With any luck these wrinkles will be out of the way soon, and I'll be able to recommend that people take a look. In the meanwhile, I get to play and try to find out what a "virtual learning environment" actually is.

As a professional software developer, I take pride in correctly and usefully testing my code. As a professional teacher, I take pride in correctly and usefully testing my students. Some things, however just seem too hard to test.

There have been plenty of discussions and writing in the world of software about the difficulty of testing things like asynchronous, graphical, data-dependent legacy code. There have been plenty of discussions in the world of teaching about the difficulty of testing things like understanding, empathy, originality and so on. These aren't really what's on my mind today.

I'm currently planning a couple of broadly similar software development courses using Java. Part of the syllabus for both courses is a section on testing. In the manner of such things, the wording is very vague, but if I'm to reassure myself and my students that they have "got the message" about testing, I need to test their testing.

It may sound glib, but it's not as easy as it might seem. There are plenty of rules for testing software against its requirements (be they "hard" or "soft") and the needs of its customers. To assess someone's ability to create a solution to a need, all I really have to do is ask them to make one, and apply the testing rules myself. But then I'm stuck. Let's assume that everything about the software the student has produced is within tolerance. This could be because they tested it well, or it could be that they wrote it well first time, and never tested it at all. How might I test their testing of this software?

In the past, I've asked students to keep a "test journal" describing all (well, a reasonable amount) of the testing they have done, but many students find this very hard: it can destroy the "flow" of coding and testing, and depends a large amount on writing and time-management skills rather than purely testing ability. I could also maybe set a quiz or exam on some sort of theory of testing, but that seems a bit abstract and wouldn't really tell whether they can actually do it. I could get them to test each others work, and grade them by the number of faults found, but this would be unfair to those who got to test the rock-solid ones. I could set some sort of arbitrary, buggy example, and ask for a (justified) report on what is wrong with it, but this can become more of a code reading exercise for students new to programming. I could assert that each student produce at least a certain number of JUnit tests, but this might not encourage them to test the right things.

I'll have to sort out some way to do this, so I'd very much welcome any suggestions or experience anyone has had. Even if you've never "tested testing" yourself, how would you prefer to be tested for this? How would you feel best able to show just how superb a tester you really are ...

Seb at Seb's Open Research quotes Chris Corrigan in this weblog entry:

    When the session is really humming there is a chemistry that arises between the musicians. I have often thought of this state as one in which all the individuals in the group take a significant emotional investment in the music and place it outside of themselves, in the middle of the circle, like a glowing ball of energy that we all try to keep aloft.

I've not really thoght of it in these terms before, but the description strongly resonated with me as one of the reasons why I enjoy tabletop roleplaying games so much. In a good roleplaying session, one that "gets off the ground", all the players collaborate seamlessly to create an entirely imaginary story, in an entirely imaginary setting. Participants are at once the omnipotent author; a character, adrift in a complex and often deadly world; and the reader, eager for what will be revealed as each new chapter develops. The story, and sometimes the world it entwines, take on a separate existence in the minds of the people involved.

Just as with collaborative music, this is extremely hard to describe to people who have never experienced it. From the outside it's just a bunch of folks round a table with some paper, pencils and dice, who might as well be talking about some book or movie. From the inside it's an intensely personal, yet shared experience. Stories and events explained outside the circle are as dull and objectionable as someone else's half-remembered dreams. The nearest I have been able to come to conveying the feeling is through poetry.

These forms of creative art live entirely in the present. They only really exist in the minds of the participants, despite the external signs of words or music. There is neither point nor mechanism for recording them. A roleplaying game or a jam session can never be repeated or recreated, but with luck, skill, opportunity, and trust you can find the experience again.

The Suffolk Institute of Technology, an offshoot of the college where I teach and study, is offering two of its on-line courses for free. Here's a copy of the message I received through the alumni association:

    FREE on-line courses from the Suffolk Institute of Technology

    If you enrol before 30th June 2004, the Suffolk Institute of Technology (SIT) courses Professional Development Planning and Supporting a Business Using the Internet are available absolutely free.

    Professional Development Planning (Usual cost £100) Many businesses and professional bodies place increasing importance on staff continuing their professional development (CPD). For most professional bodies, evidence of CPD is essential for continued membership.

    This course enables students to formally audit their skills, assess their capabilities, interests and competencies before identifying their individual development needs. Planning how to address those needs is covered during the final stage of the course.

    Supporting a Business Using the Internet (Usual cost £99) Explore how the Internet can be used as a very powerful resource for small and medium sized businesses to investigate their market and locate customers and suppliers. Students learn how to find useful sites and services for business, find out about laws and regulations, look at international trade and the Internet and consider the future of the Internet.

    SIT students are assigned a personal tutor to support them through the course, and there are discussion facilities to share thoughts and ideas with fellow students - so on-line certainly doesn't mean on your own.

I sent them an email, and there don't seem to be any limits on who can apply: "In answer to your question, this offer is not limited to members of Suffolk College Reunited." The contact details are:

    Liz Woods
    Administrative Assistant
    CREATE / SIT
    Room N205
    Suffolk College
    IPSWICH, IP4 1LT
    Tel:  01473 296651
    
    Liz.Woods@create.Suffolk.ac.uk
    

There seems to be a bit of a fuss going on about incompatibilities between the Apache Licence (as used for Jakarta projects) and the GPL. Some GPL projects (for example SnipSnap/Radeox) are having a crisis of conscience about dependency on Apache liceneced components.

I'm hoping all this will be resolved, in time - the benefits of code sharing a reuse are too great to be derailled by a bit of legalism. However, I can happily say that my Wiki software Friki is GPL and unencumbered by using any Jakarta code. The only third-party component used in Friki is jregex which claims at sourceforge that it uses the relatively free-and-easy BSD licence, and ships with even simpler terms:

    Copyright (c) 2001, Sergey A. Samokhodkin
    All rights reserved.
    
    Redistribution and use in source and binary forms, with or without modification, 
    are permitted provided that the following conditions are met:
    
    - Redistributions of source code must retain the above copyright notice, 
      this list of conditions and the following disclaimer. 
    - Redistributions in binary form 
      must reproduce the above copyright notice, this list of conditions and the following 
      disclaimer in the documentation and/or other materials provided with the distribution.
    - Neither the name of jregex nor the names of its contributors may be used 
      to endorse or promote products derived from this software without specific prior 
      written permission. 
    
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
    IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
    OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 
    WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    
    @version
    

A few days ago, I found a site offering some software and a free service to convert RSS feeds into JavaScript, so they can be included with a simple <script> tag (the same "loophole" used by most dynamic advert systems, including Google-Ads). I tried to set it up on one of my sites, but without much luck - it used an unsupported and almost unavailable PHP RSS parser with next to no documentation. I gave up.

I was delighted when I read in this message in the author's blog that a new version is now available using a much more up-to-date parser. It's not only easier to download and set up, it now supports Atom feeds, too.

Since I got my blog, and got into the habit of posting, I've tended to neglect the "what's new" section of most of the websites I manage. Looks like this might be a good way to keep them fresh, by tapping off a sub-feed (a.k.a "category") from my blog.

Thanks Alan!

Several people seem to be worried about Movable Type's new pricing and are casting around for new blog software. One has even got as far as making a table of blog software features

I'm not sure the author of the table realizes just how many blogging tools there are. He doesn't seem to have come across any that aren't coded in PHP or Perl yet either. He's asking for more information, so maybe anyone with a Java blogging solution ought to let him know ...

Via Brian's Object Learning: a delightful note about Wiki and writing. I too appreciate the ephemeral, "never finished" nature of Wiki. I also find it in agile software development, but I guess that's a different post.

minor update: I screwed up the post link, above. Fixed now. Sorry.

Which reminds me of a small segment of a "creative writing" seminar I attended a few weeks ago. The leader said something along the lines of "You've all got paper and a pen? Go on then, write something. Make sure it's something brilliant. You have 10 minutes". Of course, there was general panic. Based on a show of hands, only about 10% of us wrote anything. I didn't get to read the rest, so I'm not sure how many of the others were "brilliant" :)

I managed a little Haiku (my favourite poetic form, at the moment):

    Fresh sharpened pencil.
    Blank pages stacked in order.
    Uh-oh! "Writers' Block"!
    

What followed was an interesting discussion about sources of creativity and how to find and make use of your own. Certainly a fun way to spend an hour and a half.

As I mentioned yesterday, I'm getting set up to teach a software development course using Java. If things work out, I may actually be teaching two slightly different Java courses, but only one is definite, so far.

Next week, I really need to speak with the Network Services people at our college, to sort out installation of the software I will need. Sure, the course won't be staring until September but, by all accounts, letting them schedule stuff well in advance is always a good idea. Although we are the "Office Technology and Computing" department, we have no computing resources of our own. Each of our computer classrooms is lined with 20-30 generic PCs, all running Windows 2000 and logging in to central servers maintained and configured by Network Services. We don't have admin priveleges to install or configure software. We don't have any servers of our own to run web applications or store shared files.

My issue at the moment is what software installation to ask for. I know the kind of software I use when I'm developing software for clients and for my own community projects, but I don't knowe if that would make sense for students with little or no experience of Java (or even programming in general). It's made more tricky by needing to specify it all up-front. In pretty much every other setup I've put together, we've had the freedom to add another jar or two to the classpath if necessary.

I guess a recent Java SDK is a must, and I hope I can ensure that the browser plugin and webstart are there as part of that. But what else? An IDE? An editor? A test framework? A build system? A useful collection of jars? any specific teaching tools (I quite like Jurtle and BlueJ, for example), anything I've missed?

I'm also keen to find a way of running some server-side software for the students to interact with. As it stands at the moment, I have to use things on my own personal sites out on the "real internet", but this has all sorts of issues that running software inside the college firewall would solve. I'm hoping that my forthcoming discussion will address some of this stuff.

In the meanwhile, if anyone has any experience or suggestions to share, please let me know.

One of the cheapest ways to host Java on the Web is with a "shared JVM" hosting provider. Most hosting companies that offer servlets/JSP support with a shared JVM only offer a "single web app per customer", but this makes it clumsy to deploy a pre-packaged web application like Friki - you need to "expand" the WAR file and make sure that the contents of WEB-INF go in the correct server-provided location, etc. Luckily, some "shared JVM" hosting operations provide a real webapps directory to simply drop in your own applications. Personally, I use LunarPages, for this, I find that $9.95/month for tons of bandwidth and as many web applications as you like (within reason!) is a compelling deal.

However, there is a down-side to this approach. In each setup like this there is a shared server instance somewhere, running as some server-specific user id. That's fine, until you run a web application which (like Friki) creates and manipulates files. Files created by the shared server are owned by the shared server user, even if they are in your directory space, and however much you try and edit them you will be prevented by the basic operating system security.

I don't know how other hosting operations cope with this but with LunarPages, at least, it seems there is a work-around. Once you have signed up for an account and got your server-side Java running, you can send an email to jsp@lunarpages.com and get your user id added to a list. Each hour a process on the server goes to the directory space of each user in the list and ensures that the owner of the directory space is the owner of all the files under webapps and WEB-INF (from the implied "root" application).

I did this, told a freshly-installed Friki to store its data in /home/myusername/WEB-INF/data/friki, waited a while, and now I can edit my Friki configs to my heart's content.

If you are interested in comparing Java hosting deals, I am still gathering details in a list of java hosting reviews and recommendations.


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforge.

I'm currently planning a Software Development course that I will be teaching from September. It's one unit from a BTEC National Diploma for IT Practitioners from Edexcel.

I've got a few issues with this course, and its assessment as defined in the Edexcel guidelines. One of the major problems is that the course specification seems to use terms loosely (or flat-out incorrectly), which leads to misunderstanding and confusion among teaching staff. Who knows how complicated it might be for the students?

Anyway, I'm currently planning to teach this module using Java as the programming language of choice:

    Centres may choose any appropriate language as a vehicle for developing this unit, eg Pascal, C, or Standard BASIC. Though it is recommended that learners develop programs in a conventional procedural language, a modern language such as Visual Basic could be used provided emphasis is placed on basic programming concepts and constructs rather than event-driven, visual interface components.

It is somewhat worrying that the only types of programming language it considers are "a conventional procedural language", and "a modern language such as Visual Basic". I'm guessing that whan they say "procedural", they really mean something more like "imperative". Otherwise they are ruling out a whole host of language paradigms, including Object Oriented, List and Stack based, Functional and so on. One colleage who will also be teaching this unit questioned my suggestion of Java on the basis that Java is too "OO" and maybe we should teach a pure procedural language (he suggested TurboPascal, I seem to recall). If we do, I pity the poor students we send into the world thinking that they have gained a useful and marketable skill. Heck, I'd rather teach them Perl, or PHP than that, at least they'd be able to use it outside the college.

When we get to the assessment criteria, I'm frankly boggled. Among other things:

    To achieve a merit grade the evidence must show that the learner is able to ... use an appropriate tool to analyse a piece of code to ascertain its semantic correctness.

Where do I start? If we had a tool to "analyse a piece of code to ascertain its semantic correctness", software development sure would be a lot easier. The nearest I can think of is something like JUnit, but that somehow doesn't seem to be what they are on about. Any suggestions?

One of the most popular requests for Friki (and Wikis in general) is a way to have nice looking links. Regular HTML has <a href='url'>label</a>. Most Wikis just have a raw URL as the link. There are several possible ways to achieve this in a Wiki, from allowing the HTML <a href='url'>label</a>, through something like BBCode ([URL=url]label[/URL]), to wierd custom markup. For the purposes of this tip, I'll show you how to implement a simple, Wiki-style markup: "label"url.

As usual, all this can be done without stopping or restarting the server or the application.

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file wiki.transform
  3. Add a new line after the first line in the embedded URLs section:
      Lock !\"([^\"]*)\"((?i)(http|https|ftp|file|mailto)(?-i):([^\s\<\>\[\]\"'\(\)\?])*[^\s\<\>\[\]\"'\(\)\?\,\.]([\?][^\s\<\>\[\]\"'\(\)\?]*[^\s\<\>\[\]\"'\(\)\?\,\.])?)!<a href='&2'>&1</a>!
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

Now you can have neat external links. For example, enter "Frank Carver"http://www.efsol.com/FrankCarver.html, view the page, and you should see a nice link like Frank Carver.

Note 1: This new transformation is added before the existing URL-to-link transformation. If you were to place the new line after the existing transformation, it would never get used; the URL would be transformed to a regular URL link, just with some quoted text before it.

Note 2: This transformation is tricky to type, and very similar to the existing URL-to-link transformation, so the easiest way to create it may be to copy-and-paste from the existing one. If you do, beware - there are two added brackets and the replacement uses &1 and &2, instead of just &0 as well as the more obvious addition of the initial pattern. These modifications are marked in red, above.


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforge.

On the list of suggestions and FrikiUserStories, someone once asked for a way of allowing numbers in WikiWords. Unfortunately, whoever it was didn't leave a name, so I can't get back to them with the answer. However, just in case anyone else is interested, or maybe the original suggester reads this stuff, here's how you can do it in the flexible Friki 2.1.

As usual, all this can be done without stopping or restarting the server or the application.

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file wiki.transform
  3. Change the line
      FilterReplace wiki.LocalWikiLink /(^|\p{Punct}|\p{Space})((\p{Lu}\p{Ll}+){2,})(\z|\n|\p{Punct}|\p{Space})/&1&~2&4/
    to
      FilterReplace wiki.LocalWikiLink /(^|\p{Punct}|\p{Space})((\p{Lu}(?:\p{Ll}|\p{Digit})+){2,})(\z|\n|\p{Punct}|\p{Space})/&1&~2&4/
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

Now you can have WikiWords like FrikiRelease58.

Note: The part of the expression (?: introduces a non-capturing group. This means that it can be used for grouping letters and numbers together, and can be added without affecting the group numbers (&1, &~2, &4) in the second part of the replacement.


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforge.

Ilja Preuss mentioned that he likes to use Friki as a home recipe database (a.k.a "cookbook"), but thinks it would be much nicer if he could align images.to the right of the page, with the text flowing to the left of the image. Once again, a simple change to the Friki configuration will add this feature without even a restart.

After thinking about this for a bit, I decided that it will be more useful to define a new markup for such "right-aligned" images, rather than changing the existing image transformation. After all, there's bound to be at least one occasion when an image on the left (or in-line) would be preferable. We could indicate one of these special images in many ways; for this example I have chosen to show a right-aligned image by placing a tilde (~) immediately before the URL (e.g. ~http://www.efsol.com/images/efsol-logo.gif). Here's how you do it:

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file wiki.transform
  3. Just before the existing image transormation, add the following line
      Lock !~(?i)((http|https|ftp|file):([^\s\<\>\[\]\"'\(\)\?])*[^\s\<\>\[\]\"'\(\)\?\,\.](\.gif|\.jp[eg]{1,2}|\.png))([\?][^\s\<\>\[\]\"'\(\)\?]*[^\s\<\>\[\]\"'\(\)\?\,\.])?(?-i)!<img src='&1' align='right'/>!
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

Now all you need to do is place a ~ before each image URL you wish to appear on the right. Voila!

Note 1: If you place the new line after the existing image transformation, it will never get used; the URL would be transformed to a regular inline image, just with a tilde before it.

Note 2: This transformation is tricky to type, and very similar to the existing image transformation, so the easiest way to create it may be to copy-and-paste from the existing one. If you do, beware - there are two added brackets and the replacement is &1, instead of &0 as well as the more obvious additions of the ~ and the align='right'. These modifications are marked in red, above.


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforge.

It's not part of the standard Wiki syntax, but several Wikis have a way to specify headers (e.g. <h2>Some Stuff</h2>) Adding this to Friki is another simple change.

Danny Cook suggests that Usemod indicates such headers using a = Header One =, == Header Two == syntax. To add this style of header to your friki installation:

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file wiki.transform
  3. add the following lines (just after Include wiki-extra.txt is a good place)
      Replace !^= (.*) =$!<h1>$1</h1>!
      Replace !^== (.*) ==$!<h2>$1</h2>!
      Replace !^=== (.*) ===$!<h3>$1</h3>!
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

Rafael Alvarez suggests that PHPWiki indicates such headers using a !Header One, !!Header Two syntax. To add this style of header to your friki installation:

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file wiki.transform
  3. add the following lines (just after Include wiki-extra.txt is a good place)
      Replace #^!(.*)$#<h1>$1</h1>#
      Replace #^!!(.*)$#<h2>$1</h2>#
      Replace #^!!!(.*)$#<h3>$1</h3>#
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

And away you go! If you do add markup extensions like this to your Friki installation, please remember to update your PageFormatting page so that your users can find out how to do it.

Note from the above that specification of regular-expression transformations in Friki is easy and adaptable. The first character of the pattern is used as a separator, so all you need to do is choose one that's not in the expression itself, and you don't need to worry about "escaping" it.


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforgs.

Ulf Dittmer pointed out to me in an email that the old Friki 2.0 allowed more than one consecutive capital letter at the start of each WikiWord. Friki 2.1 sticks closer to the standard and only allows one. If you have a lot of old pages like this, or you just prefer this approach, here's Ulf's Friki tip on how to change the way WikiWords are recognized.

As usual, all this can be done without stopping or restarting the server or even the application.

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file wiki.transform
  3. Change the line
      FilterReplace wiki.LocalWikiLink /(^|\p{Punct}|\p{Space})((\p{Lu}\p{Ll}+){2,})(\z|\n|\p{Punct}|\p{Space})/&1&~2&4/
    to
      FilterReplace wiki.LocalWikiLink /(^|\p{Punct}|\p{Space})((\p{Lu}+\p{Ll}+){2,})(\z|\n|\p{Punct}|\p{Space})/&1&~2&4/
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

And there you go. Now your CamelCase words can have "humps" as fat as you like :)


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforgs.

I've noticed that I've posted a bunch of entries about my Friki software recently. On the off chance that anyone is specifically interested in tracking the progress of this project, I've added a new "category" (and associated RSS, RDF and Atom feeds) just for Friki news. Entries about Friki will still appear in with general Software Development comments, and in my "everything" category, so if you are already subscribed to one of those, you can rest happy.

The new Friki 2.1 is very flexible and extendable. To demonstrate this, here's a tip about how to add simple linking to Sun's "javadoc" API documentation from your Friki pages. best of all, you can add this feature to a running Friki, without recompiling, without stopping the server, and without even restarting the Friki web application!

Note that this tip will only work properly with Friki 2.1.1 final or later. If you are still running Friki 2.0 or a beta or rc release of Friki 2.1.1, please consider upgrading.

Pete Freitag recently announced that he has built a site to provide simpler URLs for Sun's on-line Javadoc. A quick look at the URLs he provides shows that they a natural match for Friki's "interwiki" support.

To add Javadoc support to your Friki 2.1 installation, simply do the following:

  1. Go to your Friki data directory (the one you entered when you first started Friki)
  2. Edit the file intermap.txt
  3. add a line
      JavaDoc http://javadocs.org/
  4. reload your Friki configurations by using
      http://<your-server>/friki/button?button=RESET

Now you can add a Javadoc link in any of your Friki pages simply by putting (for example) JavaDoc:String or JavaDoc:javax.servlet.http.HttpServlet. Note that if there are two API classes with the same name, you will need to use the full package to get the right one, for example JavaDoc:java.awt.List.

Have fun!


Friki is a Java Wiki. It is simple to deploy (just drop in to any modern servlet container), small and very easy to customise after deployment. Supports the classic wiki markup and a few common extensions. Friki is available for download from sourceforgs.

At Last! I think Friki 2.1.1 is now stable enough for a release, so I've made it available at SourceForge. Note that this release only contains a "OneDotThree" version. I'm not confident about the reliability of the OneDotFour regex code, so I strongly suggest everyone use OneDotThree for this release. It will still work in JDK1.4 envronments, it's just a little larger than a pure OneDotFour version.

Many thanks to everyone who has helped with these major changes, and to everyone who has (patiently or not) stuck with Friki while waiting for the long-promised improvements. Everyone is still welcome to make comments and suggestions, of course, but they will now be targetted at 2.1.2 or later.

Release Note

This release note describes the "stable" release of Friki 2.1.1, It includes details of changes since the previous stable release (2.0.6), as well as the changes between the various "development" releases (2.0.7, 2.1.1 beta 1, 2.1.1 beta 2, and 2.1.1 rc1).

Overview of ths Release

Development on Friki 2.1.1 was started to solve three main problems which had been irritating users of the previous stable release.

The problem which generated the most comments was the inability to include more than one "pre-formatted block" in a Friki page. This, together with a few other accumulated niggles led to a complete redesign of the way pages are transformed from "wiki markup" into HTML for viewing in a browser. In the old Friki 2.0, all the details of the transformation were embedded in Java code. Although this code used regular expressions to recognize and replace patterns in the page, there was no way to alter these regular expressions without editing, recompiling, and rebuilding the complete application. Friki 2.1 has scrapped all the old transsformation code in favour of a more generic approach, which loads the complete transformation specification from a configuration file, allowing a Friki administrator to tinker and add extra transformations even without stopping a running Friki.

The second major problem was that rebuilding Friki 2.0 from source code was not an easy task. Friki has always been "open source", but this is only of academic use if you can't change things and regenerate a new Friki incorporating your changes. Even had users been tempted to enhance or fix problems in Friki 2.0, rebuilding it was worryingly difficult. Embedded in the build process were assumptions about where code was located, and the presence of other, unrelated, software. Friki 2.0 had also been stable for long enough that it had become "out of synch" with developments in some of the external library code it used, which meant that finding the correct versions of such code, and debugging problems when using it, became an almost insoluble problem. Friki 2.1 has solved this by "catching up" with the external library code, rewriting the build system, and making sure that all needed resources are provided in the source release. It makes the source release a little bigger, but it does mean that you can build your own Friki from scratch with just a Java SDK and Ant.

The final major problem was the lack of support for accented and other non-ASCII characters. Java as a whole supports the full range of unicode characters but, at several places in the code and the transformation regular expressions. Friki 2.0 made assumptions which prevented effective use of other characters. Friki 2.1 has addressed these issues and now correctly preserves non-ASCII characters in stored pages, and supports their use in WikiNames, where appropriate.

Along with these major issues, there are a whole bunch of smaller fixes and improvements including a first stab at a display of what has changed on a page, and a much simpler and more flexible way of reconfiguring almost every aspect of the software without stopping the server or the application.

Detailed Change List

Changes in 2.1.1 final

  • allow broader regex in remote wiki links
  • encode search URL in edit template
  • read intermap file from data directory

Changes in 2.1.1 beta 3 (a.k.a 2.1.1 rc1)

  • use a more-specific regex for mailto links [Frank Carver]
  • bullets followed by hands-off block loses the block [Marion Sturtevant]
  • RecentChanges doesn't show page links [Frank Carver]
  • logfile formatting to still work if a bunch of log lines are copied to a new page (what about diff link?)
  • ordered search results
  • patch for searching on MacOSX [Ulf Dittmer]
  • rationalise which jar files are in the source release [Marion Sturtevant]
  • better handling of non-Ascii characters in WikiWords & filenames [Ulf Dittmer]

Changes in 2.1.1 beta 2

  • stop read/write logging backing up the read requests page [Marion Sturtevant]
  • remove diff links from read requests page [Marion Sturtevant]
  • make logging of default pages/templates etc. a bit more useful [Marion Sturtevant]
  • rename (and check) installing of default pages from resource (dflpages vs dflPages) [Marion Sturtevant]
  • buildall.bat seems to build a OneDotThree with OneDotFour code in it [Marion Sturtevant]
  • escape $ in 1.4 regex wrapper (org.stringtree.regex.Pattern.replaceAll(Pattern.java:28)) [Marion Sturtevant]
  • stop the templating screwing up paypal buttons etc. [Frank Carver]
  • why does old/EmptyPage not get copied over properly? [Frank Carver]
  • fix searching error from sourceforge (rogue files in repository again?) [Tillmann Wegst] [Dave Watkins]
  • check the old --WikiName bug [Frank Carver]
  • run time command to re-load changed templates, transform etc. [Frank Carver]
      ( use http://.../friki?button?button=RESET )
  • exception on bullet item with no text ( http://tomcat.efsol.com/friki/view?BulletPointBug ) [Dave Watkins]
  • default to not logging page reads, this causes too much trouble on busy installations [Lasse Koskela]
  • validity-checking (or documentation update) for directories in stored properties if repository is copied [Dave Watkins]

Changes in 2.1.1 beta 1

  • new render engine with external spec
  • split regex wrappers into separate project jars ?
  • app name for tomcat console
  • test and fix the greedy block bug
  • allow "file:" URLS (and others, eg https: etc.)
  • internationalization of stored pages and page editing [Ilja Preuss] [Ulf Dittmer]
  • eliminate the needless "backup" of initially created pages
  • add a "diff" facility [Ilja Preuss]
  • fix "blank lines in preformatted table cells" problem [Dirk Schreckmann]
  • allow unicode upper and lower case letters in page names [Ulf Dittmer]
  • "config" mode when first installed
  • allow templates to be fetched from outside the web app
  • allow wiki.transform to be fetched from outside the web app
  • allow button spec to be fetched from outside the web app
  • update docs for new configuration options

Changes in 2.0.7

  • remove the option of "simple" markup
  • Bring up to date with current Stringtree utilities
  • simpler build process [Dirk Schreckmann] [Steve Hutton]

I've been having fun recently adding a slew of requests to Pebble's bug/feature list. I don't suppose they'll get tacked anytime soon, as Simon is a bit busy right now with other things.Then I found this blog where the author suggests a top 20 "power user" features for blogs. It's an interesting list. I'm not sure I agree with all of the entries, though.

For example, he suggests as point 20: "Rather than attaching a PPT file, or a video or sound clip, which the user must then open in a separate window, it would be very useful, especially on business blogs, to be able to have the files open and run right in the blog window.". This seems plain nutty to me. If you consider the web as one big usability experiment, it's pretty clear that people in general do not appreciate moving images or audio that start without being asked to. This is doubly true for a typical blog layout. Why would it ever make sense to have a video playing in the third post down while I'm reading the top one? And what if all three posts had videos all playing at once. Nonsense.

On the other hand, his point 15, "integrated collaboration" looks like a definate way forward. Fundamentally "blog", "wiki" and "bulletin board" are all shades of the same colour, and belong together in an integrated and flexible system.

Friki 2.1 includes some sweeping internal changes, including how it finds stored pages and page templates, and what it does with them. On the Friki-interest mailing list, someone asked about how best to migrate an old installation to the new software. This can be a bit tricky, especially if you have put effort into customizing the page templates.

With that in mind, here is a rough series of steps for migrating an old Friki installation:

  1. download or build the new Friki war file.
  2. temporarily rename it to something else (e.g. Friki211.war)
  3. deploy the new war to your container
  4. request a page from your new web app (e.g. http://server/friki211/ )
  5. tell it the path to a fresh but writable directory. Friki will then configure and install all the new default values to this directory
  6. stop the new web application, so you can tweak with the settings

  7. copy all your old page files (and the "old" directory) from the previous installation to the newly created "pages" directory.
  8. edit RecentChanges and ReadRequests using a text editor. Remove the lines starting with "content.prefix=" and "content.suffix="
  9. copy all your old template files into the newly created "templates" directory
  10. edit search.tpl and remove the <pre> and </pre> round @CONTENT@
  11. edit edit.tpl and view.tpl and change "search?@page.name@" to "search?@escaped.name@"
  12. if you want a "diff" link, add something like <a href='diff?@escaped.name@'>What's Changed?</a>

  13. restart the new web application, and check that it works OK. Note that changes and logs generated by the old version will not look sensible. I suggest archiving them and then deleting them from the new installation.
  14. When you are happy that it works, rename the war file back to "friki" and deploy it in your original context.
  15. request a page from your new web app (e.g. http://server/friki/ )
  16. tell it the path to a the data directory you have just configured

That's all off the top of my head, so I have probably missed something. If anyone wants to follow these steps for me to see if they make sense, I'd love to hear the results so I can write it up for other users.

Friki, the flexible Java wiki, now has a new "release candidate" at Sourceforge.

Following the two "beta" releases of Friki 2.1.1, here is a third one. I think this one is solid enough to be counted as a "release candidate". It has been tested on Windows, Linux and MacOSX, with all the major browsers on each platform, and using a selection of different character sets. Thanks to the great work from a crack team of beta testers we seem to have nailed all the remaining oddities. If there are no "show stoppers" in the next seven days, I will release this as 2.1.1 final. After that, any further changes and fixes will be part of Friki 2.1.2.

Note that this release does not include an optimised "OndeDotFour" binary release. I still haven't got to the bottom of some annoying exceptions which only occur when using the java.util.regex regular expression APIs, so I recommend that all users install the OneDotThree release (which uses the more robust "jregex" regular expression code). If you wish to experiment, you can still build your own OndDotFour release if you download the source archive.

Note also that some minor changes have been made to the way page files are named on disk, to the default page templates, and to the default settings in "friki.prp". So if you have installed any of the previous alpha or beta releases of Friki 2.1.1, I suggest you either move/delete the contents of your Friki data directory, or give this new release a fresh, empty one. You should be able to copy back in any pages which use only basic ASCII characters in their names, but I'd advise creating a new page for any which use non-ASCII letters in their names, and pasting-in or recreating the content. Sorry.

Changes since 2.1.1 beta 2

  • use a more-specific regex for mailto links [Frank Carver]
  • bullets followed by hands-off block loses the block [Marion Sturtevant]
  • RecentChanges doesn't show page links [Frank Carver]
  • logfile formatting to still work if lines are copied to a new page [Frank Carver]
  • ordered search results [Ilja Preuss]
  • patch for searching on MacOSX [Ulf Dittmer]
  • rationalise which jar files are in the source release [Marion Sturtevant]
  • better handling of non-Ascii characters in WikiWords [Ulf Dittmer] [Ilja Preuss]

As some of you may know, I'm currently studying for a Postgraduate Certificate of Education at Suffolk College. Sporadic information about my progress can be found here. It's a two year course, and during the two years we have to complete six modules, each module is assessed by submission of an assignment of at least 4500 words, in a rigourous, referenced, academic style.

This may not sound like much to some of you hardened students, but fitting in all this around a family, a teaching job, contract software development (to earn some "real money"), and community software projects (to keep my skills and resumé sharp) really squeezes my time.

Yesterday, I finally handed in the second module. I'm now feeling that strange, light-headed, "after the exams" feeling. On the one hand I've now got some time to do stuff. On the other hand I have a huge stack of things to do queued up (and some of it overdue).

So, of course, I "waste my time" writing blog posts instead of tackling theimportant jobs first. Sigh.

One of the many potential feature requests in the queue for Friki is the ability to export the content as a single archive. I'm sure most of us have encoutered problems when a hosting operation "goes dark" or simply gets too flakey or expensive to continue using. These thoughts were in the back of my mind when I read Lasse's plea (also here if/when that blog goes away) for information about getting his posts out of JRoller. I also noticed that Simon Brown wrote that he had recently added such a feature to Pebble.

This is also one of my main worries about the continuing effort to create a new Java forum solution for Java Ranch. JavaRanch has tens of thousands of registered users and hundreds of thousands of messages tangled in its old UBB directories. Migrating to a new solution is not just a matter of writing a little web application. The commmunity is the users and messages, and without an effective migration strategy it could all be a big dissapointment.

All of this is interesting, but without some sort of interoperability standards, actually moving any significant quantity of such content between systems would be a nightmare. Entry naming, grouping and sequencing of entities, format and markup, in-content local references between entries, entry metadata, user metadata, change histories ... There are a huge amount of things that would need a non-trivial "porting" effort.

Several blog, wiki and forum systems currently offer a "better than nothing" export feature. Currently Pebble and Friki both store their data in regular, plain-text files (or at least XML), and "zipping" then into an archive is relatively easy. But what about the ones that use databases? or that use a binary markup, or that format entries as they are created and store complete HTML pages ...

I write something on the internet pretty much every day. Blog entries, posts at JavaRanch and other forums, edits to Wiki pages, changes to my own web sites, etc. etc. I worry more and more about losing all the effort I've put into on-line content creation over the years, and would love to be able to "back it up" somehow.

So. If anyone knows of any standards (or work being done toward such standards) for any sort of application-neutral external representation of such page/message storage systems, I would love to hear about it/them. If not, I may just have to start such a process myself...