20131113: Release 2.3

  * LectureChooser: fix preferred size to the MainFrame one (fix #118)
  * AboutDialog: display the license and ChangeLog too
  * TurtleWorld: better error message when the amount of lines differs
  * TurtleWorld: new builtins to hide()/show() the turtle.
  * PancakeWorld: The larger pancake is getStackSize()-1
  * PancakeWorld: avoid ../ in the icon path: doesn't work in jarfiles
  * recursion.DragonCurve1: slight mission text improvement
  * recursion.SquareKoch: new exercise (variation over the Koch idea)
  * recursion.PentaKoch: new exercise (another variation of Koch curve)
  * recursion.HexaKoch: new exercise (yet another Koch curve)
  * recursion.Crab: new exercise (another L-system: the Lévy C curve)
  * sort.dutchflag: mention about the existing colors in the doc
  * sort.dutchflag: allow to play with the mouse through drag and drop
  * recursion.hanoi: builtin getRadius(slot): radius of top-most disk
  * recursion.hanoi: allow to play with the mouse through drag and drop
  * MainFrame: Implement a "Save a picture" feature, useful in turtleart
  * welcome.MethodsArgs.py: compare directions without relying on
    their name to avoid l10n issues (fix #122)
  * As usual, fix some typos in the French translation

20130930: Release 2.2.7

  * recursion.spiralUse: rewrite to leverage the creative mode,
    so that students don't spend too much time seeking for the reward.
  * recursion.tree: make the color changing robust to negative steps
  * recursion.tree: forbid teleporting 
    This was used by some students to make the method idempotent.
  * recursion.sierpinski: rewrite to simplify the code to be written
  * recursion.hanoi: Simplify by explicitely passing the index of the
    unused peg to the recursive function.
  * TurtleWorld: synchronize to avoid a concurent modification when a
    shape is added while we are computing the toString() of the world
  * sort.dutchflag: New universe/exercise on the Dutch Flag Sorting
  * sort.pancake: Correctly reset the move count on need
  * sort.insertion: fix path to img after recent package reorg
  * recursion.koch: give one color per side to ease the understanding
  * sort.CocktailSort2: don't use ++ but += 1 in pseudocode

20130924: Release 2.2.6

  * SortingView: display the value on the left of temporal view, not
    the index
  * TurtleArt: force a newline every 5 exercises as it does not work
    well with Java7 otherwise.
  * TurtleArt.Flower: new exercise (provided by a student :)
  * GnomeSort: fix a bug in the correction, where we stay at i=0 when
    there is no previous pot instead of moving forward.
  * TurtleWorld.equals&diffTo: synchronized on shapes to avoid issues
    when the stop is pressed, for example
  * TurtleWorld: order the points in each segment so that the line
    (ab, cd) is detected as equal to (cd, ab)
  * TurtleWorld.diffTo: i18n and improve error messages
  * recursion.Circle: kill exercise. It is superseeded by turtleart.
  * recursion.Star: kill exercise. It is superseeded by turtleart.
  * recursion.tree: rework to make it easier to understand
    - each level is given its own color
    - we provide a subtree() that is correct (but the colors) to ease
      the debugging of user's code
  * As usual, fix a bunch of typos in the French translation

20130916: Release 2.2.5: SortingWorld needs *more* polishing.

  * Align equals() and diffTo() of sortedWorld to avoid false negatives
  * Internationalize and translate the error messages of SortedWorld
  * sort.Bubble3: there is no 'break' in scala
  * Color the statusbar in red when a world is running so that people
    notice that there is more than one world.
  * SortingWorld: give large worlds a reduced delay so that people
    don't wait for the perf world too much even if they don't click

20130916: Release 2.2.4: SortingWorld also needs polishing.

  * Disable the "help me" button if the appengine is disabled
  * Document the existing colors in Buggle&Turtle worlds
  * Update "About world" dialog's title changed on Human lang switches
  * Change buggle.setColor to setBodyColor so that people used to logo
    don't use it  to change the brush color.
  * Compare turtle worlds with an upsilon to avoid false negatives.
  * Fix an error in the pseudocode of CombSort
  * Fix a bunch of typos in the French translations.
  * sorting world: represent values as letters so that they don't get
    mixed with indexes. 

20130912: Release 2.2.3: Let's start adding new bu^Wfeatures again.

  * Let every interactive control issue the source code doing the same
    thing when they are clicked, so that the students can copy/paste.
    Thanks to Laurent Guittet for suggesting this change, I love it.
  * Buggle: Translate the direction names, too
  * TurtleWorld: add a new clear() primitive that clears the sheet
  * New feature: import/export session to the cloud.
    You don't have to struggle with a bunch of zip files anymore.
  * Rewamp the ExerciseFailedDialog to be more user friendly. Its
    title is less demotival, it hints about how to fix the issue, and
    the textual diff (that can be big and ugly) is hidden by default.
  
  * BuggleWorld: dropping a baggle was possible even if you had none
  * welcome.BlueTicket: Fix typo in French
  * BatEntity: more informative error message when an exception is raised
  * FeedbackDialog: should not be modal to enable copy/paste
  * maze.island: move the initial positions to make cheating harder
  * maze.shortestpath: also translate the helper methods in scala and
    python
  * maze.shortestpath: put the distance on every cell, not just until
    we found the buggle. Otherwise, the student must do exactly the
    same traversal, which is not part of the spec, making it harder.
  * Search windows directories first as the user.home property cannot
    be trusted here at Telecom Nancy.
  * welcome.basic.meth: reword the mission to make clear that the
    code will get called automatically.
  * Don't remove runner threads too early from their set so that
    "Stop" still find them to stop them (fix #108)
  * welcome.array.has271: improve the mission text
  * welcome.traversal.*: fix the java and scala templating
  * welcome.variable: speak about != that is handy here
  
20130910: Release 2.2.2: the 2 cts release.

  * welcome.LoopCourse: specify that the colors get updated automatically
  * welcome.NearHundred: fix french translation (was plainly wrong)
  * welcome.SlugHunting: align templating and mission: isFacingTrail must be copied
  * welcome.Variables: scala mandates an initial value (fix #109)
    plus various small improvements
  * Unify all Dave messages (marking functions that are forbidden in a
    given exercise -- like setPos in maze exercises), to ensure that
    they are properly translated despite the fact that gettext don't
    dig into scala and python files for string to translate.
  * Specify a working font for plain text to help the poor Mac users
  * welcome.RunHalf: fix the scala templating
  * welcome.FlowerPot: fix the french translation (growFlowers with a s)
  * FeedbackDialog: reset the text on each invocation
  * welcome.MethodsArgs: Fix a faulty copy/paste in scala prototypes
  * welcome.LoopFor: Fix the scala syntax of for loops
  * welcome.RunHalf: the description and the given condition did not match

20130908: Release 2.2.1: C'mon, dudes. Break that one if you dare.

  * Allow a creative mode, perfectly adapted to open LOGO exercises.
    The world is never reset nor compared to the "expected" output.
    
  * Fix the dist build to not take all files copied by eclipse (fix #101)
  * welcome.PictureMono*: fix the templating of run() (fix #102)
  * welcome.Instructions: Fix a translation error (fix #103)
  * welcome.slugTracking: Mention also in scala and python how to test
    whether the ground color is green (fix #104)
  * Bat templating didn't even compile in Java and Scala, oops (fix #105)
  * turmite.hello: fix mission text: left=2; right=8
  * welcome.Poucet: specify how intersection cells must be counted
  * welcome.LoopStairs: say that there is no need to manually fiddle
    with the colors. 

20130830: Release 2.2. The funny times are over

  * Rebrand JLM into PLM (Programmer's Learning Machine)
  * Turtles: Allow for hints on segment sizes
  * Turtle.circle(): New primitive to draw circles directly.
  * New lesson turtleart on the classical Logo geometric figures
  * Upgrade our twitter4j dependency to use the new twitter API 1.1
    Twitter dropped support for the 1.0 API a while ago.
  * Drop the identi.ca spy. It does not work since the upstream move
    from status.net to pump.io, and I fail fixing it.
  * Drop our prototypal jabber chat dialog. It was not activated
    because it's not adapted: student only use it to try to cheat and
    get easy answers. A forum would be better. Students are
    authenticated, and the messages moderated (France IOI does that)
  * Build a plm-light jarfile, without scala and python dependencies.
    These langs remain usable if the deps are independently installed.
  * Specify a sain font as default to help Mac users (fix #100)

20130820:
  * RELEASE 2.1, the 100th day.
  * Introduce Scala as a new programing language (version 2.10+ required)
  * Port all exercises to scala.
  * Change turnLeft()/turnRight() to left()/right() in buggles & turtles
  * Translate all builtins of buggles, turtles and sorts to French:
    It is now possible to write avance() instead of forward()
  * Review all translations for uniformity and to iron out some typos
  * Test the compilation process in our JUnit tests, for Java and Scala.
  * Mark many more strings for translation in the engine.
  * Allow [!java]...[/!] constructs in mission texts to adapt to progLang
  * In debug mode, all adaptations of all progLangs are displayed, with
    a color code for each. This was mandatory with a third main progLang
  * Partially document the black magic fueling ExerciseTemplatingEntity 
    Erk, this class is based on ... inventive hacks ;)
  * Property jlm.display.fontsize sets the size of the mission texts
    (default: 10px; must be valid in a CSS)
  * MissionEditorApp: little application to edit the mission texts with
    realtime rendering after applying our pseudo-markdown directives
  * lessons/welcome/methods/picture/PictureMono*: new exercises on drawing, 
    but without the color so that it can come early in the learning
    process, when we don't have methods parameters yet
  * lessons/welcome/methods/flowerpot/*: two new exercises training on
    methods (and decomposition)
  * New lib/jsyntaxpane.jar, from debian package fixing some upstream bugs
    - Contextual menu now works, as well as Ctrl-Z/Ctrl-Y, etc
20130804:
  * RELEASE 2.0, the revolutionary night.
  * Remove the array world. It was not helping very much when compared
    to the bat world.
  * Use '' to get ' in translated strings to please MessageFormat.
  * Pythonize the documentation of all universes
  * add a button to lessonChooser to load lessons from disk
  * Disable the step-by-step mode when stopping or swichting
    the lesson or the exercise (fix #1)
  * Editor: kill buggles that are in outer space after world resizing.
  * Disable JavaScript, it's really not ready for the big night.
  * Update our version of jsyntaxpane to get a fully working jar file.
20130730:
  * Pythonize new exercises
  * Retranslate everything back to 100% in French
  * Various cosmetics, small refactoring and little bug fixes
  * Lesson navigator: Display which exercise are passed in which language
  * Entity.isSelected() returns whether /this/ is selected in the UI
  * Change Buggle.pickUpBaggle() to pickupBaggle() for consistency
  * ExerciseTemplated: Trim leading spaces of non-python templates
  * Fix BuggleView for non-square worlds (Fix: #83)
  * Implement a graphical lesson chooser (Fix: #19)
  * Rewrite and integrate all of the baseball exercises
  * Give the baseball universe an historical view, as for sorting one
  * PancakeView: Reimplement from scratch; can now be played with mouse
  * Split hanoi towers and the turmites out in their own lessons
  * Remove the meta lesson. It was not done, seemed difficult to
    finish, and complicated the code of the universes. (Fix: #2)
20130720:
  * Integrate the pancake exercises into the sorting lesson
  * New pancake exercise about implementing Gates' algorithm
  * 1 more exercise about the while loop: Moria
  * 2 more exercises about variables: Big Buggles's Race (1&2)
  * 3 more exercises about the for loop: Stairs, Course and CourseForest
  * 1 more exercise about the do/while loop: Poucet
  * Better integrate the slug hunting exercises; add new one (on parameters)
20130710: 
  * Fix the temporal view of the sorting world (plus various cleanups)
  * Allow to provide feedback easily. One click to open the dialog
    window, type your text, validate, and it's automatically saved
    with an http POST request.
  * Properly select the current exercise in the lesson navigator
  * Save the currently used programming language in the property file
  * Current exercise gets saved in zip files and reselected when loading
  * Speeds initialization by directly building everything in the right
    locale instead of building it with no locale, and then updating it
  * Progress spys (twitter/identica) get controled through properties
  * Default values of properties get saved to local file to ease their
    discover and tuning by users
20130705:
  * RELEASE 1.99
  * Pythonize all lessons: maze, recursion, sort and bat/string
  * Fix: demo mode in python was without delay
  * print() in python was not playing well with graphical console
  * Update French translation of missions: back to 100%
20130621:
  * Improve the BuggleWorld I/O and the BuggleWorldEditor:
    - better detection and error messages of invalid map files
    - every world's characteristic can be edited in the editor
    - buggles are read from/saved into world files
  * Update all existing worlds on disk to this format
  * Speedup the lesson loading with a cache of answer worlds:
    - If a relevant .map file exists, don't execute the answer entity
    - If not, save the .map file after execution for the next time
20130616:
  * RELEASE 1.98
  * Squeeze a bit our sources so that we can package it for Debian
  * Add a logo to the distribution (img/logo.png)
  * List the exact license of every image used in COPYING, and replace
    the ones for which we lost the license on the way. JLM is now
    perfectly clean wrt the licensing legal consideration.
  * BatEntities now work within the unit tests too (fix #67)
  * Integrate the bat exercise using integer arrays into the welcome
    lesson (fix #21)
  * Welcome lesson ported to python, both code and missions (fix: #89)
20130531:
  * Try harder to find a path where we can save our data
20130530:
  * Make sure that jarfiles compiled with Java 6 also work with Java 7
20130529a:
  * Really kill jung in the source code too so that distributed jar
    files actually work -- sorry.
20130529:
  * Reintroduce the student progression listeners. It was turned off
    for the debugging process, but that shouldnt be part of a released
    version.
20130528:
  * New lesson navigator based on JTree (fix #71)
  * Some better looking icons, with known licenses
  * Basic testing infrastructure (fix #8)
    It ensures that python entities manage to solve the Java worlds. 
    This could be extended in many way, including:
     - The java entity is not compiled, so there is no compilation test
     - Bat exercises are too specific to be tested this way.
    But at least, we have a testing infrastructure!
  * Exception raised in python code (including syntax error) are now
    correcly handled (fix #66 and #78)
  * Basic i18n infrastructure allowing to translate the user interface (fix #76)
  * Kill the ability to have more than one view per world (fix #35)
  * Save the session before switching exo/lesson to not loose student's edits (fix #45)
20130517:
  * Package baseball exercises in their own directories
  * Add a control panel for the Pancake Worlds ( raw & burned )
20130516:
  * Add an icon depicting the programming language in the status bar
  * Various polishing of the exercises in Python
  * Fix issue #64: Buggle interactive controls are now properly
    initialized
  * Package maze, welcome, lightbot, sort and bat.string1 and recursion exercises in their own directories
  * Refresh the french translation
  * Add a control panel for the Sorting World
  * Start porting bat exercises to python
  * Port hanoiWorld to python
20130515:
  * Huge python cleanup:
    - various cleanups, code factorization and bug fixes
    - Create or improve the bindings of Turtle, Sorting and Buggle
      worlds
    - Port many exercises to python, testing that the bindings are
      sufficients, and [partially] rewriting the mission text to that
      extend. The templates are not sufficient yet for absolutely all
      exercises, but many of them are. 
    - Fix line number computation in error messages coming from python
    - If python is the default language, use the python entity to
      compute the answer. Note that it still fails for some exercises.
    - Add back the jruby jar file, as jython needs it to access POSIX
  * Merge both views of sorting worlds, toward code simplification
  * Rewrite most sorting exercises mission texts after recent splitup
    of our mega exercise into several ones with one entity only each
  * Refresh the french translation
  * Simplify Random Mouse exercise, fix the demo of Pledge algorithm
  * Add a combobox to switch to next exercise in "success" dialog
  * Add an interactive way to change the buggle color and brush color
  * Baseball exercise of SMN can now be played with more than 2
    players per base
20130416:
  * Kill several seamingly good ideas that complicated the code base:
    - aliased source files: student must keep them synchronized
      manually now. We may want to reintroduce this at some point?
    - Java code that cannot be compiled. This would have been useful
      only for user-provided text files, but we don't use it now.
    - uneditable source files. The student will see all files passed
      to the compiler, now. This was never used in production
    - inconditional static rewriting patterns to apply to the source
      code. People should change the code in their source directly :)
    - lessons cannot be sequential anymore. Forbidding pupils to
      attempt the exercise in the order they want is not in the JLM
      way of style anyway.
    - exercises cannot have more than one kind of exercise. This was
      introduced to have all sorting exercises at once, but this was
      split in several exercises because the SortingView was gone amok.
  * Simplify a bit the way external lesson files are loaded
  * Remove a bunch of unused dependencies on external jars.
    The distribution jar is now only half as big only (still 20M).
  * Request a confirmation from the user (through a dialog) before
    reverting the exercise, that was a mean trap...
20130328:
  * Merge all code (and wiki) from last year's students
  * Accept a pull request from J-Bastian, with a new lesson (SMN) and a
    bunch of bug fixes.
  * Various little bug fixes.
20120319:
  * Minor update on build process
20120318:
  * Allow jlm://<lesson>/<exo> links in mission texts
20120116:
  * Add an ant target to generate a source tgz (for Debian packaging)
20120110:
  * Do not even try to compile the Java sources if we were asked to
    used another language, such as Python.
    (Fixes #48: Python source code not used if some java code provided)
20111201:
  * Port some more welcome exercises to Python. 
    The translations should be updated to appear again.
  * Port all sorting exercises to Python
20111013:
  * Fix a bug in python that were due to an extra space added in front
    of the body. Damn python indentation freaks.
  * Add a debug mode to JLM, to see more infos on problem
  * Add a trap spitting a lot of info when issue #42 (line numbers are
    shifted) occures. I need more info to understand where it comes
    from.
  * Fix the array exercises (there were bugged and not properly
    integrated into po4a)
  * various improvements to the missions and their french translations
  * Remove the "clear session" menu entry. Too dangerous.
  * Graphical consistency between menu choosing the human language,
    and the one choosing the programming language
  * Show in about box where the session gets saved to avoid NFS hell
  * Various typos and little errors hunted down by Pierre-Etienne and JC
  * Improve shortest path exercise by not removing distance marks, so
    that students can compare their computation with the correct one
20111006e:
  * Allow to code in python, javascript or ruby
  * Definitely kill the linearity of lessons (combobox removed)
  * Load the lessons on need only (and save them separately from each
    other)
  * Cleanup the way identica and twitter get informed of student
    progress
  * Textual display of what's wrong when the world is not what's
    expected
  * implement the world equality for logo
  * Allow to have lectures, ie non-interactive exercises
  * Improved turmite track, with a specific view displaying the step
20110909:
  * New exercise track on turmites
  * Enforce that the buggles cannot move to outer space with
    setPos(), setX(), setY() nor peek outer space with getCell()
20110907:
  * Add a new lesson navigator allowing to break the lesson linearity
  * Use identi.ca in addition to twitter to push the success of students