Planet Smalltalk

August 21, 2019

Alan Knight - The standard encoding of Dart source files is UTF-8

Today I spent far more time than I'd intended trying to figure out if I can rely on Dart source files being stored as UTF-8. The spec doesn't say anything about file encodings at all, and just says that "source text is represented as a sequence of Unicode code points" (section 20.1)

It's hard to find anything definitive, but the strongest practical factor seems to be that the Dart Common Front End Scanner has two scanner classes: StringScanner and Utf8BytesScanner. The StringScanner expects a String, and Dart's native String representation is UTF-16, like Chrome. When reading bytes, like from a file, it always uses the Utf8BytesScanner.  And trying to run a Dart program in UTF-16, either with or without a BOM, does not work well.

So I conclude that UTF-8 is the only accepted encoding. And since it's hard to find this out, I'm making this blog post so that future me, or someone else searching, can find this out more easily. Or someone can tell me I'm wrong.

Cincom Smalltalk - Smalltalk Digest: August Edition

Welcome to the August 2019 edition of the Cincom Smalltalk™ Digest.  In this valuable edition, we will talk about the following: What Results Came from a Recent Tech Meetup and How […]

The post Smalltalk Digest: August Edition appeared first on Cincom Smalltalk.

Torsten Bergmann - Pharo Headless - Beta

An early preview - but you can already get real headless vm and image from zero-conf and play with it. This is work from the Pharo Consortium Team from the last couple of months.

Some interesting features:

  • Image handles creation of main world - so the Pharo world instantiation and handling is even more shifted to the image side - allows to play with new ideas on world and window creation This will provide more backends: the regular VM support (compatibility with non-headless VMs), and OSWindow with two additional backends: SDL and GTK3+ (implemented using UFFI calls)
  • Handling of events on the image side - which will hopefull allow for better event handling as we can process events directly within the image and not the VM
  • VMMaker code migrated to Tonel and update on VMMaker to execute in Pharo 7 and 8 - this allows for easier VM building of the Pharo virtual machine (which is based on OpenSmalltalk VM)
  • Removing GPL code from the VM repository - to be more license clean
And the one I like most: the virtual machine is now a dynamic library. Which is the first but an important step towards embedding Pharo into other applications!

If you want to try it out check the headless branch within the OpenSmalltalk VM repository:

There is also a Continuous integration (CI) job available.

Read the full announcement.

Torsten Bergmann - Pharo bindings to the LLVM disassembler and Unicorn library

Guille Polito wrote bindings to the LLVM disassembler and Pharo bindings to the Unicorn library. Both projects are available on GitHub:

This should allow for better machine code simulation directly within Pharo.


Torsten Bergmann - Spec2

The UI framework in Pharo receives an update. Spec2 will replace Spec over time - it is already included within upcoming Pharo 8 (which is still in development). Both run in parallel to ease migration.

Source code is also on GitHub:

It is possible to load Spec2 into latest Pharo release - Pharo 7. You will find a script on the project page. Some early documentation on Spec2 is already available as PDF booklet - but as the framework itself work in progress.

Spec2 will also allow for a binding to other backends like Gtk (which is based on Mars project from Esteban):

Torsten Bergmann - Booklet - Testing in Pharo

An upcoming new booklet for Pharo. It is about "Testing in Pharo" including SUnit, DrTest and other. Still work in progress but PDF is already here

Torsten Bergmann - Pharo Chip Designer

Pavel released a new project: Pharo Chip Designer - a Silicon chip layout design game written in Pharo Code is on GitHub:

Sample Video is here:

Torsten Bergmann - Event Music Manager for Pharo - ESUG2019.

The project Event Music Manager (EMM) for Pharo from Benoît Verhaeghe allows us to play with music and video in Pharo. It will also be shown on ESUG 2019 conference.

Source code is available on GitHub:

It uses Seaside web framework and a special UFFI binding to the VLC lib which is also available on GitHub;

VLC is a free and open source cross-platform multimedia player and framework that plays most multimedia files as well as DVDs, Audio CDs, VCDs, and various streaming protocols.

 Go check the trailer:

Torsten Bergmann - GistBrowser for Pharo

There is a nice GistBrowser for Pharo - now also including Gist Press support.
Code is on GitHub:

Torsten Bergmann - Woden 3D engine for Pharo - ESUG 2019 Demo

ESUG 2019 conference is ahead and Ronie Salgado is preparing a demo of his 3D engine Woden - written in Pharo.

Torsten Bergmann - Spider

The page allows to browse VAST ENVY goodies.

The "Spider" project from Jan van de Sandt ( seems to allow similar but for the ST source graph of git and MC projects. Work in progress - but nice example for P3/Glorp, Seaside and Pharo  usage if you have a deeper look at the code. Nice!

August 15, 2019

Pharo Weekly - [ANN] Pharo Pomodoro now on GitHub

I migrated my Pomodoro timer project to GitHub now:

and you can load it using Catalog or script. I tested with Pharo 8.

See also


And yes – additionally to my blog
you will also find my news on Twitter now

Pharo Weekly - [Ann] Pharo v7.0.4

Repository: pharo-project/pharo · Tag: v7.0.4 · Commit: ccd1f64 · Released by: estebanlm

  • #4084 Moved becomeForward from Object to ProtoObject where it belongs
  • #3906 FIX/Backportof#3410
  • #3736 backporting fix for diamond problem in stateful traits
  • #3438 Adding an instance class variable remove the traits of a class
  • #3605 P7 fix forked processes in test resource
  • #3556 Instance of MenuItemPresenter did not understand isEnabled
  • #2945 ffi patch backport
  • #3340 Pharo 7 Fixes #3302 File Browser DNU #readStream

This release has 2 assets:

  • Source code (zip)
  • Source code (tar.gz)

Visit the release page to download them.

Pharo Weekly - [Ann] Commander v2.0.0

Repository: pharo-spec/Commander2 · Tag: v2.0.0 · Commit: 3dbd6b1 · Released by: juliendelplanque

Commander v2.0.0 will be integrated into Pharo after ESUG.


  • Added code for migration to v2.0.0
  • Did migration with the following renamings (order is important):
    • #name -> #dynamicName.
    • #description -> #dynamicDescription.
    • #basicName -> #name.
    • #basicDescription -> #description.
  • Updated baseline to be more flexible. …
    • Do not provide migrator in default group.
    • Provide core,test and migrator groups.
  • Removed deprecated methods:
    • #canBeRun
    • #canBeRunBlock
    • #canBeRunBlock:
    • #defaultCommandName
    • #runWith:

How to migrate code using Commander2 v1.2.0 to v2.0.0

This release provide a migration mechanism for the following renamings:

  • #name -> #dynamicName.
  • #description -> #dynamicDescription.
  • #basicName -> #name.
  • #basicDescription -> #description.

One can use the CmV2ReleaseMigrator class as follow:

1. Load the migration group

Metacello new
	repository: 'github://pharo-spec/Commander2/src';
	baseline: 'Commander2';
	load: #('migration')

2. Collect the command classes to migrate

In this step, one need to create an array of all the classes defined by his/her project that inherit from CmCommand.

An example of such script can be:

myCommandClasses := MyRootCommandClass withAllSubclasses.

3. Run the migration script

CmV2ReleaseMigrator migrate: myCommandClasses

Then run the tests of your project to ensure everything still work correctly

This release has 2 assets:

  • Source code (zip)
  • Source code (tar.gz)

Visit the release page to download them.


August 14, 2019

Cincom Smalltalk - Celebrating the Birth of Cincom Smalltalk – Final Installment

We are celebrating the 20th anniversary of Cincom Smalltalk here at Cincom. In late 1999, Cincom brought ObjectStudio and VisualWorks together under the umbrella of Cincom Smalltalk.

The post Celebrating the Birth of Cincom Smalltalk – Final Installment appeared first on Cincom Smalltalk.

August 11, 2019

Pierce Ng - Minimizing Docker Pharo

As tweeted: Docker image of Pharo VM, 7.0.3-based app Pharo image, changes/sources files, Ubuntu 16.04, 484MB. With Pharo VM Alpine Docker image, 299MB. Build app Pharo image from minimal, run without changes/sources, Alpine Pharo VM, 83MB!

And here's the Docker container resident set size upon switching from the 484MB Docker image to the Alpine-based Docker image:

Pharo Docker RSS

Norbert Hartl and I are collaborating on minimizing Dockerized Pharo. All are welcome to join.

Pharo Weekly - [ANN] Pharo Chip Designer


I have created a little program based on an old educational game by Zachtronics (KOHCTPYKTOP: Engineer of the People[1]) named Pharo Chip Designer.
It is an inaccurate and highly simplified tool for the design of silicon chip layouts. Unlike common tools for logic circuits designs, in Pharo Chip Designer, you need to face the real-life problems like propagation delays or limited amount of layers and available substrate area.
It contains levels from the original game, but you can play with your custom designs on larger surfaces. And of course, use all the Pharo power to control the I/O signals.
The Pharo Chip Designer required Pharo 8.0 and Spec2.
— Pavel

August 10, 2019

Smalltalk Jobs - Smalltalk Jobs 8/10/19

  • Pune, IndiaSmartflow Smalltalk Developer through Zensar Technologies
    • Required Skills:
      • Visualage Smalltalk programming must have
      • Exposure in SQL -basic queries, create and modify scripts and stored procedures
      • Experience in support and maintenance (L2/L3 support)
      • Knowledge of Service now
      • Ready to work in US shifts
    • Wanted Skills:
      • .NET
      • MVC
      • .NET Framework
      • Silverlight
Good luck with your job hunting,
James T. Savidge

View James T. Savidge's profile on LinkedIn

This blog’s RSS Feed

August 09, 2019

Pharo Weekly - Autonomous robot running 100% on PharoThings IoT

Steven Costiou and @Allex Oliveira are working on an autonomous robot, all Pharo: motors, sensors and algorithms

Pharo Weekly - About Pharo vm activity


Some Pharo friends ask about the place Pharo consortium engineers were working on the Pharo VM: Here it is:

The current focus is

You can also check the other branches about threaded and others.

A summary of my interaction with Guille, Esteban, and Pablo.


August 08, 2019

Pharo Weekly - [ANN] Pharo Headless – Beta

For the anxious, you can get real headless vm and image from zero-conf.

$ wget | bash

Zero conf scripts remain unchanged for users.

However, if you are launching the VM by hand from the executable
instead of the launcher scripts (pharo and pharo-ui) as in

$ ./pharoexecutable Pharo.image

the image will launch in headless mode and will not open a window.
To launch it in headfull, you can use the –interactive argument after
the image, which will make the image open a window using SDL2.

$ ./pharoexecutable Pharo.image –interactive

Long version

Hi, this mail is the happy intermediate result of the work that us,
the Pharo Consortium Team, has been doing in the last couple of
Our main objective is to have a real headless implementation of Pharo
where all the responsibility to open or not a World window (or other)
is handled by the image.
For doing so we have done a series of modifications in the image and
the VM side.
We consider this is the path that Pharo 8 and following versions
should follow, as it will severely improve server-side and command
line Pharo and in building custom desktop applications.

These modifications are available only in 64-bits machines (Windows,
OSX, and Linux).
ARM32 and 64bits headless is in the roadmap, but it is delayed because
we have prioritized our three major platforms for this first couple of

All this work is based in Opensmalltalk-VM and Ronnie’s initial work
on headless.
We are really grateful to all the contributors in the history of this
nice product.
To achieve a real headless VM we have brought modifications in the
source tree because most of the platform code to open and manipulate
windows is not required anymore.
Instead, we use the SDL2 library that implements a nice layer on top
of the OS and allows us to manage on the image side through FFI.

So this mail is now an open call for (beta?)testing.
The sources of the current VM we are building are in the headless branch in
And we have set up a CI that is both building and testing the VM in

For the future we have a lot of ideas, that will wait for another long
email or a beer-talk @ESUG.
We want to hear your ideas!!

Image-Side Improvements

– The image handles the creation or not of the main world window.
– We incorporated the idea of World renderer, where different backends
are used to render the world.
– We have 3 backends: VM support (compatibility with non-headless
VMs), and OSWindow with two backends: SDL and GTK3+.
– The modifications in the image are fully backward compatible with
the non-headless VM and are pushed since weeks in the latest 8.0
– We move the handling of events to the image side when using SDL and
GTK3+, opening the door to a richer set of events and finer-grained
control over them.
– SDL and GTK versions are implemented using FFI calls.

VM-Side Improvements

– VMMaker code migrated to Tonel thanks to Feenk and included in the
repository of the VM.
– Making VMMaker execute in Pharo 7 and 8.
– Removing GPL code from the VM repository (GDB).

– Slowly adding new tests for the JIT / Slang and VMGeneration.
– Restructuring of the source code.
– A new simpler CMake build.
– Generate VM code from Slang on each build.
– A CI process to validate (including the run of the tests in Pharo
and the ones adding to the VM).
– Simplification of the codebase.

– Maximize the reuse of code between the platforms (preferring the
standard versions over the platform-specific).
– Cleaning up duplicated code.
– All the plugins are now external plugins.
– The VM is now a dynamic library. This is a first step towards
embedding Pharo into other applications.
– The main executable is a thin frontend (you can change it or
implement your own).

– Removing unused plugins.
– Improved crash dump. Especially the crash dump works now in Windows 64bits.
– Dummy implementation of Security plugin (it is going away…. eventually).
– Cleanup of SSL, UUID, and Socket plugin.

– Cleanup of conditional code (Still to improve).
– Improving the types used in the functions (we have to be neat to be
– Improving the lookup of modules
– Improving the logging of the VM
– Improving the handling of VM arguments

Thanks a lot for reading so long!!
We hope you enjoy the VM and please tell us all the problems you find!!

Pablo, Guille, and Esteban

August 07, 2019

Cincom Smalltalk - The Surprising Secret of Creating a Twitter List

Last month, I wrote about my affinity with Ohio State football.  I previously mentioned that anyone who knows me or has been to my house knows that I’m a HUGE […]

The post The Surprising Secret of Creating a Twitter List appeared first on Cincom Smalltalk.

August 03, 2019

Pharo Weekly - [Ann] Machine code simulation in Pharo

Hi everybody,
I’ve been playing around with machine code simulation this last week and I’ve made bindings for the unicorn library and the llvm disassembler:
Funny thing: both support lots of platforms (x86 and arm both 32 and 64 bits and more…). So out of the box we can simulate and disassemble lots of platforms.
And in one afternoon I’ve played with them to do a native debugger with Spec2 just for fun.
Hope this evolves a bit more soon, and that it helps somebody.

July 30, 2019

Andres Valloud - Camp Smalltalk PDX 2019

The Camp Smalltalk crew is pleased to announce Camp Smalltalk PDX 2019, October 4th-6th in beautiful Portland, Oregon.  Registration covers the use of CTRL-H hackerspace and dinner on Saturday.  See you there!

July 29, 2019

Mariano Martinez Peck - The battle continues: Build TensorFlow C Binding for Raspberry Pi in 2019

In a recent post I showed up how challenging it still is to build TensorFlow C bindings for Raspberry Pi and other SBCs (Single Board Computer) and the lack of pre-build binaries.

As you could read, I was successful with certain approach (cross-compiling with a RaspberryPi-only script) but I wasn’t yet able to compile on the target (RaspberryPi 3 in this example) and I still had quite some questions open.

In this post I will show some more successful attempts as well as answer some of my previous questions.

Successful attempt: build from scratch on Raspberry Pi 3B+ and Raspbian Buster

I suspected one of the reasons of why I failed to do this on the first place was the amount of the swap space as well as free hard disk space.

It was the perfect excuse to buy another 64GB fast micro SD, try Raspbian Buster and start from a fresh install. So, that’s what I did.

If you remember from the previous post, the first thing you needed to do was to install Bazel. In this case, the first thing I did is to give it a lot of swap space. Instead of 2GB as I did before, I now assigned 8GB.

Next, remember you don’t need any version of Bazel. The version that TensorFlow would need. One open question I had from previous post was “how do I know that?” And here is the answer: you must check the file tensorflow/tensorflow/tools/ci_build/install/

For example, for 1.13.1 you can see:

# Select bazel version.

set +e
local_bazel_ver=$(bazel version 2>&1 | grep -i label | awk '{print $3}')

if [[ "$local_bazel_ver" == "$BAZEL_VERSION" ]]; then
  exit 0

OK, so I started compiling Bazel following the instructions of the previous post and I found out problems with the Java VM. I am sorry, but I didn’t write down which was the exact issue. But it was an error clearly related with some Java compilation that I did NOT have with my previous attempt.

My first step was to check JVM versions (java --version) of this Raspbian Buster vs the Raspbian Stretch I used before. On the latter it showed`java version “1.8.0_65″` while in the former openjdk 11.0.3 2019-04-16. OK…so Stretch came with Java 8 while Buster with 11.

This is when I imagined that maybe Bazel could be build only with a given Java version in particular. Which one? No clue (tell me if you do). So what I did on my fresh Raspbian Buster is to install java 8 too:

sudo apt-get install openjdk-8-jdk

After that, you can check which are the alternatives:

$ update-java-alternatives -l
java-1.11.0-openjdk-armhf      1111       /usr/lib/jvm/java-1.11.0-openjdk-armhf
java-1.8.0-openjdk-armhf       1081       /usr/lib/jvm/java-1.8.0-openjdk-armhf

Obviously, I didn’t want to change the default Java version for my whole OS, so I just made the following workaround:

env BAZEL_JAVAC_OPTS="-J-Xms384m -J-Xmx1024m" \
JAVA_TOOL_OPTS="-Xmx1024m" \
JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-armhf" \
EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" \
bash ./

Basically, I am just telling Bazel to use Java 8. After that, it could finish correctly. The next step was to build TensorFlow.

I started my build process but I hit another compilation issue related to AWS which I could workaround by just telling to NOT compile AWS….

Finally, after 13 hours (yes, that’s the expected time) I could successfully build it:

The final Bazel compilation script for TensorFlow was like this:

env JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-armhf" \
bazel --host_jvm_args=-Xmx1024m --host_jvm_args=-Xms384m build \
--config=noaws \
--config opt --verbose_failures --local_resources 1024,1.0,1.0 \
--copt=-mfpu=neon-vfpv4 \
--copt=-ftree-vectorize \
--copt=-funsafe-math-optimizations \
--copt=-ftree-loop-vectorize \
--copt=-fomit-frame-pointer \
--host_copt=-mfpu=neon-vfpv4 \
--host_copt=-ftree-vectorize \
--host_copt=-funsafe-math-optimizations \
--host_copt=-ftree-loop-vectorize \
--host_copt=-fomit-frame-pointer \
--host_copt=-DRASPBERRY_PI \

Interesting points:

  • I added the JAVA_HOME workaround for Java 8.
  • I removed the original --jobs=3 that I used before because didn’t seem to change much.
  • I added the --config=noaws workaround for AWS.
  • As I knew it would take a lot of time to compile I wanted to double check the CPU temperature, so every in a while I run /opt/vc/bin/vcgencmd measure_temp and check its results.

Once it finishes, you may want to copy the resulting files somewhere. In my case I did:

sudo cp bazel-bin/tensorflow/ /usr/local/lib/
sudo cp bazel-bin/tensorflow/ /usr/local/lib/	

Failed attempt (but with learnings!): build from scratch on Raspberry Pi 3B+ and Ubuntu Server 18.04 and aarch64 (ARM 64 bits)

Once I had ARM 32 bits working, my next step was to try on aarch64 (ARM 64 bits). At the time of this writing, there is no official 64 bits Raspbian version. It’s not the first time I want to run something on the Pi3B+ with aarch64 so I already had a micro SD with Ubuntu Server 18.04 up and running.

I started eating my own dog food and here it comes the first issue: the way to change the swap partition is not the same with Raspbian and Ubuntu. So I followed this guide for Ubuntu and assigned also 8GB.

Second, it seems you need python installed. No, this Ubuntu did not have any python installed. I then understood why some blog posts started with a “first, install dependencies..” and provided below line:

sudo apt-get install gcc g++ swig build-essential openjdk-8-jdk python zip unzip

I let you decide if you want Python 2.x or 3x. As we found out before, the JDK version is also important.

Anyway, after those 2 issues, I was able to compile and run bazel. However, as soon as I tried to run the previous bazel script for TensorFlow I got a compilation error saying that --copt=-mfpu=neon-vfpv4 was not a recognized option:

Thanks to freedomtan he told me that I don’t need all those extra --copts and --host_copts (they are for complicated Raspian environ). So the bazel script should then be something simpler:

 bazel --host_jvm_args=-Xmx1024m --host_jvm_args=-Xms384m build \
 --config=noaws \
 --config opt --verbose_failures --local_resources 1024,1.0,1.0 \

I thought this was going to work, but after many hours it just didn’t finish. It somehow hung. I didn’t fight any longer because this Ubuntu installation was never really stable for me. So I will try this again anytime soon with a fresh install of Debian Buster or something for aarch64.

Successful attempt: convinced someone else to build it!

In the previous post I commented about this Github repo providing binaries for TensorFlow and Raspberry Pi. The drawback was that all binaries they ship were Python only and not the C shared library.

After a nice discussion with the author, he now build it for ARM and ARM64!! And seem to have included it as part of his release process. But that’s not all. It seems that even if Google itself provides official Python wheels for Raspberry Pi, there are many people that still uses his builds. Why? He explains himself:

The difference between my Wheel file and the official Wheel is the following two points.

* Official Wheel is disabled by default on Tensorflow Lite. However, my wheel is enabled by default.

* Tuned to 2.5 times the performance of the official Tensorflow Lite.

It is 1. that is considered a problem by engineers around the world.

You can read more in above link and see how to get those binaries! BTW, the same author also provides binaries of Bazel for ARM!

Future attempts (yes, the journey is not over!)

July 28, 2019

Smalltalk Jobs - Smalltalk Jobs – 7/28/19

  • Bangalore, IndiaSr Eng Software & Application at GLOBALFOUNDRIES
    • Required Skills:
      • BS degree in computer science, software engineering or information technology discipline or equivalent years experience
      • 3+ years professional software development experience
      • 2+ years “hands-on” experience in design and development using C/C++, Java, J2EE or other Object-oriented technologies.
      • Good understanding of Web Services WSDL, SOAP, XML
      • Strong in database technologies: Oracle/DB2 and writing query languages (SQL).
      • Knowledge of and experience with Analysis and Design Patterns
    • Wanted Skills:
      • Knowledge of SAS analytics solutions and other Business Intelligence software will be a plus
      • Experience using various scripting languages like Perl, Python
      • Familiarity with or Demonstrated ability to learn Smalltalk
      • 3+ years Experience in a Unix/Linux computing environment
    • Pay:
    • Additional listings:
  • Buenos Aires, ArgentinaSoftware Engineering – Asociate (Job ID 190057603) at J.P. Morgan
    • Required Skills:
      • Degree in Computer Science, Software Engineering, Physics, Math or equivalent training and relevant experience
      • Experience in Object Oriented Programming (Python, Smalltalk, C#/C++, Ruby or similar).
      • Good oral and written communications skills in English with the ability to be highly effective with both technical and business partners
      • Experience on Financial Products/Industry domain or willingness to learn about it
      • Work closely with customers and analysts to identify and specify complex business requirements and processes, research, evaluate & recommend alternative solutions for our risk management platforms.
      • Ability to work with a sense of urgency, while maintaining attention to detail
    • Additional listings: J.P. Morgan (Job ID 190064268)
Good luck with your job hunting,
James T. Savidge

View James T. Savidge's profile on LinkedIn

This blog’s RSS Feed

July 26, 2019

Pharo Weekly - [ann] Smalltalk WebCamp day in Ghent

Hi Seaside users,

We are organising a Smalltalk WebCamp day in the Yesplan offices in Ghent on October 22nd.
The idea originated in the Seaside channel of the Pharo discord group. However, it’s not supposed to be Seaside only. All Smalltalkers doing web development, possibly involving other technologies on top of Smalltalk, are encouraged to join. Let’s meet and exchange ideas. The topics are to be determined, following the idea of an unconference [1], except that, for practical reasons, we will ask you to confirm your attendance beforehand.
More info to follow asap.
Save the date and respond already to the group if you are interested to attend.

July 25, 2019

Cincom Smalltalk - Celebrating the Birth of Cincom Smalltalk, Part 3

Do you remember 1999? Were you still in grade school?  College?  As you reflect back to your personal journey in 1999, let us take you on a journey of two products […]

The post Celebrating the Birth of Cincom Smalltalk, Part 3 appeared first on Cincom Smalltalk.

July 24, 2019

Cincom Smalltalk - Smalltalk Digest: July Edition

In this edition, we feature more of our history, some benefits of being a Cincom Smalltalk customer, a new Hidden Gem and more.

The post Smalltalk Digest: July Edition appeared first on Cincom Smalltalk.

July 23, 2019