<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Mark Padgham's curated opinions</title>
    <link>https://mpadge.eu/blog</link>
    <description>Opinions on technology in the world, on open-source software, on cities, and sometimes on bicycles.</description>
    <atom:link href="https://mpadge.eu/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>"Purposeful joy"</title>
      <link>https://mpadge.eu/blog/purposeful-joy.html</link>
      <guid>https://mpadge.eu/blog/purposeful-joy.html</guid>
      <description>The current purpose for a select few is to help computer programs replace the purposeful labour of a generation of uniquely idiosyncratic human beings. Yet the relationship of those being replaced to their own intrinsic purpose is categorically indistinguishable to that of those people doing the replacing. The end point of any logic of AI-replaceability is hierarchical collapse, the auto-CEO, and economic death. The saving grace is that, unlike purpose, joy steadfastly resists hierarchical direction. And that makes joy arguably one of the most important non-capturable resources left.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Tue, 09 Jun 26 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>"Our goodpractice Package Has New Superpowers"</title>
      <link>https://mpadge.eu/blog/goodpractice.html</link>
      <guid>https://mpadge.eu/blog/goodpractice.html</guid>
      <description>We have worked hard over the past few months on major upgrades to our goodpractice package. Checks are now grouped into categories, making it easier to control which checks are run. The biggest change has been adding over 100 new checks, from new lints to many new CRAN checks.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Fri, 05 Jun 26 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Centralisation, reversibility, and restarting</title>
      <link>https://mpadge.eu/blog/centralisation-reversibility.html</link>
      <guid>https://mpadge.eu/blog/centralisation-reversibility.html</guid>
      <description>'Technical progress tends toward centralisation: telephone multiplexing made calls easier and centralised the entire telephone industry; GitHub made coding easier and centralised the world of software development. Technical centralisation is mostly reversible. The economic and political centralisation that rides alongside it is not. The real binding force is neither the technology nor the data but the interfaces imposed to make it all work together. One of the best ways to ensure centralising tendencies can be reversed is to find ways to keep those interfaces simple.'</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Fri, 22 May 26 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Debugging C++ code in R with a single command</title>
      <link>https://mpadge.eu/blog/r-cpp-debugging.html</link>
      <guid>https://mpadge.eu/blog/r-cpp-debugging.html</guid>
      <description>There are several great references for how to debug C or C++ code in R, but descriptions of how to start a debugger are often not so informative. This post describes how to start a debugging session in R with a single command.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Tue, 30 Aug 22 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Timeout on parallel jobs in R</title>
      <link>https://mpadge.eu/blog/r-parallel-timeout.html</link>
      <guid>https://mpadge.eu/blog/r-parallel-timeout.html</guid>
      <description>Python's `multiprocessing` and `threading` libraries both have a timeout parameter for re-joining threads after they've finished. This provides an easy way to launch multi-threaded jobs while ensuing that no single thread exceeds a specified timeout. This post describes two ways to implement equivalent functionality in R.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Fri, 14 Jan 22 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>GitHub notifications from the terminal</title>
      <link>https://mpadge.eu/blog/github-terminal-notifications.html</link>
      <guid>https://mpadge.eu/blog/github-terminal-notifications.html</guid>
      <description>I work almost entirely from the terminal, and regret the few remaining tasks which still require me to venture elsewhere, such as a web browser. Until recently, one of my main reasons for constantly switching to my browser was to check my GitHub notifications. This post describes how I view my notifications within the terminal, including an option to mark them as "read" on GitHub.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Wed, 27 Oct 21 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>The allcontributors package</title>
      <link>https://mpadge.eu/blog/allcontributors.html</link>
      <guid>https://mpadge.eu/blog/allcontributors.html</guid>
      <description>An alternative implementation in R of the original 'allcontributors.org' to acknowledge all contributors in your 'README' (or elsewhere). The original is intended to help acknowledge all contributions including those beyond the contents of an actual repository, such as community or other or less-tangible organisational contributions. This version only acknowledges tangible contributions to a repository, but automates that task to a single function call, in the hope that such simplicity will spur greater usage.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Wed, 10 Mar 21 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>The troubles with getting help files in R</title>
      <link>https://mpadge.eu/blog/r-help-files.html</link>
      <guid>https://mpadge.eu/blog/r-help-files.html</guid>
      <description>A primer on ways to extract the actual content of help files. Because one day people will hopefully start text-mining these things, and show us all sorts of things we never knew about the people who make R packages. When they do, this entry will hopefully help.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Tue, 29 Sep 20 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Using RcppParallel to aggregate to a vector</title>
      <link>https://mpadge.eu/blog/rcppparallel-aggregation.html</link>
      <guid>https://mpadge.eu/blog/rcppparallel-aggregation.html</guid>
      <description>This article was recently published in the Rcpp Gallery, and demonstrates using the RcppParallel package to aggregate to an output vector. It extends directly from previous demonstrations of single-valued aggregation, through providing necessary details to enable aggregation to a vector, or by extension, to any arbitrary form.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Thu, 07 Nov 19 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Github 2FA, git push, and password entry</title>
      <link>https://mpadge.eu/blog/github-2fa-push.html</link>
      <guid>https://mpadge.eu/blog/github-2fa-push.html</guid>
      <description>Activating github two-factor authentication (2FA) offers an indubitable security boost, with one notable side effect--https authentication requires entering a Personal Access Token instead of password. This entry explains how I reconfigured my git push commands with 2FA to be able to enter my password once again, instead of a random 32-character token.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Fri, 25 Oct 19 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>What are matrices in R?</title>
      <link>https://mpadge.eu/blog/r-matrices.html</link>
      <guid>https://mpadge.eu/blog/r-matrices.html</guid>
      <description>If everything in R is a vector, then what is a matrix? This entry will demonstrate that even matrices are vectors, and that processing of matrices can in certain circumstances be considerably more efficient if they are treated as simple vectors.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Wed, 31 Jul 19 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Calling external files from C in R</title>
      <link>https://mpadge.eu/blog/c-external-files.html</link>
      <guid>https://mpadge.eu/blog/c-external-files.html</guid>
      <description>I recently encountered a problem while bundling an old C library into a new R package. The library itself depends on, and includes, an external "dictionary" in plain text format used to construct a large lookup table. The creators of this library of course assume that this dictionary file will always reside in the same directory as the compiled object, and so can always be directly linked. The `src` directory of R packages is, however, only permitted to contain source code, which text files definitively are not. This blog entry is about where to put such files, and how to link them within the source code.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Thu, 04 Jul 19 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Caching via background R processes</title>
      <link>https://mpadge.eu/blog/background-process-caching.html</link>
      <guid>https://mpadge.eu/blog/background-process-caching.html</guid>
      <description>Caching is implemented because it saves time, generally by saving the results of one function call for subsequent reuse. Background processes are also commonly implemented as time-saving measures, through delegating long-running tasks to "somewhere else", allowing you to keep focussing on whatever (un)important things you were doing in the meantime. This blog entry describes how to combine the two to save double time through caching via background processes.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Thu, 06 Jun 19 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>C++ templates and Rcpp</title>
      <link>https://mpadge.eu/blog/rcpp-cpp-templates.html</link>
      <guid>https://mpadge.eu/blog/rcpp-cpp-templates.html</guid>
      <description>C++ templates are really useful. Templates allow you to code a function able to accept arguments of different types that can't necessarily be known until compile time. There is, however, no such thing as an Rcpp template -- all inputs and outputs must have defined types. This blog entry is about how to maximise the usefulness of C++ templates in an Rcpp context.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Tue, 07 May 19 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>how i made this site</title>
      <link>https://mpadge.eu/blog/making-this-site.html</link>
      <guid>https://mpadge.eu/blog/making-this-site.html</guid>
      <description>This site is built with zurb foundation, because i had read that it did everything that hugo could, but that final products were more lightweight and flexible. Plus i had no idea about it, and learning something new is sometimes worthwhile. I was also frustrated that standard hugo advice seemed to be, ''oh, just pick a template and off you go,'' yet there is surprisingly little advice on how to modify any given template, let alone how to start from scratch. It turned out that foundation at least made starting from scratch fairly easy, and so this entry is about that process.</description>
      <content:encoded><![CDATA[]]></content:encoded>
      <pubDate>Mon, 06 May 19 00:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>
