Planet Smalltalk

July 01, 2015

Torsten Bergmann - Yaqe - Yet Another Quake Editor for Pharo

Ronie is working on a Quake style level editor using Woden (World Dynamic Engine for Pharo), a with a user interface similar to the one present in Blender. Video is below and code is here.


June 30, 2015

ESUG news - Camp Smalltalk PDX --- August 21st through the 23rd

Camp Smalltalk Portland 2015 is go for August 21st through the 23rd! (and if you arrive earlier on the 20th that's cool too) Please register for the event here:

Help us by filling in the questions so you can get your event shirt. And also see that we're having a BBQ with live music on Saturday.

Torsten Bergmann - Interactive Table with Pharo

Interactive table support in Pharo (thanks to the new OS window architecture). Thanks Thales for the sponsoring!


Torsten Bergmann - Example of Recognizer with Pharo

Torsten Bergmann - Modern Events Touch and Gestures in Pharo

Torsten Bergmann - Camp Smalltalk Portland 2015

Camp Smalltalk Portland, August 21st through the 23rd: Register here.

Andres Valloud - Camp Smalltalk Portland 2015

Camp Smalltalk Portland 2015 is go for August 21st through the 23rd!  (and if you arrive earlier on the 20th that's cool too)  Please register for the event here --- help us by filling in the questions so you can get your event shirt.  And also see that we're having a BBQ with live music on Saturday.  You can't miss it!

Andres Valloud - Camp Smalltalk Portland 2015

Dear artful programming enthusiasts,

The Pacific Northwest Smalltalk crew would like to invite you to Camp Smalltalk PDX this summer.  Come join us August 21-23 in beautiful Portland, Oregon!

We all know coding is a lot of fun, and that the best coding is done with the delete key.  Accordingly, Camp Smalltalk PDX will be at Portland’s CTRL-H hackerspace,

There is no set schedule, but of course we all have strong interests.  Some of the areas that will surely be covered include:

* Smalltalk on small devices, such as Scratch on Raspberry PI
* Web frameworks such as Seaside
* Virtual machine implementations
* Data processing applications
* Language design, Smalltalk and beyond

If you are curious about Smalltalk, feel free to drop by and give Smalltalk a try.

And yes, there are also the well known regulars --- we all know who you are :).  It’s time to catch up and plot inventing our future.

Feel free to contact us directly if you have questions regarding travel or accommodations.  Also, if you know you will be coming and you haven’t completed our survey yet, doing so will help us coordinate the infrastructure around the event:  For event information, see here:  As the dates get closer, additional organization information may become available here:

See you in Portland!

Torsten Bergmann - ESUG 2015

June 29, 2015

Torsten Bergmann - Squeak Website

Squeak Smalltalk got a fresh new look on the


The Weekly Squeak - Check out the New Squeak Website


A lot of work has gone into the new website.  Go check it out!

Nice work to everyone that worked on it, it’s beautiful and well organized!

[announcement on Squeak-dev]

Dear Smalltalkers

I am pleased to announce new look of the Squeak Website

Personally, I want to thank Fabio Niephaus, who invested a lot of effort into the new site.

Best regards

-Tobias Pape

Torsten Bergmann - MetaBorg

MetaBorg, a framework for building board games. Read more here and browse code here.

Pierce Ng - UnQLite Jx9

I’m playing with Masashi Umezawa’s PunQLite wrapper for unQLite. UnQLite provides both a key-value store and, interestingly, a JSON document store based on an embedded programming language named Jx9.

Here’s an example Jx9 program:

if (db_exists("students")) {
$s = { name: "james", age: 26 };
db_store("students", $s); 
$sid = $s.__id;

And here’s Smalltalk code to execute the above Jx9 program:

| j db |

j := '...'. "Above Jx9 program."

db := PqDatabase openOnMemory.
[   db jx9Do: [ :exe |
        exe compile: j.
    exe execute.
    Transcript show: exe @ 'sid' asString; cr ]
] ensure: [ db close ]

PunQLite supports extracting values from an executed Jx9 program, as in “exe @ ‘sid’” above. PunQLite currently does not support UnQLite’s APIs for exchanging JSON objects between Smalltalk and an Jx9 program which provide functionality similar to parameter binding in SQL APIs. That means Jx9 programs, including data to be stored, has to be constructed from strings… As OWASP says about NoSQL injection:

Because these NoSQL injection attacks may execute within a procedural
language , rather than in the declarative SQL language, the potential
impacts are greater than traditional SQL injection. 

June 27, 2015

Pharo Weekly - DragPanels: Floating palette windows with drag-and-drop in Morphic

Morphic offers everything needed to create highly interactive applications in Pharo. It is however, difficult to find out how to actually create those applications. Morphic tutorials provide a starting point, and are not very good at showing how the different features interact and are supposed to be used together. Morph has lots of methods, and some of them are not in the method category where you might expect them. The result is that most Morphs in Pharo do not use much of what Morphic has to offer.

Wouldn’t it be great if there would be some sample code, showing how Morphic can be used to great effect?

Well, here is some code that takes a first step towards that goal.
DragPanels shows how to create a floating palette, filled with
wells that support dragging a property towards a target. It shows how to combine drag-and drop with click: and context menu actions, and show  to give UI feedback when over a well and when holding the mouse down over an element that reacts to click:.

You can see the code in action here:

The color panel shows some colors. If you don’t set the allowDropBlock,
it will work with any morph that responds to #color: (like the world).
By clicking on the plus, you can add more colors to the panel. The panel has a context menu to restore the default values.

ColorPanel withSevenPaleColors
allowDropBlock: [ :source :target |
target class = CardMorph ];

The people panel shows avatars belonging to an email addres. By default it uses gravatar for them, and caches the images.

PeoplePanel new
allowDropBlock: [ :source :target |
target class = CardMorph ];

When dropping, the dragSource sends #color: resp. #email: to the  target by default. By setting the dropSelector of the DragWell this
can be overridden.

You can try the code by do-ing

Gofer new
smalltalkhubUser: ‘StephanEggermont’ project: ‘Dragpanels’
package: ‘DragPanels';

It is used in (a work in progress)

Gofer new
smalltalkhubUser: ‘StephanEggermont’ project: ‘Documentation’
package: ‘CardsMorphic';



On the wishlist are
– add more color palettes
– add a dark theme, refactoring the colors
– add a small close cross in the title bar of the palette
– define the dropSelector in the panel, not the well
– support different sized wells, refactoring the sizes
– make the mouseOver rectangle color content dependent
– add pharo contributors as an avatar source
– add a configuration

June 26, 2015

Torsten Bergmann - Roassal - New Preview for ESUG 2015

ObjectProfile is working hard on new Roassal visualizations. A preview of what will be presented will be found in this video.

Torsten Bergmann - Morphic Scrum Board Part 2 - DragPanels

Torsten Bergmann - Roundtrip

When I use Eclipse and Java I still like the nice eUML2 AddOn Tools as they allow to define quickly a conceptual model in UML. It's also the only tool I've found for Java that is able to support roundtrip engineering and that allows you to keep close to the code while still doing modeling.

DynaCase for Pharo looks promising but such roundtrip tools are still missing in the Pharo tools universe.

Torsten Bergmann - Demo stories

Tudor gave a demo on demoing stories including a demonstration of Spotter. Video is here.

Torsten Bergmann - Sonar importer for Moose

June 25, 2015

Pharo Weekly - Choose your high goal and tell its story through the system that you build


I gave last week a talk at NDC Oslo on “Don’t demo facts. Demo stories!”. While the talk is less technical, I did exemplified the message by demoing Spotter in comparison with the search support from Eclipse.
There are several things I would like to emphasize.
I compared our solution with an “industry standard” one. We often think our system as being niche and perhaps not mature enough. We need to change that perception about our work. We build state of the art.
One thing that I did not mention explicitly in the talk is the size of the implementation. The Spotter implementation is 3500 lines of code — and that it is so large because it currently comes with its own widgets. Furthermore, the extensions average 8 lines per custom processor (including the method header and the pragma). This is orders of magnitude smaller than what is typically out there, and it is precisely the reason why we can compete even if we are fewer.
But, to get out there and compete we have to set that high goal for ourselves. For example, with GT we do not want to compete. We want to outcompete. So can you.
While details are important, high goals require us to get away from those details. Only polishing details will tend to limit you to incremental improvements. We need to jump from time to time. But, these jumps are hard. On the one hand, it is hard to find the right jump and convince people to jump with you. On the other hand, they are hard to predict. For example, Spotter would have not been predictable one year ago.
Yet, dry goals are not enough to keep us going. We need stories that make us dream. And the beauty is that Pharo breaths such a story. We should not limit ourselves to that story only. For example, with GT we want to reinvent the developer experience by making the developer be able to mold visual tools to her context because that is the only effective way to build sustainable systems. This little point of view will turn the IDE upside down, and this is only possible in a system like Pharo.
Choose your high goal and tell its story through the system that you build. And remember that Pharo already offers a beautiful story to start from.

Pharo Weekly - Sonar importer for Moose


I would like to announce that I developed a Sonar importer to get sonar data into a Moose model.

It imports the list of metrics and projects available in the Sonar repository.

On demand, it imports chosen metrics for all the projects. I let you see the tests and documentation to check the behavior of this importer.

The configuration is on the Pharo catalog, so it is very easy to load it (else the repo is here).

The importer is based on the public Sonar REST API Version 3.7.2, but should work with recent ones.

Don’t hesitate to contribute if you want to add new features, the project is in public access!



Torsten Bergmann - Unified IDE

Lots of new editors for JavaScript appear - Atom, Brackets, ... and now Nuclide.

The web page of the last one tells us that Nuclide is a "A unified IDE". Hey - wake up! It is just a fancy editor - nothing more and I really wonder if these guys have ever see a real unified IDE with browsers, refactoring tools, test runner etc.

June 24, 2015

Pharo Weekly - Pharo is pulsing steady and regular

15831 Replace PluggableTextMorph with RubScrolledTextModel in Nautilus for source code

15832 Integrate new FastTable
15568 removeClass does not work for Last modified/Most viewed DynamicGroups

15827 Update Rubric

15272 RBPatternMessageNode>>match:inContext: SubscriptOutOfBounds
12728 requestImplementorToInline: is missing in NautilusRefactoring

15828 NECController must check that its editor morph is not nil before unsubscribing from it

15826 Clean up discouraged uses of SourceFiles and friends (10)

15825 Move Reflectivity changes from Opal into a Opal translator subclass (part1)

15824 Clean up discouraged uses of SourceFiles and friends (9)

15823 Clean up discouraged uses of SourceFiles and friends (8)
15818 Clean up discouraged uses of SourceFiles and friends (7)

15813 Reflectivity: #value for ReturnNodes

15812 MessageNotUnderstood: RGMethodDefinition>>ast (Suggestions expects it)

15791 Cleanup Script actions for methods

15557 New PackageManifests should be classes, not instances

15809 Update Rubric
15806 Clean up NautilusRefactoring

15805 support #newValue on assignmentNode + cleanups

15807 Revisiting RBUnpackagedCodeRule

15801 MorphTreeMorph improvement

15801 MorphTreeMorph improvement
15799 replace last #gather: reference

15800 Fix concurrency problem with RemoteString

15795 Playground enter does not work well anymore

15793 Better comment for Margin

13463 Monticello Browser doesnt scroll packages correctly

15789 Progress with reifications

7367 Nautilus Colors “not in this package” methods differently on instance/class sides

15794 Clean up discouraged uses of SourceFiles and friends (5)
15788 Clean up discouraged uses of SourceFiles and friends (4)

15785 Fix do it etc in class comment in Nautilus
15783 First cleanup of Workspace

15778 The meaning of command-click (apple-click) on class names changed from Browse class to References to class

15779 Clean up discouraged uses of SourceFiles and friends (3)

15724 RB lint rules should not directly query the system dictionary
15754 New Code Critic for unary “accessing” methods without explicit returns

15739 lastKeystroke broken

15146 Spec TabManagerModel>>selectedTab: aTab manipulates with Morphic tab

15781 Fix TraitMethodDescriptionTest>>testArgumentNames
15776 Clean up discouraged uses of SourceFiles and friends (2)

15681 Manifest-CriticBrowser

15775 remove some “halt” that where left over

15765 OrderedCollection>>#at: and #at:put is slow

15753 wrong styling for comments

15770 Methods are in wrong protocol on ThemeIcons

15711 The File Browser has a Context Menu “Workspace with Contents”. It opens an Edit Window (String Morph), but not a Workspace …
15276 radioUnselectedFormContents and radioSelectedFormContents broken in Pharo3UIThemeIcons

15766 remove explicit isKindOf: PluggableTextFieldMorph in rubric

15767 remove explicit isKindOf: PluggableTextFieldMorph

15761 remove package Tool-Browser-Old

14614 FileList is not working

15640 Call to obsolete method in LinearGradientPaint class
15746 clean up RPackage-SystemIntegration

15681 Manifest-CriticBrowser

15718 Remove StringHolder

15532 Methods in Object category drag and drop should be a Morphic extension
15660 Add String methods for removing prefix/suffix

15756 Move FileStream usages to File and Friends

15759 Remove debug code from ASMJit

15718 Remove StringHolder
15740 openInWorld: aPasteUpMorph raises MNU PasteUpMorph>>startSteppingSubmorphsOf:

15726 unimplemented methods for new change list

15720 RubTextEditor references StringHolder
15741 PluggableTextMorphWithLimits should be removed

15749 RB: Dont Add Parens Around Lit Array Elements

15751 catalog (with spotter) needs to show projects after classes and packages

15752 make browsing versions of removed methods working again
15745 add API to enumerate AST nodes

15747 cleanup tools to get rid of undeclared

15748 Reflectivity: fixes for reifications

15703 integrate new Catalog Browser

15735 Start to move RPackage-SystemIntegration to into RPackage

15744 CatalogBrowser moved to PharoExtras

15742 Small clean up in ChangesBrowser

15636 PharoTutorial contents

15731 Kill the last two #asTimeStamp methods

15734 More tests for reifications

Cincom Smalltalk - Smalltalk Digest: June Edition

The June edition of The Cincom Smalltalk Digest is available now.

Pharo News - Job Offer | 1 year Post-Doc/Research & Teaching Assistant

<p>A 12 months position for a post-doc/Research &amp; teaching assistant is available at Ecole des Mines de Douai (France). Applicants should have a PhD degree.</p> <p>Find out more about the work at Ecole des Mines (Pharo and Robotics) at <a href=""></a>.</p> <p>Contact <a href="">Noury Bouraqadi</a> for more information.</p>

Pharo News - Job Offer | 1 year Post-Doc/Research & Teaching Assistant

<p>A 12 months position for a post-doc/Research &amp; teaching assistant is available at Ecole des Mines de Douai (France). Applicants should have a PhD degree.</p> <p>Find out more about the work at Ecole des Mines (Pharo and Robotics) at <a href=""></a>.</p> <p>Contact <a href="">Noury Bouraqadi</a> for more information.</p>

June 22, 2015

Torsten Bergmann - Babelsberg/S

allows for Object-Constraint Programming in Squeak. Check it out here (based on Squeak) or read about the JS variant here.

Torsten Bergmann - ARM Cog Spur JIT VM

Eliot provides new Cog VM binaries.

What is cool about it this time: the busy VM developers now added the ARMv5/ARMv6 Cog Spur JIT VM! It has been tested on Raspberry Pi running Raspbian - feel free to help testing also on other ARM based Linux systems.

Read more here and here or just download and try:

Note that this is for ARM v5/v6 and v7 systems. And before I forget to mention: if you quickly need a 64bit VM for ARM v8 architecture just send $1,000,000 to Tim