Monthly Archives: March 2019

[Ann] NeoDNS

About Paleo-DNS….
This did already exist in various forms, a couple of years ago I made a newer version, they can all be found in!/~BenComan/DNS/ – including unit tests (but some of the older code in there is a bit stale).

It covers most record types, but most of them are not used a lot.

Simple usage:

NeoSimplifiedDNSClient default addressForName: ‘‘. “”

One of my goals was to use it as a more reliable, non-blocking ‘do we have internet access’ test:

NeoNetworkState default hasInternetConnection. “true”

From the class comments:

I am NeoSimplifiedDNSClient.

I resolve fully qualified hostnames into low level IP addresses.

NeoSimplifiedDNSClient default addressForName: ‘‘.

I use the UDP DNS protocol.
I handle localhost and dot-decimal notation.

I can be used to resolve Multicast DNS addresses too.

NeoSimplifiedDNSClient new useMulticastDNS; addressForName: ‘zappy.local’.


I execute requests sequentially and do not cache results.
This means that only one request can be active at any single moment.
It is technically not really necessary to use my default instance as I do not hold state.
I am NeoDNSClient.
I am a NeoSimplifiedDNSClient.

NeoDNSClient default addressForName: ‘‘.

I add caching respecting ttl to DNS requests.
I allow for multiple outstanding requests to be handled concurrently.


UDP requests are asynchroneous and unreliable by definition. Since DNS requests can take some time, it should be possible to have multiple in flight at the same time, thus concurrently. Replies will arrive out of order and need to be matched to their outstanding request by id.

If a request has been seen before and its response is not expired, it will be answered from the cache.

Each incoming request is handled by creating a NeoDNSRequest object and adding that to the request queue. This triggers the start up of the backend process, if necessary. The client then waits on the semaphore inside the request object, limited by the timeout.

The backend process loops while there are still outstanding requests that have not expired. It sends all unsent requests at once, and then listens briefly for incoming replies. It cleans up expired requests. When a reply comes in, it is connected to its request by id. The semaphore in the request object is then signalled so that the waiting client can continue and the request is removed from the queue. The process then loops. If the queue is empty, the backend process stops.



[Ann] Paleo-DNS

Norbert and me looked at using DNS for service discovery and ran into some of the limitations of the NetNameResolver[1]. In the end I created an initial DNS implementation in Pharo called Paleo-DNS[2] to overcome these.

DNS is a protocol we use every day but rarely think of. There is an active IETF community that is evolving the protocol and finding new usages (service discovery is one of them).

In DNS there are different types of resource records (RR). The most commonly used ones in a client (“stub”) are “A” for IPv4 addresses, “AAAA” for IPv6 addresses, “CNAME” for aliases, “SRV” records. So far only support for “A” records was implemented.

So if you are curious about DNS then this is a great opportunity to add your favorite RR implementation to it and send a PR. There are probably 20+ of them to go. 😉

Query example using DNS-over-TLS (DoT) to Google Public DNS

PaleoDNSTLSTransport new
destAddress: #[8 8 4 4] port: 853;
timeout: 2 seconds;
query: (PaleoDNSQuery new
transactionId: (SharedRandom globalGenerator nextInt: 65535);
addQuestion: (PaleoRRA new rr_name: ‘’);
addAdditional: (PaleoRROpt new udpPayloadSize: 4096))

[1] It’s blocking on Unix, on Mac only one look-up may occur at a time and it returns exactly one address. There is also no IPv6 support.


[Ann] Pharo Launcher 1.8.1

Hi all,

Pharo Launcher 1.8.1 has just been released! It is available from
Here is the changelog:

Bug fixes:

  • #326 Edit image description doesn’t update when editing existing description
  • #325 Instance of MacProcess did not understand #waitForCommand:
  • #324 sources file not found for Pharo < 3.0
  • #321 abort process if not responding. Uses TaskIt
  • #239 Mac OS menus display “SqueakOSXApp” instead of « PharoLauncher »
  • #323 Check if should be updated
  • #322 do not try to run image without preferences if not supported by the image
Thanks to all contributors, including issue reports.
The Pharo team.

[Ann] Managing your Code with Iceberg


A first version of the first part of the book “managing your book with iceberg” is available at



[Ann] Pharo with Style at


I happy to announce that Pharo with Style is now available from

If you want to sponsor this book, let me know 🙂


[Ann] How to get started with Iceberg



I’m happy to announce a new booklet (soon to be released) on how to manage code with Iceberg. We plan to discuss management patterns in the future.

Stef and Guille

[ANN] Lan.d.s Alpha: All Along the Language Tower

Dear friends !

I am quite excited to announce the availability of an alpha version
of my latest work around Parsing and Programming Languages at:

Accompanied by ~ 30 min of transcribed eye-candy:

Backed by a crowdfunding campaign ! To get the book and stable release
successfully out of the door:

Click, download, watch, enjoy ! If you like what you see, support the project ! Tiers
start from 5 and 10 euros per chapter for individuals. Companies supporting
the project can get 6 to 12 days of consultancy, on-site workshops and other perks.


What is all about ??

Lan.d.s is a new solution for language design. From general purpose
like Lise (short for (list (embedding)) to Domain-Specific
Languages using the MOODs framework
, and everything else in between.
Lan.d.s is build around the formalism of Multi-Ordered Grammars,
which are a possible alternative to CFGs and PEGs in wider use today.

Multi-ordered grammars (or simply MOGs) aim for a better exploration of ambiguity,
recursion, ordering and associativity during language design. They can be parsed using the
Gray Algorithm.
After parsing in order to ease the production of executable code
Lan.d.s introduces the Abstract Syntax Language (ASL), which is an OO
solution for compile-time meta-programming. Finally in order to promote
language extension and re-use, Lan.d.s employs GrammarTraits, as units of
composition for both MOG rules and ASL actions.


Some random highlights for the impatient:

* Object subclass: #Prediction uses: Future syntax

* Languages are everywhere, they are all around you, even now in this very sentence.

* Study SICP with a Xerox flavor, while re-inventing some Bell-labs utilities.

* TOC-Board, the TOC for your next talk 😉

Enjoy !