In a 'blast from the past', I sent my first pingback after writing the previous post. A pingback is a way for a blogger to send a message to another blogger, informing them they've written a post that refers to theirs, e.g. as a reply or an extension of the ideas raised.

The process is a bit more involved than using a webmention, which I've used before and implemented support for a while back, due to requiring an XML message to be created rather than a simple exchange of URLs.

First, I created a file pingback.xml containing the URLs of the blog post I wrote and the one I made reference to within my post. The standard defines the schema, resulting in the following:

<?xml version="1.0" encoding="UTF-8"?>

Next, I used curl on the command-line to send this file in a POST request to Wordpress's pingback service. I had to use the -k option to make this work - bypassing verification of the TLS certificate.

curl -k -d @pingback.xml

In a sign things were going well, I saw the following appear in my website's access log: - - [29/Oct/2023:09:35:06 +0100] "GET /blog/posts/agent_based_models_digital_twins/ HTTP/1.1" 200 2676 "" ";; verifying pingback from"

Finally, I received the following response to my curl request on the command-line:

<?xml version="1.0" encoding="UTF-8"?>
      <string>Pingback from to registered. Keep the web talking! :-)</string>

That "Keep the web talking! :-)" message made me smile.

In order to understand a bit better how things were being processed, I checked the Wordpress code for its pingback service, and it appears they take the title of the linked article as the author, which seems a bit odd. The pingback standard didn't allow for anything but the swapping out of links though. How your reference is summarized on the referred site is entirely left to recipient - who may process pingbacks manually or use a service automating (parts of) the processing.

Wordpress processes pingbacks automatically, turning them into comments on the original post. As the comment text, Wordpress uses the link text in the anchor element with a horizontal ellipsis around it, and some filtering to prevent the comment from being too long. It's odd how the standard didn't define further approaches to make this a bit easier. A pingback attribute in the anchor element would have been helpful for instance, as we could put some text in there to summarise our page when the pingback is processed automatically. Most surprisingly maybe, with the benefit of hindsight, it would have been interesting had the subsequent standard that emerged, Webmention, implemented some further enhancements. Aaron Parecki, author of the Webmention W3C Recommendation, might know if that was ever considered, or just not within the use case for pingbacks / webmentions? There seemed to have been some thought put into it in 2019 at least.

A new approach to modeling using categories and software, facilitating the build of advanced models like digital twins, is being developed at the moment.

During the 2023 SIAM Conference on Computational Science and Engineering, a group of researchers presented their

diagrammatic representations that provide an intuitive interface for specifying the relationships between variables in a system of equations, a method for composing systems equations into a multiphysics model using an operad of wiring diagrams, and an algorithm for deriving solvers using directed hypergraphs, yielding a method of generating executable systems from these diagrams using the operators of discrete exterior calculus on a simplicial set. The generated solvers produce numerical solutions consistent with state of the art open source tools.

As pointed out, mathematics can rarely be isomorphic to its software implementation, yet here the researchers go a long way in enabling that.

Using Julia language, the applied category theorists working on this concept wrote a software (StockFlow) which allows users to build stock-flow diagrams and do all sorts of things with them - from drawing them over to transforming them into other forms like dynamical systems and system structure diagrams, or to solving the underlying differential equations.

The team have also built software (ModelCollab) that hides all the Julia code again, enabling people that aren't educated mathematicians or computer scientists to apply this way of modeling in their work.

This fascinates me, as having a way to write and audit complex systems like digital twins using free and open-source approaches can be transformative in making them accessible for smaller organisations or developed for non-core departments in bigger organisations that up to now are the only ones with enough money or people to develop them for their key operations.

Read more on John Baez's blog.

Six years ago, I wrote about Simple Features (sf) in R. I mapped the number of pupils per high school in the Perth metro area. At the time, I didn't include how to obtain the shapefile, provided as open data by Landgate on behalf of the Western Australian government through its Shared Location Information Platform (SLIP).

I have now updated the script, available in my code repository, with an R implementation of the methodology in SLIP's How To Guides (Archive).

The relevant code looks as follows, simplified greatly through the use of the httr2 library - the equivalent of the Requests library used in the Python example in the SLIP knowledge base:

tempdirSHP <- tempdir()
tempfileSHP <- tempfile()
# Create the token request
req <- request("") |>
    req_headers("Authorization" = "Basic ZGlyZWN0LWRvd25sb2Fk") |>
    req_body_form(grant_type = "password",
                  # SLIP username and password stored in
                  # pass - the standard unix password manager
                  username = system2("pass", args = " | grep Username | sed -e 's/Username: //'", stdout = TRUE),
                  password = system2("pass", args = " | head -1", stdout = TRUE))
# Obtain the token response
tokenResponse <- req_perform(req)
# Define the SLIP file to download
slipUrl <-  ""
# Create the request for the SLIP file using the received token
req <- request(slipUrl) |>
    req_headers( 'Authorization' = paste0('Bearer ',resp_body_json(tokenResponse)$access_token))
# Obtain the SLIP file using the created request
responseSlip <- req_perform(req)

An updated plot of the high school enrollment numbers looks as follows (for clarity, I've only included the names of schools in the top 5% as ranked by student numbers):

Pupil density in Western Australian high schools

Back in May 2022, I made a bet Australian house prices would decline relative to Belgian ones, and the Australian cash rate wouldn't grow as high as the Euro-zone one. On that day, the RBA had lifted the Australian cash rate from the historical low of 0.10% to 0.35%. Today, that rate stands at 4.10%, with the latest increase in a series of 12 having happened at the start of June 2023 - an increase of 4%pt.

The European central bank in the mean time has raised its main refinancing operations rate 9 times since July 2022 from 0% to 4.25% at the start of August 2023, an increase of 4.25%pt.

Both the Australian and the Belgian government have statistical offices publishing median house prices. The way these are tracked varies slightly between the countries. In Belgium, Statbel publishes median prices for 3 types of residential dwellings every quarter, and the corresponding number of transactions that happened for each of these. The Australian Bureau of Statistics on the other hand publishes a median residential dwelling price every month, which is based on a stratification by dwellings type taken from the census which happens every 4 years.

Table with evolution of house prices

Of course, the AUD/EUR exchange rate needs to be taken into account as well. I've adjusted the prices using the weighted average monthly exchange rate. This way, we can compare the price evolution in a way that takes into account the evolving difference in purchasing power between the currencies of the 2 nations.

Plot with evolution of house prices in EUR

Comparing the first 3 months of 2021 to the first 3 months of 2023, the relative price of an Australian residential dwelling has gone to 92% of what it was when compared to its Belgian equivalent. If the starting point is Q1 2022, just before the rates started going up, the difference is an even starker 16% relative decline in price!

So far, both bets seem to have been correct - house prices in Australia have significantly gone down relative to the Belgian ones since the interest rate hikes started, and the cash rate in Europe, which started slightly lower than the one in Australia, has already surpassed it.

Moving countries means learning about a new culture. Even after 10 years in Australia, I am still discovering quirky things people raised here don't think twice about. One of these is the tradition of cutting up oranges for kids playing sports to eat during their half-time. It's not just any fruit - it simply always is oranges. It doesn't have to be oranges, except that it does, as this is just what people expect. Such a lovely tradition! Tomorrow is already the last competition day of netball in WA for the 2023 season, and my first as the parent responsible to bring in the oranges.


Perth, Western Australia is a sunny place, as any local will confirm. Combined with subsidised buyback tariffs for electricity returned into the grid, this has resulted in many local households now having an array of solar panels on their roof.

What most will intuitively understand is the production of these panels varying over the year. That's a combination of the differences in average cloud cover on the one hand, and on the other hand the amount of energy that falls down on the panel from the sun varying over the year due to the tilted axis of the earth.

Combined, this results in significantly different levels of energy available on our roofs throughout the year.

Table: Average solar exposure per m2 in Kings Park, Perth Jan 2017 to Jun 2023.

Month Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

MJ/m2 949,152 741,432 642,187 484,428 362,085 280,690 297,863 411,215 548,154 718,831 831,845 958,651

Right now in June, we're at the low point for the year in expected yield from a solar panel, with just about a third of the energy being generated that we can expect to get in Dec.

With summer having come to an end over here in Western Australia, the wind-filled afternoons are also behind us for a few months. While the prevailing easterlies that now reign make for glassy ocean conditions, they're generally not strong enough for wing surfing. Most Autumn days don't bring enough swell to go out surfing either around the area I live. This prompted me to try out a new activity - balance boarding.

I bought the board online from a Sunshine Coast family business, Barefoot & Salty. It came with 2 cork rollers, 5cm and 8cm in diameter. They were really nice to deal with, and included a handwritten thank-you note in the shipment. A lovely touch.

Just a few days in, I can already see a lot of progress, and it's proving to be a really fun activity for which I don't even need to leave the house.

Keep on riding :)

Barefoot & Salty XL Surf balance board


Following on from my last post on joining the indieweb...

Back in February, I implemented Webmentions on my website. I took a roll-my-own approach, borrowing from an idea by superkuh. It's a semi-automated solution which listens for webmentions using nginx. When (if) one is received, an email is generated that tells me about this, allowing me to validate it's a genuine comment.

Technically, nginx logs the body of POST requests in its logfile.

In the main configuration file /etc/nginx/nginx.conf, I've added

# Defined for Webmention logging support of
log_format postdata '$time_local,$remote_addr,"$http_user_agent",$request_body';

In the configuration for, the following lines enable logging webmention requests:

# use proxying to self to get the HTTP post variables.
    location = /webmention {
    limit_req zone=webmention;
    client_max_body_size 7k;
    if ($request_method = POST) {
            access_log /var/log/nginx/postdata.log postdata;
            proxy_pass $scheme://;
    return 204 $scheme://$host/serviceup.html;
    location /logsink {
    #return 200;
    # use 204 instead of 200 so no 0 byte file is sent to browsers from HTTP forms.
    return 204;

Before the server section in there, I'm reducing the risk of abuse by rate limiting requests:

limit_req_zone  $server_name  zone=webmention:1m   rate=2r/s;

The logfile is being monitored by a service calling a shell script:

# Service starts on boot in /etc/systemd/system/webmention.service
inotifywait -s -m $WEBMENTION_LOG --format "%e %w%f" --event modify|
while read CHANGED;
    echo "$CHANGED"
    logger "Webmention received"
    tail -n1 $WEBMENTION_LOG | /usr/bin/mail -a'From: niihau webmention service <webmaster@email.address>' -s 'Webmention received' $TO

This uses inotifywait, which is part of inotify-tools. Unfortunately, logrotate will remove the log file on a regular basis, which is done in 3 steps. The first 2 steps results in a MODIFY event, before a DELETE event is created. That results in 2 emails being sent every time logs are rotated if using the above script. I've not tried to ignore these yet - checking for logrotate running at the time an event is triggered could be a solution.

The systemd service is defined in /etc/systemd/system/webmention.service:

Description=Service to monitor nginx log for webmentions



Announcing I'm accepting webmentions is as simple as putting the endpoint in the header of the blog:

<link rel="webmention" href="">

Clearly federating conversation as the final level of joining the indieweb is quite a bit more complicated than achieving 'level 2' status on

Public Sector Network's Innovate WA conference today started with a poll amongst the attendees, asking for our biggest goal or aspiration for the public sector in Western Australia. Overwhelmingly, collaboration came out as the main opportunity for contributors and decision makers in the sector. Closely linked was the desire to better share data between government departments and functions. In his opening address, WA Minister for Innovation Stephen Dawson touched on that, mentioning the State Government is planning to introduce legislation later this year around privacy and responsible data sharing. This will be the first time WA government agencies and state-owned enterprises will be subject to privacy laws, and at the same time is hoped to encourage data sharing that should result in better outcomes for citizens of the state.

poll results

Greg Italiano, the state government's CIO, gave an update on the digital transformation of the WA government. Delivering a digital identity has been a key milestone so far - no easy task given the many arms of government at state and federal level that were involved. He acknowledged the Service WA app doesn't offer a compelling range of services to deal with government so far though - finding your best deal for refueling and notices on shark detections probably don't top the list of needs for many.

With an ability to digitally authenticate as yourself, many options now do exist for future enhancements. This was also the viewpoint of Hans Jayatissa, who spoke about the steps the Danish government has taken over the last 20 years that have brought the country to be the world leader in digital government.

All the focus on 'digital first' should not result in 'digital only' though, which came out strongly in a review of the blueprint to ensure digital inclusivity in government. To that end, it was great to hear several actions have been planned to help specific groups in society at risk of being left behind: people in regional communities, older people, Aboriginal communities, people from different cultural and linguistic backgrounds all have a range of reasons why they may be digitally excluded: lacking education on how to use IT, no access to devices like internet-connected phones or computers, lacking budgets to pay for connectivity, etc. A human-centered approach to digital inclusivity clearly brought out what to work on to ensure everyone will have a decent opportunity to access an increasingly digital world.

Giselle Rowe and Danielle Giles in their respective talks provided excellent advice on how to foster innovation in an organisation. The former listed out a range of factors for success - an understanding of 'what is in it for me', small steps, supportive leadership, innovation ambassadors all are enablers for changing business processes. The latter convinced the conference room of the power of simple 2 minute exercises like creating a portrait of the person you are working with without taking your eyes of them, or continuously asking 'who are you' as a variant of the '5 why technique' demonstrating how you need multiple attempts at answering the same question to get to a root truth.

Great to see such a focus on enabling and supporting innovation, not only to streamline access to government services, but also in the wider economy to help keep Australia shine on the world stage!

After setting a personal objective late last year of reaching 'level 2' on the indieweb, with the ability to send WebMentions, I stumbled on Bring Back Blogging yesterday. I love how some people are dedicated to keeping a decentralised internet available and of relevance.

Over the past month, I created an OpenGraph plugin for IkiWiki which allows to add customized Open Graph tags to posts on my blog. This in combination with standard IkiWiki blog support seems equivalent to an h-entry, which was a level 1 feature.

I've also added an h-card to the About section of this site, thereby completing the first part of the level 2 requirements.

Yet to do are the WebMentions. There were some conversations about that on the IkiWiki discussion forum years ago, but no code was checked in to complete the feature. At its simplest, it appears to be a matter of including another site's blog post in yours and sending of a ping to the site to inform it about this. Having the ability to receive back seems quite a bit harder.

This blog is powered by ikiwiki.