Monthly Archives: July 2018

Sharing some discussions

To give you a feel of the friendliness of the Pharo community, here is a part of a discussion:

Hi Offray,

> On 27 Jul 2018, at 12:39, Offray Vladimir Luna Cárdenas <offray.luna at> wrote:
> Hi,
> I was ready to show a friend the Pharo web capabilities with the
> classical "myString asUrl retrieveContents", but the friend gave me a
> url that contains non Latin characters[1] and then I got an
> ZnInvalidUTF8 error.
> [1]
> How can I process web addresses in Pharo that contain non latin
> characters like the one in [1]?

I am on holiday, so I cannot go too deep into this, but AFAIU the URL is wrong (or it assumes a specific context with a non-standard encoding).

In a URL's query part, non-ASCII data is first UTF-8 encoded, then percent encoded (this is the modern way).

I don't read Chinese, so it is hard to infer much from the original site, but I am assuming the search is for '喀什', a city called Kashgar,

The string in question can be written as (to avoid copy/paste problems):

  String with: 21888 asCharacter with: 20160 asCharacter.

The encoding in a URL has to be:

  ZnPercentEncoder new encode: (String with: 21888 asCharacter with: 20160 asCharacter).

This gives us for example the following URL:

  '' asUrl.

Which parses OK and contains the correct encoded string (decoded in the URL object):

  '' asUrl queryAt: #q.

If you copy/paste that URL in your browser it should resolve to stuff about Kashgar.

Obviously the website does something else (non-standard ?).



> Thanks,
> Offray

Cryptography on github

After several attempts to solve the Cryptography package problems over the years I decided to move it on my own to github.

What I did:

- researched all authors and used the git migration tool to get the package from smalltalkhub to github 
- released a version 0.1 that should be exactly the same as the code on smalltalkhub for people that want to change
- fixed an occurrence of IfNotNilDo: in the Cryptography package to make it load in pharo7
- added a metacello baseline
- added a group „all" that loads everything like it is now with one package
- added travis files and enable travis checks for pull requests
- released a version 0.2 that contains the original code plus travis and metacello
- Started to cut off the ASN1, PKCS12 and X509 classes in separate packages
- Added to each new package a -Tests package containing tests
- constructed all dependencies in the baseline
- added a core group that loads the now slimmed down package solely

I must say this was really great with the help of promote-demote package tag functionality and the dependency browser. The only thing missing is kind of a tool to construct the metacello baseline. I miss Versionner here.

What I didn’t do:

- checking all the other packages in the repo. There are packages with old style ffi calls and things that seem to be squeak dependent.

I hope with the time and people’s complaints we can figure out what is obsolete and what needs to be adjusted.

The repository is now at <>

but I’m happy to move it to a better place if someone has an idea. 

Pull requests and tickets are welcome.

Hope you like it,


New success story: LawTracker

Here is a new success story around Pharo.

Do not hesitate to send to us your success stories.

About dynabook and DrGeo


The Dynabook concept and Dr. Geo share some values.

Here is how




I am finally releasing an initial public version of Pharo Git Thermite, a tool that I am developing as part of my master thesis for visualizing Monticello and Git commits, for Pharo and Python:

GitHub Page with sources/documentation/issue tracker:

Short video examples:
- Monticello Visualization;
- GitHub pull request:
- Local git commit:

Feedback form:

Best regards,

Google API

I created a new repo at since the original repo is self-hosted, I don’t know what the contribution policy is, and I need the fix to continue my work. I’ll keep the MC meta info so that my changes can be merged back if desired.

Fun fact. I was able to send a multipart text & html email after a few gotchas. Here is the script in case someone wants to do the same:
| api message raw |
api := GoogleGmailApiUsersMessages new.
api authenticate.
message := MailMessage
from: ‘”Mr. Sender” <>’
to: { ‘”Mrs. Receiver” <>’. }
about: ‘Thank you!’
asFollows: ”.
addAlternativePart: self plainTextString contentType: ‘text/plain’;
addAlternativePart: self htmlString
contentType: ‘text/html’.
raw := message asSendableText base64Encoded.
“Web-safe base64 from
raw := raw copyReplaceAll: ‘+’ with: ‘-‘.
raw := raw copyReplaceAll: ‘/’ with: ‘_’.
api send: ‘’ api options: (Dictionary with: ‘raw’ -> raw)

where #send:options: is just the generated #send: with an argument passed through (instead of nil) as the last argument to:

^ self makeRequestTo: path usingMethod: action with: optionsDict.

[ANN] New Academic Partner: University of Yaoundé 1

The Pharo Consortium is very happy to announce that University of Yaoundé 1 has joined as a Academic Partner.

- University of Yaoundé 1:
- Pharo Consortium:

The goal of the Pharo Consortium is to allow companies and institutions to
support the ongoing development and future of Pharo.

Individuals can support Pharo via the Pharo Association:

[ANN] New Academic Partner: SQLab

The Pharo Consortium is very happy to announce that SQLab has joined as a Academic Partner.

- Software Quality Laboratory, Part of University of Novi Sad:
- Pharo Consortium:

The goal of the Pharo Consortium is to allow companies and institutions to
support the ongoing development and future of Pharo.

Individuals can support Pharo via the Pharo Association: