<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LornaJane's Website</title><link>https://lornajane.net/</link><description/><atom:link href="https://lornajane.net/feed" rel="self"/><lastBuildDate>Mon, 29 Jun 2026 20:06:00 +0100</lastBuildDate><item><title>Using mitmproxy reverse mode for API testing</title><link>https://lornajane.net/posts/2026/using-mitmproxy-reverse-mode</link><description>&lt;p class="first last"&gt;&lt;a class="reference external" href="https://www.mitmproxy.org/"&gt;mitmproxy&lt;/a&gt; is my preferred proxy for API testing these days. I'm using it mostly in reverse mode though, so I thought I'd capture my setup in case it's useful for anyone else. My main use case is to inspect the traffic coming into the API server and being returned, mostly when running tests against it. Where mitmproxy is typically used as a proxy to monitor traffic passing into/out of a client application, for this I'm concerned with the server's handling. Reverse mode lets me inspect and adjust the traffic as I go along. I start up the proxy, configure the tests to point to it instead of the actual server, and I'm all set.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 29 Jun 2026 20:06:00 +0100</pubDate><guid>tag:lornajane.net,2026-06-29:/posts/2026/using-mitmproxy-reverse-mode</guid><category>APIs</category><category>api</category><category>cli</category><category>http</category><category>mitmproxy</category><category>proxy</category><category>tips</category><category>tech</category></item><item><title>Selectively ignore lines in git diff</title><link>https://lornajane.net/posts/2026/selectively-ignore-lines-in-git-diff</link><description>&lt;p class="first last"&gt;I have a things-as-code project that outputs mostly text-based formats, but a lot of them. To keep an eye on consistency, I rebuild all the outputs and dump them into a local git repository so I can very easily diff to spot any changes - which was fine until we added a build timestamp, so every file looks changed on every run! This post is about ignoring the matching line with &lt;tt class="docutils literal"&gt;git diff &lt;span class="pre"&gt;-I&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 04 Mar 2026 07:57:00 +0000</pubDate><guid>tag:lornajane.net,2026-03-04:/posts/2026/selectively-ignore-lines-in-git-diff</guid><category>tech</category><category>git</category><category>tips</category></item><item><title>Git renames are not renames</title><link>https://lornajane.net/posts/2026/git-renames-are-not-renames</link><description>&lt;p class="first last"&gt;I consider myself pretty git-confident, I've worked with it a lot, taught it, been a git consultant, run engineering and various things-as-code teams. This week I had a spectactular git problem where merging one branch into another produced changes that didn't exist on either branch. Turns out, renaming directories in a monorepo with multiple almost-identical boilerplate documentation files comes with surprises...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 28 Jan 2026 09:29:00 +0000</pubDate><guid>tag:lornajane.net,2026-01-28:/posts/2026/git-renames-are-not-renames</guid><category>tech</category><category>git</category><category>tips</category></item><item><title>Manage Diagrams in AsciiDoc on GitHub</title><link>https://lornajane.net/posts/2026/manage-diagrams-in-asciidoc-on-github</link><description>&lt;p class="first last"&gt;I use a lot of &lt;a class="reference external" href="https://asciidoc.org/"&gt;asciidoc&lt;/a&gt; these days for work documentation (and I love it) and I've been so happy that GitHub renders it when you view a repository in the web browser, just like it does for Markdown and ReStructuredText. BUT what GitHub does not do is render the image types that asciidoc does so even though I'm working with asciidoc and PlantUML, and the asciidoc tools render those diagrams nicely in PDF and HTML output - GitHub's rendering doesn't. So here's a quick overview of how I handle those repositories.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 25 Jan 2026 21:22:00 +0000</pubDate><guid>tag:lornajane.net,2026-01-25:/posts/2026/manage-diagrams-in-asciidoc-on-github</guid><category>tech</category><category>asciidoc</category><category>ci</category><category>git</category><category>github</category><category>markup</category><category>tips</category></item><item><title>Tag Kinds in OpenAPI 3.2</title><link>https://lornajane.net/posts/2025/tag-kinds-in-openapi-3-2</link><description>&lt;p class="first last"&gt;OpenAPI tags have always been annoying: user-supplied arbitrary data for endpoints &lt;em&gt;should&lt;/em&gt; be a fabulous feature - but the documentation tools seem to think that tags are only for them so it becomes more difficult to use tags for other purposes. In fact it is very useful to be able to tag endpoints with lots of different categories of data and so in OpenAPI 3.2, tags were enhanced to include an additional &amp;quot;kind&amp;quot; field so that different kinds of tag could be used.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 08 Dec 2025 08:32:00 +0000</pubDate><guid>tag:lornajane.net,2025-12-08:/posts/2025/tag-kinds-in-openapi-3-2</guid><category>APIs</category><category>kind</category><category>openapi</category><category>tags</category><category>tips</category></item><item><title>Nested tags in OpenAPI 3.2</title><link>https://lornajane.net/posts/2025/nested-tags-in-openapi-3-2</link><description>&lt;p class="first last"&gt;OpenAPI has always had support for simple tags, but the OpenAPI 3.2 release brought in some serious tag upgrades including a summary field, a &amp;quot;kind&amp;quot; field with registry, - and the ability to nest tags which is the focus of today's post. If one level of organisation isn't enough for your API (and on bigger APIs I'd argue it shouldn't be) then the ability to indicate which tag is the parent of this tag will be a good feature to adopt when you upgrade your OpenAPI descriptions.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 04 Dec 2025 20:53:00 +0000</pubDate><guid>tag:lornajane.net,2025-12-04:/posts/2025/nested-tags-in-openapi-3-2</guid><category>APIs</category><category>openapi</category><category>tags</category><category>tips</category><category>tech</category></item><item><title>Notification Contexts Matter</title><link>https://lornajane.net/posts/2025/notification-contexts-matter</link><description>&lt;p class="first last"&gt;Like many of you, my days are dominated by notifications. Emails from project management systems, source control systems, calendar invitations, ticket updates, and message about messages on other platforms. I've noticed that some people use notifications as a power tool, while others seem blind to what happens when they do something. So this post is some tips that I've picked up along the way.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 16 Nov 2025 21:13:00 +0000</pubDate><guid>tag:lornajane.net,2025-11-16:/posts/2025/notification-contexts-matter</guid><category>work</category><category>career</category><category>notifications</category><category>tips</category><category>work</category><category>writing</category></item><item><title>Quick local API docs with Scalar</title><link>https://lornajane.net/posts/2025/quick-local-api-docs-with-scalar</link><description>&lt;p class="first last"&gt;Today I'm sharing a quick-and-dirty script to take an OpenAPI description, spin up a docs server locally, and copy the URL into your clipboard. I also use a bit of glob expansion in my script to find the right folder, because I have a lot of APIs with long and formulaic directory names (&lt;a class="reference external" href="https://tmforum.org"&gt;TM Forum members&lt;/a&gt; know this story). I'm spinning up &lt;a class="reference external" href="https://scalar.com/"&gt;Scalar&lt;/a&gt; here as it's my current favourite just-works local API docs platform.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 17 Sep 2025 21:05:00 +0100</pubDate><guid>tag:lornajane.net,2025-09-17:/posts/2025/quick-local-api-docs-with-scalar</guid><category>APIs</category><category>api</category><category>scalar</category><category>tips</category><category>tools</category></item><item><title>API Specificity with Overlays and Enums</title><link>https://lornajane.net/posts/2025/api-specificity-with-overlays-and-enums</link><description>&lt;p class="first last"&gt;The more I work on API standards, the more I realise how few teams understand that they can adopt the standards and, without breaking any contract, adapt them to make a strong interface for their own application. One of my favourite examples is to add enums where a standard interface cannot dictate the exact values, but in your own implementation it is very helpful to do so.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 21 Jul 2025 08:48:00 +0100</pubDate><guid>tag:lornajane.net,2025-07-21:/posts/2025/api-specificity-with-overlays-and-enums</guid><category>APIs</category><category>openapi</category><category>overlays</category><category>speakeasy</category><category>tools</category><category>tech</category></item><item><title>Safe Screensharing Setup</title><link>https://lornajane.net/posts/2025/safe-screensharing-setup</link><description>&lt;p class="first last"&gt;In my time I've spent a LOT of time on screenshare, and I'm confident sharing my screen. Part of the confidence comes from maintaining a usage pattern that means I CAN confidently share my screen and rarely embarrass myself. After sharing some tips with a former colleague recently, I have tried to package up the best bits of that conversation and turn it into some tips to share.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 10 Jun 2025 17:32:00 +0100</pubDate><guid>tag:lornajane.net,2025-06-10:/posts/2025/safe-screensharing-setup</guid><category>tech</category></item><item><title>Publish to GitHub pages with Sphinx</title><link>https://lornajane.net/posts/2025/publish-to-github-pages-with-sphinx</link><description>&lt;p class="first last"&gt;I'm a big fan of &lt;a class="reference external" href="https://opensource.com/article/22/10/docs-as-code"&gt;docs-as-code&lt;/a&gt; for more or less any type of content publishing, but I'm less of a fan of Jekyll, the default tool used in GitHub pages. I also prefer ReStructuredText over Markdown as a markup format, so Sphinx is definitely on my shortlist of SSGs (Static Site Generators) for my projects. I recently switched the &lt;a class="reference external" href="https://rst2pdf.org"&gt;rst2pdf docs&lt;/a&gt; to using Sphinx hosted on GitHub pages, so here are my setup notes.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 05 Jun 2025 09:59:00 +0100</pubDate><guid>tag:lornajane.net,2025-06-05:/posts/2025/publish-to-github-pages-with-sphinx</guid><category>tech</category><category>ci</category><category>docs-as-code</category><category>documentation</category><category>github</category><category>sphinx</category></item><item><title>Just Enough Docs</title><link>https://lornajane.net/posts/2025/just-enough-docs</link><description>&lt;p class="first last"&gt;Too many open source projects suffer from inadequate documentation, and that hurts their adoption, their communities, and puts more burden on maintainers. Many people who create open source software don't see see themselves as writers, but today I'm sharing tips for documenting open source projects without it needing to take up a huge amount of time to get something published and ready for (docs) contributions.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 28 Apr 2025 18:12:00 +0100</pubDate><guid>tag:lornajane.net,2025-04-28:/posts/2025/just-enough-docs</guid><category>tech</category><category>docs</category><category>markdown</category><category>open source</category><category>template</category><category>tips</category></item><item><title>Right-Size Your RESTful API: More Flexibility Without GraphQL</title><link>https://lornajane.net/posts/2025/better-rest-before-graphql</link><description>&lt;p class="first"&gt;If you publish a RESTful API and there are situations when you need less (or more!) detail in the API responses from your API - then this post is for you. When I run into this with the teams I advise, the initial problem statement usually arrives more like &amp;quot;We need to move to GraphQL&amp;quot;, but this is a solution, not a problem to solve. The problem usually turns out to be either or both of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p class="first"&gt;the API responses are simply too large for some of the clients or uses cases, users need to select just the fields they want&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;the API doesn't have enough information in the response payload for this client or use case, users need to choose to include nested data&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="last"&gt;GraphQL is one way to achieve these things, but this post is about the RESTful way to provide the right level of detail in an API response.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 26 Mar 2025 10:31:00 +0000</pubDate><guid>tag:lornajane.net,2025-03-26:/posts/2025/better-rest-before-graphql</guid><category>tech</category><category>api</category><category>design</category><category>graphql</category><category>openapi</category><category>rest</category></item><item><title>Markdown/Mermaid output for OpenAPI Arazzo</title><link>https://lornajane.net/posts/2025/markdown-mermaid-output-for-openapi-arazzo</link><description>&lt;p&gt;API reference documentation changed the way we built integrations, and eventually became part of the driving force for OpenAPI adoption and all the good tooling that flowed from it. As a developer experience specialist, I spend a lot of time thinking about how human users can work with the technical …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 12 Mar 2025 16:01:00 +0000</pubDate><guid>tag:lornajane.net,2025-03-12:/posts/2025/markdown-mermaid-output-for-openapi-arazzo</guid><category>tech</category><category>arazzo</category><category>cli</category><category>open source</category><category>openapi</category><category>tools</category></item><item><title>From HTTP to OpenAPI with Optic</title><link>https://lornajane.net/posts/2025/from-http-to-openapi-with-optic</link><description>&lt;p class="first last"&gt;I've been using &lt;a class="reference external" href="https://github.com/opticdev/optic"&gt;Optic's CLI&lt;/a&gt;, an OpenAPI tool that does a bunch of things including diffing OpenAPI descriptions and comparing HTTP traffic with OpenAPI. My use case was an established API that didn't have an OpenAPI file yet - using Optic we could create one as a starting point, and then move to a design-first workflow to make the changes that I was there to help with. For this blog post, I've used the example of &lt;a class="reference external" href="https://api.joind.in"&gt;https://api.joind.in&lt;/a&gt; as an excellent representation of an API still in use, but without an OpenAPI file and not built with code that a code generator would recognise.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 17 Feb 2025 10:07:00 +0000</pubDate><guid>tag:lornajane.net,2025-02-17:/posts/2025/from-http-to-openapi-with-optic</guid><category>tech</category><category>ai</category><category>api</category><category>joindin</category><category>llm</category><category>openapi</category><category>optic</category><category>tools</category></item><item><title>Preview OpenAPI as HTML using Scalar</title><link>https://lornajane.net/posts/2025/preview-openapi-as-html-using-scalar</link><description>&lt;p class="first last"&gt;The API DevTools space is alive and well with lots of new and exciting products popping up all the time. I've been especially impressed by the &lt;a class="reference external" href="https://apievangelist.com/2025/01/28/we-are-entering-the-3rd-api-documentation-renaissance/"&gt;new tools in the docs space&lt;/a&gt;, but some of the options are less practical for use as quick human-friendly OpenAPI renderings or previews to use during API development. My current favourite in this space is &lt;a class="reference external" href="https://scalar.com/"&gt;Scalar&lt;/a&gt; because I can get an HTML file to easily include in a build or share with others. It's a bit of a hack though, so I thought I'd share...&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Fri, 14 Feb 2025 14:49:00 +0000</pubDate><guid>tag:lornajane.net,2025-02-14:/posts/2025/preview-openapi-as-html-using-scalar</guid><category>tech</category><category>docs</category><category>openapi</category></item><item><title>Presenting with pdfpc</title><link>https://lornajane.net/posts/2025/presenting-with-pdfpc</link><description>&lt;p class="first last"&gt;My slide deck tool ( &lt;a class="reference external" href="https://rst2pdf.org"&gt;rst2pdf&lt;/a&gt; ) produces PDFs, and I use &lt;a class="reference external" href="https://pdfpc.github.io/"&gt;pdfpc&lt;/a&gt; to present the PDF slides. It shows the current and next slides, my notes, a timer, and it probably does other things too that I don't use! I've used it for years but it was really designed for &amp;quot;in real world&amp;quot; presenting with one or two screens. Recently I discovered it also supports some great options for remote presentations, but I had to look up how to do that so here are my notes (mostly in case I need to look it up 1 minute before I go on stage again!!).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 11 Feb 2025 12:08:00 +0000</pubDate><guid>tag:lornajane.net,2025-02-11:/posts/2025/presenting-with-pdfpc</guid><category>tech</category><category>pdfp</category><category>pdfpc</category><category>speaking</category></item><item><title>Querying the GitHub GraphQL API</title><link>https://lornajane.net/posts/2025/querying-the-github-graphql-api</link><description>&lt;p class="first last"&gt;In a recent project around open source contributors, I wanted to take a look at which projects a particular user (actually a few of them, but I wrote a wrapper to repeat the process for each handle) maintains. GitHub doesn't show this maintainer relationship, so instead I used the v4 GraphQL API and looked at pull request comments on repositories that the user has access to. I'm sharing my query and the Python script I used to make the API calls to.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 27 Jan 2025 12:48:00 +0000</pubDate><guid>tag:lornajane.net,2025-01-27:/posts/2025/querying-the-github-graphql-api</guid><category>tech</category><category>api</category><category>github</category><category>graphql</category><category>python</category><category>rest</category></item><item><title>Save edits to OpenAPI as an Overlay</title><link>https://lornajane.net/posts/2025/save-edits-to-openapi-as-an-overlay</link><description>&lt;p class="first last"&gt;For teams that generate OpenAPI from their codebase, there's a tough choice between maintaining rich and extensive content such as Markdown descriptions and examples in codebase annotations, or in making those changes to the generated file - and then losing them when the code changes and the file is regenerated. The new OpenAPI Overlay Specification defines a format for storing updates to an OpenAPI document, and there's a new generation of tools to make it easy to do, so let's take a look.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 09 Jan 2025 12:18:00 +0000</pubDate><guid>tag:lornajane.net,2025-01-09:/posts/2025/save-edits-to-openapi-as-an-overlay</guid><category>tech</category><category>api</category><category>openapi</category><category>overlays</category><category>speakeasy</category><category>tips</category><category>tools</category></item><item><title>Run GitHub Actions on Subdirectories</title><link>https://lornajane.net/posts/2025/run-github-actions-on-subdirectories</link><description>&lt;p class="first last"&gt;I come across a lot of &amp;quot;greedy&amp;quot; GitHub Actions, where automation is running across a whole project instead of only on the parts that are relevant. Examples might be code linters that report problems with documentation folders, or the inverse of that. It's especially problematic in monorepos where we probably want to use the same tool when we're doing the same task for different subfolders, but that tool might not make sense to run everywhere.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 07 Jan 2025 13:39:00 +0000</pubDate><guid>tag:lornajane.net,2025-01-07:/posts/2025/run-github-actions-on-subdirectories</guid><category>tech</category><category>ci</category><category>github</category><category>tools</category></item><item><title>OpenAPI Overlays to avoid API oversharing</title><link>https://lornajane.net/posts/2024/openapi-overlays-to-avoid-api-oversharing</link><description>&lt;p class="first last"&gt;Most APIs aren't perfect. By design they are long-lived and may serve many audiences. I see a lot of organisations maintaining multiple versions of APIs, or simply not documenting some of the endpoints to avoid them being included in the published documentation and confusing users. The problem of API redaction is a real one in most organisations, and it goes unsolved or is solved in a way that causes ongoing friction. I've helped a few API projects to solve this problem with the new &lt;a class="reference external" href="https://learn.openapis.org/overlay/"&gt;OpenAPI Overlay specification&lt;/a&gt; so I thought I'd share!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 12 Dec 2024 11:37:00 +0000</pubDate><guid>tag:lornajane.net,2024-12-12:/posts/2024/openapi-overlays-to-avoid-api-oversharing</guid><category>tech</category><category>api</category><category>openapi</category><category>overlays</category></item><item><title>Use multi-line values in GitHub Actions</title><link>https://lornajane.net/posts/2024/use-multi-line-values-in-github-actions</link><description>&lt;p class="first last"&gt;I created an action that needed a rich Markdown value in it, because it's our weekly meeting agenda template which is formatted for humans with links and paragraphs and things. The Action syntax produced errors when trying to add the content directly to the action, but I got it to work by putting the content into the file, and using the file contents as an environment variable. That's really the punchline of this post, but read on if you would like more details and some examples.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 25 Nov 2024 10:25:00 +0000</pubDate><guid>tag:lornajane.net,2024-11-25:/posts/2024/use-multi-line-values-in-github-actions</guid><category>tech</category><category>ci</category><category>github</category><category>tech</category><category>tools</category></item><item><title>How to structure and share code examples</title><link>https://lornajane.net/posts/2024/how-to-structure-and-share-code-examples</link><description>&lt;p class="first last"&gt;Writing for technical audiences often means sharing code in one form or another. If the code is only for illustration purposes, then it can be included in the article for observation. But if the code is useful or reusable by your readers, then you need a way to make it available to them. I've seen a few questions on this recently (shout out to the DevRel Collective slack for a brilliant discussion AND nagging me to write it up as a post!), so I'm sharing my experiences on how to publish and maintain code in sane ways!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 18 Nov 2024 09:28:00 +0000</pubDate><guid>tag:lornajane.net,2024-11-18:/posts/2024/how-to-structure-and-share-code-examples</guid><category>tech</category><category>code</category><category>devex</category><category>github</category></item><item><title>Pretty-print JSON with jq</title><link>https://lornajane.net/posts/2024/pretty-print-json-with-jq</link><description>&lt;p class="first last"&gt;Wrangling some document conversion the other day, I ended up in a situation where I had the JSON I needed, but in a completely unreadable format. Luckily, this problem is very easily fixable .... when you know how. So today's post is a quick recap on how I did that using &lt;a class="reference external" href="https://jqlang.github.io/jq/"&gt;jq&lt;/a&gt;, a very handy command-line tool for working with JSON. For the impatient, here's the command:&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Fri, 01 Nov 2024 17:20:00 +0000</pubDate><guid>tag:lornajane.net,2024-11-01:/posts/2024/pretty-print-json-with-jq</guid><category>tech</category><category>json</category><category>tools</category></item><item><title>Open Standards for APIs</title><link>https://lornajane.net/posts/2024/open-standards-for-apis</link><description>&lt;p class="first last"&gt;I work or have worked with APIs of all sorts of standards, sometimes many standards at once - or none. Each standard exists for a purpose and might be a great fit, or a terrible fit for other purposes. Today's post is a recap of some of the common API standards around and what you need to know about each one.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 09 Oct 2024 08:21:00 +0100</pubDate><guid>tag:lornajane.net,2024-10-09:/posts/2024/open-standards-for-apis</guid><category>tech</category><category>api</category><category>asyncapi</category><category>openapi</category><category>standards</category></item><item><title>Lint APIs with Redocly CLI</title><link>https://lornajane.net/posts/2024/lint-apis-with-redocly-cli</link><description>&lt;p class="first"&gt;API governance needs good tooling, and rules that fit - so today's post covers both.&lt;/p&gt;
&lt;p class="last"&gt;Fun fact: I work at Redocly and had used the tool for years, but recently realised that I have a post about a different tool in the archives of my blog, but no Redocly post. So here's the Lorna-recommended version of OpenAPI linting with Redocly CLI.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 05 Aug 2024 07:58:00 +0100</pubDate><guid>tag:lornajane.net,2024-08-05:/posts/2024/lint-apis-with-redocly-cli</guid><category>tech</category><category>api governance</category><category>openapi</category><category>redocly</category><category>redocly-cli</category></item><item><title>API Description Pipelines</title><link>https://lornajane.net/posts/2024/pipelines-api-descriptions</link><description>&lt;p class="first last"&gt;Working on API tools, I get to see inside lots of different organisations' API projects and processes. Every scenario is different, but a common theme is that many companies use a more complicated API description workflow than you see in conference slide decks! This article shares my typical workflow, steps and chosen tools that might show up in an API description pipeline.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 18 Jun 2024 21:54:00 +0100</pubDate><guid>tag:lornajane.net,2024-06-18:/posts/2024/pipelines-api-descriptions</guid><category>tech</category><category>api</category><category>api governance</category><category>openapi</category><category>tools</category></item><item><title>Checking Links in Docs-As-Code Projects</title><link>https://lornajane.net/posts/2024/checking-links-in-docs-as-code-projects</link><description>&lt;p class="first last"&gt;Creating content requires accuracy as well as creativity and the ability to deliver. Working with docs-as-code gives a strong foundation and structure to work within, and means there's a clear workflow where automation can be added to help us with the easy stuff, such as &amp;quot;do all these links work?&amp;quot;. I really appreciate having the extra confidence and support of these types of tools, and having implemented them on multiple projects at this point, I thought I'd share my advice for anyone looking to do the same.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sat, 27 Apr 2024 17:48:00 +0100</pubDate><guid>tag:lornajane.net,2024-04-27:/posts/2024/checking-links-in-docs-as-code-projects</guid><category>tech</category><category>docs-as-code</category><category>mlc</category><category>sphinx</category><category>tips</category><category>tools</category></item><item><title>Reviewdog filter settings with GitHub Actions</title><link>https://lornajane.net/posts/2024/reviewdog-filter-settings-with-github-actions</link><description>&lt;p class="first last"&gt;Reviewdog is a tool to use with GitHub actions for applying review tools in your CI. I use it with Vale, and it's really good. One thing that has tripped me up multiple times is that by default, it only applies the checks to the changes in the pull request, not to the whole project. So when you add something like Vale, which is a prose linter, it only checks ... the workflow file you just added! I always forget that it works this way, and how to change it, so I'm pasting some examples for future reference.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 25 Mar 2024 08:10:00 +0000</pubDate><guid>tag:lornajane.net,2024-03-25:/posts/2024/reviewdog-filter-settings-with-github-actions</guid><category>tech</category><category>docs-as-code</category><category>github</category><category>tips</category><category>tools</category><category>vale</category><category>writing</category></item><item><title>Short tech writing style guide for developers</title><link>https://lornajane.net/posts/2024/short-tech-writing-style-guide-for-developers</link><description>&lt;p class="first last"&gt;Style guides are vital to successful publishing projects, but they are usually too extensive for casual contributors. After running a number of projects with developers rather than specialist documentarians as the main contributors, I've started using a short-form style guide, short enough to be read and used by people who don't spend as much time thinking about these things as a full time writer does. The main version is &lt;a class="reference external" href="https://github.com/lornajane/developer-style-guide"&gt;published on GitHub&lt;/a&gt;, but I'm also sharing the current version here.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 24 Jan 2024 09:18:00 +0000</pubDate><guid>tag:lornajane.net,2024-01-24:/posts/2024/short-tech-writing-style-guide-for-developers</guid><category>tech</category></item><item><title>API Linting Levels</title><link>https://lornajane.net/posts/2024/api-linting-levels</link><description>&lt;p class="first last"&gt;I've been thinking about API linting lately, partly because I work on &lt;a class="reference external" href="https://github.com/redocly/redocly-cli"&gt;a tool for API linting&lt;/a&gt; in my day job, and partly because I get quite a lot of questions from teams wanting to improve their API quality. The &amp;quot;best&amp;quot; ruleset depends entirely on your context, where you are in your API practice journey, and how much you want to invest in the API in question. I typically use a 4-levels model of API linting readiness, and I'm sharing them so that you can find yourself on the map and see where you might go from here.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 11 Jan 2024 00:05:00 +0000</pubDate><guid>tag:lornajane.net,2024-01-11:/posts/2024/api-linting-levels</guid><category>tech</category><category>api</category><category>openapi</category></item><item><title>Add OpenAI flags to OpenAPI descriptions</title><link>https://lornajane.net/posts/2023/add-openai-consequential-to-openapi</link><description>&lt;p class="first"&gt;With &lt;a class="reference external" href="https://openai.com/"&gt;OpenAI's&lt;/a&gt; new &lt;a class="reference external" href="https://platform.openai.com/docs/actions"&gt;Actions feature&lt;/a&gt; allowing you to get a GPT that uses your own API, many new doors are open. However giving an AI an access token the keys to your API and telling it to have fun may lead you to realise that one of the doors available leads to the empty lift shaft of overwritten data, or the bottomless well of cloud bill shock. To reduce the risks, OpenAI supports an extension &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;x-openai-isConsequential&lt;/span&gt;&lt;/tt&gt; that you can add to your OpenAPI description, to indicate which endpoints should not be called without a human confirmation step.&lt;/p&gt;
&lt;p class="last"&gt;I'm not doing much with OpenAI right now, but I do plenty with OpenAPI and the question &amp;quot;how do I add this field to my existing API description?&amp;quot; is one that I can answer! What's more, you can use the advice in this post to add other extensions or additions to your OpenAPI descriptions using &lt;a class="reference external" href="https://github.com/OAI/Overlay-Specification"&gt;Overlays&lt;/a&gt;, this advice isn't OpenAI-specific, but it's used in the examples.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 28 Nov 2023 09:48:00 +0000</pubDate><guid>tag:lornajane.net,2023-11-28:/posts/2023/add-openai-consequential-to-openapi</guid><category>tech</category><category>api</category><category>openai</category><category>openapi</category><category>overlayjs</category><category>overlays</category><category>tips</category></item><item><title>When to version bump your OpenAPI description</title><link>https://lornajane.net/posts/2023/when-to-version-bump-your-openapi-description</link><description>&lt;p class="first last"&gt;I've heard a variety of bad advice (and some untruths!) regarding how to version your OpenAPI description lately. Rather than dig into those, instead I'll share my opinion on how I like to version API descriptions in my own projects. Every API project is different, but perhaps there's something here that can help your project too.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 20 Nov 2023 13:10:00 +0000</pubDate><guid>tag:lornajane.net,2023-11-20:/posts/2023/when-to-version-bump-your-openapi-description</guid><category>tech</category><category>api</category><category>apidesign</category><category>asyncapi</category><category>openapi</category><category>tips</category></item><item><title>API docs previews with Redoc and Netlify</title><link>https://lornajane.net/posts/2023/api-docs-previews-with-redoc-and-netlify</link><description>&lt;p class="first last"&gt;I talk to a lot of people about their API lifecycles and processes, and one thing that has value in almost every case is immediate documentation preview for all updates to an &lt;a class="reference external" href="https://openapis.org"&gt;OpenAPI&lt;/a&gt; description. The time it takes to set it up (about ten minutes now I know what to do) is an investment that makes every future change easier to propose, review, and accept. Here's my recipe for open source OpenAPI documentation using &lt;a class="reference external" href="https://github.com/redocly/redoc"&gt;Redoc&lt;/a&gt; (disclaimer: I work for Redocly, who publish Redoc) with the files pushed to &lt;a class="reference external" href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; for hosting (but it's HTML, so really any hosting will do and you should feel free to adapt the instructions for your preferred platform, and then share them in the comments).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 08 Nov 2023 09:18:00 +0000</pubDate><guid>tag:lornajane.net,2023-11-08:/posts/2023/api-docs-previews-with-redoc-and-netlify</guid><category>tech</category><category>api</category><category>docs</category><category>docs-as-code</category><category>netlify</category></item><item><title>Selective prose linting with Vale's glob switch</title><link>https://lornajane.net/posts/2023/selective-prose-linting-with-vales-glob-switch</link><description>&lt;p class="first"&gt;&lt;a class="reference external" href="https://vale.sh/"&gt;Vale&lt;/a&gt; is an open source CLI tool for linting prose (if you're not linting prose yet, why not? I never want to go back). I typically use it for everything, locally and in CI, and it's especially valuable now I'm working for a company that uses US English. You'd think that most of the challenges would be caused by the majority of non-native English language contributors? Nope, most of the chaos comes from the token Brit :)&lt;/p&gt;
&lt;p class="last"&gt;I ran into one challenge though where I didn't want to enable Vale for everything: a large internal documentation repo. This is the catch-all of things we should share with one another and like most internal company documentation sites, there is a lot going on. I assembled a very minimal set of Vale rules and still the first pass netted me over 10k errors. Luckily, Vale has a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--glob&lt;/span&gt;&lt;/tt&gt; option, but it took me a while to find how to exclude multiple files and directories using it, so here's the example for future-me, and anyone else who needs to see it!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 23 Aug 2023 11:55:00 +0100</pubDate><guid>tag:lornajane.net,2023-08-23:/posts/2023/selective-prose-linting-with-vales-glob-switch</guid><category>tech</category><category>docs-as-code</category><category>tools</category></item><item><title>Visualise OpenAPI with Blockly</title><link>https://lornajane.net/posts/2023/visualise-openapi-with-blockly</link><description>&lt;p class="first"&gt;Giving talks about OpenAPI often means lots and lots of slides of YAML. In fact, one of my talks even contains a &amp;quot;warning, contains yaml&amp;quot; slide! If you aren't a professional yaml developer, it can be difficult to digest and learn from, and so I wanted to do better. The various elements are nested inside one another, and so I had this idea to build a representation of OpenAPI using &lt;a class="reference external" href="https://developers.google.com/blockly/"&gt;Blockly&lt;/a&gt; (the tooling also used for &lt;a class="reference external" href="https://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;, if you've seen that).&lt;/p&gt;
&lt;p class="last"&gt;&lt;a class="reference external image-reference" href="https://lornajane.net/images/2023/06/openapi-tags-block.png"&gt;&lt;img alt="Showing tags with descriptions" class="aligncenter size-medium wp-image-4624" src="https://lornajane.net/images/2023/06/openapi-tags-block-300x128.png" style="width: 300px; height: 128px;" /&gt;&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 20 Jun 2023 12:57:00 +0100</pubDate><guid>tag:lornajane.net,2023-06-20:/posts/2023/visualise-openapi-with-blockly</guid><category>tech</category><category>api</category><category>github</category><category>openapi</category></item><item><title>Tips for better documentation with OpenAPI</title><link>https://lornajane.net/posts/2023/tips-for-better-documentation-with-openapi</link><description>&lt;p class="first last"&gt;I love documentation, which is supposed to be rare for software engineers. I am pretty sure that loving documentation is actually very common, but not very cool and so few people admit to it! I love reading good docs, and so I love writing them too. Between hanging out in the &lt;a class="reference external" href="https://www.writethedocs.org/"&gt;Write the Docs&lt;/a&gt; community, and recently being at the &lt;a class="reference external" href="https://apithedocs.org/amsterdam-2023"&gt;APItheDocs conference&lt;/a&gt;, I've answered a bunch of questions about getting good documentation from an OpenAPI document, so I thought I'd round them up in case it's useful.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 12 Jun 2023 13:30:00 +0100</pubDate><guid>tag:lornajane.net,2023-06-12:/posts/2023/tips-for-better-documentation-with-openapi</guid><category>tech</category><category>api</category><category>apithedocs</category><category>docs</category><category>openapi</category></item><item><title>Raising the Next Generation of DevRel</title><link>https://lornajane.net/posts/2023/raising-the-next-generation-of-devrel</link><description>&lt;p class="first"&gt;Developer Relations isn't new, but it's also broad, ill-defined, and constantly evolving. It's difficult to keep your own skills up to date, never mind coping with a whole team full of people and constantly creeping industry scope. The required combination of specialist and generalist skills to be successful is any of the Developer Relations and allied roles is extensive, and it's easy to feel overwhelmed and end up coasting being just-good-enough at things but never feeling mastery.&lt;/p&gt;
&lt;p class="last"&gt;As an individual contributor, manager and general DevRel presence over the years, I've developed some tactics both for myself and my team, and I'd like to share them in case they're useful to others. Also since I'm moving to a less DevRel role, writing this down while I can still think about it!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 08 Mar 2023 20:42:00 +0000</pubDate><guid>tag:lornajane.net,2023-03-08:/posts/2023/raising-the-next-generation-of-devrel</guid><category>work</category><category>devrel</category><category>opinion</category></item><item><title>Improve Existing OpenAPI Descriptions</title><link>https://lornajane.net/posts/2023/overlay-improvements-to-openapi</link><description>&lt;p class="first"&gt;I'm a firm fan of a design-first approach to building APIs, and advocate for it at every opportunity. Repeatedly. Design-first means that an API change starts in the OpenAPI description, gets reviewed and approved by the stakeholders, and then gets built afterwards.&lt;/p&gt;
&lt;p class="last"&gt;I also live in the real world, where OpenAPI descriptions get generated from existing codebases, and engineering teams lack either the knowledge or the enthusiasm to modernise their processes. With a generated OpenAPI description, everything else that OpenAPI enables is likely to be disappointing, because the description only contains the information that was in the serverside code, and if you're lucky some comment metadata. Enter &lt;em&gt;OpenAPI Overlays&lt;/em&gt;, a way to describe alterations to an existing OpenAPI description that can be reapplied every time that description changes.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 28 Feb 2023 18:04:00 +0000</pubDate><guid>tag:lornajane.net,2023-02-28:/posts/2023/overlay-improvements-to-openapi</guid><category>tech</category><category>openapi</category><category>overlays</category><category>redocly</category></item><item><title>Manager's Secret Second Calendar</title><link>https://lornajane.net/posts/2023/managers-secret-second-calendar</link><description>&lt;p class="first last"&gt;Employees expect a lot from their managers, and as managers we do our best to meet those expectations. However most managers are only human (I've met a few that I had doubts about), and so it can be difficult to get absolutely everything right absolutely all the time. I'd like to share a tactic that I learned from another manager around the time that I took my first line manager role, that I think really helped me to at least give the impression that I knew what was going on: &lt;strong&gt;a second calendar, visible only to you, with key dates in&lt;/strong&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 26 Feb 2023 16:33:00 +0000</pubDate><guid>tag:lornajane.net,2023-02-26:/posts/2023/managers-secret-second-calendar</guid><category>work</category><category>tips</category><category>work</category></item><item><title>Generating a nice-looking PDF with Pandoc</title><link>https://lornajane.net/posts/2023/generating-a-nice-looking-pdf-with-pandoc</link><description>&lt;p class="first last"&gt;&lt;a class="reference external" href="https://pandoc.org/"&gt;Pandoc&lt;/a&gt; is one of my favourite tools in the world. If you haven't come across it before, it converts between more or less any two document formats. I use it a lot with MarkDown and ReStructuredText so that I can produce content efficiently and then share it in a way that looks nice, but also to get word documents into cleaner formats. However the PDF output has always looked a little bit ... dated? (this is rich from an &lt;a class="reference external" href="https://rst2pdf.org"&gt;rst2pdf&lt;/a&gt; maintainer I know!) and I was recently delighted to find some tricks that resulted in a better PDF. I'm sharing them here, so I can find them again in the future; you are welcome to use them too, of course!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 03 Jan 2023 10:33:00 +0000</pubDate><guid>tag:lornajane.net,2023-01-03:/posts/2023/generating-a-nice-looking-pdf-with-pandoc</guid><category>tech</category><category>markdown</category><category>pandoc</category><category>pdf</category><category>writing</category></item><item><title>Sphinx extensions for developer portals</title><link>https://lornajane.net/posts/2022/sphinx-extensions-for-developer-portals</link><description>&lt;p&gt;I've been gushing about docs-as-code, but realised that I haven't shared many hands-on tips for actually building different types of sites in this sort of toolchain. I've been mostly using &lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/"&gt;Sphinx&lt;/a&gt; which generates much better-looking documentation than its website suggests. It's a python-based static site generator, with a thriving community …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 08 Nov 2022 09:27:00 +0000</pubDate><guid>tag:lornajane.net,2022-11-08:/posts/2022/sphinx-extensions-for-developer-portals</guid><category>tech</category><category>docs</category><category>docs-as-code</category><category>sphinx</category></item><item><title>Internal DevRel: Colleague Enablement</title><link>https://lornajane.net/posts/2022/internal-devrel-colleague-enablement</link><description>&lt;p class="first last"&gt;I work in Developer Relations for a very technical company (&lt;a class="reference external" href="https://aiven.io"&gt;Aiven&lt;/a&gt;), and I usually describe my job as half explaining my employer's technology to developers, and half explaining developers to my employers. However in the last year or so, I've realised that there is a variation on this theme that is impactful for my internal colleagues: explaining technology and developers to people who are experts in something else. I work with specialists in various aspects of sales and marketing (DevRel reports into Marketing) and my colleagues are genuinely curious to know more about the domain we work in! I thought I'd share more about how I enable my colleagues, and why I think it works for us.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 26 Sep 2022 15:09:00 +0100</pubDate><guid>tag:lornajane.net,2022-09-26:/posts/2022/internal-devrel-colleague-enablement</guid><category>tech</category><category>colleague</category><category>devrel</category><category>teaching</category><category>work</category></item><item><title>Outline your writing to ease the creative process</title><link>https://lornajane.net/posts/2022/outline-your-writing-to-ease-the-creative-process</link><description>&lt;p class="first last"&gt;For most of my career I've been a software developer, but now I'm mostly a communicator. As a manager, I give the right level of detail to many different audiences, and I deliver that in words they can understand. As a Developer Advocate, I explain complex technical concepts in useful, memorable, and occasionally entertaining ways. However the best software developers are lazy and I'm still always looking for ways to get things done with less effort on my part! For writing, the best process I know feels like unnecessary overhead, but it's always worth it in the end so today I'm sharing my secrets: create an outline before you start.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 11 Apr 2022 09:39:00 +0100</pubDate><guid>tag:lornajane.net,2022-04-11:/posts/2022/outline-your-writing-to-ease-the-creative-process</guid><category>work</category><category>content</category><category>speaking</category><category>tech communication</category><category>writing</category></item><item><title>Who are you writing that commit message for?</title><link>https://lornajane.net/posts/2022/who-are-you-writing-that-commit-message-for</link><description>&lt;p&gt;I read a lot of commit messages that make me wonder who the committer had in mind when they wrote it. If you don't read commit messages yourself, I think that can make it even more difficult to think about who the audience is, or when someone would be reading …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 31 Mar 2022 20:55:00 +0100</pubDate><guid>tag:lornajane.net,2022-03-31:/posts/2022/who-are-you-writing-that-commit-message-for</guid><category>tech</category><category>git</category><category>tips</category></item><item><title>Weekly Planning with Obsidian</title><link>https://lornajane.net/posts/2022/weekly-planning-with-obsidian</link><description>&lt;p class="first last"&gt;Keeping on top of tasks at work has been a work in progress throughout my career. However now I'm doing a more managerial role, I also need to keep track of all the meetings and preparation/followup work in my meetings. I find my daily log fills so many pages of notebook that I moved my weekly plan to a separate section - and then to my preferred digital notes tool, &lt;a class="reference external" href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt;. If you're interested in my setup, read on.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 16 Feb 2022 13:01:00 +0000</pubDate><guid>tag:lornajane.net,2022-02-16:/posts/2022/weekly-planning-with-obsidian</guid><category>tech</category><category>productivity</category></item><item><title>Keeping your finger on the (digital) pulse</title><link>https://lornajane.net/posts/2022/keeping-your-finger-on-the-digital-pulse</link><description>&lt;p class="first"&gt;Whether you are building your own presence, or representing a brand or employer online, it's useful to know what people are saying! Keeping up with all those possible places you should look for news or mentions can be pretty laborious and when things are busy, it's difficult to keep up with this work unless you have some decent tooling in place. There are some great automation offerings around but here's my very basic strategy.&lt;/p&gt;
&lt;p class="last"&gt;&lt;strong&gt;TL;DR a bookmarks folder in my browser to open a bunch of saved searches all at once&lt;/strong&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 15 Feb 2022 18:25:00 +0000</pubDate><guid>tag:lornajane.net,2022-02-15:/posts/2022/keeping-your-finger-on-the-digital-pulse</guid><category>work</category><category>devrel</category><category>productivity</category><category>stackoverflow</category></item><item><title>Open Source and Business</title><link>https://lornajane.net/posts/2022/open-source-and-business</link><description>&lt;p&gt;This collection of resources accompanies my keynote talk &amp;quot;Open source is good for business&amp;quot;, since it's easier to access links on a web page than in a slide deck. The talk, and these resources, are divided into sections.&lt;/p&gt;
&lt;p&gt;View &lt;a class="reference external" href="https://noti.st/lornajane/uDbbll"&gt;Open source is good for business&lt;/a&gt; on Notist.&lt;/p&gt;
&lt;p&gt;&lt;script async src="https://on.notist.cloud/embed/002.js"&gt;&lt;/script&gt;&lt;/p&gt;&lt;div class="section" id="about-open-source"&gt;
&lt;h3&gt;About Open Source …&lt;/h3&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sat, 12 Feb 2022 18:03:00 +0000</pubDate><guid>tag:lornajane.net,2022-02-12:/posts/2022/open-source-and-business</guid><category>misc</category></item><item><title>VSCode setup for technical writers</title><link>https://lornajane.net/posts/2022/vscode-setup-for-technical-writers</link><description>&lt;p class="first last"&gt;I'm working almost entirely with docs-as-code setups for prose at work these days and while I do use vim for most of what I do, VSCode is increasingly in the mix. It's just about accessible enough with keyboard shortcuts and the command palette for me, and I thought I'd share the extensions I'm using and find helpful.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 05 Jan 2022 14:23:00 +0000</pubDate><guid>tag:lornajane.net,2022-01-05:/posts/2022/vscode-setup-for-technical-writers</guid><category>tech</category><category>aiven</category><category>restructuredtext</category><category>tech writing</category><category>tips</category><category>vscode</category></item><item><title>What Happened to your Blog?</title><link>https://lornajane.net/posts/2021/what-happened-to-your-blog</link><description>&lt;p class="first last"&gt;What happened to my blog? Nothing happened, I still blog ... except then I looked at my site the other day and realised, it's been a while.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 12 Dec 2021 20:20:00 +0000</pubDate><guid>tag:lornajane.net,2021-12-12:/posts/2021/what-happened-to-your-blog</guid><category>work</category><category>blog</category><category>work</category></item><item><title>Sphinx front matter and template variables</title><link>https://lornajane.net/posts/2021/sphinx-front-matter-and-template-variables</link><description>&lt;p class="first last"&gt;I'm building a docs-as-code site at work at the moment (you can peek if you like &lt;a class="reference external" href="https://developer.aiven.io"&gt;https://developer.aiven.io&lt;/a&gt;) and working with ReStructuredText in this setup is new to me. One thing I really missed was the concept of &lt;a class="reference external" href="https://jekyllrb.com/docs/front-matter/"&gt;front matter&lt;/a&gt;, which I'm not sure is even official or documented but seems to be reasonably widely supported (I promise to save the rant about markdown for another day). It took me a while to figure this out for Sphinx/rst but now I'm looking at it working, I had better write it down before I forget!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Fri, 10 Sep 2021 21:47:00 +0100</pubDate><guid>tag:lornajane.net,2021-09-10:/posts/2021/sphinx-front-matter-and-template-variables</guid><category>tech</category><category>html</category><category>sphinx</category></item><item><title>Use Database Connection Strings with Laravel 8</title><link>https://lornajane.net/posts/2021/use-database-connection-strings-with-laravel-8</link><description>&lt;p class="first last"&gt;I've been doing a lot of database stuff lately, and not much PHP, so when I returned to make my first &lt;a class="reference external" href="https://laravel.com/"&gt;Laravel&lt;/a&gt; project for a while, I had to check the docs to remind myself how some of this works. I noticed that the default approach to database credentials is still to use separate credentials for the host, port, and other variables. I'm using &lt;a class="reference external" href="https://aiven.io"&gt;Aiven&lt;/a&gt; databases (because I work there and managed databases are great for demo apps as well as real ones!) which supply connection strings, but Laravel supports these too.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 18 Aug 2021 08:56:00 +0100</pubDate><guid>tag:lornajane.net,2021-08-18:/posts/2021/use-database-connection-strings-with-laravel-8</guid><category>mysql</category><category>database</category><category>laravel</category><category>mysql</category><category>php</category><category>postgresql</category><category>tech</category></item><item><title>Hold Attention on the Virtual Stage</title><link>https://lornajane.net/posts/2021/hold-attention-on-the-virtual-stage</link><description>&lt;p class="first"&gt;How do I ensure that I keep my attendees' attention when I'm presenting virtually?&lt;/p&gt;
&lt;p class="last"&gt;&lt;strong&gt;I don't.&lt;/strong&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 08 Aug 2021 22:37:00 +0100</pubDate><guid>tag:lornajane.net,2021-08-08:/posts/2021/hold-attention-on-the-virtual-stage</guid><category>tech</category><category>events</category><category>learning</category><category>speaking</category></item><item><title>Define Navigation Structure in a Sphinx Project</title><link>https://lornajane.net/posts/2021/define-navigation-structure-in-a-sphinx-project</link><description>&lt;p class="first last"&gt;As a newcomer to &lt;a class="reference external" href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt;, I found many things confusing, but the table of contents or &amp;quot;toc&amp;quot; configuration was the thing that almost made me change my mind and pick a different platform! I now have a setup that works pretty well, using &lt;a class="reference external" href="https://github.com/executablebooks/sphinx-external-toc"&gt;Sphinx External TOC&lt;/a&gt;, so I thought I'd share my setup.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 13 Jun 2021 19:11:00 +0100</pubDate><guid>tag:lornajane.net,2021-06-13:/posts/2021/define-navigation-structure-in-a-sphinx-project</guid><category>tech</category><category>documentation</category><category>sphinx</category></item><item><title>Considering Developer Relations as a Career Move</title><link>https://lornajane.net/posts/2021/considering-developer-relations</link><description>&lt;p class="first"&gt;I think that Developer Relations is a fabulous career, and I'm often asked how I got started, or how someone else could get started. There are a lot of people hiring for Developer Relations roles just now (including me!) so here are my tips.&lt;/p&gt;
&lt;p class="last"&gt;There are so many different Developer Relations roles (called &amp;quot;DevRel&amp;quot;) that I am definitely going to fall short of covering them all in any sort of detail! My own background is in Software Engineering, and I've mostly worked as a Developer Advocate since making the move into DevRel, so that's my context here.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 24 May 2021 11:02:00 +0100</pubDate><guid>tag:lornajane.net,2021-05-24:/posts/2021/considering-developer-relations</guid><category>work</category><category>career</category><category>devrel</category></item><item><title>Best Things About Developer Advocacy</title><link>https://lornajane.net/posts/2021/best-things-about-devrel</link><description>&lt;p class="first last"&gt;There are some excellent articles around about what a Developer Advocate does, but have you ever wondered WHY we do what we do? I tried to articulate this when chatting with another developer lately, and I'm still thinking about it! So I thought I'd write it down to share a little more widely why I love this strange, misshapen career as much as I do.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 26 Apr 2021 20:07:00 +0100</pubDate><guid>tag:lornajane.net,2021-04-26:/posts/2021/best-things-about-devrel</guid><category>tech</category><category>career</category><category>devrel</category><category>work</category></item><item><title>Measuring Repo Community Health with GitHub's API</title><link>https://lornajane.net/posts/2021/measuring-github-community-health</link><description>&lt;p class="first"&gt;I'm on record saying that &lt;a class="reference external" href="https://developerrelations.com/developer-experience/github-is-your-documentation-landing-page"&gt;GitHub is your Landing Page&lt;/a&gt; and when I think about companies having open source profiles, I think about how many developers will have the first contact with them on GitHub. If it's a code example you're looking for then like it or not, GitHub is considered a search engine by many developers.&lt;/p&gt;
&lt;p&gt;With that in mind, I wanted to look at GitHub's &lt;a class="reference external" href="https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions"&gt;Community Health measure&lt;/a&gt; of the repositories I'm responsible for. You can view each repo's community page separately through the web interface (look under &amp;quot;Insights&amp;quot;) but that's not especially scalable if you have a lot of projects to track.&lt;/p&gt;
&lt;p class="last"&gt;&lt;a class="reference external image-reference" href="https://lornajane.net/images/2021/04/Screenshot_2021-04-13-lornajane-PHP-Web-Services.png"&gt;&lt;img alt="screeshot of the project's /community page, showing low completion" class="alignnone size-large wp-image-4375" src="https://lornajane.net/images/2021/04/Screenshot_2021-04-13-lornajane-PHP-Web-Services-1024x509.png" style="width: 584px; height: 290px;" /&gt;&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 14 Apr 2021 09:19:00 +0100</pubDate><guid>tag:lornajane.net,2021-04-14:/posts/2021/measuring-github-community-health</guid><category>tech</category><category>community</category><category>github</category><category>metrics</category><category>python</category></item><item><title>From Spreadsheet to Database with ddlgenerator</title><link>https://lornajane.net/posts/2021/from-spreadsheet-to-database-with-ddlgenerator</link><description>&lt;p class="first last"&gt;I've been using some &lt;a class="reference external" href="https://www.kaggle.com/datasets"&gt;fun open data sets&lt;/a&gt; recently but I'm more familiar with databases than with traditional data science formats (this one is CSV). &lt;a class="reference external" href="https://www.enterprisedb.com/postgres-tutorials/how-import-and-export-data-using-csv-files-postgresql"&gt;Importing CSV into Postgres&lt;/a&gt; is fairly well-established, but you need a table structure to import into ... and I was looking at a CSV with 50 columns (for my &lt;a class="reference external" href="https://aiven.io/blog/discover-exoplanets-with-postgresql"&gt;post about exoplanets on the Aiven blog&lt;/a&gt;). Enter this neat utility: &lt;a class="reference external" href="https://pypi.org/project/ddlgenerator/"&gt;ddlgenerator&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 22 Mar 2021 16:33:00 +0000</pubDate><guid>tag:lornajane.net,2021-03-22:/posts/2021/from-spreadsheet-to-database-with-ddlgenerator</guid><category>tech</category></item><item><title>Intro to RPi Pico with Mini Memory Game</title><link>https://lornajane.net/posts/2021/intro-to-rpi-pico-with-mini-memory-game</link><description>&lt;p class="first"&gt;I am the proud owner of a &lt;a class="reference external" href="https://www.raspberrypi.org/documentation/pico/getting-started/"&gt;Raspberry Pi Pico&lt;/a&gt; which is a dinky microcontroller from the lovely people at Raspberry Pi. I &lt;em&gt;also&lt;/em&gt; have the &lt;a class="reference external" href="https://shop.pimoroni.com/products/pico-rgb-keypad-base"&gt;RGB Pico Keypad Base&lt;/a&gt;, because my husband was buying something else from &lt;a class="reference external" href="https://shop.pimoroni.com/"&gt;Pimoroni&lt;/a&gt; (3D printer filament, more on that another day) and we love them and ... here we are :)&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="https://lornajane.net/images/2021/02/wp-1612817806936-scaled.jpg"&gt;&lt;img alt="image1" class="alignnone size-medium wp-image-4362" src="https://lornajane.net/images/2021/02/wp-1612817806936-300x169.jpg" style="width: 300px; height: 169px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="last"&gt;I've tried to write down and link to the stuff I found useful along the way with this project, in case it helps you too. Well, no, really so I can come back to it next time I'm using one of these!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 08 Feb 2021 21:49:00 +0000</pubDate><guid>tag:lornajane.net,2021-02-08:/posts/2021/intro-to-rpi-pico-with-mini-memory-game</guid><category>tech</category><category>hardware</category><category>python</category><category>raspi</category></item><item><title>Lab Book Meets Bullet Journal</title><link>https://lornajane.net/posts/2021/lab-book-meets-bullet-journal</link><description>&lt;p class="first last"&gt;I enjoy a productivity hack as much as the next person, and I'm often asked about my setup. My background is in engineering (I hold an MEng in Electronic Engineering from York) and recognise the legacy of the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Lab_notebook"&gt;lab book&lt;/a&gt; in much of what I do. If you're new to the lab book concept, check out this &lt;a class="reference external" href="https://colinpurrington.com/tips/lab-notebooks/"&gt;excellent article on how to maintain one properly&lt;/a&gt;. My practice breaks a LOT of the lab book rules and is also heavily influenced by the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Bullet_journal"&gt;Bullet Journal&lt;/a&gt; trend (if you have time to spare, the &lt;a class="reference external" href="https://www.instagram.com/explore/tags/bulletjournal/"&gt;instagram #bulletjournal hashtag&lt;/a&gt; gives a prettier introduction), which is a way to combine the benefits of productivity and processing information by writing it. Today's post gives a quick tour of my process.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 31 Jan 2021 21:39:00 +0000</pubDate><guid>tag:lornajane.net,2021-01-31:/posts/2021/lab-book-meets-bullet-journal</guid><category>work</category><category>productivity</category></item><item><title>Digital Developer Relations: Past and Future</title><link>https://lornajane.net/posts/2020/digital-developer-relations-past-and-future</link><description>&lt;p class="first last"&gt;I work in Developer Relations, or &amp;quot;DevRel&amp;quot;, and 2020 was a strange year with travel restrictions that meant that the entire industry did everything online, or digitally. I see this as a very positive progression of the way we work as DevRel professionals, and I understand that might be controversial, but I'd like to back up my position so hear me out (and then let me know what you think!).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 23 Dec 2020 09:24:00 +0000</pubDate><guid>tag:lornajane.net,2020-12-23:/posts/2020/digital-developer-relations-past-and-future</guid><category>work</category><category>devrel</category><category>opinion</category></item><item><title>What's New in OpenAPI 3.1</title><link>https://lornajane.net/posts/2020/whats-new-in-openapi-3-1</link><description>&lt;p class="first"&gt;With OpenAPI 3.1 coming &amp;quot;soon&amp;quot;, I gave a talk at APIDays Paris about what to expect. But I'm a great fan of the written word as reference so here's a written recap of what's in the next OpenAPI release.&lt;/p&gt;
&lt;div class="last line-block"&gt;
&lt;div class="line"&gt;Top features:&lt;/div&gt;
&lt;div class="line"&gt;- Compatible with JSON Schema 2020-12&lt;/div&gt;
&lt;div class="line"&gt;- Webhook support&lt;/div&gt;
&lt;div class="line"&gt;- Many other minor improvements&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 14 Dec 2020 09:54:00 +0000</pubDate><guid>tag:lornajane.net,2020-12-14:/posts/2020/whats-new-in-openapi-3-1</guid><category>tech</category><category>openapi</category></item><item><title>Bystanders Guide to Repository Maintenance</title><link>https://lornajane.net/posts/2020/bystanders-guide-to-repository-maintenance</link><description>&lt;p class="first last"&gt;Today's post is about bystanders and open source. We sometimes have anxiety about doing things on &amp;quot;other people's&amp;quot; projects but the thing about open source is that those are not &amp;quot;their&amp;quot; projects, those are &amp;quot;our&amp;quot; projects, and they only exist because people other than their nominated gatekeepers chip in now and then.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Fri, 04 Dec 2020 20:20:00 +0000</pubDate><guid>tag:lornajane.net,2020-12-04:/posts/2020/bystanders-guide-to-repository-maintenance</guid><category>tech</category><category>github</category><category>open source</category></item><item><title>Making SDKs a Value-Added Experience</title><link>https://lornajane.net/posts/2020/making-sdks-a-value-added-experience</link><description>&lt;p class="first last"&gt;I've been working with SDKs quite a bit this year, simple ones that wrap a bunch of API endpoints. The best bits of these SDKs isn't just the delightful developer experience of using the clunky endpoints with the elegant SDK wrapping them. I mean, it is, but I already &lt;a class="reference external" href="https://nordicapis.com/build-consistent-and-delightful-sdks-for-your-apis/"&gt;wrote about consistent and Delightful SDKs for Nordic APIs&lt;/a&gt;; today I want to cover the some of the &amp;quot;extra&amp;quot; things that make a big difference in the APIs.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 16 Nov 2020 10:18:00 +0000</pubDate><guid>tag:lornajane.net,2020-11-16:/posts/2020/making-sdks-a-value-added-experience</guid><category>tech</category><category>api</category><category>devx</category><category>sdk</category></item><item><title>DevContainers, VSCode and GitHub Codespaces</title><link>https://lornajane.net/posts/2020/devcontainers-vscode-and-github-codespaces</link><description>&lt;p class="first last"&gt;I've seen quite a bit of chatter later about the &lt;a class="reference external" href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt; feature lately, and I have beta access to it so I thought I'd share my first impressions and make some notes of what I've tried that might be useful to others.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 15 Nov 2020 13:31:00 +0000</pubDate><guid>tag:lornajane.net,2020-11-15:/posts/2020/devcontainers-vscode-and-github-codespaces</guid><category>tech</category><category>containers</category><category>docker</category><category>github</category><category>tips</category><category>vscode</category></item><item><title>Ubuntu Command for Mic Mute with Pulsemixer</title><link>https://lornajane.net/posts/2020/ubuntu-command-for-mic-mute-with-pulsemixer</link><description>&lt;p class="first last"&gt;One of the major problems I run into with video conferencing tools is how many of them are not at all accessible. I'm a keyboard-only user so if I need to hover a pointer in a particular area of the screen and then click an icon to mute ... then I can't do that. And if you mute me when I join because there are a lot of people here, then I can't participate at all. To work around this, I need a one-liner to mute (and unmute) my mic ... so here it is.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 12 Nov 2020 17:27:00 +0000</pubDate><guid>tag:lornajane.net,2020-11-12:/posts/2020/ubuntu-command-for-mic-mute-with-pulsemixer</guid><category>tech</category><category>streamdeck</category><category>tips</category><category>ubuntu</category></item><item><title>Keyboard-only Web Browser</title><link>https://lornajane.net/posts/2020/keyboard-only-web-browser</link><description>&lt;p class="first last"&gt;I haven't used a pointing device in over a decade, and I get a lot of questions about how I navigate the web using only the keyboard. The short answer is: &lt;a class="reference external" href="https://vimium.github.io/"&gt;Vimium&lt;/a&gt; and funnily enough, it's a productivity tool rather than an accessibility tool. Curious? Let me show you around!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 22 Oct 2020 13:53:00 +0100</pubDate><guid>tag:lornajane.net,2020-10-22:/posts/2020/keyboard-only-web-browser</guid><category>tech</category><category>a11y</category><category>accessibility</category><category>vimium</category></item><item><title>Combine Multiple Field Tags in Go</title><link>https://lornajane.net/posts/2020/combine-multiple-field-tags-in-go</link><description>&lt;p class="first last"&gt;I work a lot with JSON APIs in my Go projects, so almost every struct has some field tags on it to translate &lt;tt class="docutils literal"&gt;AccountID&lt;/tt&gt; into &lt;tt class="docutils literal"&gt;account_id&lt;/tt&gt; and that sort of thing. Then one day I needed to load data from config using &lt;a class="reference external" href="https://pkg.go.dev/github.com/mitchellh/mapstructure"&gt;mapstructure&lt;/a&gt; and it took a few attempts with the search engine to find the syntax I needed, so it's here for next time I need it (or in case you need it too).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 21 Oct 2020 09:46:00 +0100</pubDate><guid>tag:lornajane.net,2020-10-21:/posts/2020/combine-multiple-field-tags-in-go</guid><category>tech</category><category>go</category><category>tips</category></item><item><title>Adding Tables of Contents to Markdown</title><link>https://lornajane.net/posts/2020/adding-tables-of-contents-to-markdown</link><description>&lt;p class="first last"&gt;Once any document gets over a certain length, a table of contents can be useful. I have a favourite markdown table-of-contents tool but it usually takes me a trip to the search engine to remember what it is! (tl;dr: &lt;a class="reference external" href="https://github.com/ekalinin/github-markdown-toc"&gt;github-markdown-toc&lt;/a&gt; )&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 18 Oct 2020 20:34:00 +0100</pubDate><guid>tag:lornajane.net,2020-10-18:/posts/2020/adding-tables-of-contents-to-markdown</guid><category>tech</category><category>github</category><category>markdown</category><category>tips</category></item><item><title>Package Webpages as Apps with Nativefier</title><link>https://lornajane.net/posts/2020/package-webpages-as-apps-with-nativefier</link><description>&lt;p class="first last"&gt;There are a couple of specific web pages I use in separate windows from my other browser tabs, so I can always find them. However this quickly leads to a too-many-browser-windows problem. Instead, I have been turning them into basic standalone applications with a javascript tool: &lt;a class="reference external" href="https://github.com/jiahaog/nativefier"&gt;nativefier&lt;/a&gt; and I thought I'd share my recipes.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 15 Sep 2020 11:22:00 +0100</pubDate><guid>tag:lornajane.net,2020-09-15:/posts/2020/package-webpages-as-apps-with-nativefier</guid><category>tech</category><category>nativefier</category><category>twitch</category><category>ubuntu</category></item><item><title>Create .desktop files for Ubuntu</title><link>https://lornajane.net/posts/2020/create-desktop-files-for-ubuntu</link><description>&lt;p class="first last"&gt;Having created a couple of &lt;tt class="docutils literal"&gt;.desktop&lt;/tt&gt; files lately to make launching apps easier, I thought I'd write myself a quick reminder of what I did and how it works. If it's useful to you too, then great! I have one application in a weird path, and another that needs a specific environment variable set for it to work.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 13 Sep 2020 11:21:00 +0100</pubDate><guid>tag:lornajane.net,2020-09-13:/posts/2020/create-desktop-files-for-ubuntu</guid><category>tech</category><category>ubuntu</category></item><item><title>Sharing Screen and Camera from Android to Linux</title><link>https://lornajane.net/posts/2020/sharing-screen-and-camera-from-android-to-linux</link><description>&lt;p class="first last"&gt;With all the video calls, &lt;a class="reference external" href="https://twitch.tv/lornajanetv"&gt;twitch streaming&lt;/a&gt; and product demo work I've been doing recently, I've been building up a library of tricks for using my android devices within the video content I produce from my laptop, so I thought I'd share. I've worked remotely for many years but I think there's more of us not going back to the office any time soon, so strong video communication skills are important!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 17 Aug 2020 09:38:00 +0100</pubDate><guid>tag:lornajane.net,2020-08-17:/posts/2020/sharing-screen-and-camera-from-android-to-linux</guid><category>tech</category><category>android</category><category>streaming</category><category>ubuntu</category><category>video</category></item><item><title>An Intro to Your ESP8266</title><link>https://lornajane.net/posts/2020/an-intro-to-your-esp8266</link><description>&lt;p class="first"&gt;I've been using a microchip on my &lt;a class="reference external" href="https://lornajane.net/posts/2020/neopixel-shelf"&gt;neopixel shelf project&lt;/a&gt; but I kind of set it up, changed one thing, and didn't look at it again until this week. I'd like to have my neopixels do something more interesting than one solid colour or another, so I needed to remind myself of what this thing is and how I do it. These are my notes, for my Ubuntu platform, but you're more than welcome to them!&lt;/p&gt;
&lt;p class="last"&gt;&lt;img alt="strip of pink LEDs embedded in a shelf, with an esp8266 on a wire in the foreground" class="alignnone size-full wp-image-4259" src="https://lornajane.net/images/2020/08/esp8266-pink.png" style="width: 395px; height: 218px;" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sat, 08 Aug 2020 20:54:00 +0100</pubDate><guid>tag:lornajane.net,2020-08-08:/posts/2020/an-intro-to-your-esp8266</guid><category>tech</category><category>esp</category><category>esp8266</category><category>lua</category><category>microcontroller</category></item><item><title>Creating a Simple OpenAPI Spec</title><link>https://lornajane.net/posts/2020/creating-a-simple-openapi-spec</link><description>&lt;p class="first last"&gt;Having API descriptions in your workflow is a game-changer, but how do you get from nothing to a functioning spec in the first place? I recently made a very simple spec for a very simple API, and thought it might make a good example for anyone looking to create a spec for the first time. OpenAPI specs are very verbose so this very tiny API makes quite a manageable example!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 06 Aug 2020 13:44:00 +0100</pubDate><guid>tag:lornajane.net,2020-08-06:/posts/2020/creating-a-simple-openapi-spec</guid><category>tech</category><category>api</category><category>openapi</category><category>planet</category></item><item><title>Using Environments in Postman</title><link>https://lornajane.net/posts/2020/using-environments-in-postman</link><description>&lt;p class="first last"&gt;I'm using &lt;a class="reference external" href="https://postman.com"&gt;Postman&lt;/a&gt; more lately and showing off the Environments feature really often. I really like this feature for giving easy ways to handle values I use frequently, but it seems to be a bit of a hidden gem, so I thought I'd write about when I find it useful, in case you do too!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 23 Jul 2020 16:55:00 +0100</pubDate><guid>tag:lornajane.net,2020-07-23:/posts/2020/using-environments-in-postman</guid><category>tech</category><category>api</category><category>postman</category><category>tips</category></item><item><title>Planets and Webhooks: a simple Flask app</title><link>https://lornajane.net/posts/2020/planets-and-webhooks-a-simple-flask-app</link><description>&lt;p class="first last"&gt;As a Developer Advocate for an API company, I spend a lot of time talking about APIs and webhooks and HTTP in general. Recently I've been focussing on HTTP tools, but I really wanted a very simple example API that I could use that would return JSON but really let me focus on the tools, not the API. So I created a &amp;quot;Planets and Webhooks&amp;quot; API with a couple of &lt;tt class="docutils literal"&gt;GET&lt;/tt&gt; endpoints to return JSON data, and another endpoint to receive and log incoming webhook data.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 22 Jul 2020 14:50:00 +0100</pubDate><guid>tag:lornajane.net,2020-07-22:/posts/2020/planets-and-webhooks-a-simple-flask-app</guid><category>tech</category><category>api</category><category>http</category><category>python</category><category>tools</category></item><item><title>Neopixel Shelf</title><link>https://lornajane.net/posts/2020/neopixel-shelf</link><description>&lt;p class="first"&gt;In these days of video calling in place of any other social contact, I've seen a lot of excellent video backgrounds. Perhaps I'm old-fashioned but I went the traditional route, and set up my computer close to a wall (so you can't see the mess in the room) and added a nice pinboard behind me. I looked a bit flat against the wall though, so I did what anyone else would do ... and built a handmade wooden shelf with neopixels in it!&lt;/p&gt;
&lt;p class="last"&gt;&lt;img alt="webcam's eye view, showing radiator, shelf with blue lights, and pinboard above" class="alignnone size-medium wp-image-4233" src="https://lornajane.net/images/2020/07/DSC_6168-300x169.jpg" style="width: 300px; height: 169px;" /&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sat, 18 Jul 2020 17:47:00 +0100</pubDate><guid>tag:lornajane.net,2020-07-18:/posts/2020/neopixel-shelf</guid><category>craft</category><category>craft</category><category>iot</category><category>leds</category><category>woodwork</category><category>tech</category></item><item><title>Add a Screenshot Button to Streamdeck with Golang</title><link>https://lornajane.net/posts/2020/add-a-screenshot-button-to-streamdeck-with-golang</link><description>&lt;p class="first last"&gt;I'm the proud owner of a Streamdeck XL but as an Ubuntu user, the tool support isn't great. There's a Python library that gives a bit of a GUI but I found it hard to use and I'd have needed to put each piece of functionality as a commandline script that this program could call. Instead, I am using &lt;a class="reference external" href="https://github.com/magicmonkey/go-streamdeck"&gt;go-streamdeck&lt;/a&gt; to create a custom application - and I'm having fun! Today's example adds a single button that runs a command to take a screenshot.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 06 Jul 2020 10:09:00 +0100</pubDate><guid>tag:lornajane.net,2020-07-06:/posts/2020/add-a-screenshot-button-to-streamdeck-with-golang</guid><category>golang, tech</category><category>go</category><category>open source</category><category>streamdeck</category><category>ubuntu</category></item><item><title>Accessing Nested Config with Viper</title><link>https://lornajane.net/posts/2020/accessing-nested-config-with-viper</link><description>&lt;p class="first last"&gt;I'm writing a Go application that glues together a bunch of other things, so it has a whole bunch of basically unrelated config, dumped in a yaml file. I was struggling a little with this non-standard use of &lt;a class="reference external" href="https://github.com/spf13/viper"&gt;Viper&lt;/a&gt; but actually, it does everything I needed. And, presumaby, more besides. I thought I would put some examples here to show how to handle this.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 25 Jun 2020 21:28:00 +0100</pubDate><guid>tag:lornajane.net,2020-06-25:/posts/2020/accessing-nested-config-with-viper</guid><category>golang</category><category>golang</category><category>tips</category><category>tech</category></item><item><title>Use a Local Version of a Library in Go</title><link>https://lornajane.net/posts/2020/use-a-local-version-of-a-library-in-go</link><description>&lt;p class="first last"&gt;I have a couple of projects in Go where I need to work with a branch that isn't the released version of a library that my code depends on. This happens when I'm the developer of the library and an application to use it, or when I'm a contributor to the library so I have my own fork and will want to check out branches to submit or test patches. Go has a pretty need way to allow this: using the &lt;tt class="docutils literal"&gt;replace&lt;/tt&gt; keyword in the &lt;tt class="docutils literal"&gt;go.mod&lt;/tt&gt; file.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 15 Jun 2020 09:51:00 +0100</pubDate><guid>tag:lornajane.net,2020-06-15:/posts/2020/use-a-local-version-of-a-library-in-go</guid><category>golang</category><category>golang</category><category>streamdeck</category><category>tech</category></item><item><title>OBS Studio, Ubuntu 20.04 and a Wacom Tablet</title><link>https://lornajane.net/posts/2020/obs-ubuntu-20-04-and-a-wacom-tablet</link><description>&lt;p&gt;When I upgraded my computers to Ubuntu 20.04, I noticed a weird problem with OBS when using an old Wacom Bamboo tablet (because, have you ever tried to use OBS without a pointing device?). I couldn't actually click anything! The pointer seemed to be ... pointing to the wrong place …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 31 May 2020 20:31:00 +0100</pubDate><guid>tag:lornajane.net,2020-05-31:/posts/2020/obs-ubuntu-20-04-and-a-wacom-tablet</guid><category>tech</category><category>obs</category><category>streaming</category><category>ubuntu</category></item><item><title>Eye Contact Owl</title><link>https://lornajane.net/posts/2020/eye-contact-owl</link><description>&lt;p class="first last"&gt;I don't post as much handicraft on this blog as I used to (it's mostly &lt;a class="reference external" href="https://www.instagram.com/lornajane_net/"&gt;on my instagram account&lt;/a&gt; with fewer words now), but I wanted to share my new handmade owl. He solves a genuine problem: how to make eye contact with your webcam.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 26 May 2020 20:11:00 +0100</pubDate><guid>tag:lornajane.net,2020-05-26:/posts/2020/eye-contact-owl</guid><category>craft</category><category>craft</category><category>owl</category><category>peg</category><category>webcam</category></item><item><title>Custom OpenAPI Style Rules with Spectral</title><link>https://lornajane.net/posts/2020/custom-openapi-style-rules-with-spectral</link><description>&lt;p class="first"&gt;&lt;strong&gt;Edit: There's a&lt;/strong&gt; &lt;a class="reference external" href="https://lornajane.net/posts/2024/lint-apis-with-redocly-cli"&gt;newer post on this topic using Redocly CLI&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I work quite a bit with OpenAPI specs and with lots of specs and lots of collaborators, keeping the specs all functional (never mind tidy, consistent, or other dreamwords) is a challenge! We use &lt;a class="reference external" href="https://github.com/stoplightio/spectral"&gt;spectral&lt;/a&gt; to check our specs, both when we work on them and in the build process. Spectral is great but it has Opinions(TM)!&lt;/p&gt;
&lt;p class="last"&gt;For most users, running Spectral out of the box gives quite a lot of output even on an otherwise valid spec. I do think the default ruleset for Spectral is pretty good, but every situation is different so having your own ruleset to use is a good idea. This post shows how to use a ruleset and some examples.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 21 May 2020 15:54:00 +0100</pubDate><guid>tag:lornajane.net,2020-05-21:/posts/2020/custom-openapi-style-rules-with-spectral</guid><category>tech</category><category>openapi</category><category>spectral</category></item><item><title>The python-is-python2 package on Ubuntu Focal Fossa</title><link>https://lornajane.net/posts/2020/the-python-is-python2-package-on-ubuntu-focal-fossa</link><description>&lt;p&gt;I did a fresh install of Ubuntu 20.04 Focal Fossa on my laptop, and was surprised at what happened when I went to install python:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ sudo apt install python
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'python-is-python2' instead of 'python'
&lt;/pre&gt;
&lt;p&gt;Um, what?&lt;/p&gt;
&lt;p&gt;It …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Fri, 24 Apr 2020 19:15:00 +0100</pubDate><guid>tag:lornajane.net,2020-04-24:/posts/2020/the-python-is-python2-package-on-ubuntu-focal-fossa</guid><category>tech</category><category>apt</category><category>python</category><category>ubuntu</category></item><item><title>A First Netlify Function in Golang</title><link>https://lornajane.net/posts/2020/a-first-netlify-function-in-golang</link><description>&lt;p class="first last"&gt;I love all things serverless, and &lt;a class="reference external" href="https://www.netlify.com/products/functions/"&gt;Netlify Functions&lt;/a&gt; is a neat and convenient way to access AWS Lambda. I do also love AWS Lambda but it's so powerful and flexible that creating something like a webhook receiver can be hard going by the time you have all the permissions and API Gateway setup sorted out - for a simple webhook receiver, Netlify functions is a nice and easy way to get going. Best of all: it supports Golang but the docs are very JS-heavy so I am writing my notes here in case I need to refer back to them some day.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 15 Apr 2020 11:20:00 +0100</pubDate><guid>tag:lornajane.net,2020-04-15:/posts/2020/a-first-netlify-function-in-golang</guid><category>golang</category><category>golang</category><category>netlify</category><category>serverless</category><category>tech</category></item><item><title>Wget Direct to S3 with Golang Streams</title><link>https://lornajane.net/posts/2020/wget-direct-to-s3-with-golang-streams</link><description>&lt;p class="first last"&gt;One thing I find very elegant about working with golang is that it is very open minded about where data is flowing in from or going out to. I recently built an application that downloaded an audio file from one location and pushed it to s3 - and golang makes it very easy to do that without needing to write an intermediate file and then upload that. Here's my code, in case I need to do this again some day :)&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 08 Apr 2020 16:30:00 +0100</pubDate><guid>tag:lornajane.net,2020-04-08:/posts/2020/wget-direct-to-s3-with-golang-streams</guid><category>golang</category><category>aws</category><category>golang</category><category>s3</category><category>stream</category><category>tech</category></item><item><title>HTTPMock for Testing a Golang API Client</title><link>https://lornajane.net/posts/2020/httpmock-for-testing-a-golang-api-client</link><description>&lt;p class="first last"&gt;I'm working on an API client for some &lt;a class="reference external" href="https://developer.nexmo/com/api"&gt;Nexmo APIs&lt;/a&gt; and having tests to work through the various responses that the API can return and check that it does what I expect has been very handy so I thought I'd share my thoughts. I've got a bit of a head start here too since the OpenAPI specs have example responses in them that I can grab and feed to the mocking tool I'm using in my tests!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 30 Mar 2020 20:08:00 +0100</pubDate><guid>tag:lornajane.net,2020-03-30:/posts/2020/httpmock-for-testing-a-golang-api-client</guid><category>golang</category><category>golang</category><category>http</category><category>tests</category><category>tech</category></item><item><title>Remove Accidental Content from Git Commit</title><link>https://lornajane.net/posts/2020/remove-accidental-content-from-git-commit</link><description>&lt;p class="first last"&gt;When I teach git I try to show loads of good practice about how to inspect what's staged before commit, etc etc. Good practice is good of course, but knowing how to undo a mess you created is better - and mistakes will happen. For example, accidentally including a &lt;tt class="docutils literal"&gt;node_modules&lt;/tt&gt; directory in your otherwise excellent and useful commit. This post will walk you through how to fix the problem without losing any of your work.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 15 Mar 2020 20:24:00 +0000</pubDate><guid>tag:lornajane.net,2020-03-15:/posts/2020/remove-accidental-content-from-git-commit</guid><category>tech</category><category>git</category><category>tips</category></item><item><title>Teach Your API Test Platform to Send Callbacks</title><link>https://lornajane.net/posts/2020/teach-your-api-test-platform-to-send-callbacks</link><description>&lt;p class="first last"&gt;I already wrote about &lt;a class="reference external" href="https://lornajane.net/posts/2020/instant-test-api-platforms-with-prism"&gt;using Prism as an API test platform&lt;/a&gt; but I didn't include an example with callbacks so this post is to fill that gap! If you didn't read the previous post, the tl;dr is that &lt;a class="reference external" href="https://stoplight.io/open-source/prism"&gt;Prism&lt;/a&gt; is a nodejs open source tool that can take your &lt;a class="reference external" href="https://www.openapis.org/"&gt;OpenAPI&lt;/a&gt; specification and then do an impression of your live API, validating the API calls sent to it and responding with the example data described in the spec. It can also follow up the API response and send an HTTP request of its own to mock the callbacks described in your OpenAPI spec.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 18 Feb 2020 15:50:00 +0000</pubDate><guid>tag:lornajane.net,2020-02-18:/posts/2020/teach-your-api-test-platform-to-send-callbacks</guid><category>javascript</category><category>api</category><category>openapi</category><category>prism</category><category>stoplight</category><category>tech</category></item><item><title>Make Thumbnails of PDF Pages with ImageMagick</title><link>https://lornajane.net/posts/2020/make-thumbnails-of-pdf-pages-with-imagemagick</link><description>&lt;p class="first last"&gt;All my talk slides are PDF - I use &lt;a class="reference external" href="https://rst2pdf.org"&gt;rst2pdf&lt;/a&gt; to transform text-based ReStructuredText content into presentation slides. With all these PDFs hanging around, it can be very handy to have them as thumbnails. I use the images both in the printable speaker notes that I produce (and I should blog that too now I've mentioned it), and to share on twitter - especially the resources slide that everyone photographs! My image file is much more readable than your cameraphone picture in terrible lighting :) So here's my script for thumbnails in case you want to do the same; most presentation tools will export to PDF if you're not already working in that format.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sun, 16 Feb 2020 15:06:00 +0000</pubDate><guid>tag:lornajane.net,2020-02-16:/posts/2020/make-thumbnails-of-pdf-pages-with-imagemagick</guid><category>tech</category><category>imagemagick</category><category>pdf</category><category>python</category></item><item><title>Instant Test API Platforms with Prism</title><link>https://lornajane.net/posts/2020/instant-test-api-platforms-with-prism</link><description>&lt;p class="first last"&gt;I've been writing a bit about OpenAPI lately and I realised that I didn't share how I'm creating local, test versions of production APIs to work with while I develop new client code or test SDK features. The recipe is simple: you will need an API spec, the excellent open source tool &lt;a class="reference external" href="https://stoplight.io/open-source/prism"&gt;Prism&lt;/a&gt; and an HTTP client. Mix it up and be ready to change your API development workflows forever.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 23 Jan 2020 11:17:00 +0000</pubDate><guid>tag:lornajane.net,2020-01-23:/posts/2020/instant-test-api-platforms-with-prism</guid><category>javascript</category><category>js</category><category>openapi</category><category>prism</category><category>stoplight</category><category>tech</category></item><item><title>Grab Annotations from a PDF with pypdf2</title><link>https://lornajane.net/posts/2020/grab-annotations-from-a-pdf-with-pypdf2</link><description>&lt;p class="first"&gt;If you've noticed a lot of PDF content around here lately, that's because I work with PDF a lot! Most of all, all my slide decks are in PDF and in the last year or so I've started using speaker notes in my presentations. Yes, this means that if you saw me speak in the &lt;em&gt;first&lt;/em&gt; ten years of my speaking career, that was without speaker notes.&lt;/p&gt;
&lt;p class="last"&gt;There are some situations where I don't have access to my speaker notes. Usually this is a good reason, such as I have mirrored my displays so I can demo or play a video without fiddling with my display settings in the middle of a talk. Sometimes, it's because something bad happened and I'm presenting from someone else's machine or a laptop that's completely off stage and I only have the comfort monitor. For those situations I use a printed set of backup speaker notes so I thought I'd share the script that creates these.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Wed, 15 Jan 2020 20:37:00 +0000</pubDate><guid>tag:lornajane.net,2020-01-15:/posts/2020/grab-annotations-from-a-pdf-with-pypdf2</guid><category>tech</category><category>pdf</category><category>python</category></item><item><title>Raspberry Pi SenseHat Night Clock</title><link>https://lornajane.net/posts/2019/raspberry-pi-sensehat-night-clock</link><description>&lt;p class="first last"&gt;I recently upgraded my smartwatch and the new model needs charging daily (whether that's really an upgrade is a separate discussion!) so I drop it on the charger by my bed overnight. As a result, I can't tell the time if I wake up in the night which is only annoying because I don't know if it's midnight or if the alarm is going to go off in ten minutes! So I made myself a colourful fuzzy time clock with a raspberry pi and a SenseHat that were lying around in my office.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Sat, 28 Dec 2019 09:36:00 +0000</pubDate><guid>tag:lornajane.net,2019-12-28:/posts/2019/raspberry-pi-sensehat-night-clock</guid><category>tech</category></item><item><title>Counting Duplicate Commit Messages</title><link>https://lornajane.net/posts/2019/counting-duplicate-commit-messages</link><description>&lt;p class="first last"&gt;When chatting about source control good practice the other day, I got a question about repeated git commit messages. In general, I would always advise that the same commit messages appearing multiple times in a project's history is a definite red flag - and if I'm responsible for that repository I will probably make fun of you for doing it.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 16 Dec 2019 16:24:00 +0000</pubDate><guid>tag:lornajane.net,2019-12-16:/posts/2019/counting-duplicate-commit-messages</guid><category>tech</category><category>git</category><category>tips</category></item><item><title>Ruby for non-Rubyists with Snap</title><link>https://lornajane.net/posts/2019/ruby-for-non-rubyists-with-snap</link><description>&lt;p&gt;I'm an Ubuntu user and I enjoy most server-side scripting languages but I haven't done much Ruby and I never get the feeling that Ruby is pleased to see me when I do. Something is always out of date or has an incompatible dependency or ... and since I don't use …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 07 Oct 2019 09:52:00 +0100</pubDate><guid>tag:lornajane.net,2019-10-07:/posts/2019/ruby-for-non-rubyists-with-snap</guid><category>tech</category><category>ruby</category><category>snap</category><category>ubuntu</category></item><item><title>Sniglet is a Font for Avoiding Font Loading Mistakes</title><link>https://lornajane.net/posts/2019/sniglet-is-a-font-for-avoiding-font-loading-mistakes</link><description>&lt;p class="first"&gt;I am not a designer, nor will I ever be. Things look perfectly fine to me a very long time before they look OK to anyone else! Along with that, I don't always find it easy to tell fonts apart. I can do serif-ish and sans-ish but if the fixed-width font has serifs on it I sometimes miss that detail if I'm not looking for it - which also means that I have no idea if I've loaded the fonts I was thinking of or not.&lt;/p&gt;
&lt;p class="last"&gt;To get around this, I test everything by switching the font to &lt;a class="reference external" href="https://www.theleagueofmoveabletype.com/sniglet"&gt;Sniglet&lt;/a&gt; from the League of Moveable Type. It's ... umistakable!&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 16 Sep 2019 20:45:00 +0100</pubDate><guid>tag:lornajane.net,2019-09-16:/posts/2019/sniglet-is-a-font-for-avoiding-font-loading-mistakes</guid><category>tech</category><category>fonts</category></item><item><title>OpenAPI Description using API key and secret</title><link>https://lornajane.net/posts/2019/openapi-description-using-api-key-secret</link><description>&lt;p class="first last"&gt;I've been working on a few OpenAPI descriptions of APIs lately, and really enjoying the benefits they bring. In particular the &lt;a class="reference external" href="https://lornajane.net/posts/2019/ready-to-wear-api-collections-with-openapi-and-postman"&gt;ability to import into Postman as a collection&lt;/a&gt; I think is a &amp;quot;killer feature&amp;quot; for APIs looking to get developers up and running quickly. The catch? I found that an API that needs an API key and secret, or a username and password/token, is supposed to be described with multiple security schemes - but this does not play nicely with tools like Postman.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Thu, 15 Aug 2019 18:10:00 +0100</pubDate><guid>tag:lornajane.net,2019-08-15:/posts/2019/openapi-description-using-api-key-secret</guid><category>tech</category><category>nexmo</category><category>openapi</category></item><item><title>The Laravel Synchronous Queue</title><link>https://lornajane.net/posts/2019/the-laravel-synchronous-queue</link><description>&lt;p class="first last"&gt;Using queues for asynchronous processing is one of my favourite tricks for offloading hard work from web servers. When working with &lt;a class="reference external" href="https://laravel.com/"&gt;Laravel&lt;/a&gt; recently I was pleased to find that it supports &lt;a class="reference external" href="https://beanstalkd.github.io/"&gt;beanstalkd&lt;/a&gt; out of the box. I've got opinions about frameworks with Opinions but I did find one thing I really liked in the way Laravel uses queues: the &lt;strong&gt;sync&lt;/strong&gt; queue option that runs your queue synchronously on your development platform so you can develop and debug your work, then switch the queue platform you use later.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 20 May 2019 15:43:00 +0100</pubDate><guid>tag:lornajane.net,2019-05-20:/posts/2019/the-laravel-synchronous-queue</guid><category>php</category><category>beanstalkd</category><category>laravel</category><category>tech</category></item><item><title>The First Thousand Blog Posts</title><link>https://lornajane.net/posts/2019/the-first-thousand-blog-posts</link><description>&lt;p class="first last"&gt;This is the 1000th post on &lt;a class="reference external" href="https://lornajane.net"&gt;https://lornajane.net&lt;/a&gt;. People ask &amp;quot;how do you even do that?&amp;quot; and the short answer is &amp;quot;start in 2006&amp;quot;, but the long answer isn't all that long.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Tue, 30 Apr 2019 09:51:00 +0100</pubDate><guid>tag:lornajane.net,2019-04-30:/posts/2019/the-first-thousand-blog-posts</guid><category>tech</category><category>writing</category></item><item><title>Handy Beanstalkd Admin Console</title><link>https://lornajane.net/posts/2019/handy-beanstalkd-admin-console</link><description>&lt;p class="first last"&gt;I've been building apps with queues lately and mostly using &lt;a class="reference external" href="https://beanstalkd.github.io/"&gt;beanstalkd&lt;/a&gt; as my queue because it is very simple, very fast and on my platform it is &lt;tt class="docutils literal"&gt;[apt install beanstalkd]&lt;/tt&gt; -easy to install. I have also been using a handy web interface for beanstalkd which I like so much that I felt I ought to share! It's &lt;a class="reference external" href="https://github.com/ptrofimov/beanstalk_console"&gt;beanstalk-console&lt;/a&gt;, which is a PHP-based web interface to one (or many) beanstalkd servers.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lornajane</dc:creator><pubDate>Mon, 08 Apr 2019 09:13:00 +0100</pubDate><guid>tag:lornajane.net,2019-04-08:/posts/2019/handy-beanstalkd-admin-console</guid><category>tech</category><category>beanstalkd</category><category>devtools</category><category>php</category><category>tools</category></item></channel></rss>