<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog</title><id>https://prcleary.github.io</id><updated>2026-04-26</updated><link href="https://prcleary.github.io/Blog" rel="alternate"/><link href="https://prcleary.github.io/Blog.xml" rel="self"/><entry><id>Blog/setting-up-emanote</id><title type="text">Setting up Emanote</title><updated>2026-04-26</updated><link href="https://prcleary.github.io/Blog/setting-up-emanote" rel="alternate"/><summary type="text">This is how to set up Emanote on a Linux computer (Pop!_OS) to create a blog to host on GitHub Pages, i.e. this one.</summary></entry><entry><id>Blog/2026-04-20</id><title type="text">The scope of this blog</title><updated>2026-04-20</updated><link href="https://prcleary.github.io/Blog/2026-04-20" rel="alternate"/><summary type="text">Potential reasons for blogging include:</summary></entry><entry><id>Blog/2026-04-18</id><title type="text">Pop!_OS upgrade; blog development</title><updated>2026-04-18</updated><link href="https://prcleary.github.io/Blog/2026-04-18" rel="alternate"/><summary type="text">A quiet weekend. Was supposed to be in Pakistan but Iran got first dibs. Up to over 9,000 words for textbook chapter I am writing. Nothing much else going on.</summary></entry><entry><id>Blog/2026-04-13</id><title type="text">New Emanote blog</title><updated>2026-04-13</updated><link href="https://prcleary.github.io/Blog/2026-04-13" rel="alternate"/><summary type="text">Yup, I’ve changed the blog software again. Zola is really powerful, but as before with Quarto/Hugo/Jekyll/you name it, the default format is too basic, so you end up finding a template that is partly what you want and then fighting to get it to do everything you want, which means understanding enough of yet another templating language that you really don’t want to learn, and which LLMs are not very good at. I wanted something that looked good to me with minimal work (and boring enough to deter visitors) and followed whatever structure of nested folders of Markdown files I had without having to specify much routing. This site is for me and rarely for others unless I have pointed someone to something specific. My content is so niche that no one should follow this site. I am a medic doing global health informatics, but am not sure that what I am interested in would interest medics or global health informatics folk. In related news I’ve also come off all social media, realising that I didn’t know what I was doing there and had no reason to use it.</summary></entry><entry><id>Blog/my-emanote-cheatsheet</id><title type="text">My Emanote cheatsheet</title><updated>2026-04-08</updated><link href="https://prcleary.github.io/Blog/my-emanote-cheatsheet" rel="alternate"/><summary type="text">Uses standard Markdown</summary></entry><entry><id>Blog/automatically-email-yourself-tomorrows-calendar</id><title type="text">Automatically email yourself tomorrow's calendar</title><updated>2026-01-17</updated><link href="https://prcleary.github.io/Blog/automatically-email-yourself-tomorrows-calendar" rel="alternate"/><summary type="text">I sometimes have early meetings and it is nice to check while still in bed. This uses a PowerShell script to send an email containing tomorrow’s calendar events to a specified email address.</summary></entry><entry><id>Blog/2026-01-06</id><title type="text">New Zola blog; Dashboard Reports; integration teaser; most-used tech</title><updated>2026-01-06</updated><link href="https://prcleary.github.io/Blog/2026-01-06" rel="alternate"/><summary type="text">Testing out a new Zola blog using the tabi-start template - feels pretty Spartan at the moment compared to Tiddlywiki.</summary></entry><entry><id>Blog/2025-12-31</id><title type="text">Out with the old, in with the new; updates, plans and aspirations</title><updated>2025-12-31</updated><link href="https://prcleary.github.io/Blog/2025-12-31" rel="alternate"/><summary type="text">Well, 2025 ends with this ageing epidemiologist still endlessly curious and in love with life and the human race (yes, all of you, you beautiful complex bastards), maybe a bit tired/bored at work but looking forward to a refreshing short sabbatical later in the year and thinking about how I can keep my job interesting for another 5-10 years when I’ve already done everything I wanted to do.</summary></entry><entry><id>Blog/my-zola-cheatsheet</id><title type="text">My Zola cheatsheet</title><updated>2025-12-31</updated><link href="https://prcleary.github.io/Blog/my-zola-cheatsheet" rel="alternate"/><summary type="text">Most Markdown works as expected, but here are some less obvious things you can do. You can also include HTML.</summary></entry><entry><id>Blog/rust-learning-resources</id><title type="text">Rust learning resources</title><updated>2025-12-31</updated><link href="https://prcleary.github.io/Blog/rust-learning-resources" rel="alternate"/></entry><entry><id>Blog/how-to-install-peertube-on-ubuntu</id><title type="text">How to install PeerTube on Ubuntu</title><updated>2025-10-24</updated><link href="https://prcleary.github.io/Blog/how-to-install-peertube-on-ubuntu" rel="alternate"/><summary type="text">PeerTube is a self-hosted video streaming platform, with various social networking features that I am not using. I need this to host training videos for SENAITE.</summary></entry><entry><id>Blog/2025-09-11</id><title type="text">Karakeep; Paperless GPT; vibe coding; PeerTube; Kodi; Proxmox upgrade</title><updated>2025-09-11</updated><link href="https://prcleary.github.io/Blog/2025-09-11" rel="alternate"/><summary type="text">Off today so catching up with the blog. Lots going on as always; at work I am increasingly being led down a technical leadership path, which is not always comfortable for me, and mostly takes me away from doing lovely technical stuff, but it seems to be what they need me to do; the global health work is progressing, but as always taking longer than expected.</summary></entry><entry><id>Blog/my-devtools-cheatsheet</id><title type="text">My devtools cheatsheet</title><updated>2025-09-11</updated><link href="https://prcleary.github.io/Blog/my-devtools-cheatsheet" rel="alternate"/></entry><entry><id>Blog/quick-dhis-2</id><title type="text">Quick DHIS 2</title><updated>2025-05-02</updated><link href="https://prcleary.github.io/Blog/quick-dhis-2" rel="alternate"/><summary type="text">Needed a quick DHIS 2 for testing something - here is an aide-mémoire of doing it with dhis2/dhis2-server-tools: Tools to support installation and management of DHIS2 on a new Ubuntu 22.04 VM (4GB RAM, 2 vCPU, 20GB storage, static IP address 192.168.1.104) on Proxmox.</summary></entry><entry><id>Blog/deleting-unusedempty-dashboards-and-similar-in-dhis-2-via-the-api-using-r</id><title type="text">Deleting unused/empty dashboards and similar in DHIS 2 via the API using R</title><updated>2025-04-28</updated><link href="https://prcleary.github.io/Blog/deleting-unusedempty-dashboards-and-similar-in-dhis-2-via-the-api-using-r" rel="alternate"/><summary type="text">The Data Administration app (Data Integrity section) in DHIS 2 can give you a list of dashboards which are empty or which have not been viewed within the last year. It is easy to delete those dashboards manually if you can access those dashboards as another user, but what if the dashboards have not been shared with other users?</summary></entry><entry><id>Blog/creating-indicators-via-the-dhis-2-api</id><title type="text">Creating indicators via the DHIS 2 API</title><updated>2025-04-21</updated><link href="https://prcleary.github.io/Blog/creating-indicators-via-the-dhis-2-api" rel="alternate"/><summary type="text">Creating indicators manually in DHIS 2 is not difficult, but it is time-consuming if you have to do a lot. I needed to create health facility-level rates for over 30 data elements. The R code below takes a manual download of DHIS 2 data element metadata, filters them to those with a certain pattern in their names (in my case, “(new cases)” - not case sensitive) and creates a JSON file to be uploaded into DHIS 2 via the Data Import/Export app.</summary></entry><entry><id>Blog/incidence-rates-in-dhis-2</id><title type="text">Incidence rates in DHIS 2</title><updated>2025-04-10</updated><link href="https://prcleary.github.io/Blog/incidence-rates-in-dhis-2" rel="alternate"/><summary type="text">Fair comparison of disease activity across areas typically requires calculation of rates. Here are some notes on uploading denominator data into DHIS 2 and creating indicators for incidence.</summary></entry><entry><id>Blog/backing-up-servers-and-desktops-with-borgmatic</id><title type="text">Backing up servers and desktops with borgmatic</title><updated>2025-04-06</updated><link href="https://prcleary.github.io/Blog/backing-up-servers-and-desktops-with-borgmatic" rel="alternate"/><summary type="text">To have a resilient backup strategy, you need:</summary></entry><entry><id>Blog/senaite-customising-laboratory-report-content</id><title type="text">SENAITE: customising laboratory report content</title><updated>2025-03-31</updated><link href="https://prcleary.github.io/Blog/senaite-customising-laboratory-report-content" rel="alternate"/><summary type="text">senaite/senaite.patient: Patient handling for SENAITE is the add-on that adds the capability to SENAITE to manage patient data but unfortunately it does not include any patient information in lab reports (COA, or Certificates Of Analysis in SENAITE parlance) by default. The COA templates used are in the folder /home/senaite/buildout-cache/eggs/cp27mu/senaite.impress-2.5.0-py2.7.egg/senaite/impress/templates/reports/ - you can create a Plone add-on which overrides these templates (hard if you don’t know Plone) or simply edit the templates in place (easier but your changes will disappear if you upgrade senaite.patient). Plone is pretty complex and it may be a while before I am creating my own add-ons, so I went with the easy option.</summary></entry><entry><id>Blog/implementation-considerations-infrastructure-dhis-2-academy</id><title type="text">Implementation considerations: infrastructure (DHIS 2 Academy)</title><updated>2025-03-21</updated><link href="https://prcleary.github.io/Blog/implementation-considerations-infrastructure-dhis-2-academy" rel="alternate"/><summary type="text">Excellent webinar from the University of Oslo on the advantages and disadvantages of different options for hosting DHIS 2, the open-source health information management system; also useful on the open-source software skills needed for implementation (which many IT people won’t have if their experience has been in commercial contexts); advice on having separate development, staging, production and training instances, and separate instances for tracker and aggregate systems; accessible and non-technical approach</summary></entry><entry><id>Blog/2025-03-11</id><title type="text">SENAITE progress; Bluesky; home server; AOC; Shiny app; Python apps from R; old blog; LibreELEC; Pop! OS Linux distro and new desktop computer; causal inference course</title><updated>2025-03-11</updated><link href="https://prcleary.github.io/Blog/2025-03-11" rel="alternate"/><summary type="text">My main global health focus is still on setting up SENAITE open-source laboratory information system for a provincial lab in Pakistan; I wrote up the post-installation steps; partners are engaging well, we are adding more and more metadata, and we are hopefully nearing the stage where it can be used in production; I did a presentation on the work at a conference, which generated some interest; I found and reported a bug in the senaite.patient add-on; I was slightly worried that not all of the SENAITE API would work but I haven’t had any problems yet, and I’ve written some useful R functions to query the API; I treated myself to the Senaite Starter Package to help me understand SENAITE internals and add more functionality, though haven’t played with it yet; I’ve also worked out how to add Urdu subtitles to recordings of my training presentations on SENAITE, though it doesn’t work perfectly.</summary></entry><entry><id>Blog/convenience-r-functions-for-querying-the-senaite-api</id><title type="text">Convenience R functions for querying the SENAITE API</title><updated>2025-03-11</updated><link href="https://prcleary.github.io/Blog/convenience-r-functions-for-querying-the-senaite-api" rel="alternate"/><summary type="text">Developed these R functions to query the SENAITE API and to put the data into a more manageable format</summary></entry><entry><id>Blog/how-to-create-a-bluesky-feed</id><title type="text">How to create a Bluesky feed</title><updated>2025-03-11</updated><link href="https://prcleary.github.io/Blog/how-to-create-a-bluesky-feed" rel="alternate"/><summary type="text">You can see the result of mine here: EpiNerd — Bluesky - it still includes some weird things (mute or block them if they keep appearing)</summary></entry><entry><id>Blog/notes-on-new-homelab-setup</id><title type="text">Notes on new homelab setup</title><updated>2025-03-11</updated><link href="https://prcleary.github.io/Blog/notes-on-new-homelab-setup" rel="alternate"/><summary type="text">Bullet point notes on recent acquisition of home server and set up so far:</summary></entry><entry><id>Blog/update-on-progress-with-senaite-laboratory-information-management-system-configuration</id><title type="text">Update on progress with SENAITE laboratory information management system configuration</title><updated>2025-03-11</updated><link href="https://prcleary.github.io/Blog/update-on-progress-with-senaite-laboratory-information-management-system-configuration" rel="alternate"/><summary type="text">I am currently working on the implementation of a laboratory information management project using SENAITE. As previously with DHIS 2, I am learning as I go: how to install it, how to pronounce it (senn-ite I think), how to make it secure, how to configure it for the specific context where it will be used, maintenance, troubleshooting, working with users, how to integrate it with other data processes, etc etc.</summary></entry><entry><id>Blog/extracting-postcodes-from-text</id><title type="text">Extracting postcodes from text</title><updated>2025-02-20</updated><link href="https://prcleary.github.io/Blog/extracting-postcodes-from-text" rel="alternate"/></entry><entry><id>Blog/function-to-aggregate-counts-by-iso-week-from-dates-without-gaps</id><title type="text">Function to aggregate counts by ISO week from dates, without gaps</title><updated>2025-02-20</updated><link href="https://prcleary.github.io/Blog/function-to-aggregate-counts-by-iso-week-from-dates-without-gaps" rel="alternate"/></entry><entry><id>Blog/function-to-find-date-of-end-of-iso-week-for-a-date</id><title type="text">Function to find date of end of ISO week for a date</title><updated>2025-02-20</updated><link href="https://prcleary.github.io/Blog/function-to-find-date-of-end-of-iso-week-for-a-date" rel="alternate"/></entry><entry><id>Blog/stuff-i-found-from-years-ago-when-i-was-going-down-a-web-developmentprint-css-rabbithole</id><title type="text">Stuff I found from years ago when I was going down a Web development/Print CSS rabbithole</title><updated>2025-02-20</updated><link href="https://prcleary.github.io/Blog/stuff-i-found-from-years-ago-when-i-was-going-down-a-web-developmentprint-css-rabbithole" rel="alternate"/><summary type="text">Just found these notes while clearing out old files, from an abortive Quarto blog years ago. I ended up going down a Web development rabbithole and got fed up with both Web development and Quarto.</summary></entry><entry><id>Blog/command-line-weather-forecast</id><title type="text">Command line weather forecast</title><updated>2025-02-18</updated><link href="https://prcleary.github.io/Blog/command-line-weather-forecast" rel="alternate"/><summary type="text">You can get a weather forecast direct from the command line with e.g.</summary></entry><entry><id>Blog/useful-javascript-snippets</id><title type="text">Useful JavaScript snippets</title><updated>2025-02-03</updated><link href="https://prcleary.github.io/Blog/useful-javascript-snippets" rel="alternate"/><summary type="text">The most reliable method I have found for avoiding productive procrastination (where you keep busy all day, but avoid important tasks you are still processing subconsciously or have a mental block on) is to randomise my tasks. I have found ways to get my tasks out of Nextcloud tasks to include in a text-based randomisation process, but I need this to work for email as well. You can easily copy the titles of emails from the Outlook client but by default you can’t copy out of webmail clients (I have Outlook and Proton Mail webmail accounts - it is unlikely to work with other types of webmail as is).</summary></entry><entry><id>Blog/adding-translated-subtitles-to-video-recordings-of-presentations-using-large-language-models</id><title type="text">Adding translated subtitles to video recordings of presentations, using large language models</title><updated>2025-01-28</updated><link href="https://prcleary.github.io/Blog/adding-translated-subtitles-to-video-recordings-of-presentations-using-large-language-models" rel="alternate"/><summary type="text">As part of my LIMS implementation I have been delivering training sessions in my native English to non-native English speakers. I usually consciously try to speak slowly but I have realised I may need to do more to increase accessibility for non-native speakers. It’s possible a British accent is more difficult to understand (even in the US I found I needed to speak in a mid-Atlantic way to avoid occasional incomprehension). Recently I was excited to find an easy way to add translated subtitles to a presentation recording without using any online services.</summary></entry><entry><id>Blog/run-shiny-app-from-windows-batch-file-example</id><title type="text">Run Shiny app from Windows batch file: example</title><updated>2025-01-13</updated><link href="https://prcleary.github.io/Blog/run-shiny-app-from-windows-batch-file-example" rel="alternate"/><summary type="text">Create planner.bat (not planner.bat.txt!)</summary></entry><entry><id>Blog/running-python-apps-from-r</id><title type="text">Running Python apps from R</title><updated>2025-01-08</updated><link href="https://prcleary.github.io/Blog/running-python-apps-from-r" rel="alternate"/><summary type="text">You too can run Python apps from R. I did the following in RStudio:</summary></entry><entry><id>Blog/advent-of-code-2024-days-6-9</id><title type="text">Advent of Code 2024: days 6-9</title><updated>2024-12-30</updated><link href="https://prcleary.github.io/Blog/advent-of-code-2024-days-6-9" rel="alternate"/><summary type="text">Got further than I thought I would - ran out of alone time when I got to day 9 .</summary></entry><entry><id>Blog/advent-of-code-2024-days-1-5</id><title type="text">Advent of Code 2024: days 1-5</title><updated>2024-12-13</updated><link href="https://prcleary.github.io/Blog/advent-of-code-2024-days-1-5" rel="alternate"/><summary type="text">Here are my solutions so far:</summary></entry><entry><id>Blog/deef-a-shiny-app</id><title type="text">deef: a Shiny app</title><updated>2024-11-15</updated><link href="https://prcleary.github.io/Blog/deef-a-shiny-app" rel="alternate"/><summary type="text">Nearly 10 years ago I was faced with the challenge of routinely collecting personally-identifiable data on TB cases from clinicians across my region. I created a form in Microsoft Word and some code (ultimately a Shiny app) to extract the data from a batch of forms (sent via secure email), which involved getting my head around XML and XPath queries. This process worked surprisingly well for several years, and I automated much of the analysis too. I even Dockerised the Shiny app at one point and tried to deploy it on our internal OpenShift platform (ultimately stymied by a non-functioning GitLab Runner). For fun (only) I deployed the app on my CapRover PaaS. It was my first real Shiny app and I did want to develop it further to tidy up the code and the user interface and capture more types of form field, but version 2 never progressed very far due to increasing competing demands on my time. Eventually the national surveillance data collection system was upgraded to capture the same data and we switched to using that instead.</summary></entry><entry><id>Blog/post-installation-checklist-for-senaite</id><title type="text">Post-installation checklist for SENAITE</title><updated>2024-10-27</updated><link href="https://prcleary.github.io/Blog/post-installation-checklist-for-senaite" rel="alternate"/><summary type="text">Congratulations if you have successfully installed SENAITE. This checklist follows on here.</summary></entry><entry><id>Blog/should-i-learn-python-now-i-know-r</id><title type="text">Should I learn Python now I know R?</title><updated>2024-10-27</updated><link href="https://prcleary.github.io/Blog/should-i-learn-python-now-i-know-r" rel="alternate"/><summary type="text">In response to a query from a colleague:</summary></entry><entry><id>Blog/my-proxmox-cheatsheet</id><title type="text">My Proxmox cheatsheet</title><updated>2024-10-14</updated><link href="https://prcleary.github.io/Blog/my-proxmox-cheatsheet" rel="alternate"/><summary type="text">Not got this working yet</summary></entry><entry><id>Blog/modifying-a-senaite-add-on</id><title type="text">Modifying a SENAITE add-on</title><updated>2024-10-10</updated><link href="https://prcleary.github.io/Blog/modifying-a-senaite-add-on" rel="alternate"/><summary type="text">The lab I am working with needs to add some additional patient identifiers to its sample requests. SENAITE (with the senaite.patient add-on) has an unsatisfactory solution to this: you can add arbitrary identifiers, but only if you go into the Patient listing and add the patient there, i.e. as an additional step to entering the sample request information. Ideally you would be able to enter the additional identifiers at the same time as you enter the sample request information.</summary></entry><entry><id>Blog/installation-senaite</id><title type="text">Installation · SENAITE</title><updated>2024-10-08</updated><link href="https://prcleary.github.io/Blog/installation-senaite" rel="alternate"/><summary type="text">An updated version of the official installation instructions, working as of September 2024 - I subsequently found this which might be better: bika.documentation/docs/BikaSenaiteServerIntroduction.md at main · bikalims/bika.documentation</summary></entry><entry><id>Blog/dealing-with-tiny-console-text-in-proxmox</id><title type="text">Dealing with tiny console text in Proxmox</title><updated>2024-10-04</updated><link href="https://prcleary.github.io/Blog/dealing-with-tiny-console-text-in-proxmox" rel="alternate"/><summary type="text">It is easy to do most Proxmox things through the Web interface. You can easily interact with virtual machines through a console in your browser, but the console text is very small and borderline readable for someone like me. You can easily increase the size of the text by changing the console font thus:</summary></entry><entry><id>Blog/next-steps-with-proxmox</id><title type="text">Next steps with Proxmox</title><updated>2024-10-04</updated><link href="https://prcleary.github.io/Blog/next-steps-with-proxmox" rel="alternate"/><summary type="text">Been ill with some virus and feeling pretty sorry for myself for nearly two weeks.</summary></entry><entry><id>Blog/proxmox-your-own-data-centre</id><title type="text">Proxmox: your own data centre</title><updated>2024-10-04</updated><link href="https://prcleary.github.io/Blog/proxmox-your-own-data-centre" rel="alternate"/><summary type="text">I want to do more experimentation with virtualisation and containerisation, but don’t want to keep paying additional sums for things I might spin up on cloud providers like Hetzner or Digital Ocean. I’ve got several web apps/services that I use regularly (Nextcloud, Calibre, RStudio, Jupyter, Miniflux, Dolibarr, Appsmith and others) running on my domain, all of which run in Docker containers on a single VM behind CapRover (which uses Docker Swarm). Although only a single point of failure away from data loss (I’ve seen similar setups described as “clown computing”), this has worked really well for my personal stuff so far. I take snapshots, though not perhaps as frequently as I should, and periodically back up my Nextcloud files and other key stuff to an external drive (Nextcloud syncs with my main home Linux box). So not quite a 3-2-1 backup strategy. I’ve also got a mailserver running on a separate (much lower spec) VM for a local football club I do some admin stuff for (use MailInABox for this and had to interact with Google, Microsoft and others to get the IP address off various spam blacklists). I’ve also temporarily set up various other more expensive VPSs to experiment with things like DHIS 2 over the years.</summary></entry><entry><id>Blog/moocs</id><title type="text">MOOCs</title><updated>2024-09-23</updated><link href="https://prcleary.github.io/Blog/moocs" rel="alternate"/><summary type="text">Currently doing this free online edX course: HarvardX: Causal Diagrams: Draw Your Assumptions Before Your Conclusions | edX and it’s really good. I finished the Pearl book on causal inference thinking it all made sense but wasn’t sure how I would apply it in practice. This course fills that gap by going through many examples of epidemiological findings which only make sense in the light of graphical models. It has made me change how I think about confounding and selection bias.</summary></entry><entry><id>Blog/automating-bitwarden-send</id><title type="text">Automating Bitwarden Send</title><updated>2024-08-24</updated><link href="https://prcleary.github.io/Blog/automating-bitwarden-send" rel="alternate"/><summary type="text">Not many years ago your local IT department might be alarmed to learn that you were using a password manager. A password manager is a software tool running on your computer and/or in your browser which helps you keep track of your login details for different websites. The key advantage is that you can create a different long, complex password (I use at least 20 characters from a-z, A-Z, 0-9 plus special characters) for every site without having to remember any of them; the downside is if your password manager gets hacked. However, if your alternative to using a password manager is to use the same passwords (or variations) across sites, then that is far more risky. The UK National Cybersecurity Centre now recommends the use of password managers.</summary></entry><entry><id>Blog/2025-04-10</id><title type="text">DHIS 2 indicators for incidence; a good webinar; backing up servers</title><updated>2024-04-10</updated><link href="https://prcleary.github.io/Blog/2025-04-10" rel="alternate"/><summary type="text">Just a quick post - I’m going to try to blog little and often in future</summary></entry><entry><id>Blog/senaite-setup-data-diagram</id><title type="text">SENAITE setup data diagram</title><updated>2024-03-27</updated><link href="https://prcleary.github.io/Blog/senaite-setup-data-diagram" rel="alternate"/><summary type="text">As part of getting my head around SENAITE, I put together the diagram below using the Mermaid.js syntax. As you can see, it is quite a large and complex diagram which is hard to read. Syntax is below.</summary></entry><entry><id>Blog/how-to-follow-blogs-without-rss-feeds</id><title type="text">How to follow blogs without RSS feeds</title><updated>2024-03-09</updated><link href="https://prcleary.github.io/Blog/how-to-follow-blogs-without-rss-feeds" rel="alternate"/><summary type="text">If like me you have given up on Twitter, Reddit, Mastodon and whatnot (I haven’t deleted my Facebook and LinkedIn accounts just yet), and follow blogs exclusively using their RSS (or Atom or JSON) feeds, then you will occasionally find a really good geek blog which inexplicably does not have a web feed (expecting you to use Twitter or Mastodon instead). In vain you will add things like /feed.xml to the end of the URL or search the page source.</summary></entry><entry><id>Blog/my-tech-march-2024</id><title type="text">My tech March 2024</title><updated>2024-03-09</updated><link href="https://prcleary.github.io/Blog/my-tech-march-2024" rel="alternate"/><summary type="text">Recently there has been a flurry of “my tech” articles on the blogs I follow, so I thought I would list some of the more interesting software I’ve been using recently.</summary></entry><entry><id>Blog/notes-on-using-bayesian-statistics-in-outbreak-investigation</id><title type="text">Notes on using Bayesian statistics in outbreak investigation</title><updated>2024-02-13</updated><link href="https://prcleary.github.io/Blog/notes-on-using-bayesian-statistics-in-outbreak-investigation" rel="alternate"/><summary type="text">I recently had the opportunity to try out Bayesian methods in a large gastrointestinal disease outbreak. This was a case-case study, comparing cases of outbreak infection with cases of another gastrointestinal infection. Data were collected from different regions/countries, in different ways. There was no sampling; just all the data we could get, which is the standard approach.</summary></entry><entry><id>Blog/2024-02-03</id><title type="text">Back to blogging; RSS feed; p values; SENAITE; 2024 reading</title><updated>2024-02-03</updated><link href="https://prcleary.github.io/Blog/2024-02-03" rel="alternate"/><summary type="text">Have been doing bits and pieces on this blog over recent months, but no posts like this; I’ve been led to realise how niche my interests are on a number of occasions recently, but this blog is still useful to me, as somewhere to put stuff if nothing else</summary></entry><entry><id>Blog/notes-on-the-datatable-package</id><title type="text">Notes on the data.table package</title><updated>2024-02-03</updated><link href="https://prcleary.github.io/Blog/notes-on-the-datatable-package" rel="alternate"/><summary type="text">Work in progress</summary></entry><entry><id>Blog/2024-10-27</id><title type="text">SENAITE rabbithole; Python mon amour; Alles was du wissen muss; causal inferencing; better blogging; Bayesian and other shiny new things</title><updated>2024-01-27</updated><link href="https://prcleary.github.io/Blog/2024-10-27" rel="alternate"/><summary type="text">When I was previously tasked with implementing DHIS 2 for surveillance I must have spend hundreds of hours learning about it and playing with it, both in work and in my own time; the last several months I have been going through a similar process with SENAITE the laboratory information management system; I have been documenting things here as I go, such as installation, modifying functionality, styling printed reports and the myriad other steps involved in implementation; this week we should be “soft launching” it at the lab we are working with to see what they think and make any further changes required; I am confident we have chosen the best open source option, but there is further work to do around microbiology/AMR reporting, SMS reporting and integration of the data with DHIS 2.</summary></entry><entry><id>Blog/timezones</id><title type="text">Timezones</title><updated>2024-01-19</updated><link href="https://prcleary.github.io/Blog/timezones" rel="alternate"/><summary type="text">From the amazing Free Clocks for Your Website</summary></entry><entry><id>Blog/quick-start-with-senaite-laboratory-information-management-system-configuration</id><title type="text">Quick start with SENAITE laboratory information management system configuration</title><updated>2024-01-16</updated><link href="https://prcleary.github.io/Blog/quick-start-with-senaite-laboratory-information-management-system-configuration" rel="alternate"/><summary type="text">I previously installed SENAITE on my test server and I have now installed a production instance on another server, using my notes from last time.</summary></entry><entry><id>Blog/installing-senaite-laboratory-information-management-system-on-ubuntu</id><title type="text">Installing SENAITE laboratory information management system on Ubuntu</title><updated>2023-12-08</updated><link href="https://prcleary.github.io/Blog/installing-senaite-laboratory-information-management-system-on-ubuntu" rel="alternate"/><summary type="text">Notes from my own recent installation:</summary></entry><entry><id>Blog/statistical-practice-in-field-epidemiology-so-many-problems-so-many-solutions</id><title type="text">Statistical practice in field epidemiology: so many problems, so many solutions</title><updated>2023-10-01</updated><link href="https://prcleary.github.io/Blog/statistical-practice-in-field-epidemiology-so-many-problems-so-many-solutions" rel="alternate"/><summary type="text">Some colleagues and I have recently been having an interesting discussion about how we should be taking account of recent statistical criticisms of p values and practices such as stepwise model selection. We work in a field where a lot of statistical analysis is done by non-statisticians, with or without the support of statisticians, often as part of outbreak investigations and sometimes for research projects.</summary></entry><entry><id>Blog/interested-in-bayesian-statistics-and-want-to-know-more</id><title type="text">Interested in Bayesian statistics and want to know more?</title><updated>2023-06-23</updated><link href="https://prcleary.github.io/Blog/interested-in-bayesian-statistics-and-want-to-know-more" rel="alternate"/><summary type="text">Some suggested articles below. Not a systematic review but ones that I found useful or might be of general interest. Some start off easy but suddenly get hard - dip in and out of several to see which interest you most.</summary></entry><entry><id>Blog/my-linux-cheatsheet</id><title type="text">My Linux cheatsheet</title><updated>2023-06-12</updated><link href="https://prcleary.github.io/Blog/my-linux-cheatsheet" rel="alternate"/><summary type="text">Stuff I find myself Googling for the nth time</summary></entry><entry><id>Blog/checklist-for-setting-up-a-new-ubuntu-server-vm-in-proxmox-to-run-docker</id><title type="text">Checklist for setting up a new Ubuntu Server VM in Proxmox to run Docker</title><updated>2023-03-16</updated><link href="https://prcleary.github.io/Blog/checklist-for-setting-up-a-new-ubuntu-server-vm-in-proxmox-to-run-docker" rel="alternate"/><summary type="text">Bit of an aide-memoire as I have done this so many times now and keep forgetting bits. There may be slight differences between Ubuntu versions.</summary></entry><entry><id>Blog/useful-scripts-from-chatgpt</id><title type="text">Useful scripts from ChatGPT</title><updated>2023-03-16</updated><link href="https://prcleary.github.io/Blog/useful-scripts-from-chatgpt" rel="alternate"/><summary type="text">Possibly like many nerds, I couldn’t initially see past all the hype and stupidity around generative AI, but I have now managed to get ChatGPT to generate some really useful scripts recently, which I have included below, and I now realise it can be really useful if not game-changing. It sometimes took several iterations to get the working code I wanted, so there definitely has to be a human in the loop for it to be safe, but generative AI does have the potential to be quite time-saving. It is good at some things (bash or Python scripts) but not so good at others (Dockerfiles, Ansible playbooks). DeepSeek seems quite good for providing technical step-by-step guidance, though again it can take several attempts to get a correct answer.</summary></entry><entry><id>Blog/my-r-cheatsheet</id><title type="text">My R cheatsheet</title><updated>2023-03-15</updated><link href="https://prcleary.github.io/Blog/my-r-cheatsheet" rel="alternate"/><summary type="text">Stuff I find myself Googling for the nth time</summary></entry><entry><id>Blog/my-docker-cheatsheet</id><title type="text">My Docker cheatsheet</title><updated>2023-03-13</updated><link href="https://prcleary.github.io/Blog/my-docker-cheatsheet" rel="alternate"/><summary type="text">Stuff I find myself Googling for the nth time</summary></entry><entry><id>Blog/2023-03-01</id><title type="text">My tech March 2024</title><updated>2023-03-01</updated><link href="https://prcleary.github.io/Blog/2023-03-01" rel="alternate"/><summary type="text">Recently there has been a flurry of “my tech” articles on the blogs I follow, so I thought I would list some of the more interesting software I’ve been using recently.</summary></entry><entry><id>Blog/2023-02-26</id><title type="text">Most frequently bookmarked</title><updated>2023-02-27</updated><link href="https://prcleary.github.io/Blog/2023-02-26" rel="alternate"/><summary type="text">I follow more than 4,500 blogs or other Web sites at the moment and have bookmarked over 15,500 pages in recent years. My rule is no feeds before 6pm, even at weekends (reading, Anki, guitar practice and either a run or pull-ups take priority in leisure time), but I can skim through a lot quite quickly, bookmarking those that might come in useful later and reading only those that are relevant to what I am doing now.</summary></entry><entry><id>Blog/how-to-learn-r</id><title type="text">How to learn R (an opinionated view)</title><updated>2023-02-27</updated><link href="https://prcleary.github.io/Blog/how-to-learn-r" rel="alternate"/><summary type="text">So you would like to learn the statistical programming language R. You have decided this entirely of your own free will and without any undue coercion, conscious or unconscious, from me.</summary></entry><entry><id>Blog/2023-02-27</id><title type="text">Holiday reading; learning R; most frequently bookmarked</title><updated>2023-02-07</updated><link href="https://prcleary.github.io/Blog/2023-02-27" rel="alternate"/></entry></feed>