<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hang Out With J. B. Rainsberger</title>
    <description>Missing Documentation: Help Pages I wish they&apos;d written</description>
    <link>http://jb.rainsberger.ca/</link>
    <atom:link href="http://jb.rainsberger.ca/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Thu, 19 Mar 2026 15:57:26 +0000</pubDate>
    <lastBuildDate>Thu, 19 Mar 2026 15:57:26 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Byobu Session Name in Terminal Window Title</title>
        <description>&lt;p&gt;I started using multiple &lt;code&gt;byobu&lt;/code&gt; windows to organize my projects, but in the process, something annoying happened: I began to lose track of which window was which. When switching windows, I couldn’t tell from the window title which &lt;code&gt;byobu&lt;/code&gt; window to switch to.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src=&quot;/img/set-window-title-in-byobu/windows-look-the-same.png&quot;
style=&quot;width:80.0%&quot; /&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;
“Uhh… which one?”
&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Fortunately, I use &lt;code&gt;tmux&lt;/code&gt; as the terminal back-end for &lt;code&gt;byobu&lt;/code&gt;, so I some very elementary &lt;code&gt;tmux&lt;/code&gt; configuration was enable to solve the problem.&lt;/p&gt;
&lt;h1 id=&quot;turn-titles-on-in-tmux&quot;&gt;Turn Titles On in &lt;code&gt;tmux&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;In a &lt;code&gt;tmux&lt;/code&gt; window:&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;&lt;p&gt;Press &lt;code&gt;F12&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type &lt;code&gt;:set -g set-titles on&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type &lt;code&gt;:set -g set-titles-string &quot;#{session_name} @ #{host_short}:#{pane_current_path}&quot;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you reopen the terminal window, you’ll see that the &lt;code&gt;byobu&lt;/code&gt; session name is now at the beginning of the terminal window title, making it easier to see when switching windows.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src=&quot;/img/set-window-title-in-byobu/i-can-find-my-window.png&quot;
style=&quot;width:80.0%&quot; /&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;
“A little busy, but good enough for now.”
&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h1 id=&quot;remember-these-settings-forever&quot;&gt;Remember These Settings Forever&lt;/h1&gt;
&lt;p&gt;Edit the &lt;code&gt;.tmux.conf&lt;/code&gt; configuration file. I found mine at &lt;code&gt;$HOME/.config/byobu/.tmux.conf&lt;/code&gt;. Add these lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set -g set-titles on
set -g set-titles-string &amp;quot;#{session_name} @ #{host_short}:#{pane_current_path}&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you reopen the terminal window, you’ll see that these settings have become yours to keep forever.&lt;/p&gt;
&lt;h1 id=&quot;further-reading&quot;&gt;Further Reading&lt;/h1&gt;
&lt;p&gt;Nothing beats the &lt;code&gt;man&lt;/code&gt; page.&lt;/p&gt;
</description>
        <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/byobu-session-name-in-terminal-window-title</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/byobu-session-name-in-terminal-window-title</guid>
        
        
      </item>
    
      <item>
        <title>Viewing HEIC (HEIF) Images on Pop! OS 22.04</title>
        <description>&lt;p&gt;Today I was blindsided by the existence of HEIC images, because I don’t often receive images from iPhone/iPad users. Since Pop!_OS is still running Ubuntu 22.04, I not only didn’t have the library I needed to view these images, but when I found the library I needed, the standard package manager had an out-of-date version for the images I was trying to view. It took an hour of stumbling around to track down a solution.&lt;/p&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;p&gt;Install the latest version of the &lt;code&gt;libheif&lt;/code&gt; package from the Ubuntu PPA.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:strukturag/libheif
$ sudo nala install libheif1 heif-gdk-pixbuf heif-thumbnailer&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;the-symptom&quot;&gt;The Symptom&lt;/h1&gt;
&lt;p&gt;I couldn’t open the HEIC images using &lt;code&gt;eog&lt;/code&gt;, but I &lt;em&gt;could&lt;/em&gt; open them using GIMP. I wanted to convert the images in bulk to JPG, so I didn’t stop at using GIMP to convert the images one by one using the UI.&lt;/p&gt;
&lt;h2 id=&quot;attempt-1&quot;&gt;Attempt 1&lt;/h2&gt;
&lt;p&gt;I tried to install &lt;code&gt;heif-gdk-pixbuf&lt;/code&gt;, but then neither &lt;code&gt;magick&lt;/code&gt; nor &lt;code&gt;eog&lt;/code&gt; could read the image. I got this error message:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Could not read HEIF/AVIF file: Invalid input: Unspecified: Metadata not correctly assigned to image&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is how I learned that the version (1.12) of &lt;code&gt;libheif&lt;/code&gt; that ships (as of the date of writing this) in the Ubuntu package manager can’t read HEIC images taken on iOS 18. I needed to install the latest version (1.19.8) from the Ubuntu PPA listed in the solution.&lt;/p&gt;
&lt;p&gt;Now I can receive images from my friends who use iOS 18 and, so far, all the image tools I use can read the images without issue.&lt;/p&gt;
</description>
        <pubDate>Tue, 14 Oct 2025 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/viewing-heic-images-on-popos</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/viewing-heic-images-on-popos</guid>
        
        
      </item>
    
      <item>
        <title>Video Gradually and Increasingly Falling Behind: Don&apos;t Use Buffering</title>
        <description>&lt;p&gt;I noticed in early 2025 that, when I used my USB external webcam together with OBS Studio for video sessions, that the video signal was falling gradually and increasingly behind my audio signal and, indeed, real time. Sometimes it took 10 minutes, sometimes it took an hour, but eventually, my video would become so far out of sync with my audio that it became too distracting to continue. Restarting OBS Studio brought the camera back in sync with my microphone.&lt;/p&gt;
&lt;p&gt;The problem lay in &lt;strong&gt;buffering&lt;/strong&gt;, so I turned it off, and now all seems well.&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;In OBS Studio, open the &lt;strong&gt;Properties&lt;/strong&gt; for your &lt;strong&gt;V4L2 Video Source&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Look for the option &lt;strong&gt;Use buffering&lt;/strong&gt; and unselect it. In OBS Studio 31, this is a checkbox, so uncheck it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I don’t know whether you &lt;em&gt;need&lt;/em&gt; to restart OBS Studio for this change to take effect, but you might.&lt;/p&gt;
&lt;p&gt;With buffering off, my webcam has not (yet) fallen behind noticeably, even after over 90 minutes of continuous use on my laptop. If the symptom remains, it is much much much less noticeable.&lt;/p&gt;
&lt;h1 id=&quot;a-fix&quot;&gt;A Fix?&lt;/h1&gt;
&lt;p&gt;The nice folks in the OBS Studio community &lt;a href=&quot;https://github.com/obsproject/obs-studio/pull/12431&quot;&gt;are working on a fix&lt;/a&gt; as of July 25, 2025.&lt;/p&gt;
&lt;h1 id=&quot;key-references&quot;&gt;Key References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/obsproject/obs-studio/discussions/11142&quot;&gt;A Github conversation about whether buffered video sources are a good idea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://obsproject.com/forum/threads/video-gradually-falling-behind-audio-where-can-i-start-investigating.187021&quot;&gt;The OBS Studio Forum thread where I beg for help&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;some-details&quot;&gt;Some Details&lt;/h1&gt;
&lt;p&gt;First, the ingredients that led to the symptom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OBS Studio 31.0.4 running on Flatpak&lt;/li&gt;
&lt;li&gt;Anker PowerConf C200 external USB webcam connected by USB-A&lt;/li&gt;
&lt;li&gt;Røde lapel microphone connected to an audio-to-USB adapter connected to an external (powered) USB hub connected by USB-A&lt;/li&gt;
&lt;li&gt;The Zoom client for Linux&lt;/li&gt;
&lt;li&gt;Pop!_OS 22.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The symptom: the video signal echoed through OBS Studio and transmitted over Zoom gradually and increasingly fell behind real time, although my audio signal stayed very close (close enough!) to real time for me not to notice the difference. Video fell more and more out of sync with audio (and real time) without a clear pattern for when it would happen nor how much. I only knew that it happened increasingly, so that choosing a fixed audio offset would not solve the problem.&lt;/p&gt;
&lt;p&gt;With all these variables, you can imagine how many permutations I had to test to gather information. Sometimes I could run my camera for 30 minutes and not notice a difference and sometimes I could run my camera 10 minutes and start seeing my video fall noticeably behind. As I was thinking about what could be happening, I was ruling ingredients out, such as Flatpak, the USB hub, the microphone, the webcam (my laptop’s internal webcam seemed fine), the Zoom client, the Zoom web app on Chrome, the current version of OBS Studio… it took weeks to gather enough information to be able to ask for help in a meaningful way.&lt;/p&gt;
&lt;p&gt;Why not just use my internal webcam? Because on it I look pink like a lobster… part of the time. I like this external USB webcam precisely because it provides a nicer and more consistent picture.&lt;/p&gt;
&lt;p&gt;Finally, I managed to point the finger quite strongly at OBS Studio, which led me to ask on the forum. It took nearly two weeks, but someone replied not only with a helpful idea, but with a very likely explanation for all the behavior I was seeing: OBS Studio was buffering the frames and insisting on displaying “out of date” frames rather than jumping forward to the front of the queue. When the computer was under heavier load, the frame queue kept expanding and OBS Studio kept insisting on displaying frames in sequence, rather than jumping forward. The issue seems to revolve around the difficult question of which timestamps to trust coming from which clocks.&lt;/p&gt;
&lt;p&gt;Very well, then: turn buffering off, which results in perhaps dropping more frames, but eliminates the problem of never catching up to the front of the frame queue.&lt;/p&gt;
&lt;p&gt;Presumably this buffering also affects my laptop’s internal webcam, but I presume that external webcams connected by an external USB port are more likely to be affected by variations in the computer’s workload. I suppose if I kept OBS Studio open for 24 hours and kept my laptop busy from time to time, even a buffered internal webcam video source might fall behind real time.&lt;/p&gt;
&lt;p&gt;So there it is. I don’t know whether I will ever regret turning buffering off, but at least for now, my voice and my face are reunited, which is plenty good enough for today.&lt;/p&gt;
</description>
        <pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/video-gradually-lagging-behind</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/video-gradually-lagging-behind</guid>
        
        
      </item>
    
      <item>
        <title>Upgrading Discourse When You Totally Have Enough Disk Space</title>
        <description>&lt;p&gt;I run some forums with Discourse and I upgrade them. Sometimes, when I upgrade them, I end up in an infinite loop of sadness. There is an easy way out that doesn’t require more disk space, because sometimes, you know, you already have enough disk space.&lt;/p&gt;
&lt;h1 id=&quot;the-symptom&quot;&gt;The Symptom&lt;/h1&gt;
&lt;p&gt;Try to upgrade and you get a message telling you to free up disk space, but when you try to free up disk space by deleting unused containers, and then you have something like 7.5 GiB free, you get that message again. But… I have enough disk space!&lt;/p&gt;
&lt;h1 id=&quot;a-workaround&quot;&gt;A Workaround&lt;/h1&gt;
&lt;p&gt;According to &lt;a href=&quot;https://meta.discourse.org/t/less-than-5gb-of-free-space-not-true/224517/6?u=jbrains&quot;&gt;this post at the Discourse Discourse&lt;/a&gt;, you can tell the upgrade script not to check for free space, but just go ahead. And it often works!&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;span id=&quot;cb1-1&quot;&gt;&lt;a href=&quot;#cb1-1&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;co&quot;&gt;# ./launcher rebuild app --skip-prereqs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If this doesn’t work, then you actually need to free some disk space or increase the disk capacity.&lt;/p&gt;
&lt;h1 id=&quot;why&quot;&gt;Why?!&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;You have 7.1GB free &lt;em&gt;before&lt;/em&gt; downloading the discourse container image but less than 5gb &lt;em&gt;after&lt;/em&gt; downloading it when we perform the check.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now you know.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 May 2024 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/upgrading-discourse-when-you-totally-have-enough-disk-space</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/upgrading-discourse-when-you-totally-have-enough-disk-space</guid>
        
        
      </item>
    
      <item>
        <title>unWise Arithmetic</title>
        <description>&lt;p&gt;My company and I bank with Wise and today, while doing a routine check of exchange rates, Wise’s UI scared the hell out of me. Fortunately, they were able to explain why it looked like their web site was bothering to throwing away the paltry sum of $10 on a currency conversion. They weren’t. It’s fine; it’s just a questionable user experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please note&lt;/strong&gt;: I have notified Wise customer support about this. Maybe they’ll do something to make it better. I’m guessing that they’ve had non-trivial internal discussion about the tension between a cleaner UI and a more-transparent UI. The ball is firmly in their court now.&lt;/p&gt;
&lt;h1 id=&quot;the-symptom&quot;&gt;The Symptom&lt;/h1&gt;
&lt;p&gt;I visited Wise’s “Convert Money” feature to see what they would give me in CAD for all the USD in my account. Their UI helpfully shows the conversion like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;USD amount
- our fees
x exchange rate
= the CAD we would deposit into your account&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I really like how clearly they present their calculation. There was only one problem: &lt;strong&gt;the CAD amount didn’t match the calculation&lt;/strong&gt;. It was a difference of about $10, which is not a large amount, but is enough to look like a hidden fee, rather than a computation error. Wise’s brand is fee transparency as well as keeping fees low.&lt;/p&gt;
&lt;h1 id=&quot;the-impact&quot;&gt;The Impact&lt;/h1&gt;
&lt;p&gt;Was there some hidden fee I didn’t know about?! Did Wise forget how to do arithmetic?! I expect them to get it right to the penny. Every. Single Time. It’s what I pay every bank for. Whatever the explanation, there is some part of my psyche that now trusts them less. I can’t be the only person.&lt;/p&gt;
&lt;h1 id=&quot;the-problem&quot;&gt;The Problem&lt;/h1&gt;
&lt;p&gt;Wise reports the exchange rate rounded to four decimal places, however, they apply a more-precise exchange rate. When the amount to convert is large enough, a difference of 0.00005 becomes noticeable, and when they round up, it looks like I’m not getting all my money, even though I am.&lt;/p&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;p&gt;I told Wise customer support what psychological effect this experience had on me, notably on my perception of their brand. Now it’s on me to remember this for the future as well as on them to decide whether a slightly cleaner UI is worth scaring a segment of their customer base. It has become a business decision for them. I did my duty and reported the issue; I also did my best to present my opinion without undue drama.&lt;/p&gt;
&lt;p&gt;And I believe my heart rate is all the way back to normal.&lt;/p&gt;
</description>
        <pubDate>Mon, 08 Apr 2024 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/unwise-arithmetic</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/unwise-arithmetic</guid>
        
        
      </item>
    
      <item>
        <title>strptime: a Beginner&apos;s Mistake</title>
        <description>&lt;p&gt;I’m using &lt;code&gt;jq&lt;/code&gt; to process CSV files to use in a Plain Text Accounting environment, specifically using &lt;code&gt;hledger&lt;/code&gt;. I mention all this, not because it’s salient, but purely to make it easier for you to find this article by a web search.&lt;/p&gt;
&lt;h1 id=&quot;the-symptom&quot;&gt;The Symptom&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ jq -n &amp;#39;&amp;quot;8/4/2023&amp;quot; | strptime(&amp;quot;%D&amp;quot;)&amp;#39;
jq: error (at &amp;lt;unknown&amp;gt;): date &amp;quot;8/4/2023&amp;quot; does not match format &amp;quot;%D&amp;quot;

$ jq -n &amp;#39;&amp;quot;8/4/2023&amp;quot; | strptime(&amp;quot;%m/%d/%y&amp;quot;)&amp;#39;
jq: error (at &amp;lt;unknown&amp;gt;): date &amp;quot;8/4/2023&amp;quot; does not match format &amp;quot;%m/%d/%y&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WAT?!&lt;/p&gt;
&lt;h1 id=&quot;the-problem&quot;&gt;The Problem&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;strptime&lt;/code&gt; pattern &lt;code&gt;%y&lt;/code&gt; matches the string &lt;code&gt;23&lt;/code&gt;, but not the string &lt;code&gt;2023&lt;/code&gt;. It’s pretty clear in the &lt;code&gt;man&lt;/code&gt; page, if a little unexpected.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%y     The  year  within  century  (0–99).   When a century is not otherwise specified, values in the range 69–99 refer to years in the
      twentieth century (1969–1999); values in the range 00–68 refer to years in the twenty-first century (2000–2068).

%Y     The year, including century (for example, 1991).&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ jq -n &amp;#39;&amp;quot;8/4/2023&amp;quot; | strptime(&amp;quot;%m/%d/%Y&amp;quot;)&amp;#39;
[
  2023,
  7,
  4,
  0,
  0,
  0,
  5,
  215
]&lt;/code&gt;&lt;/pre&gt;
</description>
        <pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/strptime-a-beginner_s-mistake</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/strptime-a-beginner_s-mistake</guid>
        
        
      </item>
    
      <item>
        <title>Remove a Password from a PDF Document on Linux the Super-Easy Way</title>
        <description>&lt;p&gt;My accountants sensibly send me PDFs of returns and authorization forms with password protection enabled. Sadly, this makes it difficult for me to add text and sign the document digitally, at least with my preferred PDF editor on Linux, Master PDF Editor. Every year I fail to remember how to work around this problem, so I’m writing this article, hoping that my web search will find it next year.&lt;/p&gt;
&lt;h1 id=&quot;the-symptom&quot;&gt;The Symptom&lt;/h1&gt;
&lt;p&gt;My PDF document is password protected, so I can’t do anything with it, including adding text and signing it digitally.&lt;/p&gt;
&lt;h1 id=&quot;the-problem&quot;&gt;The Problem&lt;/h1&gt;
&lt;p&gt;Web searches for this topic return many many many irrelevant articles. It’s worse than searching the web for recipes.&lt;/p&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;p&gt;Use &lt;code&gt;evince&lt;/code&gt; to print a new copy of the PDF document to file. This removes the passwodrd protection by default.&lt;/p&gt;
</description>
        <pubDate>Mon, 19 Feb 2024 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/remove-the-password-from-a-pdf-the-super-easy-way</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/remove-the-password-from-a-pdf-the-super-easy-way</guid>
        
        
      </item>
    
      <item>
        <title>The Mysterious Extra Quotes that `jc` Put In My JSON</title>
        <description>&lt;h1 id=&quot;the-symptom&quot;&gt;The Symptom&lt;/h1&gt;
&lt;p&gt;I try to use &lt;a href=&quot;https://github.com/kellyjonbrazil/jc&quot;&gt;&lt;code&gt;jc&lt;/code&gt;&lt;/a&gt; to convert a CSV file to JSON for further processing with &lt;a href=&quot;https://github.com/jqlang/jq&quot;&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;. When I try to process the JSON document with &lt;code&gt;jq&lt;/code&gt;, it fails, unable to find a value for the first cell of the first row.&lt;/p&gt;
&lt;p&gt;When I look at the JSON document, the JSON object key corresponding the first column name in the CSV document has extra quotes around it: instead of &lt;code&gt;&quot;Date&quot;&lt;/code&gt;, the key is &lt;code&gt;&quot;\&quot;Date\&quot;&quot;&lt;/code&gt;. Only this key has been changed; the others are exactly as I expect them.&lt;/p&gt;
&lt;p&gt;It seems that &lt;code&gt;jc&lt;/code&gt; has put extraneous quotes (or extra quotation marks&lt;a href=&quot;#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot; role=&quot;doc-noteref&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; ) around a CSV column header name.&lt;/p&gt;
&lt;h1 id=&quot;the-cause&quot;&gt;The Cause&lt;/h1&gt;
&lt;p&gt;The CSV file has a Byte Order Mark (BOM) at the beginning, which is unprintable, so I didn’t notice it. These unprintable characters become part of the name of the first CSV column, which then becomes a key in the resulting JSON objects that &lt;code&gt;jc --csv&lt;/code&gt; parses.&lt;/p&gt;
&lt;p&gt;Since &lt;code&gt;&quot;\&quot;Date\&quot;&quot;&lt;/code&gt; is not equal to &lt;code&gt;&quot;Date&quot;&lt;/code&gt;, chaos reigns.&lt;/p&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;p&gt;Upgrade &lt;code&gt;jc&lt;/code&gt; to at least version 1.22.2, at least according to &lt;a href=&quot;https://github.com/kellyjonbrazil/jc/issues/307&quot;&gt;this issue&lt;/a&gt;. I was using… 1.20.4. How embarrassing.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb1&quot;&gt;&lt;pre class=&quot;sourceCode zsh&quot;&gt;&lt;code class=&quot;sourceCode zsh&quot;&gt;&lt;span id=&quot;cb1-1&quot;&gt;&lt;a href=&quot;#cb1-1&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;$ pip3 install jc&lt;/span&gt;
&lt;span id=&quot;cb1-2&quot;&gt;&lt;a href=&quot;#cb1-2&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;$ jc --version&lt;/span&gt;
&lt;span id=&quot;cb1-3&quot;&gt;&lt;a href=&quot;#cb1-3&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;jc version:  1.25.0&lt;/span&gt;
&lt;span id=&quot;cb1-4&quot;&gt;&lt;a href=&quot;#cb1-4&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;python interpreter version:  3.11.2&lt;/span&gt;
&lt;span id=&quot;cb1-5&quot;&gt;&lt;a href=&quot;#cb1-5&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;python path:  /home/jbrains/ThirdParty/python-3.11.2/bin/python3&lt;/span&gt;
&lt;span id=&quot;cb1-6&quot;&gt;&lt;a href=&quot;#cb1-6&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&quot;cb1-7&quot;&gt;&lt;a href=&quot;#cb1-7&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;https://github.com/kellyjonbrazil/jc&lt;/span&gt;
&lt;span id=&quot;cb1-8&quot;&gt;&lt;a href=&quot;#cb1-8&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;© 2019-2024 Kelly Brazil&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&quot;the-gory-details&quot;&gt;The Gory Details&lt;/h1&gt;
&lt;p&gt;I reproduce these details in order to give the next poor soul a chance to make it here by reading a single web page. Here are the steps that led me here.&lt;/p&gt;
&lt;p&gt;I downloaded a CSV file of transactions from PayPal. (I use them against my will.)&lt;/p&gt;
&lt;p&gt;I tried to process the CSV file with &lt;code&gt;jc --csv | jq &apos;.[&quot;Date&quot;] | parse_paypal_date&apos;&lt;/code&gt;, because I’ve written a &lt;code&gt;jq&lt;/code&gt; function to parse PayPal’s annoying date format of &lt;code&gt;dd/mm/yyyy&lt;/code&gt;. (If I got to pass one law, it’d require ISO 8601 for all dates all the time everywhere.)&lt;/p&gt;
&lt;p&gt;My processing command failed with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jq: error (at &amp;lt;stdin&amp;gt;:1): strptime/1 requires string inputs and arguments&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I checked the CSV file and I saw a column named &lt;code&gt;Date&lt;/code&gt; with obvious string values, starting with &lt;code&gt;&quot;02/11/2022&quot;&lt;/code&gt;, which is, of course, 2022-11-02 to people with taste.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/the-mysterious-extra-quotes-that-jc-put-in-my-json/the_date_is_right_there.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After a few iterations of disbelief and confusion, I checked the JSON document.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb3&quot;&gt;&lt;pre class=&quot;sourceCode json&quot;&gt;&lt;code class=&quot;sourceCode json&quot;&gt;&lt;span id=&quot;cb3-1&quot;&gt;&lt;a href=&quot;#cb3-1&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;ot&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span id=&quot;cb3-2&quot;&gt;&lt;a href=&quot;#cb3-2&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;  &lt;span class=&quot;fu&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span id=&quot;cb3-3&quot;&gt;&lt;a href=&quot;#cb3-3&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;dt&quot;&gt;&amp;quot;﻿&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;dt&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;dt&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;fu&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st&quot;&gt;&amp;quot;02/11/2022&amp;quot;&lt;/span&gt;&lt;span class=&quot;fu&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Extra quotes?!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And, BTW, when I paste the JSON output into Typora to write this article, Typora clearly shows me that there’s an unprintable character at the beginning of that key.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’ve never seen this before, so let me check another, very similar CSV file from a different source. &lt;strong&gt;Was this always broken?!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nope. Everything looks good from another CSV document that also has &lt;code&gt;&quot;Date&quot;&lt;/code&gt; as the first column name.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb4&quot;&gt;&lt;pre class=&quot;sourceCode json&quot;&gt;&lt;code class=&quot;sourceCode json&quot;&gt;&lt;span id=&quot;cb4-1&quot;&gt;&lt;a href=&quot;#cb4-1&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;ot&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span id=&quot;cb4-2&quot;&gt;&lt;a href=&quot;#cb4-2&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;  &lt;span class=&quot;fu&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span id=&quot;cb4-3&quot;&gt;&lt;a href=&quot;#cb4-3&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;    &lt;span class=&quot;dt&quot;&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class=&quot;fu&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;st&quot;&gt;&amp;quot;11/01/2022&amp;quot;&lt;/span&gt;&lt;span class=&quot;fu&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;spot-the-difference&quot;&gt;Spot the Difference!&lt;/h2&gt;
&lt;p&gt;At least now I can compare these two CSV documents and ignore the rest of the world. That makes diagnosis much simpler.&lt;/p&gt;
&lt;p&gt;Since I can’t see a difference in the first column name between these two files, &lt;strong&gt;there must be an unprintable difference&lt;/strong&gt;. How do I see the unprintable characters in a text file on the typical Linux distribution?&lt;/p&gt;
&lt;p&gt;Today I Learned about &lt;code&gt;cat -A&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot; id=&quot;cb5&quot;&gt;&lt;pre class=&quot;sourceCode bash&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;span id=&quot;cb5-1&quot;&gt;&lt;a href=&quot;#cb5-1&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;ex&quot;&gt;$&lt;/span&gt; cat &lt;span class=&quot;at&quot;&gt;-A&lt;/span&gt; /path/to/annoying/paypal.csv &lt;span class=&quot;kw&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;at&quot;&gt;-n&lt;/span&gt; 1    &lt;/span&gt;
&lt;span id=&quot;cb5-2&quot;&gt;&lt;a href=&quot;#cb5-2&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot;&gt;&lt;/a&gt;&lt;span class=&quot;ex&quot;&gt;M-oM-&lt;/span&gt;&lt;span class=&quot;kw&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;M-?&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Time&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;TimeZone&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Type&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Status&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Currency&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Gross&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Fee&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Net&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;From Email Address&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;To Email Address&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Transaction ID&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Shipping Address&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Address Status&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Item Title&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Item ID&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Shipping and Handling Amount&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Insurance Amount&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Sales Tax&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Option 1 Name&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Option 1 Value&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Option 2 Name&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Option 2 Value&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Reference Txn ID&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Invoice Number&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Custom Number&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Quantity&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Receipt ID&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Balance&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Address Line 1&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Address Line 2/District/Neighborhood&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Town/City&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;State/Province/Region/County/Territory/Prefecture/Republic&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Zip/Postal Code&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Country&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Contact Phone Number&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Subject&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Note&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Country Code&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;st&quot;&gt;&amp;quot;Balance Impact&amp;quot;&lt;/span&gt;&lt;span class=&quot;ex&quot;&gt;$&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/img/the-mysterious-extra-quotes-that-jc-put-in-my-json/unprintable_characters.jpg&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;til-byte-order-marks&quot;&gt;TIL: Byte Order Marks&lt;/h2&gt;
&lt;p&gt;I inhaled quickly, then exhaled slowly.&lt;/p&gt;
&lt;p&gt;I searched the web for &lt;code&gt;&quot;M-oM-;M-?&quot;&lt;/code&gt; and found a non-trivial number of resuilts, which led me to learn about Byte Order Marks (BOM), thanks first to &lt;a href=&quot;https://stackoverflow.com/a/57282281/253921&quot;&gt;a Stack Overflow answer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don’t know much about Byte Order Marks, except that now I have better search keywords.&lt;/p&gt;
&lt;p&gt;I searched the web for &lt;code&gt;remove &quot;BOM&quot; from csv file&lt;/code&gt; and found a non-trivial number of results, including the authoritative-sounding &lt;a href=&quot;https://csv.thephpleague.com/7.0/bom/&quot;&gt;“CSV and BOM character”&lt;/a&gt;. Unfortunately, I’m not writing PHP code using LeagueCSV, so that helps me a bit less to work around the problem. Even so, it gives me confidence that there exists some body of prior art on this subject, so I don’t need to figure this all out on my own.&lt;/p&gt;
&lt;h2 id=&quot;i-cant-be-the-first&quot;&gt;I Can’t Be the First!&lt;/h2&gt;
&lt;p&gt;I went back to &lt;code&gt;jc&lt;/code&gt;, hoping to find an issue about this, before I went charging off on my own to &lt;del&gt;fix&lt;/del&gt; work around the problem. And that’s when I found &lt;a href=&quot;https://github.com/kellyjonbrazil/jc/issues/307&quot;&gt;this issue&lt;/a&gt;. And that’s when I discovered that I’m using an outdated version of &lt;code&gt;jc&lt;/code&gt; and that upgrading might fix the problem.&lt;/p&gt;
&lt;p&gt;And that’s when I wrote all this, while it was fresh in my mind.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn1&quot; role=&quot;doc-endnote&quot;&gt;&lt;p&gt;I add synonyms here, not for clarity, but to attract more hits in web searches.&lt;a href=&quot;#fnref1&quot; class=&quot;footnote-back&quot; role=&quot;doc-backlink&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
        <pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/the-mysterious-extra-quotes-that-jc-put-in-my-json</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/the-mysterious-extra-quotes-that-jc-put-in-my-json</guid>
        
        
      </item>
    
      <item>
        <title>Ducking in Screenflow</title>
        <description>&lt;h1 id=&quot;the-problem&quot;&gt;The Problem&lt;/h1&gt;
&lt;p&gt;I don’t remember how to do ducking correctly in Screenflow. I can’t figure it out by just doing what I think makes sense. Everyone wants to provide help as a video instead of as searchable text. I’m impatient.&lt;/p&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;p&gt;Leave the music bed track, the one under the voiceover, alone. Enable ducking on the voiceover track. Adjust until happy.&lt;/p&gt;
</description>
        <pubDate>Sat, 26 Aug 2023 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/ducking-in-screenflow</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/ducking-in-screenflow</guid>
        
        
      </item>
    
      <item>
        <title>LibreOffice Calc, Headers, Footers, and Every Page!</title>
        <description>&lt;p&gt;I prepare expense reports using LibreOffice Calc, because nothing seems to handle multiple currencies the way my company wants to do it. The details don’t matter, but it’s enough to know that I print a workbook to PDF as part of my workflow. This workbook has many worksheets. I want headers and footers on each page in order to easily see which document I’m looking at.&lt;/p&gt;
&lt;p&gt;Suddenly, without warning, I started to see out-of-date headers on page 2 of my document. Several minutes of checking page styles and header settings didn’t change anything. I couldn’t find the magic keywords to search the web to find the problem. And then, finally, I noticed the issue: a new feature in LibreOffice 7.&lt;/p&gt;
&lt;h1 id=&quot;the-problem&quot;&gt;The Problem&lt;/h1&gt;
&lt;p&gt;Somebody wanted to be able to use different headers on the first page from the headers on remaining pages within a single sheet page style. They added that feature. They even made it possible to keep the previous behavior of using the same headers on every page. Sadly, they didn’t make the old behavior the default choice, so it changed without my consent.&lt;/p&gt;
&lt;p&gt;Moreover, they named the option in a way that makes sense to programmers, but not to normal, everyday humans. I didn’t notice it even after looking directly at it a handful of times.&lt;/p&gt;
&lt;h1 id=&quot;the-solution&quot;&gt;The Solution&lt;/h1&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;Open the Styles panel and locate your page style.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modify…&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the tab &lt;strong&gt;Header&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Locate the new option “&lt;strong&gt;Same content on first page&lt;/strong&gt;”. It’s probably disabled, so enable it!&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Edit…&lt;/strong&gt;. Notice that now there only one tab for the header.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;LibreOffice Calc will now use this one header on every page of your PDF document.&lt;/p&gt;
&lt;p&gt;If you’d like to see the difference, disable the option &lt;strong&gt;Same content on first page&lt;/strong&gt;, then edit the headers again. Now notice that there are two settings tabs: one for the first page and one for the rest of the pages.&lt;/p&gt;
&lt;p&gt;Now check your &lt;strong&gt;Footer&lt;/strong&gt; settings.&lt;/p&gt;
&lt;h1 id=&quot;a-ux-suggestion-for-everyone&quot;&gt;A UX Suggestion For Everyone&lt;/h1&gt;
&lt;p&gt;When you add a new feature with configuration settings, give those settings default values that match the previous behavior, so that you don’t confuse users. Thanks.&lt;/p&gt;
</description>
        <pubDate>Wed, 17 May 2023 00:00:00 +0000</pubDate>
        <link>http://jb.rainsberger.ca/permalink/libreoffice-calc-headers</link>
        <guid isPermaLink="true">http://jb.rainsberger.ca/permalink/libreoffice-calc-headers</guid>
        
        
      </item>
    
  </channel>
</rss>
