Planet Smalltalk

March 02, 2015

Benoit St-Jean - PhlappyBird

Pharo vous propose maintenant un clone du jeu Flappy Bird, PhlappyBird.

Classé dans:Pharo, Smalltalk Tagged: Pharo, Smalltalk

Benoit St-Jean - Smalltalk en vrac (12)


Camp Smalltalk Ottawa en juin 2015.


Teapot 0.9 est arrivé!

TrashCan : une corbeille pour récupérer vos méthode supprimées!

MultiDictionary : un nouveau type de collection, une structure de données de plus à votre arsenal!

StNER : on peut dorénavant interagir avec le Standford Named Entity Recognizer.


Une démo de Roassal sur VisualWorks.

Classé dans:Pharo, Seaside, Smalltalk, VisualWorks Tagged: Camp Smalltalk, MultiDictionary, Ottawa, Pharo, Roassal, Standford Named Entity Recognizer, StNER, Teapot, TrashCan, VisualWorks

Benoit St-Jean - WebFileBrowser

WebFileBrowser, un interface web (Seaside) pour gérer vos fichiers.

Classé dans:Pharo, Seaside, Smalltalk Tagged: fichiers, Pharo, Seaside, Smalltalk, web

March 01, 2015

Torsten Bergmann - TrashCan of removed methods

Torsten Bergmann - Teapot 0.9 for Pharo

A new version of Teapot was released: Teapot 0.9!/~zeroflag/Teapot

It still less than 700 Lines of code and a nice micro web framework for Pharo. You need to load "ConfigurationOfTeapot-AttilaMagyar.6", if you are on Pharo 4 you can directly load it from the configuration browser.

 As this framework is very easy to use (it bases on the concept of URL routes): you can serve dynamic or static HTML pages, JSON and other web related stuff easily from Pharo. It is nice especially if frameworks like Seaside are too heavy for your web application needs.

Torsten Bergmann - AST Link Annotation Infrastructure

Pharo 4.0 also includes some more AST Link Annotation Infrastructure. Read more.

Torsten Bergmann - Language Detection using Pharo

Language Detection API is a service to query the language of a given input text. You can use it from Pharo. Read more.

Pharo Weekly - A simple AST-transformer plugin architecture for Opal…

A simple AST-transformer plugin architecture for Opal…

-> subclass OCCompilerASTPlugin
-> implement #transform e.g.

| rule |
rule := RBParseTreeRewriter replaceLiteral: 42 with: ‘meaning of life’.
rule executeTree: ast.

The plugin can be activated *per class hierarchy* by overriding #compiler

“the example plugin is active for this class”
^super compiler addPlugin: ASTPluginMeaningOfLife.

or of course for a single compilation:

(Smalltalk compiler addPlugin: ASTPluginMeaningOfLife) evaluate: ’42’

For review here:


Smalltalk Jobs - Smalltalk Jobs – 3/1/15

  • Leinster, Ireland (possibly Dublin) – Software Developer Advisor at Dell
    • Required Skills:
      • Unix/Linux
      • Excellent knowledge in GEMSTONE and Oracle databases. (Please do not forward any CVs with no experience in GEMSTONE and Smalltalk)
      • Smalltalk
      • Excellent SQL and/or PL/SQL knowledge
      • Good MQ series and SFTP knowledge
      • Java, HTML & JavaScript Knowledge
      • Good understanding of ITIL practices
      • Fluency in English language
    • Wanted Skills:
      • Familiar with various application architecture, from client-server to multi-tier web application architecture
      • Working with large scale transaction and reporting applications
  • Buenos Aires, ArgentinaKapital Financial Developer – Associate (Job ID 150021865) at J.P. Morgan
    • Required Skills:
      • Application development using Object Orientated technology (Smalltalk, Java, C#, Python etc), preferably on large scale systems.
      • Previous experience of Financial Services, preferably in Investment Banking.
      • Good communication and organizational skills, build good client relationships and takes ownership of issues.
      • Self motivated to learn and ask questions to produce the best technology solutions
Good luck with your job hunting,
James T. Savidge

View James T. Savidge's profile on LinkedIn

This blog’s RSS Feed

Filed under: Employment Tagged: jobs, Smalltalk, Smalltalk jobs

Benoit St-Jean - C’est une langue belle…

LanguageDetection : un outil Pharo pour détecter la langue !

Classé dans:Pharo, Smalltalk Tagged: détection, langue, Pharo, Smalltalk

Pharo Weekly - Language Detection API available in Pharo


Language Detection API is a service to query the language of a given input text. You will need to register an API key in the web site to use the service.

This client enables to use the service from Pharo Smalltalk. The output is an object containing the language code, a confidence score and a ‘is reliable’ boolean value.

Installation and usage details in the following post:



February 28, 2015

Hernán Morales Durand - LanguageDetection API Client in Smalltalk


Language Detection API is a service to query the language of a given input text. You will need to register an API key in the web site to use the service. This client enables to use the service from Pharo Smalltalk. The output is an object containing the language code, a confidence score and a 'is reliable' boolean value.


Inside Pharo, open the Configuration Browser and select LanguageDetection, then Install. Or evaluate the following expression:

Gofer it
smalltalkhubUser: 'hernan' project: 'LanguageDetection';
configurationOf: 'LanguageDetectionAPI';


| ldClient |
ldClient := LDApiClient new.
query: 'Des perles de pluie venues de pays où il ne pleut pas';
query: 'Een enkele taal is nooit genoeg ';
query: 'buenos dias señor';

February 27, 2015

Torsten Bergmann - Twins in Pharo

Torsten Bergmann - FOSDEM

If you were not able to participate in FOSDEM here is something to look at:

Torsten Bergmann - Videos and Slides from PharoDays

If you were not able to participate in PharoDays here is something you should look at:

ESUG news - Camp Smalltalk Ottawa June 2015

"Join us at Camp Smalltalk Ottawa 2015

If you enjoy programming Smalltalk or you're interested in promoting Smalltalk, come join us in Ottawa from June 12th to 14th for Camp Smalltalk Ottawa. Present your latest projects in lightning talks and chat with other Smaltalk developers.

The theme of this Smalltalk is "Send a Message". We'll be doing things to tell the world about Smalltalk and why we use it. All talks will be recorded and posted on YouTube. We'll interview Smalltalk developers for the Smalltalk Reflections podcast. We'll be developing frameworks for Smalltalk contests. More information will be available soon as we finalize the details.

On Friday June 12, we'll meet at the Ottawa Public Library to mingle and chat. Saturday and Sunday will be at the Shopify headquarters on Elgin Street."

Pharo Weekly - CompiledMethod got a Twin


In 40516 there is now a strange, but rather powerful mechanism for CompiledMethod: the Twin.

What does that do?

you can call on a method #createTwin

(ReflectivityExamples>>#exampleMethod) createTwin.

after this, the CompiledMethod has a high-level representation (the AST) attached that itself references the CompiledMethod
(they form a twin).

(ReflectivityExamples>>#exampleMethod) reflectiveMethod

The fun thing is now that one can install either in the class. Call #invalidate to make sure the reflective method is installed.

ReflectiveMethod implements #run:with:in: which calls a compilation hook (too re-create from the AST) and then installs that in the
method dict and then executes the method:

(ReflectivityExamples>>#exampleMethod) createTwin.
(ReflectivityExamples>>#exampleMethod) invalidate.
self assert: (ReflectivityExamples>>#exampleMethod) class = ReflectiveMethod.
self assert: ReflectivityExamples new exampleMethod = 5.
self assert: (ReflectivityExamples>>#exampleMethod) class = CompiledMethod.

Which means that this gives us an in-image, on-demand JIT compiler AST->Bytecode. In 50 lines of code.

e.g. try on Morph:

Morph methods do: #createTwin.
Morph methods do: #invalidate.

Counting which twin is installed shows us the working set of Morph:

(Morph methods select: [ :each | each class = CompiledMethod ]) size

some 330 method out of nearly 900….

So what can one do with this? In essence this turns the AST into a reflective representation for Methods
(if you care to set up twin creation + invalidation correctly).

What will this allow us to do? stay tuned…


Pharo News - Slides and Videos Pharo Days 2015

<p>The slides and videos for Pharo Days 2015 are now online:</p> <ul><li> <a href="">Slides on SlideShare</a></li></ul> <ul><li> <a href="">Slides (PDF)</a></li></ul> <ul><li> <a href="">Videos</a></li></ul>

Pharo News - Slides and Videos Pharo Days 2015

<p>The slides and videos for Pharo Days 2015 are now online:</p> <ul><li> <a href="">Slides on SlideShare</a></li></ul> <ul><li> <a href="">Slides (PDF)</a></li></ul> <ul><li> <a href="">Videos</a></li></ul>

Torsten Bergmann - Roassal visualization on VisualWorks

The Roassal visualization engine not only works on Pharo but also VisualWorks:

February 26, 2015

Pharo Weekly - The essential: many improvements daily

14990 MonitorDelay>>#signalLock:afterMSecs:inMonitor:queue: should return MonitorDelay object

14984 Improve protocol names in ComposableModel and subclasses

14996 LinkedList>>#select:thenCollect: is slow

14995 script: Pragma is also acceptable for non-unary methods

14991 ExampleSlotWithDefaultValue: allow default to be set in definition

14992 ScriptLoader: code path of Integrator needs to delete scripts, too

14982 Improved support for unknown bytecode

– Scriptloader test

14868 Unbound Globals (XBytecodeGenerator)

14989 Improve and simplify BlockClosure benchmarking

14901 Matrix>>extent is missing

14359 ScriptLoader linesOfCode ==> 108740

14981 Fixes for SistaV1 bytecode set (part 2)

14987 ShoreLine Reporter version 0.1.2

14983 MorphicEventDispatcher>>#dispatchEvent:with: needs to nil morph instance

14862 /is/this/possible? asFileReference size

13004 Key Mapping should have a GUI interface to show all definitions

14965 #class:instanceVariableNames: not needed in OldClassBuilderAdapter

14980 Method missing to decode bytecode set

14979 Fixes for SistaV1 bytecode set

14964 deprecated #anonymousSubclassOf:

14975 Generate initialize methods should be in initialization protocol

14967 MCFileTreeRepository does not implement #versionInfoFromVersionNamed: correctly

14954 load new configuration 2.9 (more morphic support)

14955 load new TxText configuration 2.8.3 (more morphic support)

14960 Extend Duration with a human readable print option and some related accessors

14963 addInstVarNamed: should use addSlot:

14970 TheManifestBuilder>>removeManifestOf:(manifest is shadowed)

14914 #initializeSlots: should not skip hidden slots

14942 Delay refactoring (part 2b) – clean out newCodeEnabled wrappers

14631 DNU GLMThemeIcons >> overlayModificationIconContents

14941 isObsolete returns true for anonymous classes

14728 NBFFICalloutAPI option WinUnicode is not prefixed with opt, as all the other options

14961 instantiation is misspelled in PharoSyntaxTutorial

14947 Missing allChildrenMatching:

14971 MorphicTransform: Better Argument Names

14949 String>>asPackage

14957 Number>>#percent

14958 DateModel>>#initializeWidgets error

14934 Load new Athens configuration 2.8

This fixes the following issues

case 14723 Make StrikeFonts working in Athens (font size related)
case 14710 AthensCairoCanvas setAA not implemented
case 14799 AthensCairoCanvas draws in empty rectangles

14935 Load new configuratoin of TxText 2.8.2

with the following fixes
case 14778 TxAthensLayoutView should not impose a x offset minimal value
case 14774 TxHighlightRenderer shapes badly computed when scrolling horizontally
case 14719 TxTextLayout startPosition and TxTexLayoutView scrolling management
case 14715 TxTextEditorMorph modifies dragged morph position
case 14687 TxTextPosition moveDown: can only move one line down

14940 timeToRunWithoutGC broken

14946 Replace senders of String>>#subStrings: in Tool-Finder

14937 better comments and test for Matrix

14060 MNU: receiver of “stepToCallee” is nil

14943 really deprecated #leap

14897 Date isLeapYear equally defined in Dates superclass

14483 Extract the PragmaCollector into its own package

14064 Improvements to checking termination of processes

2649 dont let an empty Rectangle #intersects:

14938 missing addModelItemsToWindowMenu: in WindowModel

14939 example for SearchableList does not work (MNU)

4795 Horizontal wheel events

14905 Missing test and clean code for SmalltalkImage>>#extractMinusParameters

14852 TTLCache should allow for custom TTLAssociation that can compute their own expiration

14869 Repeated methods in Trait Composition

14904 Slot: hand the correct class to slot in #buildNewClass

14899 add addSlot in testClassRespectsPolymorphismWithTrait

14874 WorldState>>#interCyclePause: failed

14895 Class Variable Refactoring -> Add produce error when pressing escape on dialog

14892 Slots: when class is created, #installingIn: is not called

14893 Slots: allSlots should filter hidden slots

14888 Matrix>>rows:columns arguments are unclear

14894 SimpleSwitchMorph lost onColor: aColor

14891 Slots: add #addSlot and #hasSlots

Pharo Weekly - How Far We’ve Come!

Sean De Nigris (an early pharo adopter) wrote the following:

It was so much fun watching the Pharo Days videos! Thanks for recording them
and I hope to be there next time :)

(note videos are here

Somewhere halfway through the playlist, it hit me how easily I was
downloading all the projects and images being talked about. I was
copy/pasting one-line Metacello scripts out of github READMEs, clicking in
the Configuration Browser, or downloading the latest code from CI – and it
all “just worked”!!!

Remember not too long ago when we were passing around custom scripts to load
multiple dependent packages, and explaining to outsiders that “we don’t need
github because Smalltalk invented SCM” (or whatever) while we created the
future invisibly, hidden away from the rest of the world?

After laying down so many building blocks (like FileSystem) that take the
system out of the way of creative expression, it is exciting to finally be
tackling some of the high-impact things… you know the ones we’ve been
avoiding… like Morphic, development tools, and the text editors.

And the steady streams of new talent and funding seem likely to keep the
successes coming.

So CONGRATULATIONS, Pharo Community!!!! We deserve it.

Now get back to work – we’ve got a future to create ;)

Pharo Weekly - GADM package for Pharo

I am pleased to announce the release of the GADM package for Pharo. GADM is a high-resolution spatial database of the location of the world’s administrative areas for use in Geographical Information Systems (GIS) and similar software.

The following post contains details about the release:

If anyone wish to extend it with the polygon data included in GADM, please feel free to request repository permission to upload changes.



Pharo Weekly - Pharo interface to the Stanford Named Entity Recognizer


I am announcing the release of StNER. StNER provides a Pharo interface to the Stanford Named Entity Recognizer (NER). (

Installation and usage details are described in the following post:



PS: Only tested in Windows 8.1

February 25, 2015

Hernán Morales Durand - StNER: Interface to the Stanford Named Entity Recognizer


StNER provides a Pharo Smalltalk interface to the Stanford Named Entity Recognizer (NER). The Stanford NER recognizer is an implementation of a Named Entity Recognizer, used for tagging raw text which is a central task in Information Retrieval and Natural Language Processing. The input is a sequence of words in a text, and the NER classifier - using already trained data - try to recognize typically three types of "Named Entities" (NEs) : NAME, LOCATION and ORGANIZATION (more classes exists). The output is the tagged text in some common tagging format for tagging tokens. This recognizer works better on input more similar to the already trained labeled data sets (muc6, muc7, conll2003), however there are reports to use it with tweets, and you can retrain to recognize entities for your particular needs.

To recognize text in other languages, for example, Chinese, German, or Spanish, a different classifier (in this context a .tgz file) can be used (see NLP Stanford Demo).


  • Java is required to run the server locally.
  • Download the Stanford NER packages.
  • Inside Pharo, open the Configuration Browser and select StNER, then Install. Or evaluate

    Gofer it
    smalltalkhubUser: 'hernan' project: 'StNER';
    configurationOf: 'StNER';

Launch the server

  • Start (from Smalltalk) the (Java) server using the StNER Smalltalk server interface. For example, to start the server with default parameters in Windows:

    StSocketNERServer new
    stanfordNERPath: 'c:\stanford-ner-2015-01-30\';
  • Query an input text using the StNER Smalltalk client interface.

Server Settings

Providing path location is mandatory. If no host or port is supplied, defaults to:
  • localhost (,
  • port 8080
  • JVM memory 1000m.
  • output format: inlineXML

You can configure the server with the following taggers:
  • 3 class NER tagger that can label: PERSON, ORGANIZATION, and LOCATION entities. (#setEnglish3ClassTagger)
  • 4 class NER tagger trained on the CoNLL 2003 Shared Task training data that labels for PERSON, ORGANIZATION, LOCATION, and MISC. (#setEnglish4ClassTagger)
  • 7 class NER tagger trained only on data from MUC (#setEnglish7ClassTagger): TIME, LOCATION, ORGANIZATION, PERSON, MONEY, PERCENT, DATE.

Client Usage

To tag text you can use the #tagText: method as follows:

StSocketNERClient new
tagText: 'University of California is located in California, United States'
and the output will be:

'University of California
is located in California,
United States' "
Another example including PERSON tagging:

StSocketNERClient new
tagText: 'Argentina President Kirchner has been asked to testify in court on the death of Alberto Nisman the crusading prosecutor who had accused her of conspiring to cover up involvement of Iran'
which results in:

'Argentina President Kirchner has been asked to testify in court on the death of Alberto Nisman the crusading prosecutor who had accused her of conspiring to cover up involvement of Iran'
Parse text to in-line XML

StSocketNERClient new
parseText: 'University of California is located in California, United States'
results in a Dictionary of Bag's with occurrences of tagged classes.

Francois Stephany - Android Google Study Jams Brussels

audience at the Study Jam

The Google Developer Study Jams Android Fundamentals is a worldwide study group organised by Google and Udacity. The principle is quite simple: people follows an online course on Udacity to become Android developers. Events are locally organized weekly so participants can share their problems, ideas and solutions.

The official website describes it perfectly:

Study Jams are an opportunity for students to receive free, in-person guidance and tutoring on the Udacity course in a fun classroom environment. Study Jam sessions are designed around the Udacity course structure, with a weekly session following each lesson (6 lessons), plus two additional weeks for completing and sharing course final projects. Students are expected to come to the Study Jam sessions having completed that week’s Udacity lesson online, so that the Study Jam time may be used to review key concepts, address questions, and work on individual projects. The live community atmosphere and tutoring is designed to help students achieve deeper learning around the concepts taught in the course.

The Google Developer Group of Brussels is organising the local event in Belgium in the beautiful working space Co.Station, next to the central station.

Friedger Müffke and I are the two tutors for the Brussels local group. We try to expand the content of the online course with some of our experiences. We also try to give the student a feeling of the Android ecosystem.

audience at the Study Jam

The Android fondamental course does not use any external libraries. Even for HTTP calls. Instead they ask the students to copy/paste a huge gist containing the code doing the call. I thought that it would have been nice to show the students how to include an external library.

We started to follow that path and we talked quite a lot about libraries that I find useful. Here are some of them:

  • OkHTTP, HTTP calls should be easy.
  • GSON, JSON manipulation.
  • Retrofit, Ideal if you want to interact with a REST+JSON webservice. Beware that it can feel a little bit magic, it's hard to know what's going on. It relies on OkHTTP and GSON to do its job.
  • EventBus, an EventBus for your application. It lets you send event throughout your application. *Otto, basically the same as EventBus. Try both and keep the one you prefer.
  • Timber, small librarie that makes it easier to deal with logs.

You can find all those library in the jcenter maven repository.

Many of those libraries are edited by Square. Check their open source listing for more goodness.

Another small tool that we covered (but that I haven't tested in real life yet) is Retrolambda. You integrate it into your build chain and it lets you write lambda expressions with java 7. Nobody knows when (or even if) Java 8 will be available on android, so this tool can come handy if you really want to use those lambdas.

We also mentioned Genymotion, a fast android emulator based on VirtualBox.

Someone has a question about Context last week. This article is quite good to grasp the differences between the different available contexts.

Last but not least, we talked about Android Weekly, a very nice newsletter that collects all the news from the Android ecosytem. It is a great way to discover new libraries and tools.

Thanks a lot to Anne Collet from Le Wagon Brussels to host us in Co.Station.

If you're interested and want to participate, join the Google Developer Group Brussels on Meetup!

Benoit St-Jean - GADM

GADM est une base de donnés spatiales de grande précision renfermant des informations spatiales, géographiques et de géolocalisation.  Au plus grand plaisir de tous, GADM est maintenant accessible à partir de Pharo!

Sur un tout autre sujet, savez-vous ce que représente le nombre 80738163270632 dans l’adresse du blogue de Hernan ( ?  La réponse dans quelques articles!

Classé dans:bases de données, Pharo, Smalltalk Tagged: base de données, GADM, géographie, géographique, géolocalisation, GIS, Pharo, Smalltalk, spatial, spatiales

Torsten Bergmann - GADM: Access to Global Administrative Areas in Pharo

Hernán Morales Durand announced the release of the GADM package for Pharo Smalltalk. GADM is a high-resolution spatial database of the location of the world's administrative areas for use in Geographical Information Systems (GIS) and similar software. Read more and try out here.

Hernán Morales Durand - GADM: Access to Global Administrative Areas in Smalltalk


GADM is a high-resolution spatial database of the location of the world's administrative areas for use in GIS and similar software. GADM is freely available for academic and other non-commercial use. The data contained in GADM was collected from spatial databases provided by NGO, National Governments, and/or maps and list of names available on the Internet (e.g. from Wikipedia).

Administrative areas include: countries, provinces, counties, departments, etc. up to five sublevels, which cover most boundaries in the world. For each level it provides some attributes, foremost being the name and in some cases variant names. GADM can also be used to extract polygon shapes for visualization, for example to build choropleth maps for regions. The GADM package includes the raw data in CSV format, which I parsed to build a browseable GADM world tree, allowing off-line access to the GADM database in a hierarchical fashion with objects, without need to perform on-line queries for basic requests. A hierarchical tree can be used to build a toponym browser for example.


From within Pharo 3, or Pharo 4 you can use the Configuration Browser, or evaluate the following expression:

Gofer it
smalltalkhubUser: 'hernan' project: 'GADM';
configurationOf: 'GADM';

Usage Examples

" To access to the whole World (as seen by GADM), evaluate "
GADMWorldTree root.

" Access country Lithuania "
GADMWorldTree @ 'Lithuania'.

" To acces the Part (Partido: spanish) where I am living:"
GADMWorldTree @ 'Argentina' @ 'Buenos Aires' @ 'La Plata'.

" You want to know which type of region is Los Angeles "
(GADMWorldTree @ 'United States' @ 'California' @ 'Los Angeles') typeName " 'County' "

" You wish to list all subregions in San Marino "
(GADMWorldTree @ 'San Marino') nodeNames
" a SortedCollection('Acquaviva'
'Borgo Maggiore'
'San Marino'
'Serravalle') "

February 24, 2015

Torsten Bergmann - PharoCloud now with new appliance Pharo + MongoDB

PharoCloud added another starter appliance that is easy to use: "Pharo + MongoDB".

Basically an embedded MongoDB runs locally in this appliance and you can use Mongo or other packages in Pharo to access it. Maybe you already know that when loading the Voyage project is very easy to do persistence in Pharo with MongoDB. To get started with Voyage use this or this.

You can read more details on this new PharoCloud offer here.