Iceberg version 0.6

Hi all,

I released Iceberg version 0.6. It includes a lot of small tweaks and fixes, but the most important inclusion is tonel file format which aims to replace file tree.
Tonel is a file-per-class file format for monticello repositories. It’s purpose is to reduce the amount of files touched each operation, make the IO faster an compact the repositories database.
It has also as an objective to offer an “easy-to-read” format, so people wanting to understand a chunk of code will recognise it easily.
For testing, I migrated several of my projects to Tonel and I’ve been using it, you can see some as examples: (this was just an example and it has some minimal errors already fixed)
We plan to migrate Pharo development to tonel to address some problems we have:
– since it has to read/write a lot of files, IO operations are slow
– and even much more slow in Windows
– Windows also has a problem with longpaths.
Iceberg 0.6 will be integrated to Pharo7 soon 🙂
To update Pharo 6.1, there are instructions in the readme:
now, if you wan to migrate your projects to Tonel (from FileTree), here is a script you can use:
btw, tonel is independent of Iceberg and can be used with plain Monticello (but it is a metadaless format, history will reside on git, not on monticello).

PharoLauncher 1.0.1

Hi all,

I just released a new version of the PharoLauncher 1.0.1.
Here are major improvements since last version:

  • Pharo launcher is now distributed with a Pharo 60 image with a 32-bits threaded VM (to avoid hangs when using OSProcess).
  • Add a VM management utility able to find (and download) the appropriate VM for a given image. So, the launcher is NOT shipped anymore with an extra VM. It will fetch required VM when needed.
  • Pharo Launcher files (images, VMs) are now considered as user Documents (easier to find). Consequently, they are now stored in the standard documents folder, i.e.
    • $HOME/Documents/Pharo on OS X,
    • $HOME/My Documents/Pharo on windows,
    • $HOME/Pharo on Linux (some linux distributions provide a document folder but some others not, so we put it in the HOME directory in all cases).
    • In this folder, you will find your images and virtual machines needed to run images.
  • Use of ProcessWrapper to run images on Windows.
  • Adds download of sources file for Pharo images > 60.
  • Left panel is now used for official images and Jenkins jobs templates and right panel is used for local images.
  • New mooc entry with the image ready to start the Pharo Mooc.
  • New deprecated category to find old official Pharo images.
  • Use system unzip when possible (Pharo unzip does not manage file permissions nor symbolic links).
You can get platform bundles from


For those wanted more info on how the adequate VM is computed, here is the process:
  1. determine the image format version
  2. find (and optionnaly fetch) a compatible VM (a VM able to run this image format) and run the image to get its Pharo version number
  3. find (and optionnaly fetch) the appropriate VM for this specific Pharo image version. Sources files are also downloaded with the VM when applicable.
  4. run the image with the appropriate VM

[Fun] SVG snippet

Load XMLParser from catalog and load Athens-SVG from the Pharo/Athens repository
xmlDoc := XMLDOMParser parseUrl: ‘‘.
svg := AthensSVGConverter new importXMLDocument: xmlDoc.
svg transform: ‘scale(0.5)’.
surface := AthensCairoSurface extent: 500 @ 500.
surface drawDuring: [ :aCanvas | svg renderOn: aCanvas ].
surface asForm.

Screen Shot 2017-10-06 at 17.20.39


About getting lines

$ cat > /tmp/lines.txt

Here are different ways to get lines
(FileLocator temp / ‘lines.txt’) contents lines.

‘/tmp/lines.txt’ asFileReference contents lines.

‘/tmp/lines.txt’ asFileReference readStreamDo: [ :in |
Array streamContents: [ :out |
[ in atEnd ] whileFalse: [ out nextPut: in nextLine ] ] ].

(File named: ‘/tmp/lines.txt’) readStreamDo: [ :in |
| characterStream |
characterStream := ZnCharacterReadStream on: in.
Array streamContents: [ :out |
[ characterStream atEnd ] whileFalse: [ out nextPut: characterStream nextLine ] ] ].

They all return #(‘one’ ‘two’ ‘three’).

In the last, more complex example, you first get a binary stream (and a ‘line’ is a character based concept), so wrapping the binary stream in a character read stream (which does know about lines) solves the problem.



From the trenches: esteban’ log


This is my weekly ChangeLog, from 25 September 2017 to 1 October 2017.
You can see it in a better format by going here:


28 September 2017:

*    I spent my day preparing [iceberg 0.6]( to be released
and I think I didn’t do a bad you.

* I integrate two PR to dev-0.5 and then merge it to dev-0.6
* I closed issues [#470]( and [#239](
* I fixed a problem on cherry-pick and renamed/removed classes (not reported as issue, but there)
* I added a “full sync” option meant to verify the full repository differences (this is useful in certain cases)

… and I’m still trying to get a loadable version of latest metacello (which will come with tonel integration)

27 September 2017:

*    I’m still making latest [metacello]( version to work properly
on Pharo, so we can integrate it into Pharo 7.0 (and we can also update Iceberg).

Right now, I have what I think is a “working version”, but I’m still figuring out how to include it
into Pharo (other than regular merge in image, export… which I think will be our approach until
we have subtrees)

24 September 2017:

*    I forget to say that friday with Ronie we made win32 headless version work 🙂

Now, it just remains win64 version… and of course, we will need to start test intensively so we can
have good support for the moment of release.

Sqlite under Linux


I managed to get Sqlite work with Pharo under linux (Fedora), in both 32 and 64 bit. The setup has nothing to do with LD_LIBRARY_PATH. I’ll use those example under fedora linux.
First, of course, you need to install either UDBCSqlite or Garage-Sqlite drivers
You first need to have sqlite3 libs installed on your system
$ rpm -qa | grep sqlite
=> for 64 bits version
=> for 32 bits version
Then find the path of your library
$ rpm -ql sqlite-libs.i686
/usr/lib/ -> this is your path in 32 bits
$ rpm -ql sqlite-libs.x86_64
/usr/lib64/ -> this is your path in 64 bits

Under Linux, you have to give the library path inside Pharo Image, or link the library from pharo VM folder:

1. Update library path from pharo image

Using UDBDSQLite, update to return the path of the library on your system

UDBCSQLite3Library >> library

Smalltalk os isMacOS ifTrue: [ ^ #sqlite3 ].

^ ‘sqlite3’


UDBCSQLite3Library >> library

Smalltalk os isMacOS ifTrue: [ ^ #sqlite3 ].


If you are using Garage,Update:

GASqlite3FFI >> library

^ ‘/usr/lib/’

2. link the library from VM folder:

ln -s /usr/lib/ libsqlite3 or ln -s /usr/lib64/ sqlite3 if the module name is sqlite3 in your library method.

Then your test should pass green.
The reason it pass under windows is because the method library return by default sqlite3, which is the dll name you put under pharo VM directory to get it work.
On linux, unless you link your library in the VM folder, the image has no clue where to find sqlite3.
Hope this helps.

Pharo Mooc second session in starting blocks

The second session of the Pharo Mooc is in the starting block.

Register! It starts 16 of October.

New this year:
– English dubs
– Japanese subtitles


New OOP/OOD/TDD lecture starting…

Hi all

Monday we are starting a new lecture on OOP/OOD with Pharo in TDD mode at University of Prague.

I created a dedicated Mooc based on the Pharo Mooc.

We will use the following new book ”

Learning Object-Oriented Programming, Design with TDD in Pharo”


New Pharo booklet!

Scraping HTML with XPath

Available at

S. Ducasse and P. Kenny

More tutorials for Pharo: XPath

Some new tutorials are in preparation…. a first one is about Web scraping and XPath.

Beta version (please comment)

Stef D. and Peter. K