{
  "author" : {
    "name" : "Douglas Hill",
    "url" : "https://douglashill.co/"
  },
  "feed_url" : "https://douglashill.co/full-feed.json",
  "home_page_url" : "https://douglashill.co/",
  "items" : [
    {
      "content_html" : "<p>lol special announcement on the train from Brussels to London now saying their Wi-Fi is “not the best” and to please stream the football using your own 4G/5G connection instead.</p>\n",
      "date_published" : "2026-07-15T21:07:30+02:00",
      "id" : "https://douglashill.co/2026/stream-the-football/",
      "url" : "https://douglashill.co/2026/stream-the-football/"
    },
    {
      "content_html" : "<p>Heading to Berlin today for <a href=\"https://www.localfirstconf.com/\">Local First Conference</a>. It‘s a software conference themed around goals rather than technologies. Very interested to see how this goes and what other people there are building.</p>\n",
      "date_published" : "2026-07-08T08:17:18+02:00",
      "id" : "https://douglashill.co/2026/heading-to-berlin-today-for-local-first-conference/",
      "url" : "https://douglashill.co/2026/heading-to-berlin-today-for-local-first-conference/"
    },
    {
      "content_html" : "<p>I’m seeing a regression in Apple Shortcuts where “Count Characters in …” says “Unable to decode file contents” when passed rich text. Workaround: Add a “Get text from (rich text)” and count with that instead. (I’m on macOS 26.5 but this might have been there for a while.)</p>\n",
      "date_published" : "2026-07-03T13:13:08+02:00",
      "id" : "https://douglashill.co/2026/shortcuts-count-characters-rich-text/",
      "url" : "https://douglashill.co/2026/shortcuts-count-characters-rich-text/"
    },
    {
      "content_html" : "<p>Limited social connection was always a challenge with remote work, but with AI human-to-human communication is further minimised. We exchange messages with people’s robots, or more likely we have our robots talk to their robots. Efficient, but makes me think it would be nice to hang out with people.</p>\n",
      "date_published" : "2026-07-03T12:37:57+02:00",
      "id" : "https://douglashill.co/2026/social-connection-remote-work-ai/",
      "url" : "https://douglashill.co/2026/social-connection-remote-work-ai/"
    },
    {
      "content_html" : "<p>In May, I attended <a href=\"https://rustweek.org/\">RustWeek</a> in Utrecht. This was my first time at a conference outside of iOS/Swift development, and except for <a href=\"https://tryswift.jp/\">try! Swift Tokyo</a>, it was the biggest conference I’ve been to. Someone said there were around 800 attendees, which sounds plausible.</p>\n\n<p>The conference had three parallel talk tracks, and you could easily switch tracks between each talk. Everything ran impressively on schedule so it was easy to switch rooms.</p>\n\n<p>I’m fairly new to Rust so some of the more technical details in talks were harder for me to follow, but it was great learning about Rust and the Rust community. There were enough general talks that someone who never worked with Rust could probably find the two days useful treating this as a general software development conference.</p>\n\n<p>Since I went into the conference knowing nobody, I would have appreciated more structure in place to help with meeting people. Of course I still met people, just this was harder work. There were social activities, but these were mostly <em>after</em> the main conference days, and I wasn’t able to stay around that long. Ideally you’d meet more people before. <a href=\"https://uikonf.com/\">UIKonf</a> did this best, with a range of excellent social activities on the Sunday afternoon before their conference (kayaking, bike tour, museums) and volunteers organising dinner groups.</p>\n\n<p>Below are notes on some of the talks I attended.</p>\n\n<h2>Day 1</h2>\n\n<p>The main track started with <a href=\"https://2026.rustweek.org/talks/taylor/\"><em>The Language of Empathy</em></a> by <a href=\"https://github.com/cramertj/\">Taylor Cramer</a>. This was a great opener. Taylor spoke about empathy as part of Rust’s design philosophy, tooling, and community, then turned that into practical advice for building better systems and better teams. The advice wasn’t specific to Rust or software development really. For example, if someone is expressing an opposing view to you, make sure you’ve each communicated your <em>trade-offs</em>. Making different trade-offs is likely leading to the different conclusions.</p>\n\n<p><img src=\"https://douglashill.co/2026/rustweek/empathy.jpg\" alt=\"Photo of Taylor Cramer on stage with summary slide that says: Empathy; Focus on OFNR (observations, feelings, needs, requests); Discuss your trade-offs; Be open to having your mind changed; Find positive-sum solutions!\" title=\"\" /></p>\n\n<p><a href=\"https://2026.rustweek.org/talks/waffle/\"><em>When is never?</em></a> by <a href=\"https://blog.ihatereality.space/\">waffle</a> switched to a technical topic: the never type. It explained what Rust’s <a href=\"https://doc.rust-lang.org/std/primitive.never.html\"><code>!</code> never type</a> is, why this has been unstable for so long, and what is involved in bringing this to stable Rust. The talk was still easy enough for me to follow along. There are some inconsistencies in how never behaves, and it’s desirable to resolve these before making the API stable. To do this, some existing code would have to be broken one way or another. The chosen approach is to make this a warning first. We’ll be able to retain the old behaviour by staying on an older edition of Rust.</p>\n\n<p>The never type being called <a href=\"https://doc.rust-lang.org/std/primitive.never.html\"><code>!</code> in Rust</a> and <a href=\"https://developer.apple.com/documentation/swift/never\"><code>Never</code> in Swift</a> is a great example of the trade-offs in the languages. Rust often likes to express things with a minimum of characters. Swift is more verbose, but I would say generally ends up with more clarity and consistency.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/mark/\"><em>Scaling up Rust development at the Dutch Electoral Council</em></a> by <a href=\"https://github.com/praseodym\">Mark Janssen</a> covered lessons from using Rust in production for Dutch elections and scaling Rust usage to new projects at the <a href=\"https://www.kiesraad.nl/\">Dutch Electoral Council</a>. This included an overview of how the voting system works in the Netherlands: individual votes are made on paper and summed up locally on an air-gapped system running <a href=\"https://github.com/kiesraad/abacus\">Abacus</a>, which is implemented in Rust and React/TypeScript.</p>\n\n<p>By regulation, the entire toolchain, including the compiler, must be open source. They thought Rust was the more unproven thing, but actually had more issues with React.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/bastian/\"><em>How we replace common C(++) libraries with Rust at scale</em></a> by <a href=\"https://github.com/1c3t3a\">Bastian Kersting</a> from Google was about replacing libraries with Rust alternatives, then exposing them back to C++ using <a href=\"https://github.com/google/crubit\">Crubit</a>. Rather than rewriting all their C++ in Rust, what they’re focusing on first is swapping out dependencies for things like image decoding and compression from C/C++ to Rust dependencies. This addresses the most likely areas for memory safety bugs first. They mostly wrap these for use from their C++ code. A useful resource shared was Google’s <a href=\"https://github.com/google/safe-bindings\">safe-bindings</a> repository.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/andreea/\"><em>Lessons Learnt from using Rust as the Intro to Programming</em></a> by <a href=\"https://andrecostea.github.io/\">Andreea Costea</a> explored using Rust as the first language in an introductory programming course. One concern was whether Rust not allowing many types of programming errors would deprive students from learning from their mistakes. As it turned out, they still make the mistakes, but the compiler catches these, so the compiler itself is like a teaching assistant.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/cliff/\"><em>Common Pitfalls of Rewriting Things In Rust</em></a> by <a href=\"https://cliffle.com/blog/\">Cliff L. Biffle</a> was focused on systems programming and common patterns from C, C++, and Go that don’t translate cleanly to Rust. My main takeaway was that it’s aliasing: two references back to the same memory. Global variables are also common in C, and Rust doesn’t like them, but they can still be a good option.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/xavier/\"><em>When Iterators Aren’t Zero Cost</em></a> by <a href=\"https://github.com/xldenis\">Xavier Denis</a> was a look at when iterators in Rust can and can’t be compiled to vector instructions. This was technically deep, but was clearly presented so I found it easy to follow. It was useful to learn about <a href=\"https://speedscope.app/\">speedscope</a>, a flame graph visualiser for analysing where programs spend their time.</p>\n\n<p>The first day finished with <a href=\"https://2026.rustweek.org/talks/alice/\"><em>Completion-based IO</em></a> by <a href=\"https://ryhl.io/\">Alice Ryhl</a>. The talk was about the history of operating system APIs for reading and writing files and how <a href=\"https://tokio.rs/\">Tokio</a> provides async behaviour on top of these mostly synchronous APIs. The technical details went a bit over my head at the end of a long day!</p>\n\n<h2>Day 2</h2>\n\n<p>In <a href=\"https://2026.rustweek.org/talks/greg/\"><em>Untrusted data in Linux — How Rust is going to save us</em></a>, <a href=\"http://www.kroah.com/log/\">Greg Kroah-Hartman</a> spoke about making the boundary between trusted and untrusted data explicit in the Linux kernel, using Rust to track data that crosses from userspace into the kernel. The kernel abstracts away the hardware and is never finished because hardware keeps changing. Linux is used everywhere, including in cow-milking machines.</p>\n\n<p>A recurring theme was “all input is evil”. Greg talked about <code>guard()</code> in C for scoped locks and allocations, inspired by Rust, and about using <code>Untrusted&lt;T&gt;</code> and different pointer types for data originating outside the kernel. At the snapshot shown in the talk, Linux had around 36 million lines of C and 113,000 lines of Rust. Adding Rust has also forced them to review C APIs. They want more developers; the place to start is <a href=\"https://rust-for-linux.com/\">Rust for Linux</a>.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/wasm/\"><em>Debunking Rust Wasm Performance Myths: Why We Moved Core Business Logic to Rust at Canva</em></a> by <a href=\"https://andrewjakubowicz.me/\">Andrew Jakubowicz</a> and <a href=\"https://github.com/taj-p\">Taj Pereira</a> covered lessons from shipping Rust and WebAssembly in production at Canva. WebAssembly is a compile destination that complements JavaScript, can run on the server as well as in the browser, and is sandboxed by default. It has no knowledge of the host, so it can’t even log to the console without help, and Rust commonly integrates with JavaScript via <a href=\"https://github.com/rustwasm/wasm-bindgen\"><code>wasm-bindgen</code></a>.</p>\n\n<p>The performance section pushed back on several myths. JavaScript might be fast enough on high-end devices, but many people use low-end devices that aren’t getting faster in the same way. JavaScript can also hit slow cases with megamorphic input and garbage collection spikes. The talk also covered the “bridge tax”: function calls don’t necessarily have meaningful overhead, but strings are more complicated because JavaScript uses UTF-16 while Rust uses UTF-8. Their supporting book for the talk is <a href=\"https://rust-wasm-myths.rustweek2026.workers.dev/\">Rust Wasm Performance Myths</a>. They also mentioned that there is no JavaScript JIT in hybrid apps on iOS, so compiling Rust natively can make sense there.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/karin/\"><em>Learning Rust as First Programming Language</em></a> by <a href=\"https://github.com/jkarinkl\">Karin Lammers</a> covered what it is like to learn Rust with no previous programming experience. She described five pillars of learning: motivation, growth mindset, habit, a network of people, and resources. One useful framing was “I can’t do this <em>yet</em>.” She also kept a journal, so she could look back and see her progress. Good resources were <a href=\"https://doc.rust-lang.org/book/\">The Rust Programming Language book</a> (which I read already) and <a href=\"https://rustlings.rust-lang.org/\">Rustlings</a>, which provides small exercises and was new to me.</p>\n\n<p>There aren’t many learning resources out there for learning Rust as a first language. You can learn how to write a function in Rust, but not what a function is.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/arya/\"><em>Obsessive Optimization with String Interning</em></a> by <a href=\"https://bal-e.org/\">arya dradjica</a> was a deep dive into low-level optimisation through string interning, based on building a fast multi-threaded string interner. A couple of interesting crates are <a href=\"https://docs.rs/string-interner\"><code>string-interner</code></a> and <a href=\"https://docs.rs/hashbrown/latest/hashbrown/\"><code>hashbrown</code></a>.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/teor/\"><em>Are we interop yet?</em></a> by <a href=\"https://github.com/teor2345\">Teor</a> covered the current state of Rust interop features, especially for C++ and similar languages. C interfaces rule the world, and a lot of interop is specified in terms of C, but C can’t capture features of modern languages. Some of the tools mentioned were <a href=\"https://hkalbasi.github.io/zngur/\">Zngur</a>, <a href=\"https://github.com/google/crubit\">Crubit</a>, <a href=\"https://cxx.rs/\">cxx</a>, <a href=\"https://google.github.io/autocxx/\">autocxx</a>, <a href=\"https://rust-lang.github.io/rust-bindgen/\">bindgen</a>, and <a href=\"https://github.com/mozilla/cbindgen\">cbindgen</a>.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/urgau/\"><em>Overcoming GitHub shortcomings with Triagebot</em></a> by <a href=\"https://github.com/Urgau\">Urgau</a> was about improving Rust’s GitHub workflow with <a href=\"https://forge.rust-lang.org/triagebot/index.html\">Triagebot</a>. GitHub can make large or long-lived PRs hard to review: it collapses large numbers of comments and only loads more comments in chunks. Triagebot adds a <a href=\"https://forge.rust-lang.org/triagebot/view-all-comments-link.html\">view of all comments</a>, which is also useful if the main GitHub site is down but the API still works.</p>\n\n<p>Another useful feature was a <a href=\"https://git-scm.com/docs/git-range-diff\"><code>git range-diff</code></a> viewer: a diff of diffs. This can be confusing manually, so the bot detects rebases and posts a comment linking to a range-diff view.</p>\n\n<p><a href=\"https://2026.rustweek.org/talks/laurenz/\"><em>Typst: Designing for Incrementality</em></a> by <a href=\"https://laurmaedje.github.io/\">Laurenz Mädje</a> covered how <a href=\"https://typst.app/\">Typst</a> is designed to support real-time preview for large documents.</p>\n\n<p>An interesting point was that you can’t lay out a document in one pass. A table of contents depends on headings, but comes first, so it can push following pages later. With LaTeX you often need to run the compiler multiple times. Typst automatically runs multiple times until the result stabilises. Laurenz also talked about memoization with <a href=\"https://github.com/typst/comemo\">comemo</a>. Since Typst is like a program with no extra input, everything is determined; you can hover over code and it shows the result of that code.</p>\n\n<p>The conference closed, for me, with <a href=\"https://2026.rustweek.org/talks/aeva/\"><em>Between Computer Code And Legal Code: Open Source’s Influence</em></a> by <a href=\"https://aeva.online/\">Æva Black</a>. This was about the relationship between open source, policy and regulation. Æva talked about how open source communities can participate in shaping rules that will affect them.</p>\n\n<p>There were several interesting examples. MySQL was an open source company acquired for a billion dollars. Companies building on top of open source can be incentivised not to share security patches. The <a href=\"https://digital-strategy.ec.europa.eu/en/policies/cra-open-source\">EU Cyber Resilience Act</a> changes some of that by obliging companies to provide patches, while open source projects are not obliged to incorporate them. Open source stewards have some fairly lightweight responsibilities under this act.</p>\n\n<h2>In general</h2>\n\n<p>It was clear from the conference just how important <em>community</em> is to Rust.</p>\n\n<p>People at the conference works on all sorts of different things, and it seems like many people didn’t use Rust at the main jobs (like me). This makes sense given how awesome the language is but how painful big code migrations are.</p>\n",
      "date_published" : "2026-07-01T00:00:28+0200",
      "id" : "https://douglashill.co/2026/rustweek/",
      "title" : "RustWeek",
      "url" : "https://douglashill.co/2026/rustweek/"
    },
    {
      "content_html" : "<p>Looking forward to being back in Wales in September to talk about Rust at <a href=\"https://www.iosdevuk.com/\">iOSDevUK</a>. Early bird <a href=\"https://www.iosdevuk.com/tickets\">conference tickets</a> are available until the end of this month. It’s my favourite and best-value iOS conference. Also let me know if you’re interested in hiking in Eryri/Snowdonia the weekend before.</p>\n\n<p><img src=\"https://douglashill.co/2026/rust-at-iosdevuk/iosdevuk-card.jpg\" alt=\"Speaker card: Douglas Hill; Rust for iOS developers: more Swifty than Swift; iOSDevUK; 7th to 10th September 2026; Aberystwyth University; www.iosdevuk.com\" title=\"\" /></p>\n",
      "date_published" : "2026-06-24T09:45:15+0200",
      "id" : "https://douglashill.co/2026/rust-at-iosdevuk/",
      "url" : "https://douglashill.co/2026/rust-at-iosdevuk/"
    },
    {
      "content_html" : "<p>WWDC labs are conspicuously missing from the <a href=\"https://developer.apple.com/wwdc26/\">activities this year</a>. (The private WebEx calls usually with the person who worked on the thing you're asking about.) At Nutrient, <a href=\"https://www.nutrient.io/blog/wwdc-at-nutrient/\">we found these the most valuable part of WWDC</a>.</p>\n",
      "date_published" : "2026-05-19T17:29:09+02:00",
      "id" : "https://douglashill.co/2026/wwdc-labs-are-conspicuously-missing/",
      "url" : "https://douglashill.co/2026/wwdc-labs-are-conspicuously-missing/"
    },
    {
      "content_html" : "<p>I’m excited to be learning new things at the <a href=\"https://2026.rustweek.org/\">RustWeek</a> conference in the Netherlands.</p>\n",
      "date_published" : "2026-05-19T08:43:50+02:00",
      "id" : "https://douglashill.co/2026/at-rustweek/",
      "url" : "https://douglashill.co/2026/at-rustweek/"
    },
    {
      "content_html" : "<p>We’re trying something new for NSLondon this month: If you’re a woman, non-binary, or otherwise feel underrepresented in the London iOS developer community, you can request an early-access spot by <a href=\"https://docs.google.com/forms/d/e/1FAIpQLSfkWvVomYXUwESWHet2HDxTia4euvYcP2WKtkVQLXCzjmtbvA/viewform\">filling in this very short form</a>. General availability opens at 1pm BST this Monday <a href=\"https://www.meetup.com/nslondon/events/313347930/\">on Meetup</a>.</p>\n",
      "date_published" : "2026-05-01T16:11:39+01:00",
      "id" : "https://douglashill.co/2026/nslondon-justpark-underrepresented-early-access/",
      "url" : "https://douglashill.co/2026/nslondon-justpark-underrepresented-early-access/"
    },
    {
      "content_html" : "<p>TIL about the <a href=\"https://developer.apple.com/documentation/contactprovider\">ContactProvider</a> framework on iOS (not Mac). Sounds like a way to build an end-to-end encrypted replacement for iCloud/CardDAV contacts sync if you can get your head around the difference between <code>ContactItemEnumerating</code> and <code>ContactItemEnumerator</code>.</p>\n\n<p><img src=\"https://douglashill.co/2026/contactprovider-framework/screenshot.png\" alt=\"protocol ContactItemEnumerating: A protocol to provide enumerators for collections of contact items. protocol ContactItemEnumerator: A protocol to provide enumerations of all contact items and changed contact items.\" title=\"\" /></p>\n",
      "date_published" : "2026-04-14T08:18:30+0100",
      "id" : "https://douglashill.co/2026/contactprovider-framework/",
      "url" : "https://douglashill.co/2026/contactprovider-framework/"
    },
    {
      "content_html" : "<p>Interesting evening yesterday at <a href=\"https://www.meetup.com/rust-london-user-group/events/313816694\">Rust London</a> learning all sorts. Dan Groshev spoke about <a href=\"https://dgroshev.com/blog/okmain/\">picking a dominant colour from an image</a>. (I used a similar approach in Jamie Oliver‘s Recipes in 2014.) Jérôme Étévé gave a talk on <a href=\"https://github.com/jeteve/mokapot\">Mokaccino</a> and <a href=\"https://github.com/evadne\">Evadne Wu</a> on sandboxing AI agents.</p>\n",
      "date_published" : "2026-04-03T10:11:52+01:00",
      "id" : "https://douglashill.co/2026/rust-london-learning-all-sorts/",
      "url" : "https://douglashill.co/2026/rust-london-learning-all-sorts/"
    },
    {
      "content_html" : "<p>At NSLondon we’re <a href=\"https://www.meetup.com/nslondon/events/313805476/\">meeting for coffee on Sat 18th</a> followed by a stroll in Hyde Park if the weather is fine. Bring a laptop and show your coding project. I’ll be there with non-iOS projects.</p>\n",
      "date_published" : "2026-04-01T21:02:49+01:00",
      "id" : "https://douglashill.co/2026/nslondon-coffee-april/",
      "url" : "https://douglashill.co/2026/nslondon-coffee-april/"
    }
  ],
  "title" : "Douglas Hill",
  "version" : "https://jsonfeed.org/version/1"
}