Monthly Archives: August 2019

Pharo-Headless-Linux-VM debugging

Guille’s procrastination experiments inspired me to procrastination of my own,
with an experiment around debugging Pharo-Headless-Linux-VM using Visual Studio running on Windows.
I’ve refined the steps-from-scratch to reproduce down to the following…
Overview…
1. Install Windows Subsystem from Linux
2. Install Visual Studio 2019
3. Build and run hello-world exercise inside WSL
4. Build and run Pharo-Headless-VM inside WSL

Now lets get started…

###############################
Install Windows Subsystem from Linux
###############################
1A. On a Windows 10 box, go to the Windows App Store and Ubuntu 18.04…

Ref: https://docs.microsoft.com/en-us/windows/wsl/install-win10

1B. Ensure this configured as the default (otherwise later the $defaultWSLPath variable doesn’t work and you may see a Visual Studio error “Could not open windows subsystem shell”)…

C:\Users\Ben>wslconfig /l
Windows Subsystem for Linux Distributions:
Legacy (Default)
kali-linux
Ubuntu-18.04
Ubuntu-16.04

C:\Users\Ben>wslconfig /setdefault Ubuntu-18.04

C:\Users\Ben>wslconfig /l
Windows Subsystem for Linux Distributions:
Ubuntu-18.04 (Default)
Legacy
kali-linux
Ubuntu-16.04

Ref: https://www.howtogeek.com/344688/how-to-set-your-default-linux-distribution-on-windows-10/

btw, my Windows 10 box recently upgrade to latest version.
C:\Users\Ben> ver
Microsoft Windows [Version 10.0.18362.295]

1C. Start Ubuntu-18.04, then update/upgrade/install pre-requisites…
“`
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install clang gcc gdb make rsync zip        # Visual Studio requirement
sudo apt-get install uuid-dev                      # Pharo VM build requirement
“`

While that is running…

####################

Install Visual Studio 2019
####################
2A. Download and run the installer for Visual Studio Community 2019 (not Visual Studio Code)

Ref: https://visualstudio.microsoft.com/free-developer-offers/

2B. When the “Visual Studio Installer” opens, under its “Workloads” tab, select “Linux development with C++” and click **Install**.

Ref: https://docs.microsoft.com/en-us/cpp/linux/download-install-and-setup-the-linux-development-workload?view=vs-2019

#####################################
Build and run hello-world exercise inside WSL

#####################################
3A. Start Visual Studio 2019
and at its opening window, under “Get started” click “Create a new project”.
Then scroll down and choose “CMake Project” and <Next>.
and configure…
Project name: hello-world
then click <Create>.

Ref: https://docs.microsoft.com/en-us/cpp/linux/cmake-linux-project?view=vs-2019

Now it may immediately start the CMake build and get an error because its using the default “x64-Debug” configuration.

Ignore that, we will create a new configuration to build on Windows Subsystem for Linux.

3B. From the “Configuration drop-down” (where you see “x64-Debug”)
select “Manage Configurations…”
Delete “x64-Debug”.
Add… “WSL-Debug” and use all defaults then press <CTRL-S> to save.

Inside WSL, Cmake will start generating the makefiles.

At some point you might see “Supported CMake version is not present on WSL. Install CMake binaries built by Microsoft?”
YES, do that.

3C. After “CMake generation finished”,
pull down “Select Startup Item” and select “hello-world”
then press the green PLAY button.

Inside WSL, the make build will start and after its done the pharo executable will run there.
In the [Output] tab, it was successful if you see  “The thread ‘hello-world’ (0x1f7a) has exited with code 0” .

3D. For proof that its running inside WSL, lets write a file!
In the “Solution Explorer” tab, browse to “hello-world.cpp” and change its contents to…
“`
#include <stdio.h>
int main()
{
FILE* fp;
int i;
/* open the file for writing*/
fp = fopen(“/tmp/built-by-visual-studio”, “w”);
fprintf(fp, “It worked.\n”);
fclose(fp);
return 0;
}
“`
then press the green PLAY button.
After you see “thread ‘hello-world’ has exited with code 0”
open a WSL shell and run…
$ cat /tmp/built-by-visual-studio
It worked

3E. To experience debugging Linux from Visual Studio, first remove the test file…
$ rm /tmp/built-by-visual-studio
then put a breakpoint on “fopen” and click the PLAY button.
Check if the file is there…
$ cat /tmp/built-by-visual-studio
cat: /tmp/built-by-visual-studio: No such file or directory
<STEP OVER> fopen
$ cat /tmp/built-by-visual-studio
<STEP OVER> fprintf
$ cat /tmp/built-by-visual-studio
<STEP OVER> fclose
$ cat /tmp/built-by-visual-studio
It worked

3F. All done…
File > Close Folder

#####################################
Build and run Pharo-Headless-VM inside WSL
#####################################
4A. From Visual Studio 2019 opening window, under “Get started” click “Clone or check out code”
Repository location: https://github.com/bencoman/opensmalltalk-vm.git
then click <Clone>.
https://docs.microsoft.com/en-us/visualstudio/get-started/tutorial-open-project-from-repo?view=vs-2019

4B. In the bottom-right status bar, click the “branching” icon and choose “Manage Branches”.
Expand “remotes/origin”,
then right-click “headless-WSL-VisualStudio” and “Checkout”

A fixed “WSL-Debug” configuration is a part of this branch, so its CMake-build should auto-start and complete successfully.

4C. After “CMake generation finished”,
pull down “Select Startup Item” and select “pharo (build/vm/pharo)”
then press the green PLAY button.

Don’t worry if it sits for a long time on “BalloonEnginePlugin>>primitiveAddRect”

The [Error List] tab pops up with 116 Warnings.
Switching back to the [Output] tab, you hopefully see “thread ‘pharo’ (0x4d0d) has exited with code 0”

So the VM just built and ran headless under Windows Subsystem for Linux.

Now lets debug that from Visual Studio.

4D. Browse to src/main.c and put a breakpoint in main() on the call to parseArguments()
Then click the PLAY button.
Once stopped at the breakpoint, <STEP INTO>.
In the [Autos] tab, expand the “parameters” variable.  Observe “imageFile” is empty.
Notice “imageFile” becomes “Pharo.image” after <STEP OVER> splitVMAndImageParameters().

So now I leave you to play.  I’d be interested in hearing about people’s experiences.

Placing the correct PharoHeadless.image in the right place to actually run the image
is left as an exercise for the reader.
cheers -ben

[Ann] Pharo Consortium New Bronze Member: Object Guild

The Pharo Consortium is very happy to announce that the Object Guild has joined the Consortium as a Bronze Member.

Object Guild

Simply Revolutionary
High fidelity software solutions for values-driven organisations.
We help you to help the world become a better place.

Object Guild differentiates itself as a custom software design and development shop in the following ways:

– by a commitment to use technology and software to make the world a better place;
– by seeking and serving clients who are equally committed to social and environmental enhancement;
– by focusing on “Software that Fits,” that seamlessly integrates with and enhances the complex system where it is deployed;
– by our commitment to Pharo and Smalltalk development, including expanding and enhancing Pharo;
– by a focus on education and training, internal and for clients, that advances the “state-of-the-practice” of software development.
https://objectguild.com

The goal of the Pharo Consortium is to allow companies and institutions to
support the ongoing development and future of Pharo.  http://consortium.pharo.org

Individuals can support Pharo via the Pharo Association. http://association.pharo.org

[ann] pre-release Voyage 1.6

I made a pre-release for voyage 1.6 at

It enables to usage in pharo8. Also included is a first preview of using ArangoDB [1] with Voyage
Norbert

[ann] Iterator framework for Pharo

Hello,

I wanted to have an iterator framework for Pharo for a long time.
So I started building it step by step and today I think that, while it still requires more documentation, it is ready to be announced and used by others.
The idea is that, as described by the iterator design pattern, any object that needs to be walked provides one or many iterators.
In the library, #iterator method is the convention to get the default iterator of any object (if it has one).
Iterators provides a DSL to deal with iterators combination.
It is inspired from shell’s streams manipulation syntax:
– The pipe “|” allows one to chain iterators
– The “>” allows one to create a new collection with data transformed through chained iterators
– The “>>” allows one to fill an existing collection with data transformed through chained iterators
For example, one can write:
iterator := #(1 2 3) iterator.
iterator
| [ 😡 | x * 2 ] collectIt
| [ 😡 :y | x + y ] reduceIt
> Array “#(12)”
Or
iterator := #(1 2 3) iterator.
collectionToFill := OrderedCollection new.
iterator
| [ 😡 | x * 2 ] collectIt
| [ 😡 :y | x + y ] reduceIt
> collectionToFill.
collectionToFill “anOrderedCollection(12)”
The equivalent of “/dev/null” in Linux also exists:
iterator := #(1 2 3) iterator.
iterator
| [ 😡 | x * 2 ] collectIt
| [ :object | object logCr ] doIt “Just print incoming objects in transcript.”
> NullAddableObject “Special object that ignore incoming objects.”
There are documentation and examples on the GitHub repository.
Initially, the goal was to avoid to duplicate all collection’s iterator methods (e.g. #collect:, #select:, etc) in composite objects.
Thus, it provides an IteratorWithCollectionAPI which wrap an iterator and provides all the methods we want (#collect:, #select:, …).
Via IteratorWithCollectionAPI, your objects automatically gets the Collection API, you just need to access it via #iterator message:
myObject iterator select: [ 😡 | x isFoo ]
This is another way to use the framework, just to avoid code duplication.
Future work is to provide the possibility to have iterator with multiple inputs.
I already have an undocumented prototype on the repository that works like this:
it1 := (1 to: 10) iterator.
it2 := (1 to: 10) iterator.
it1 & it2
| [ 😡 :y | x@y ] mergeIt
> Array. “{(1@1). (2@2). (3@3). (4@4). (5@5). (6@6). (7@7). (8@8). (9@9). (10@10)}”
Yes, “&” operator will again kind of mimic the one from the shell.
Hope it helps other people.
Feedback is welcome.
Cheers,
Julien

[Ann] Magritte ready for Pharo 80

Just a little announce to let you know that magritte is now ready for Pharo 80.

https://github.com/magritte-metamodel/magritte/

S

[ann] PolyMath 1.0

Dear all,

we are happy to announce the release of PolyMath 1.0, the
computational framework for Pharo.

Please find more information about the project here:
https://github.com/PolyMathOrg/PolyMath

Changelog of modifications is available here:
https://github.com/PolyMathOrg/PolyMath/milestone/1?closed=1

You can install the 1.0 version in a fresh Pharo 7.0 with the
following code snippet:

Metacello new
repository: ‘github://PolyMathOrg/PolyMath:v1.0/src‘;
baseline: ‘PolyMath’;
load

Thank you Hemal, Oleks, Atharva, Nikhil, Konrad and Werner for your
help on this release.
I will do a PolyMath 1.0 talk at ESUG 2019.

Regards,

Serge Stinckwich

[ANN] Pharo Pomodoro now on GitHub

I migrated my Pomodoro timer project to GitHub now:

https://github.com/astares/Pharo-Pomodoro

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

See also https://twitter.com/TorstenAstares/status/1161212424982290435

Bye
T.

And yes – additionally to my blog http://astares.blogspot.com
you will also find my news on Twitter now https://twitter.com/TorstenAstares

[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.

[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.

Changelog

  • 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.

 

[ANN] Pharo Chip Designer

Hi,

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.
Cheers,
— Pavel
PharoChipDesigner.gif