]> git.vanrenterghem.biz Git - www2.vanrenterghem.biz.git/commitdiff
Verwijder mdwn bestanden.
authorFrederik Vanrenterghem <frederik@vanrenterghem.biz>
Mon, 11 Dec 2023 14:21:19 +0000 (22:21 +0800)
committerFrederik Vanrenterghem <frederik@vanrenterghem.biz>
Mon, 11 Dec 2023 14:21:19 +0000 (22:21 +0800)
46 files changed:
source/posts/AUC_and_economics_of_predictive_modelling.mdwn [deleted file]
source/posts/Bluetooth.mdwn [deleted file]
source/posts/Bring_Back_Blogging.mdwn [deleted file]
source/posts/Debian_on_A20.mdwn [deleted file]
source/posts/Fearless_analysis.mdwn [deleted file]
source/posts/FedEx_marries_TNT.mdwn [deleted file]
source/posts/Fibonacci_golden_spiral.mdwn [deleted file]
source/posts/Half_Time_Oranges.mdwn [deleted file]
source/posts/I_bought_a_balance_board.mdwn [deleted file]
source/posts/Implementing_Webmention_on_my_blog.mdwn [deleted file]
source/posts/In_the_pines.mdwn [deleted file]
source/posts/Innovate_WA_2023.mdwn [deleted file]
source/posts/Magna_Carta.mdwn [deleted file]
source/posts/NYC_taxi_calendar_fun.mdwn [deleted file]
source/posts/Nobel_prize_winner_having_fun.mdwn [deleted file]
source/posts/Perth_solar_exposure_over_year.mdwn [deleted file]
source/posts/R_and_github.mdwn [deleted file]
source/posts/Ronald_McDonald_House.mdwn [deleted file]
source/posts/Setting_up_an_Analytics_Practice.mdwn [deleted file]
source/posts/WADSIH_talk_on_consumer_insights.mdwn [deleted file]
source/posts/WA_roads_in_R_using_sf.mdwn [deleted file]
source/posts/agent_based_models_digital_twins.mdwn [deleted file]
source/posts/azure_file_storage_blobs.mdwn [deleted file]
source/posts/different_spin_to_competing_on_analytics.mdwn [deleted file]
source/posts/explore-AU-road-fatalities.mdwn [deleted file]
source/posts/facet_labels_in_R.mdwn [deleted file]
source/posts/fertile-summers.mdwn [deleted file]
source/posts/first_r_package.mdwn [deleted file]
source/posts/fun_with_RJDBC_and_RODBC.mdwn [deleted file]
source/posts/generating_album_art_on_N9.mdwn [deleted file]
source/posts/house_price_evolution.mdwn [deleted file]
source/posts/loans_and_semi_Markov_chains.mdwn [deleted file]
source/posts/managing_data_science_work.mdwn [deleted file]
source/posts/monetary_policy_and_mortgage_products.mdwn [deleted file]
source/posts/my_management_style_mission_control.mdwn [deleted file]
source/posts/new_blog_activated.mdwn [deleted file]
source/posts/obnam_multi_client_encrypted_backups.mdwn [deleted file]
source/posts/obtaining_SLIP_data_using_R.mdwn [deleted file]
source/posts/on_social_media.mdwn [deleted file]
source/posts/sending_pingback_oldskool_indieweb.mdwn [deleted file]
source/posts/spatial_indexes_to_plot_income_per_postal_code_in_Australian_cities.mdwn [deleted file]
source/posts/state-of_SaaS.mdwn [deleted file]
source/posts/survival_analysis_in_fintech.mdwn [deleted file]
source/posts/using_Apache_Nifi_Kafka_big_data_tools.mdwn [deleted file]
source/posts/using_R_to_automate_reports.mdwn [deleted file]
source/posts/using_spatial_features_and_openstreetmap.mdwn [deleted file]

diff --git a/source/posts/AUC_and_economics_of_predictive_modelling.mdwn b/source/posts/AUC_and_economics_of_predictive_modelling.mdwn
deleted file mode 100644 (file)
index 268e048..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-[[!meta date="2017-01-11 04:12:52 +1300"]]
-[[!tag R analysis economics forecasting]]
-The strenght of a predictive, machine-learning model is often evaluated by quoting the area under the curve or AUC (or similarly the Gini coefficient). This AUC represents the area under the ROC line, which shows the trade-off between false positives and true positives for different cutoff values. Cutoff values enable the use of a regression model for classification purposes, by marking the value below and above which either of the classifier values is predicted. Models with a higher AUC (or a higher Gini coefficient) are considered better.
-
-This oversimplifies the challenge facing any real-world model builder. The diagonal line from (0,0) to (1,1) is a first hint at that. Representing a model randomly guessing, this model with an AUC of .5 is effectively worth nothing. Now assume a model with the same AUC, but for a certain range of cutoffs its curve veers above the diagonal, and for another it veers below it.
-
-Such a model may very well have some practical use. This can be determined by introducing an **indifference line** to the ROC analysis. The upper-left area of the ROC space left by that line is where the model makes economical sense to use.
-
-The slope of the line (s) is defined mathematically as follows:
-
-slope s = (ratio negative * (utility TN - utility FP)) / (ratio positive * (utility TP - utility FN))
-
-This with *ratio negative* the base rate of negative outcomes, *utility TN* the economic value of identifying a true negative, and so on.
-
-Many such lines can be drawn on any square space - the left-most one crossing either (0,0) or (1,1) is the one we care about.
-
-This line represents combinations of true positive rates and false positive rates that have the same utility to the user. In the event of equal classes and equal utilities, this line is the diagonal of the random model.
-
-[[!img pics/indifference-line.png size="300x300" alt="ROC space plot with indifference line."]]
-
-An optimal and viable cutoff is the point of the tangent of the left-most parallel line to the indifference line and the ROC curve.
-
-The code to create a graphic like above is shown below. Of note is the conversion to `coord_fixed` which ensures the plot is actually a square as intended.
-
-[[!format r """
-library(ggplot2)
-library(dplyr)
-r.p <- nrow(filter(dataset, y == 'Positive')) / nrow(dataset)
-r.n <- 1- r.p
-uFP <- -10 
-uFN <- -2
-uTP <- 20
-uTN <- 0
-s <- (r.n * (uTN - uFP)) / (r.p * (uTP - uFN)) # equals .4 
-ROC.plot + # start from a previous plot with the ROC space
-  coord_fixed() + # Fix aspect ratio - allows to convert slope to angle and also better for plotted data
-  geom_abline(intercept = ifelse(s < 1, 1-s, 0), slope = s, colour = "blue") + 
-  annotate("text", x = 0.05, y = ifelse(s < 1, 1 - s -.01, 0), angle = atan(s) * 180/pi, label = "Indifference line", hjust = 0, colour = "blue")
-"""]]
-
-[Reference article](http://fulltext.study/article/3468080/A-principled-approach-to-setting-optimal-diagnostic-thresholds-where-ROC-and-indifference-curves-meet)
diff --git a/source/posts/Bluetooth.mdwn b/source/posts/Bluetooth.mdwn
deleted file mode 100644 (file)
index 227b013..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-[[!meta date="2015-03-27 01:24:28 +1300"]]
-Wondering which bluetooth chipsets have free firmware. Debian non-free contains Broadcom firmware, but are more ndiswrapper tricks needed for others?
diff --git a/source/posts/Bring_Back_Blogging.mdwn b/source/posts/Bring_Back_Blogging.mdwn
deleted file mode 100644 (file)
index 73894c9..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-[[!meta date="2023-01-02 19:35:28 +0800"]]
-[[!opengraph2 ogimage="https://indieweb.org/File:indiewebcamp-logo-lockup-color@3x.png"]]
-[[!tag indieweb blogging open_web]]
-
-After setting a personal objective late last year of reaching ['level 2' on the indieweb](https://indiewebify.me/send-webmentions/), with the ability to send [WebMentions](http://webmention.org/), I stumbled on [Bring Back Blogging](https://bringback.blog/) 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](http://git.vanrenterghem.biz/git.ikiwiki.info.git/blob/6c546c8f3182668c6d21d578b789674894f18c39:/IkiWiki/Plugin/opengraph2.pm) which allows to add customized [Open Graph](ogp.me) tags to posts on my blog. This in combination with standard IkiWiki blog support seems equivalent to an [h-entry](http://microformats.org/wiki/h-entry), which was a level 1 feature.
-
-I've also added an [h-card](https://microformats.org/wiki/h-card) to the [About](https://www.vanrenterghem.biz/About/index.shtml) 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](https://ikiwiki.info/todo/pingback_support/) 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.
diff --git a/source/posts/Debian_on_A20.mdwn b/source/posts/Debian_on_A20.mdwn
deleted file mode 100644 (file)
index 0c6ac02..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[[!meta date="2015-03-17 04:08:26 +1300"]]
-[Installing Debian on A20 development board](http://www.vanrenterghem.biz/Linux/Installing_Debian_on_Lime2.shtml)
-
diff --git a/source/posts/Fearless_analysis.mdwn b/source/posts/Fearless_analysis.mdwn
deleted file mode 100644 (file)
index 5c30303..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-[[!meta date="2015-08-22 01:47:57 +1200"]]
-['There is no silver bullet': Isis, al-Qaida and the myths of terrorism](http://www.theguardian.com/world/2015/aug/19/isis-al-qaida-myths-terrorism-war-mistakes-9-11)
-
-> The west’s response to 9/11 was the catastrophic ‘war on terror’. Have we learned from our mistakes with
-> al-Qaida, or is history repeating itself with Isis?
-
-As Boyd said: Observe, orient, decide, act. Seems that second step is forgotten these days.
-
diff --git a/source/posts/FedEx_marries_TNT.mdwn b/source/posts/FedEx_marries_TNT.mdwn
deleted file mode 100644 (file)
index 05a6670..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-[[!meta date="2015-04-07 20:05:21 +1200"]]
-Well, that one has been in the works for a while! Buying a solid European network for two-thirds of what UPS was willing to pay for it a few years ago sounds like a great deal.
-
-[FedEx to buy TNT to expand Europe deliveries](http://www.reuters.com/article/2015/04/07/us-tnt-express-m-a-fedex-idUSKBN0MY06G20150407)
-
-> AMSTERDAM (Reuters) - FedEx Corp <FDX.N> is seeking to buy Dutch package delivery firm TNT Express 
-> for an agreed 4.4 billion euros ($4.8 billion), aiming to succeed where United Parcel Service <UPS.N>
diff --git a/source/posts/Fibonacci_golden_spiral.mdwn b/source/posts/Fibonacci_golden_spiral.mdwn
deleted file mode 100644 (file)
index 3aecd5d..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-[[!meta date="2019-09-16 22:03:03 +0800"]]\r
-[[!tag mathematics R visualisation]]\r
-\r
-# What\r
-\r
-After having read the first part of a Rcpp tutorial which compared native R vs C++ implementations of a Fibonacci sequence generator, I resorted to drawing the so-called Golden Spiral using R.\r
-\r
-\r
-# Details\r
-\r
-Libraries used in this example are the following\r
-\r
-    library(ggplot2)\r
-    library(plotrix)\r
-\r
-In polar coordinates, this special instance of a logarithmic spiral's functional representation can be simplified to r(t) = e<sup>(0.0635\*t)</sup>\r
-For every quarter turn, the corresponding point on the spiral is a factor of phi further from the origin (r is this distance), with phi the golden ratio - the same one obtained from dividing any 2 sufficiently big successive numbers on a Fibonacci sequence, which is how the golden ratio, the golden spiral and Fibonacci sequences are linked concepts!\r
-\r
-    polar_golden_spiral <- function(theta) exp(0.30635*theta)\r
-\r
-Let's do 2 full circles. First, I create a sequence of angle values theta. Since 2 \* PI is the equivalent of a circle in polar coordinates, we need to have distances from origin for values between 0 and 4 \* PI.\r
-\r
-    seq_theta <- seq(0,4*pi,by=0.05)\r
-    \r
-    dist_from_origin <- sapply(seq_theta,polar_golden_spiral)\r
-\r
-Plotting the function using coord<sub>polar</sub> in ggplot2 does not work as intended. Unexpectedly, the x axis keeps extending instead of circling back once a full circle is reached. Turns out coord<sub>polar</sub> might not really be intended to plot elements in polar vector format.\r
-\r
-    ggplot(data.frame(x = seq_theta, y = dist_from_origin), aes(x,y)) +\r
-        geom_point() +\r
-        coord_polar(theta="x")\r
-\r
-[[failed attempt plotting golden spiral|/pics/golden_spiral-coord_polar-fail.png]]\r
-\r
-To ensure what I was trying to do is possible, I employ a specialised plotfunction instead\r
-\r
-    plotrix::radial.plot(dist_from_origin, seq_theta,rp.type="s", point.col = "blue")\r
-\r
-[[Plotrix golden spiral|/pics/golden_spiral-plotrix.png]]\r
-\r
-With that established and the original objective of the exercise achieved, it still would be nice to be able to accomplish this using ggplot2. To do so, the created sequence above needs to be converted to cartesian coordinates.\r
-The rectangular function equivalent of the golden spiral function r(t) defined above is a(t) = (r(t) cos(t), r(t) sin(t))\r
-It's not too hard to come up with a hack to convert one to the other.\r
-\r
-    cartesian_golden_spiral <- function(theta) {\r
-        a <- polar_golden_spiral(theta)*cos(theta)\r
-        b <- polar_golden_spiral(theta)*sin(theta)\r
-        c(a,b)\r
-    }\r
-\r
-Applying that function to the same series of angles from above and stitching the resulting coordinates in a data frame. Note I'm enclosing the first expression in brackets, which prints it immediately, which is useful when the script is run interactively.\r
-\r
-    (serie <- sapply(seq_theta,cartesian_golden_spiral))\r
-    df <- data.frame(t(serie))\r
-\r
-\r
-# Result\r
-\r
-With everything now ready in the right coordinate system, it's now only a matter of setting some options to make the output look acceptable.\r
-\r
-    ggplot(df, aes(x=X1,y=X2)) +\r
-        geom_path(color="blue") +\r
-        theme(panel.grid.minor = element_blank(),\r
-         axis.text.x = element_blank(),\r
-         axis.text.y = element_blank()) +\r
-        scale_y_continuous(breaks = seq(-20,20,by=10)) +\r
-        scale_x_continuous(breaks = seq(-20,50,by=10)) +\r
-        coord_fixed() +\r
-        labs(title = "Golden spiral",\r
-        subtitle = "Another view on the Fibonacci sequence",\r
-        caption = "Maths from https://www.intmath.com/blog/mathematics/golden-spiral-6512\nCode errors mine.",\r
-        x = "",\r
-        y = "")\r
-\r
-[[ggplot2 version of Golden Spiral|/pics/golden_spiral-ggplot-coord-fixed.png]]\r
-\r
-\r
-# Note on how this post was written.\r
-\r
-After a long hiatus, I set about using emacs, org-mode and ESS together to create this post. All code is part of an .org file, and gets exported to markdown using the orgmode conversion - C-c C-e m m.\r
-\r
diff --git a/source/posts/Half_Time_Oranges.mdwn b/source/posts/Half_Time_Oranges.mdwn
deleted file mode 100644 (file)
index b00adda..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-[[!meta date="2023-08-25 21:36:00 +0800"]]
-[[!opengraph2 ogimage="https://www.vanrenterghem.biz/blog/pics/half-time-oranges.png"]]
-[[!tag Australia]]
-
-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.
-
-[[!img /pics/half-time-oranges.png alt = "Bag of oranges labelled half-time oranges" class = "img-fluid"]]
-
diff --git a/source/posts/I_bought_a_balance_board.mdwn b/source/posts/I_bought_a_balance_board.mdwn
deleted file mode 100644 (file)
index 7035080..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-[[!meta date="2023-05-27 16:44:00 +0800"]]
-[[!opengraph2 ogimage="https://www.vanrenterghem.biz/blog/pics/balance-board.png"]]
-[[!tag boardriding]]
-
-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](https://barefootandsalty.com.au). 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 :)
-
-[[!img /pics/balance-board.png alt="Barefoot & Salty XL Surf balance board" class="img-fluid"]]
-
diff --git a/source/posts/Implementing_Webmention_on_my_blog.mdwn b/source/posts/Implementing_Webmention_on_my_blog.mdwn
deleted file mode 100644 (file)
index d7f9048..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-[[!meta date="2023-05-14 20:32:00 +0800"]]
-[[!opengraph2 ogimage="https://indieweb.org/File:indiewebcamp-logo-lockup-color@3x.png"]]
-[[!tag indieweb blogging open_web]]
-
-Following on from my last [[post on joining the indieweb|Bring_Back_Blogging]]...
-
-Back in February, I implemented Webmentions on my website. I took a roll-my-own approach, borrowing from [an idea by superkuh](http://superkuh.com/blog/2020-01-10-1.html). 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
-
-[[!format  sh """
-# Defined for Webmention logging support of www.vanrenterghem.biz
-log_format postdata '$time_local,$remote_addr,"$http_user_agent",$request_body';
-"""]]
-
-In the configuration for www.vanrenterghem.biz, the following lines enable logging webmention requests:
-
-[[!format  sh """
-# use proxying to self to get the HTTP post variables.
-    # https://stackoverflow.com/questions/4939382/logging-post-data-from-request-body
-    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://www.vanrenterghem.biz/logsink;
-               break;
-       }
-       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:
-
-[[!format  sh """
-limit_req_zone  $server_name  zone=webmention:1m   rate=2r/s;
-"""]]
-
-The logfile is being monitored by a service calling a shell script:
-
-[[!format sh """
-#!/bin/sh
-# Service starts on boot in /etc/systemd/system/webmention.service
-TO=my@email.address
-WEBMENTION_LOG=/var/log/nginx/postdata.log
-inotifywait -s -m $WEBMENTION_LOG --format "%e %w%f" --event modify|
-while read CHANGED;
-do
-    echo "$CHANGED"
-    logger "Webmention received"
-    tail -n1 $WEBMENTION_LOG | /usr/bin/mail -a'From: niihau webmention service <webmaster@email.address>' -s 'Webmention received' $TO
-done
-"""]]
-
-This uses `inotifywait`, which is part of [inotify-tools](https://github.com/inotify-tools/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`:
-
-[[!format  sh """
-[Unit]
-Description=Service to monitor nginx log for webmentions
-After=multi-user.target
-
-[Service]
-ExecStart=/root/webmention_service.sh
-
-[Install]
-WantedBy=multi-user.target
-"""]]
-
-Announcing I'm accepting webmentions is as simple as putting the endpoint in the header of the blog:
-
-[[!format  html """
-<link rel="webmention" href="https://www.vanrenterghem.biz/webmention">
-"""]]
-
-Clearly federating conversation as the final level of joining the indieweb is quite a bit more complicated than achieving 'level 2' status on [indiewebify.me](https://indiewebify.me/).
diff --git a/source/posts/In_the_pines.mdwn b/source/posts/In_the_pines.mdwn
deleted file mode 100644 (file)
index 6a9aa45..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-[[!meta date="2015-11-09 02:20:04 +1300"]]
-Unplugged in New York. Sidetracked - The Triffids. Back to start in one hop. `#inthepines`
diff --git a/source/posts/Innovate_WA_2023.mdwn b/source/posts/Innovate_WA_2023.mdwn
deleted file mode 100644 (file)
index aa81615..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-[[!meta date="2023-02-15 17:04:00 +0800"]]
-
-[[!tag management innovation leadership]]
-
-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|/pics/Innovate_WA_2023.png]]
-
-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!
diff --git a/source/posts/Magna_Carta.mdwn b/source/posts/Magna_Carta.mdwn
deleted file mode 100644 (file)
index 1f5f7ce..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-[[!meta date="2015-06-15 12:59:30 +1200"]]
-The spirit of Magna Carta could serve us well today.
diff --git a/source/posts/NYC_taxi_calendar_fun.mdwn b/source/posts/NYC_taxi_calendar_fun.mdwn
deleted file mode 100644 (file)
index 3f1393c..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-[[!meta date="2017-11-30 21:36:05 +0800"]]
-[[!tag R analysis visualisation sqlite3 sql]]
-
-The Internet Archive contains a [[dataset from the NYC Taxi and Limousine Commission|https://archive.org/details/nycTaxiTripData2013]], obtained under a FOIA request. It includes a listing of each taxi ride in 2013, its number of passengers, distance covered, start and stop locations and more.
-
-The dataset is a wopping 3.9 GB compressed, or shy of 30 GB uncompressed. As such, it is quite unwieldy in R.
-
-As I was interested in summarised data for my first analysis, I decided to load the CSV files in a SQLite database, query it using SQL and storing the resulting output as CSV file again - far smaller though, as I only needed 2 columns for each day of the 1 year of data.
-
-The process went as follows.
-
-First extract the CSV file from the 7z compressed archive.
-
-[[!format sh """
-7z e ../trip_data.7z trip_data_1.csv
-"""]]
-
-and the same for the other months. (As I was running low on disk space, I had to do 2 months at a time only.) Next, import it in a SQLite db. 
-
-[[!format sh """
-echo -e '.mode csv \n.import trip_data_1.csv trips2013' | sqlite3 NYCtaxi.db
-"""]]
-
-Unfortunately the header row separates with ", ", and column names now start with a space. This does not happen when importing in the sqlite3 command line - tbd why. As a result, those column names need to be quoted in the query below.
-
-Repeat this import for all the months - as mentioned, I did 2 at time.
-
-Save the output we need in temporary csv files:
-
-[[!format sh """
-sqlite3 -header -csv trips2013.db 'select DATE(" pickup_datetime"), count(" passenger_count") AS rides, sum(" passenger_count") AS passengers from trips2013 GROUP BY DATE(" pickup_datetime");' > 01-02.csv
-"""]]
-
-Remove the archives and repeat:
-
-[[!format sh """
-rm trip_data_?.csv
-rm trips2013.db
-"""]]
-
-Next, I moved on to the actual analysis work in R.
-
-Looking at the number of trips per day on a calendar heatmap reveals something odd - the first week of August has very few rides compared to any other week. While it's known people in NY tend to leave the city in August, this drop is odd.
-
-[[Calendar heatmap of trips|/pics/NYCtaxitripsNbrPlot.png]]
-
-Deciding to ignore August altogether, and zooming in on occupancy rate of the taxis rather than the absolute number or rides, reveals an interesting insight - people travel together far more in weekends and on public holidays!
-
-[[Occupancy heatmap|/pics/NYCtaxioccupancyPlot.png]]
-
-Just looking at the calendar heatmap it's possible to determine 1 Jan 2013 was a Tuesday and point out Memorial Day as the last Monday of May, Labour day in September, Thanksgiving day and even Black Friday at the end of November, and of course the silly season at the end of the year!)
-
-The dataset contains even more interesting information in its geo-location columns I imagine!
diff --git a/source/posts/Nobel_prize_winner_having_fun.mdwn b/source/posts/Nobel_prize_winner_having_fun.mdwn
deleted file mode 100644 (file)
index 9c1b34c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[[!meta date="2018-10-12 20:00:01 +0800"]]
-[[!tag people leadership Python]]
-Paul Romer may well be the first Nobel prize winner using Jupyter notebooks in his scientific workflow. On his blog, he explains his reasoning.
-
-My key takeaway from [[the article|https://paulromer.net/jupyter-mathematica-and-the-future-of-the-research-paper/]]: he's having fun.
diff --git a/source/posts/Perth_solar_exposure_over_year.mdwn b/source/posts/Perth_solar_exposure_over_year.mdwn
deleted file mode 100644 (file)
index 04802bb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-[[!meta date="2023-06-11 13:27:13 +0800"]]
-[[!opengraph2 ogimage="https://www.vanrenterghem.biz/blog/pics/solarExposure.png"]]
-[[!tag R analysis weather visualisation]]
-
-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.
-
-[[!img /pics/solarExposure.png alt = "Perth solar exposure variation" class="img-fluid"]]
-
-__Table:__ Average solar exposure per m<sup>2</sup> in Kings Park, Perth Jan 2017
-to Jun 2023.
-
-[[!table header="row" data="""
-__Month__|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec
----|---|---|---|---|---|---|---|---|---|---|---|---
-__MJ/m<sup>2</sup>__|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.
diff --git a/source/posts/R_and_github.mdwn b/source/posts/R_and_github.mdwn
deleted file mode 100644 (file)
index a732db8..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-[[!meta date="2016-09-23 19:47:35 +0800"]]
-
-Where [my first R package](posts/first_r_package) was more a proof-of-concept, I now certainly left the *beginneRs* group by publishing an R package to a private Github repository at work. I used that package in some R scripts performing various real-time analysis of our operations already. This by loading it through the [devtools package](https://cran.r-project.org/web/packages/devtools/README.html), and specifically the `install_github()` function.
-
-Next, I will have to check the `install_url()` function, as I had not quite figured out at the time of writing my initial R package how I could actually use it in a script without manually installing it first.
-
-The ability to script regular reporting and publish results as graphs and tables and publishing these in emails (opening a gateway into for instance Slack) or in Excel files, is very empowering. To an extent, I used to do this using VBA some years ago. Doing that in an integrated way with various datasources required a lot more work though, certainly given how the MS Windows environment until not so long ago lacked decent support for scripted operations for anyone but in-the-know IT professionals.
diff --git a/source/posts/Ronald_McDonald_House.mdwn b/source/posts/Ronald_McDonald_House.mdwn
deleted file mode 100644 (file)
index 96b852e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-[[!meta date="2022-12-22 06:28:00 +0800"]]
-[[!opengraph2 ogimage="https://www.vanrenterghem.biz/blog/pics/group-photo-RMDH.png"]]
-[[!tag volunteering]]
-
-Synergy's Pricing and Portfolio team took the opportunity at the end of the year to volunteer for [Ronald McDonald House Nedlands](https://rmhcwa.org.au/). This is a charity providing a 'home away from home' for families with a child in hospital in Perth. These families often live hundreds if not thousands of kilometers away due to the size of Western Australia, with Perth the only metropolitan area in the state featuring a children's hospital. Families often stay for weeks and even months in the facility while their child undergoes treatment.
-
-[[!img /pics/group-photo-RMDH.png alt="Group picture with the house manager" class="img-fluid"]]
-
-We prepared lunch for the families and volunteers in the house, followed by a tour of the place by its manager. Hearing some of the stories about the children was heartbreaking and uplifting at the same time. During extremely demanding times for a family, both mentally and financially, the volunteers and the team at Ronald McDonald House do a great job in making life slightly easier for them. It was great to be able to contribute a little bit to that this Christmas period.
diff --git a/source/posts/Setting_up_an_Analytics_Practice.mdwn b/source/posts/Setting_up_an_Analytics_Practice.mdwn
deleted file mode 100644 (file)
index 648dfc4..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[[!meta date="2019-04-09 07:59:58 +0800"]]
-[[!tag leadership management analytics]]
-[[Mindmap on setting up analytics practice|/pics/Setting_up_an_analytics_practice.png]]
-
-Ideas courtesy of Abhi Seth, Head of Data Science & Analytics at Honeywell Aerospace.
diff --git a/source/posts/WADSIH_talk_on_consumer_insights.mdwn b/source/posts/WADSIH_talk_on_consumer_insights.mdwn
deleted file mode 100644 (file)
index b3ecc0a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-[[!meta date="2022-11-06 23:14:11 +1100"]]
-
-[[!tag management data_science customer_analytics analytics leadership]]
-
-I recently had the honour of giving a talk about delivering consumer insights at a publicly owned utility during a session organised by the [Western Australian Data Science Innovation Hub (WADSIH)](https://wadsih.org.au/). During the talk, I walked through the data science process the team moves through while delivering customer insights. To make that less theoretical, I did this using an example of work delivered recently to prompt consumers to take mutually beneficial actions to both lower their power bills and help ensure the stability of the electricity grid.
-
-I converted the presentation from Powerpoint to code on the weekend, and made it [available online](http://git.vanrenterghem.biz/gitweb.cgi/WADSIH-presentation.git), as well as a [compiled PDF version](http://git.vanrenterghem.biz/gitweb.cgi/WADSIH-presentation.git/blob/HEAD:/DataScienceDiscovery-ConsumerInsights.pdf).  
-
diff --git a/source/posts/WA_roads_in_R_using_sf.mdwn b/source/posts/WA_roads_in_R_using_sf.mdwn
deleted file mode 100644 (file)
index ca1f2a2..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-[[!meta date="2017-10-17 20:35:40 +0800"]]
-
-[[!tag R spatial analysis visualisation]]
-How cool is this? A map of Western Australia with all state roads marked in only 5 lines of R!
-
-[[!format r """
-WARoads <- st_read(dsn = "data/", layer = "RoadNetworkMRWA_514", stringsAsFactors = FALSE)
-WALocalities <- st_read(dsn = "data/", layer = "WA_LOCALITY_POLYGON_shp", stringsAsFactors = FALSE)
-ggplot(WALocalities) +
-  geom_sf() +
-  geom_sf(data = dplyr::filter(WARoads, network_ty == "State Road"), colour = "red")
-"""]]
-
-[[Map of WA state roads|/pics/state-roads.png]]
-
-Courtesy of the development version of ggplot2 - geom_sf is not yet available in the version on CRAN.
diff --git a/source/posts/agent_based_models_digital_twins.mdwn b/source/posts/agent_based_models_digital_twins.mdwn
deleted file mode 100644 (file)
index edac69f..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-[[!meta date="2023-10-29T07:15:34Z"]]
-[[!tag mathematics modeling]]
-
-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](https://meetings.siam.org/sess/dsp_talk.cfm?p=124342) 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](https://johncarlosbaez.wordpress.com/2023/10/25/software-for-compositional-modeling-in-epidemiology/). 
diff --git a/source/posts/azure_file_storage_blobs.mdwn b/source/posts/azure_file_storage_blobs.mdwn
deleted file mode 100644 (file)
index 8841ca9..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[[!meta date="2016-05-06 20:10:31 +0800"]]
-
-Azure's files storage blobs are currently not mountable from GNU/Linux, except if the box is running in the same Azure region as the blob. Theoretical solution: mount it on a VM, and sshfs that from anywhere. TBC.
diff --git a/source/posts/different_spin_to_competing_on_analytics.mdwn b/source/posts/different_spin_to_competing_on_analytics.mdwn
deleted file mode 100644 (file)
index a9279f2..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-[[!meta date="2019-06-11 20:46:22 +0800"]]
-[[!tag analytics leadership military fintech]]
-
-The May/June 2019 issue of Foreign Affairs contains an article by Christian Brose, titled [["The New Revolution in Military Affairs"|https://www.foreignaffairs.com/articles/2019-04-16/new-revolution-military-affairs]].
-
-What struck me while reading the article is how much of an analogy can be drawn between what is happening to businesses worldwide, and what the author writes about the future in military technology and its trailing adoption in the United States of America's military.
-
-The transformation he describes is about the core process concerning militaries, the so called "kill chain". Thanks to technological advances, including artificial intelligence, that process can be rapdidly accelerated, offering a competitive advantage to the owner of the technology.
-
-Following quotes struck me in particular:
-
-> Instead of thinking systematically about buying faster, more effective kill chains that could be built now, Washington poured money into newer versions of old military platforms and prayed for technological miracles to come.
-
-> The question, accordingly, is not how new technologies can improve the U.S. military’s ability to do what it already does but how they can enable it to operate in new ways.
-
-> A military made up of small numbers of large, expensive, heavily manned, and hard-to-replace systems will not survive on future battlefields, where swarms of intelligent machines will deliver violence at a greater volume and higher velocity than ever before. Success will require a different kind of military, one built around large numbers of small, inexpensive, expendable, and highly autonomous systems.
-
-The same could be written about so many companies that haven't taken up the strategy of competing on analytics.
-
-Replacing the U.S. military with banking sector for instance, formerly very profitable and seemingly unbeatable big banks have over the past decade found their banking software to be too rigid. Instead of investing in new products and services, they continued to rely on what they had been doing for the prior hundred years. They invested in upgrading their core systems, often with little payoff. While they were doing that, small fintech firms appeared, excelling at just a small fraction of what a bank considered its playing field. In those areas, these new players innovated much more quickly, resulting in far more efficient and effective service delivery.
-
-At the core of many of these innovations lies data. The author likes China's stockpiling of data as to that of oil, but the following quote was particularly relevant in how it describes the use of that stockpile of data to inform decisioning.
-
-> Every autonomous system will be able to process and make sense of the information it gathers on its own, without relying on a command hub.
-
-The analogy is clear - for years, organisations have been trying to ensure they knew the "single source of truth". Tightly coupling all business functions to a central ERP system  was usually the answer. Just like in the military, it can now often be better to have many small functions be performed on the perifery of a company's systems, accepting some duplication of data and directional accuracy to deliver quicker, more cost-effective results - using expendable solutions. The challenges to communicate effectively between these semi-autonomous systems are noted.
-
-Not insignificantly, the author poses "future militaries will be distinguished by the quality of their software, especially their artificial intelligence" - i.e. countries are competing on analytics, also in the military sphere.
-
-The article ends with some advise to government leadership - make the transormation a priority, drive the change forward, recast cultures and ensure correct incentives are in place.
diff --git a/source/posts/explore-AU-road-fatalities.mdwn b/source/posts/explore-AU-road-fatalities.mdwn
deleted file mode 100644 (file)
index c0b7265..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-[[!meta date="2017-10-10 16:56:56 +0800"]]
-[[!tag R analysis]]
-
-Road fatalities in Australia
-----------------------------
-
-Recently inspired to doing a little analysis again, I landed on a
-dataset from
-<https://bitre.gov.au/statistics/safety/fatal_road_crash_database.aspx>,
-which I downloaded on 5 Oct 2017. Having open datasets for data is a
-great example of how governments are moving with the times!
-
-Trends
-------
-
-I started by looking at the trends - what is the approximate number of
-road fatalities a year, and how is it evolving over time? Are there any
-differences noticeable between states? Or by gender?
-
-[[Overall trend line|/pics/explore-AU-road-fatalities_files/fatalitiesTrends-1.png]][[Trend lines by Australian state|/pics/explore-AU-road-fatalities_files/fatalitiesTrends-2.png]][[Trend lines by gender|/pics/explore-AU-road-fatalities_files/fatalitiesTrends-3.png]]
-
-What age group is most at risk in city traffic?
------------------------------------------------
-
-Next, I wondered if there were any particular ages that were more at
-risk in city traffic. I opted to quickly bin the data to produce a
-histogram.
-
-    fatalities %>%
-      filter(Year != 2017, Speed_Limit <= 50) %>%
-      ggplot(aes(x=Age))+
-      geom_histogram(binwidth = 5) +
-      labs(title = "Australian road fatalities by age group",
-           y = "Fatalities") +
-      theme_economist()
-
-    ## Warning: Removed 2 rows containing non-finite values (stat_bin).
-
-[[histogram|/pics/explore-AU-road-fatalities_files/fatalities.cityTraffic-1.png]]
-
-Hypothesis
-----------
-
-Based on the above, I wondered - are people above 65 more likely to die
-in slow traffic areas? To make this a bit easier, I added two variables
-to the dataset - one splitting people in younger and older than 65, and
-one based on the speed limit in the area of the crash being under or
-above 50 km per hour - city traffic or faster in Australia.
-
-    fatalities.pensioners <- fatalities %>%
-      filter(Speed_Limit <= 110) %>% # less than 2% has this - determine why
-      mutate(Pensioner = if_else(Age >= 65, TRUE, FALSE)) %>%
-      mutate(Slow_Traffic = ifelse(Speed_Limit <= 50, TRUE, FALSE)) %>%
-      filter(!is.na(Pensioner))
-
-To answer the question, I produce a density plot and a boxplot.
-
-[[density plot|/pics/explore-AU-road-fatalities_files/fatalitiesSegmentation-1.png]][[box plot|/pics/explore-AU-road-fatalities_files/fatalitiesSegmentation-2.png]]
-
-Some further statistical analysis does confirm the hypothesis!
-
-    # Build a contingency table and perform prop test
-    cont.table <- table(select(fatalities.pensioners, Slow_Traffic, Pensioner))
-    cont.table
-
-    ##             Pensioner
-    ## Slow_Traffic FALSE  TRUE
-    ##        FALSE 36706  7245
-    ##        TRUE   1985   690
-
-    prop.test(cont.table)
-
-    ## 
-    ##  2-sample test for equality of proportions with continuity
-    ##  correction
-    ## 
-    ## data:  cont.table
-    ## X-squared = 154.11, df = 1, p-value < 2.2e-16
-    ## alternative hypothesis: two.sided
-    ## 95 percent confidence interval:
-    ##  0.07596463 0.11023789
-    ## sample estimates:
-    ##    prop 1    prop 2 
-    ## 0.8351573 0.7420561
-
-    # Alternative approach to using prop test
-    pensioners <- c(nrow(filter(fatalities.pensioners, Slow_Traffic == TRUE, Pensioner == TRUE)), nrow(filter(fatalities.pensioners, Slow_Traffic == FALSE, Pensioner == TRUE)))
-    everyone <- c(nrow(filter(fatalities.pensioners, Slow_Traffic == TRUE)), nrow(filter(fatalities.pensioners, Slow_Traffic == FALSE)))
-    prop.test(pensioners,everyone)
-
-    ## 
-    ##  2-sample test for equality of proportions with continuity
-    ##  correction
-    ## 
-    ## data:  pensioners out of everyone
-    ## X-squared = 154.11, df = 1, p-value < 2.2e-16
-    ## alternative hypothesis: two.sided
-    ## 95 percent confidence interval:
-    ##  0.07596463 0.11023789
-    ## sample estimates:
-    ##    prop 1    prop 2 
-    ## 0.2579439 0.1648427
-
-Conclusion
-----------
-
-It's possible to conclude older people are over-represented in the
-fatalities in lower speed zones. Further ideas for investigation are
-understanding the impact of the driving age limit on the fatalities -
-the position in the car of the fatalities (driver or passenger) was not
-yet considered in this quick look at the contents of the dataset.
-
-[[quantile-quantile plot|/pics/explore-AU-road-fatalities_files/fatalitiesDistComp-1.png]]
diff --git a/source/posts/facet_labels_in_R.mdwn b/source/posts/facet_labels_in_R.mdwn
deleted file mode 100644 (file)
index 8f29a49..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-[[!meta date="2016-10-05 21:48:11 +0800"]]
-
-[[!tag R graph code]]
-Getting used to the grammar of ggplot2 takes some time, but so far it's not been disappointing. Wanting to split a scatterplot by segment, I used `facet_grid`. That by default shows a label on each subplot, using the values in the variable by which the plot is faceted.
-
-As that often isn't very descriptive in itself, there needs to be a way to re-label these subplots. That way is `as_labeller`, as shown in the example code below.
-
-Example:
-[[!format r """
-ggplot(outputs, aes(x=date_var,y=value_var),alpha=0.8) +
-  geom_point(aes(y=value_var, colour=colour_var)) +
-  geom_smooth() +
-  theme(legend.position = "none",axis.text.y = element_blank(),axis.text.x = element_blank()) +
-  scale_x_date(date_breaks = '1 week') +
-  labs(y = "Value",x = "Date", title = "Example") +
-  scale_colour_manual("Legend",values=named_coloring_vector)) +
-  scale_fill_manual("",values=c("grey12")) +
-  facet_grid(. ~ Segment, labeller = as_labeller(c("yes" = "Segment A",
-                                                          "no" = "Segment B")))
-"""]]
-
-Output:
-[[!img pics/2016-10-05_R-facet.png size="200x200" alt="Example plot with 2 facets labelled Segment B and Segment A"]]
diff --git a/source/posts/fertile-summers.mdwn b/source/posts/fertile-summers.mdwn
deleted file mode 100644 (file)
index fb217be..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-[[!meta date="2017-10-26 13:06:27 +0800"]]
-[[!tag R analysis visualisation births Australia]]
-In the Northern hemisphere, it's commonly said women prefer to give birth around summer. It would appear this does not hold for Australia. The graph below actually suggests most babies are conceived over the summer months (December to February) down under!
-
-[[seasonal subseries plot Australian births by month 1996-2014|/pics/au-births-seasonal-subseries-plot.png]]
-
-In preparing the graph above (a "seasonal subseries plot"), I could not help but notice the spike in the numbers for each month around 2005. It turns out that was real - Australia did experience a temporary increase in its fertility rate. Whether that was thanks to government policy (baby bonus, tax subsidies) or other causes is not known.
-
-[Full R code is on my git server.](http://git.vanrenterghem.biz/?p=R/project-au-births.git;a=summary) Check it out - there are a few more plots in there already. I might write about these later.
diff --git a/source/posts/first_r_package.mdwn b/source/posts/first_r_package.mdwn
deleted file mode 100644 (file)
index 4665e44..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-[[!meta date="2016-05-18 21:09:02 +0800"]]
-
-Continuing a [long tradition](https://web.archive.org/web/20041111125713/http://vanrenterghem.biz/News/index.php?begin=25) with announcing *firsts*, I wrote an [R package](http://git.vanrenterghem.biz/?p=R/operatingdays.git;a=summary) recently, and made it available on [Projects](http://git.vanrenterghem.biz/), a new section of the website. (Talking about my website on said website is also not exactly new.)
-
-It still needs further work, as it really only supports AU public holidays for now, but it's exciting to be able to use freely available public data to make analysis a bit easier. The ability to know how many working days are left in the month is fundamental in forecasting a month-end result. Extensions of the package could include simple checks like if today's date is a working day, or more complex ones like the number of working days between given dates for instance.
-
-In other news, I received [a new gadget](http://www.rtl-sdr.com) in the mail today.
-
-> RTL-SDR is a very cheap software defined radio that 
-> uses a DVB-T TV tuner dongle based on the RTL2832U 
-> chipset. With the combined efforts of  Antti Palosaari
-> , Eric Fry and Osmocom it was found that the signal 
-> I/Q data could be accessed directly, which allowed the 
-> DVB-T TV tuner to be converted into a wideband software 
-> defined radio via a new software driver.
diff --git a/source/posts/fun_with_RJDBC_and_RODBC.mdwn b/source/posts/fun_with_RJDBC_and_RODBC.mdwn
deleted file mode 100644 (file)
index 65e3005..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-[[!meta date="2016-06-24 14:17:16 +0800"]]
-
-I have learned the hard way it is important to be aware that
-
-> Type-handling is a rather complex issue, especially with JDBC as different databases support different data types. RJDBC attempts to simplify this issue by internally converting all data types to either character or numeric values. 
-
-[Source](https://www.rforge.net/RJDBC/)
-
-This because RODBC does not have the same behaviour. 
-
-When switching a few R scripts over from using RJDBC to access a MS SQL Server database to RODBC, I ran into some odd problems.
-
-First, I noticed `as.Date(query,output$datecolumn)` resulted in what looked like 2016-06-21 becoming 2016-06-22. That's right, R started adding a day to the date. `as.Date(strptime(query.output$datecolumn, "%Y-%m-%d"))` put a stop to that madness.
-
-Another problem had to do with an XML value being returned by a query. The application generating that XML for some reason opts to not store it as an XML data type but instead uses a varchar. That makes it is very hard to use XQuery, so I had opted to do the hard work in R by taking the whole XML value into R - despite this making the retrieval of query results almost impossible. In order to convert that column to an XML data type in R, I was able to do `sapply(response.xml$response, xmlParse)` on the output of a SQL query using RJDBC. Once the output from the RODBC connection had to be processed, this needed to become `sapply(response.xml$response, xmlParse, asText = TRUE)`. It is interesting this wasn't needed for the RJDBC output.
-
-So yes, type-handling is a rather complex issue.
diff --git a/source/posts/generating_album_art_on_N9.mdwn b/source/posts/generating_album_art_on_N9.mdwn
deleted file mode 100644 (file)
index 2663c4d..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-[[!meta date="2016-10-03 21:33:50 +0800"]]
-
-For unknown reasons, the Music application on my Nokia N9 does not always display the album cover where expected. Instead, it displays the artist name and album title. Reports by other users of this phone suggest this isn't an uncommon issue, but offer no *confirmed* insight in the root cause of the problem unfortunately.
-
-Fortunately, the symptoms of this problem are relatively easy to fix on a one-by-one basis.
-
-In `~/.cache/media-art` on the phone, copy the album art (in a JPEG file) to a file named using the following format:
-
-```
-album-$(echo -n "artist name" | md5sum | cut -d ' ' -f 1)-$(echo -n "album name" | md5sum | cut -d ' ' -f 1).jpeg 
-```
-
-Replace `artist name` and `album name` with the appropriate values for the album, in small caps (lowercase).
-
-This follows the [Media Art Storage Spec](https://wiki.gnome.org/action/show/DraftSpecs/MediaArtStorageSpec?action=show&redirect=MediaArtStorageSpec)
-
-Luckily, in most cases the above is not necessary and it suffices to store the cover picture as `cover.jpg` in the album's directory in `~/MyDocs/Music`.
diff --git a/source/posts/house_price_evolution.mdwn b/source/posts/house_price_evolution.mdwn
deleted file mode 100644 (file)
index 33ada7b..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-[[!meta date="2023-09-02 16:01:16+08:00"]]
-[[!opengraph2 ogimage="https://www.vanrenterghem.biz/blog/pics/house-price-evolution-table.png"]]
-[[!tag economics Australia Belgium]]
-
-Back in May 2022, [[I made a bet|monetary policy and mortgage products]] 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.
-
-[[!img /pics/house-price-evolution-table.png alt="Table with evolution of house prices" class="img-fluid"]]
-
-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.
-
-[[!img /pics/house-price-evolution-plot.png alt="Plot with evolution of house prices in EUR" class="img-fluid"]]
-
-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.
-
diff --git a/source/posts/loans_and_semi_Markov_chains.mdwn b/source/posts/loans_and_semi_Markov_chains.mdwn
deleted file mode 100644 (file)
index 2652618..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-[[!meta date="2017-02-17 20:07:10 +0800"]]
-[[!tag finance fintech analysis forecasting Markov]]
-Using Markov chains' transition matrices to model the movement of loans from being opened (in a state of "Current") to getting closed can misinform the user at times.
-
-To illustrate the challenge, the graph below plots the evolution, from the original state to the final state, of a group of loans over 6 periods of time.
-
-[[!img pics/rollRateBeware.png size="400x247" alt="Actual vs predicted loan vintage performance."]]
-
-The solid lines are the result of applying an average transition matrix 6 times (the model's predicted outcome). The dashed lines are the actual observed results for a set of loans.
-
-As can be seen, the model does not do a very good job at predicting the accounts that will end up in state "Closed" in each period. They end up in a different state between Current and Closed (i.e. overdue) at a higher than expected rate. Why is that?
-
-The prediction was built using an average of the transition matrix of a number of consecutive period statetables for a book of loans. That book was not homogenic though. Most obviously, the "Current" accounts were not of the same vintage - some had been in that state for a number of periods before already. The observed set of loans all originated in the same period. Other differences can be related to client demographics, loan characteristics or macro-economic circumstances.
-
-Applying a transition matrix based on a group of loans of various vintages to a group of loans that all were new entrants in the book violates the often implied Markov chain assumption of time-homogenity.
-
-What that assumption says is that the future state is independent of the past state.
-
-Loans typically have a varying chance of becoming delinquent in function of how long they have been open already.
-
-Multi-order Markov chains are those that depend on a number (the order) of states in the past. The question becomes - what order is the Markov chain? Otherwise put, how many previous periods need to be taken into account to be able to accurately estimate the next period's statetable? Controlling for the other differences suggested above, if found to be material, may be important as well.
diff --git a/source/posts/managing_data_science_work.mdwn b/source/posts/managing_data_science_work.mdwn
deleted file mode 100644 (file)
index 9e7bea2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-[[!meta date="2018-06-19 20:51:36 +0800"]]
-[[!tag leadership management analytics military]]
-
-It appears to me the cross-industry standard process for data mining (CRISP-DM) is still, almost a quarter century after first having been formulated,  a valuable framework to guide management of a data science team. Start with building business understanding, followed by understanding the data, preparing it, moving from modeling to solve the problem over to evaluating the model and ending by deploying it. The framework is iterative, and allows for back-and-forth between these steps based on what's learned in the later steps. 
-
-[[CRISP-DM|/pics/crisp-dm-diagram.png]]
-
-It  doesn't put too great an emphasis on scheduling the activities, but focuses on the value creation. 
-
-The Observe-Orient-Decide-Act (OODA) loop from John Boyd seems to be an analogue concept. Competing businesses would then be advised to speed up their cycling through the CRISP-DM loop, as that's how Boyd stated advantage is obtained - by cycling through the OODA loops more quickly than ones opponent. Most interestingly, in both loops it's a common pitfall to skip the last step - deploying the model / acting.
-
-[[OODA loop|/pics/OODA-diagram.png]]
-
-([[Image by Patrick Edwin Moran - Own work, CC BY 3.0|https://commons.wikimedia.org/w/index.php?curid=3904554]])
diff --git a/source/posts/monetary_policy_and_mortgage_products.mdwn b/source/posts/monetary_policy_and_mortgage_products.mdwn
deleted file mode 100644 (file)
index 3012e28..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-[[!meta date="2022-05-09 18:48:00 +0800"]]
-[[!tag economics finance law Belgium Australia]]
-
-In its latest [statement on monetary policy](https://www.rba.gov.au/publications/smp/2022/may/pdf/statement-on-monetary-policy-2022-05.pdf) ([Internet Archive](https://web.archive.org/web/20220506111153/https://www.rba.gov.au/publications/smp/2022/may/pdf/statement-on-monetary-policy-2022-05.pdf)), the Reserve Bank of Australia highlighted that households in Australia have much higher private debt than before. Total private debt is approximately [120% of GDP](https://stats.bis.org/statx/srs/table/f3.1) ([Internet Archive](https://web.archive.org/web/20220505031215/https://stats.bis.org/statx/srs/table/f3.1)), roughly double Belgium's. [Analysts hint this will restrict by how much the central bank will be able to raise the cash rate target](https://www.abc.net.au/news/2022-05-02/rba-will-raise-rates-but-not-to-levels-experts-are-predicting/101029534) ([Internet Archive](https://web.archive.org/web/20220509111508/https://www.abc.net.au/news/2022-05-02/rba-will-raise-rates-but-not-to-levels-experts-are-predicting/101029534)) to battle rising inflation in the near future.
-
-Most mortgages in Australia are contracted on a variable rate, or fixed only for the short term. As such, rising interest rates not only affect people taking out new loans - they also affect the amount all other indebted households need to repay. This contrasts with Belgium for instance, where in the first 3 months of 2022 [93.5% of mortgage contracts had a fixed term over the entire duration of the contract](https://www.febelfin.be/nl/press-room/ook-eerste-trimester-van-2022-record-aan-hypothecaire-kredietverlening) ([Internet Archive](https://web.archive.org/web/20220509115728/https://www.febelfin.be/nl/press-room/ook-eerste-trimester-van-2022-record-aan-hypothecaire-kredietverlening)). Only less than 1% of contracts closed in this quarter has a rate varying periodically. This despite strong consumer protections built into the Code of Economic Law [see art VII.143, § 2 to 6 in the Flemish publication](https://www.ejustice.just.fgov.be/cgi_loi/change_lg.pl?language=nl&la=N&table_name=wet&cn=2016042201) ([Internet Archive](https://web.archive.org/web/20210617021917/https://www.ejustice.just.fgov.be/cgi_loi/change_lg.pl?language=nl&la=N&table_name=wet&cn=2016042201)): few of them vary immediately upon changes in the cash rate as the minimum term between changes is at least a year, and the updated interest rate can never exceed twice the original rate. 
-
-In contrast, Australian mortgages are rarely offered with a fixed interest rate period beyond 2 years - 5 years is practically the most I have seen advertised. Banks can vary the rate at will - they are not mandated to link a change to a variation in the cash rate, nor do they need to stick to that variation. Rates can go as high as the banks want them to go.
-
-This is a remarkable difference in the products banks in these countries make available. I wonder to what extent this will influence how high the cash rate will be allowed to rise before politicians will need to step in, if at all they will, and how it may affect the evolution of houseprices in the countries. My current bet: Australian houseprices will decline relative to Belgian ones, and the cash rate won't grow as much. (At the time of writing, the RBA has a target cash rate of 0.35% while ECB still has a target cash rate of 0.00% though.)
-
diff --git a/source/posts/my_management_style_mission_control.mdwn b/source/posts/my_management_style_mission_control.mdwn
deleted file mode 100644 (file)
index 8d74311..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-[[!meta date="2018-02-14 15:38:33 +0800"]]
-[[!tag management leadership]]
-
-I have been asked a few times recently about my management style. First, while applying for a position myself. Next, less expected, by a member of the org I joined as well as by a candidate I interviewed for a position in the team.
-
-My answer was not very concise, as I lacked the framework knowledge to be so.
-
-Today, I believe to have stumbled on a description of the style I practice (or certainly aim to) most often on [[Adam Drake's blog|https://aadrake.com/]]. Its name? [[Mission Command|http://usacac.army.mil/sites/default/files/misc/doctrine/CDG/adp6_0.html]]. (The key alternative being detailed command.)
-
-Now this is an interesting revelation for more than one reason. I consider it a positive thing I can now more clearly articulate how I naturally tend to work as a team leader. It now becomes clear too what is important to me, by reviewing the key principles:
-
-  * Build cohesive teams through mutual trust.
-  * Create shared understanding.
-  * Provide a clear commander’s intent.
-  * Exercise disciplined initiative.
-  * Use mission orders.
-  * Accept prudent risk.
-  
-Reviewing these principles in detail, this style of leadership should not be mistaken for *laissez-faire*. Providing clear commander's intent, creating shared understanding, using mission orders are very active principles for the leader. For the subordinate, the need to exercise *disciplined* initiative is clearly also not a free-for-all. The need for mutual trust for this to work cannot be emphasised enough.
diff --git a/source/posts/new_blog_activated.mdwn b/source/posts/new_blog_activated.mdwn
deleted file mode 100644 (file)
index 632a468..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[[!meta date="2016-05-05 21:54:07 +0800"]]
-
-Going back to the early days of this site, I added a blog section in again, replacing the social one, which was overkill. Still need to import the posts done there though.
diff --git a/source/posts/obnam_multi_client_encrypted_backups.mdwn b/source/posts/obnam_multi_client_encrypted_backups.mdwn
deleted file mode 100644 (file)
index 4698c3f..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-[[!meta date="2016-06-09 20:41:06 +0800"]]
-
-Trying to configure [obnam](http://obnam.org) to use one repository for 3 clients using encryption has been a bit of search.
-
-Initialising the first client was straightforward. I simply set it up to use a gpg key for encryption per the manual. Since that key is only used for encrypting backups from this client, making it not have a passphrase seemed to be a good option.
-
-For the next client, things got a bit trickier. Since the backup repository is now encrypted, that client couldn't access it. The solution I ended up with was to temporarily ensure client 2 has access to client 1's secret key too.
-
-On client 1: `gpg --export-secret-key -a LONG_KEY > client1.private.key`
-
-That file I had to copy to the other client, and import it using:
-
-On client 2: `gpg --import client1.private.key`
-
-Now I could configure this client with its own gpg key and perform an initial backup.
-
-After this, client 1's secret key can be removed again: `gpg --delete-secret-key LONG_KEY` followed by `gpg --delete-key LONG_KEY`.
-
-(Not removing it defeats the purpose of having a specific key per client - the workaround above doesn't seem entirely sensible from that perspective either, as the secret key needs to be shared temporarily.)
-
-The third client should have been easy, but gpg-agent made it a bit more tricky. Obnam failed to run because it couldn't find gpg-agent. Several workarounds have been documented in the past, but they all ended up not working anymore since version 2.1 of gpg-agent. I ended up [^1] having to modify `~/.bashrc` as follows: 
-
-       function gpg-update() {
-               GPG_PID=$(pidof gpg-agent)
-               GPG_AGENT_INFO=${HOME}/.gnupg/S.gpg-agent:$GPG_PID:1
-               export GPG_AGENT_INFO
-       }
-
-       gpg-update
-
-[^1]: Courtesy of [Brian Lane on RedHat's bugtracker](https://bugzilla.redhat.com/show_bug.cgi?id=1221234#c5)
diff --git a/source/posts/obtaining_SLIP_data_using_R.mdwn b/source/posts/obtaining_SLIP_data_using_R.mdwn
deleted file mode 100644 (file)
index 9e7bc01..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-[[!meta date="2023-10-11T23:41:54+08:00"]]
-[[!opengraph2 ogimage="https://www.vanrenterghem.biz/blog/pics/SLIP_WA_schools.png"]]
-[[!tag R spatial analysis visualisation]]
-
-Six years ago, [[I wrote about Simple Features (sf) in R|using spatial features and openstreetmap]]. 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](https://data.wa.gov.au/slip)).
-
-I have now updated the script, [available in my code repository](http://git.vanrenterghem.biz/?p=R/project-wa-schools.git;a=summary), with an R implementation of [the methodology in SLIP's How To Guides](https://toolkit.data.wa.gov.au/hc/en-gb/articles/115000962734) ([Archive](https://web.archive.org/web/20230608184007/https://toolkit.data.wa.gov.au/hc/en-gb/articles/115000962734)). 
-
-The relevant code looks as follows, simplified greatly through the use of the [httr2](https://httr2.r-lib.org/) library - the equivalent of the [Requests](https://docs.python-requests.org/en/latest/) library used in the Python example in the SLIP knowledge base:
-
-[[!format r """
-library(httr2)
-tempdirSHP <- tempdir()
-tempfileSHP <- tempfile()
-# Create the token request
-req <- request("https://sso.slip.wa.gov.au/as/token.oauth2") |>
-    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 = "slip.wa.gov.au | grep Username | sed -e 's/Username: //'", stdout = TRUE),
-                  password = system2("pass", args = "slip.wa.gov.au | head -1", stdout = TRUE))
-# Obtain the token response
-tokenResponse <- req_perform(req)
-# Define the SLIP file to download
-slipUrl <-  "https://direct-download.slip.wa.gov.au/datadownload/Education/Current_Active_Schools_Sem_1_2022_Public_DET_020_WA_GDA94_Public_Shapefile.zip"
-# 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):
-
-[[!img /pics/SLIP_WA_schools.png alt="Pupil density in Western Australian high schools" class="img-fluid"]]
-
-
-
-
diff --git a/source/posts/on_social_media.mdwn b/source/posts/on_social_media.mdwn
deleted file mode 100644 (file)
index 1c4a715..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[[!meta date="2018-01-08 21:04:09 +0800"]]
-[[!tag social_media blogging meta_thinking open_web]]
-Dries Buytaert [wrote last week](https://dri.es/more-blogging-and-less-social-media) about intending to use social media less in 2018. As an entrepreneur developing a CMS, he has a vested interest in preventing the world moving to see the internet as being either Facebook, Instagram or Twitter (or reversing that current-state maybe). Still, I believe he is genuinely concerned about the effect of using social media on our thinking. This partly because I share the observation. Despite having been an early adopter, I disabled my Facebook account a year or two ago already. I'm currently in doubt whether I should not do the same with Twitter. I notice it actually is not as good a source of news as classic news sites - headlines simply get repeated numerous times when major events happen, and other news is equally easily noticed browsing a traditional website. Fringe and mainstream thinkers alike in the space of [management](http://tompeters.com/), [R](http://dirk.eddelbuettel.com/blog/) [stats](http://www.brodrigues.co/), [computing hardware](https://www.olimex.com/) etc are a different matter. While, as Dries notices, their micro-messages are typically not well worked out, they do make me aware of what they have blogged about - for those that actually still blog. So is it a matter of trying to increase my Nexcloud newsreader use, maybe during dedicated reading time, and no longer opening the Twitter homepage on my phone at random times throughout the day, and conceding short statements without a more worked out bit of content behind it are not all that useful?
-
-The above focuses on consuming content of others. To foster conversations, which arguably is the intent of social media too, we might need something like [webmentions](https://www.w3.org/TR/webmention/) to pick up steam too.
diff --git a/source/posts/sending_pingback_oldskool_indieweb.mdwn b/source/posts/sending_pingback_oldskool_indieweb.mdwn
deleted file mode 100644 (file)
index 5bda94d..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-[[!meta title="About sending pingbacks, webmentions and some thoughts on how to improve on them."]]
-[[!tag indieweb blogging open_web]]
-[[!meta date="2023-10-31T20:41:30+08:00"]]
-In a 'blast from the past', I sent my first [pingback](https://www.hixie.ch/specs/pingback/pingback) after writing the [[previous post|agent based models digital twins]]. 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](https://www.w3.org/TR/webmention/), which I've used before and [[implemented support for|Implementing webmention on my blog]] 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:
-
-[[!format xml """
-<?xml version="1.0" encoding="UTF-8"?>
-<methodCall>
-    <methodName>pingback.ping</methodName>
-    <params>
-        <param>
-            <value><string>https://www.vanrenterghem.biz/blog/posts/agent_based_models_digital_twins/</string></value>
-        </param>
-        <param>
-            <value><string>https://johncarlosbaez.wordpress.com/2023/10/25/software-for-compositional-modeling-in-epidemiology/</string></value>
-        </param>
-    </params>
-</methodCall>
-"""]]
-
-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.
-
-[[!format sh """
-curl -k https://johncarlosbaez.wordpress.com/xmlrpc.php -d @pingback.xml
-"""]]
-
-In a sign things were going well, I saw the following appear in my website's access log:
-
-[[!format txt """
-192.0.112.141 - - [29/Oct/2023:09:35:06 +0100] "GET /blog/posts/agent_based_models_digital_twins/ HTTP/1.1" 200 2676 "https://www.vanrenterghem.biz/blog/posts/agent_based_models_digital_twins/" "WordPress.com; https://johncarlosbaez.wordpress.com; verifying pingback from 139.216.235.49"
-"""]]
-
-Finally, I received the following response to my `curl` request on the command-line:
-
-[[!format xml """
-<?xml version="1.0" encoding="UTF-8"?>
-<methodResponse>
-  <params>
-    <param>
-      <value>
-      <string>Pingback from https://www.vanrenterghem.biz/blog/posts/agent_based_models_digital_twins/ to https://johncarlosbaez.wordpress.com/2023/10/25/software-for-compositional-modeling-in-epidemiology/ registered. Keep the web talking! :-)</string>
-      </value>
-    </param>
-  </params>
-</methodResponse>
-"""]]
-
-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](https://core.trac.wordpress.org/browser/trunk/src/wp-includes/class-wp-xmlrpc-server.php?rev=56637#L7040), 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](https://core.trac.wordpress.org/browser/trunk/src/wp-includes/class-wp-xmlrpc-server.php?rev=56637#L7036) 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](https://aaronparecki.com/), 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](https://aaronparecki.com/2019/10/15/26/) at least.
diff --git a/source/posts/spatial_indexes_to_plot_income_per_postal_code_in_Australian_cities.mdwn b/source/posts/spatial_indexes_to_plot_income_per_postal_code_in_Australian_cities.mdwn
deleted file mode 100644 (file)
index 5a7b167..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-[[!meta date="2017-11-16 15:07:59 +0800"]]
-[[!tag R spatial analysis visualisation Australia git]]
-
-Trying to plot the income per capita in Australia on a map, I came across a perfectly good reason to make good use of [[a spatial query|http://r-spatial.org/r/2017/06/22/spatial-index.html]] in R.
-
-I had to combine a shapefile of Australian SA3's, a concept used under the Australian Statistical Geography Standard meaning Statistical Area Level 3, with a dataset of income per postal code. I created a matrix of intersecting postal codes and SA3's, and obtained the desired income per capita by SA3 performing a matrix multiplication. If the geographical areas were perfectly alignable, using a function like `st_contains` would have been preferred. Now I fell back on using `st_intersects`, which results in possibly assigning a postal code to 2 different statistical areas. Alternative approaches are welcome in the comments!
-
-As Australia is so vast, and the majority of its people are earning a living in a big city, a full map does not show the difference in income per area at this level of detail. Instead, I opted to map some of the key cities in a single image.
-
-[[Income distribution in major AU cities|/pics/AUCitiesIncomeDistribution.gif]]
-
-The full code is available on my git server for you to clone using `git clone git://git.vanrenterghem.biz/R/project-au-taxstats.git`.
diff --git a/source/posts/state-of_SaaS.mdwn b/source/posts/state-of_SaaS.mdwn
deleted file mode 100644 (file)
index cad484b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[[!meta date="2015-11-08 01:09:53 +1300"]]
-Nov 2015. Still no Mailpile 1.0. Roundcube Next MIA. Lest we forget, no Freedom
-Box.
diff --git a/source/posts/survival_analysis_in_fintech.mdwn b/source/posts/survival_analysis_in_fintech.mdwn
deleted file mode 100644 (file)
index 6ae99da..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-[[!meta date="2016-12-10 15:49:02 +0800"]]
-
-[[!tag R fintech analysis]]
-It is useful to apply the concepts from survival data analysis in a fintech environment. After all, there will usually be a substantial amount of time-to-event data to choose from. This can be website visitors leaving the site, loans being repaid early, clients becoming delinquent - the options are abound.
-
-A visual analysis of such data can easily be obtained using R.
-
-[[!format r """
-library(survminer)
-library(survival)
-library(KMSurv)
-## Create survival curve from a survival object
-#' Status is 1 if the event was observed at TimeAfterStart
-#' It is set to 0 to mark the right-censored time
-vintage.survival <- survfit(Surv(TimeAfterStart,Status) ~ Vintage, data = my.dataset)
-## Generate cumulative incidence plot
-ci.plot <- ggsurvplot(vintage.survival,
-           fun = function(y) 1-y,
-           censor = FALSE,
-           conf.int = FALSE,
-           ylab = 'Ratio event observed',
-           xlab = 'Time after open',
-           break.time.by = 30,
-           legend = "bottom",
-           legend.title = "",
-           risk.table = TRUE,
-           risk.table.title = 'Number of group',
-           risk.table.col = "black",
-           risk.table.fontsize = 4,
-           risk.table.height = 0.35
-           )
-"""]]
-
-This produces a plot with a survival curve per group, and also includes the risk table. This table shows how many members of the group for whom no event was observed are still being followed at each point in time. Labelling these "at risk" stems of course from the original concept of survival analysis, where the event typically is the passing of the subject.
-
-The `fun = function(y) 1-y` part actually reverses the curve, resulting in what is known as a cumulative incidence curve.
-
-[[!img pics/surv-curve-risk-table.png size="442x393" alt="Survival/incidence curve and risk table"]]
-
-Underneath the plot, a risk table is added with no effort by adding `risk.table = TRUE` as parameter for `ggsurvplot`.
-
-Checking the trajectory of these curves for different groups of customers (with a different treatment plan, to stick to the terminology) is an easy way to verify whether actions are having the expected result.
diff --git a/source/posts/using_Apache_Nifi_Kafka_big_data_tools.mdwn b/source/posts/using_Apache_Nifi_Kafka_big_data_tools.mdwn
deleted file mode 100644 (file)
index 75a1943..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-[[!meta date="2018-09-11 21:09:06 +0800"]]
-[[!tag Apache Nifi Kafka bigdata streaming]]
-
-Working in analytics these days, the concept of big data has been firmly established. Smart engineers have been developing cool technology to work with it for a while now. The [[Apache Software Foundation|https://apache.org]] has emerged as a hub for many of these - Ambari, Hadoop, Hive, Kafka, Nifi, Pig, Zookeeper - the list goes on.
-
-While I'm mostly interested in improving business outcomes applying analytics, I'm also excited to work with some of these tools to make that easier.
-
-Over the past few weeks, I have been exploring some tools, installing them on my laptop or a server and giving them a spin. Thanks to [[Confluent, the founders of Kafka|https://www.confluent.io]] it is super easy to try out Kafka, Zookeeper, KSQL and their REST API. They all come in a pre-compiled tarball which just works on Arch Linux. (After trying to compile some of these, this is no luxury - these apps are very interestingly built...) Once unpacked, all it takes to get started is:
-
-[[!format sh """
-./bin/confluent start
-"""]]
-
-I also spun up an instance of [[nifi|https://nifi.apache.org/download.html]], which I used to monitor a (json-ised) apache2 webserver log. Every new line added to that log goes as a message to Kafka.
-
-[[Apache Nifi configuration|/pics/ApacheNifi.png]]
-
-A processor monitoring a file (tailing) copies every new line over to another processor publishing it to a Kafka topic. The Tailfile monitor includes options for rolling filenames, and what delineates each message. I set it up to process a custom logfile from my webserver, which was defined to produce JSON messages instead of the somewhat cumbersome to process standard logfile output (defined in apache2.conf, enabled in the webserver conf):
-
-[[!format sh """
-LogFormat "{ \"time\":\"%t\", \"remoteIP\":\"%a\", \"host\":\"%V\", \"request\":\"%U\", \"query\":\"%q\", \"method\":\"%m\", \"status\":\"%>s\", \"userAgent\":\"%{User-agent}i\", \"referer\":\"%{Referer}i\", \"size\":\"%O\" }" leapache
-"""]]
-
-All the hard work is being done by Nifi. (Something like
-
-[[!format sh """
-tail -F /var/log/apache2/access.log | kafka-console-producer.sh --broker-list localhost:9092 --topic accesslogapache
-"""]]
-
-would probably be close to the CLI equivalent on a single-node system like my test setup, with the -F option to ensure the log rotation doesn't break things. Not sure how the message demarcator would need to be configured.)
-
-The above results in a Kafka message stream with every request hitting my webserver in real-time available for further analysis.
-
diff --git a/source/posts/using_R_to_automate_reports.mdwn b/source/posts/using_R_to_automate_reports.mdwn
deleted file mode 100644 (file)
index 61bf60f..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-[[!meta date="2016-10-10 21:48:11 +0800"]]
-
-[[!tag R code automation]]
-A lot of information on [knitr](https://cran.r-project.org/web/packages/knitr/index.html) is centered around using it for reproducible research. I've found it to be a nice way to make abstraction of mundane reporting though. It is as easy as performing the necessary data extraction and manipulation in an R script, including the creation of tables and graphs.
-
-To develop the report template, simply `source` the R script within an Rmd one, per the example template below:
-
-[[!format r """
----
-title: "My report"
-date: "`r Sys.time()`" 
-output: pdf_document
----
-
-```{r setup, include=FALSE}
-library(knitr)
-knitr::opts_chunk$set(echo = TRUE)
-source('my-report.R')
-```
-
-Include some text about your report.
-
-##Add a title.
-
-Some further text.
-
-```{r, echo=FALSE}
-plot(my-plot-object)
-kable(my-df-or-table)
-```
-"""]]
-
-When you are ready to create the report, the convenience of [RMarkdown](https://cran.r-project.org/web/packages/rmarkdown/) is hard to beat:
-
-[[!format bash """
-R -e "rmarkdown::render('~/my-report.Rmd',output_file='~/my-report.pdf')"
-"""]]
-
-Thanks to the YAML header at the start of the report template, information like the report's title and target output format don't need to be mentioned. This command can easily be scripted a bit further to include a date-time stamp in the output filename for instance, and scheduled using `cron`.
diff --git a/source/posts/using_spatial_features_and_openstreetmap.mdwn b/source/posts/using_spatial_features_and_openstreetmap.mdwn
deleted file mode 100644 (file)
index f99bae0..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-[[!meta date="2017-10-12 21:30:51 +0800"]]
-[[!tag R spatial analysis visualisation]] 
-Turns out it is possible, thanks to the good folks at [Stamen Design](stamen.com), to get fairly unobtrusive maps based on the OpenStreetMap data.
-
-Combining this with a SLIP dataset from the Western Australian government on active schools in the state provided a good opportunity to check out the recently released [sf (Simple Features) package](https://cran.r-project.org/web/packages/sf/index.html) in R.
-
-Simple features are a standardized way to encode spatial vector data. Support in R was added in November 2016. For users of the tidyverse, this makes manipulating shapefiles and the likes easier, as simple features in R are dataframes!
-
-[[Plot of secondary schools by student population|/pics/Western_Australia_metro_secondary_schools.png]]
-
-[Full details in git](http://git.vanrenterghem.biz/?p=R/project-wa-schools.git;a=summary).