<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Hub&#x27;s wlog</title>
    <link href="https://www.figuiere.net/hub/wlog/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://www.figuiere.net/hub/wlog"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-10-11T00:00:00+00:00</updated>
    <id>https://www.figuiere.net/hub/wlog/atom.xml</id>
    <entry xml:lang="en">
        <title>Dev Log September 2025</title>
        <published>2025-10-11T00:00:00+00:00</published>
        <updated>2025-10-11T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-september-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-september-2025/</id>
        
        <content type="html">&lt;p&gt;Not as much as I wanted to do was done in September.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h2&gt;
&lt;p&gt;Extracting more of the calibration values for colour correction on
DNG. Currently work on fixing the purple colour cast.&lt;&#x2F;p&gt;
&lt;p&gt;Added Nikon ZR and EOS C50.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exiftool&quot;&gt;ExifTool&lt;&#x2F;h2&gt;
&lt;p&gt;Submitted some metadata updates to ExifTool. Because it nice to have,
and also because libopenraw uses some of these autogenerated: I have a
Perl script to generate Rust code from it (it used to do C++).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;niepce&quot;&gt;Niepce&lt;&#x2F;h2&gt;
&lt;p&gt;Finally merged the develop branch with all the import dialog work
after having requested that it be removed from Damned Lies to not
strain the translator is there is a long way to go before we can
freeze the strings.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;supporting-cast&quot;&gt;Supporting cast&lt;&#x2F;h2&gt;
&lt;p&gt;Among the number of packages I maintain &#x2F; update on flathub, LightZone
is a digital photo editing application written in
Java&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#java&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. Updating to the latest runtime 25.08 cause it to ignore
the HiDPI setting. It will honour &lt;code&gt;GDK_SCALE&lt;&#x2F;code&gt; environment but this
isn&#x27;t set. So I wrote the small command line too &lt;code&gt;gdk-scale&lt;&#x2F;code&gt; to output
the value. See &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;hfiguiere&#x2F;gdk-scale&quot;&gt;gdk-scale on
gitlab&lt;&#x2F;a&gt;. And another patch in
the wrapper script.&lt;&#x2F;p&gt;
&lt;p&gt;HiDPI support remains a mess across the board. Fltk just recently
gained support for it (it&#x27;s used by a few audio plugins).&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;java&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;Don&#x27;t try this at home.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log August 2025</title>
        <published>2025-09-07T00:00:00+00:00</published>
        <updated>2025-09-07T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-august-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-august-2025/</id>
        
        <content type="html">&lt;p&gt;Some of the stuff I did in August.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;abiword&quot;&gt;AbiWord&lt;&#x2F;h2&gt;
&lt;p&gt;More memory leaks fixing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gudev-rs&quot;&gt;gudev-rs&lt;&#x2F;h2&gt;
&lt;p&gt;Updated gudev-rs to the latest glib-rs, as a requirement to port any
code using it to the latest glib-rs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h2&gt;
&lt;p&gt;A minor fix so that it can be used to thumbnail JPEG file extracting the
preview.&lt;&#x2F;p&gt;
&lt;p&gt;Released alpha.12.&lt;&#x2F;p&gt;
&lt;p&gt;Converted the x-trans interpolation to use floats. Also removed a few
unnecessary unsafe blocks.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;niepce&quot;&gt;Niepce&lt;&#x2F;h2&gt;
&lt;p&gt;A lot of work on the importer. Finally finished that UI bit I had in
progress of a while and all the downfall with it. It is in the
&lt;code&gt;develop&lt;&#x2F;code&gt; branch which mean it will be merged to &lt;code&gt;main&lt;&#x2F;code&gt;. The includes
some UI layout changes to the dialog.&lt;&#x2F;p&gt;
&lt;p&gt;Then I fixed the camera importer that was assuming everyone followed
the DCIM specification (narrator: no they didn&#x27;t). This mean it was
broken on iPhone 14 and the Fujifilm X-T3 that has two card slot
(really, use a card reader if the camera uses memory cards). Also sped
it up, it&#x27;s still really slow.&lt;&#x2F;p&gt;
&lt;p&gt;Also better handle the asynchronous tasks running on a thread like the
thumbnailing or camera import list content. I&#x27;m almost ready to move
on.&lt;&#x2F;p&gt;
&lt;p&gt;Tore up code using gdkpixbuf for many reasons. It&#x27;s incompatible with
multiple threads, gdk texture were already created from raw
buffers. This simplify a lot of things.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log July 2025</title>
        <published>2025-08-01T00:00:00+00:00</published>
        <updated>2025-08-01T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-july-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-july-2025/</id>
        
        <content type="html">&lt;h2 id=&quot;abiword&quot;&gt;AbiWord&lt;&#x2F;h2&gt;
&lt;p&gt;Working on rebasing and finishing an &amp;quot;old&amp;quot; patch from Michael Gorse
that implement accessibility in AbiWord. While the patch is a few
years old, it&#x27;s perfectly rebasable.&lt;&#x2F;p&gt;
&lt;p&gt;Pushed a lot of code modernisation on master, as well as various
memory leaks and crashes on stable.&lt;&#x2F;p&gt;
&lt;p&gt;Released 3.0.7 (tag, and flatpak build). 3.0.8 might come soon as I&#x27;m
backporting more crashers that are already fixed on master. Until I
have a 3.1.90 version ready for testing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h2&gt;
&lt;p&gt;Finally I have Fujifilm X-Trans demosaicking, which needs more work as
it is still a crude port of the dcraw C code. A also apply the white
balance. Added few new cameras and some benchmarks.&lt;&#x2F;p&gt;
&lt;p&gt;Finally I released 0.4.0-alpha.11.&lt;&#x2F;p&gt;
&lt;p&gt;Also I did update libopenraw-view which is my GUI for testing
libopenraw. It now renders asynchronously.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;supporting-cast&quot;&gt;Supporting cast&lt;&#x2F;h2&gt;
&lt;p&gt;Some other various stuff.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;glycin&quot;&gt;glycin&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;glycin&#x2F;-&#x2F;merge_requests&#x2F;230&quot;&gt;merge request to update
libopenraw&lt;&#x2F;a&gt;
was merged. Thanks to Sophie!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gegl-rs&quot;&gt;gegl-rs&lt;&#x2F;h3&gt;
&lt;p&gt;Updated gegl-rs to the new glib-rs.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lrcat-extractor&quot;&gt;lrcat-extractor&lt;&#x2F;h3&gt;
&lt;p&gt;Released a new version after updating rusqlite.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;niepce&quot;&gt;Niepce&lt;&#x2F;h2&gt;
&lt;p&gt;Ported to the latest gtk4-rs, hence the update to gegl-rs. Some small
API changes in the object subclassing needed to be handled.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log June 2025</title>
        <published>2025-07-02T00:00:00+00:00</published>
        <updated>2025-07-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-june-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-june-2025/</id>
        
        <content type="html">&lt;p&gt;May and June in one convenient location.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h2&gt;
&lt;p&gt;Released 0.4.0.alpha10&lt;&#x2F;p&gt;
&lt;p&gt;After that, added Nikon Z5 II and P1100, Sony 6400A and RX100M7A,
Panasonic S1II and S1IIE, DJI Mavic 3 Pro Cinema (support for Nikon
and Sony mostly incomplete, so is Panasonic decompression), Fujifilm
X-E5 and OM Systems OM-5 II.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gnome-raw-thumbnailer&quot;&gt;gnome-raw-thumbnailer&lt;&#x2F;h2&gt;
&lt;p&gt;Updated to the latest libopenraw.&lt;&#x2F;p&gt;
&lt;p&gt;Released 48.0&lt;&#x2F;p&gt;
&lt;h2 id=&quot;flathub-cli&quot;&gt;flathub-cli&lt;&#x2F;h2&gt;
&lt;p&gt;This is a project I started a while ago but put on the back burner due
to scheduling conflict. It&#x27;s a command line tool to integrate all the
tasks of maintaining flatpak packages for flathub. Some stuff isn&#x27;t
flathub specific though. I already have a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;fp-build-tools&quot;&gt;bunch of
scripts&lt;&#x2F;a&gt; I use, and this
is meant to be next level. It also merges into it my previous tool,
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;hfiguiere&#x2F;flatpak-manifest-generator&quot;&gt;flatpak-manifest-generator&lt;&#x2F;a&gt;,
an interactive tool to generate flatpak manifests.&lt;&#x2F;p&gt;
&lt;p&gt;One thing I had left in progress and did finish implementing at least
the basics is the &lt;code&gt;cleanup&lt;&#x2F;code&gt; command to purge downloads. The rationale
is that when you update a package manifest, you change the
sources. But the old ones that have been downloaded are still
kept. The &lt;code&gt;cleanup downloads&lt;&#x2F;code&gt; command will find these unused sources
and delete them for you. I really needed this.&lt;&#x2F;p&gt;
&lt;p&gt;flathub-cli is written in Rust.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;abiword&quot;&gt;AbiWord&lt;&#x2F;h2&gt;
&lt;p&gt;Fixing some annoying bugs (regressions) in master, some memory leakage
in both stable and master, a lot of in the Gtk UI code. I also fixed a
crash when editing lists in 3.0.6 that was due to some code not
touched since 2004, and even then that part is probably even
older. The short story is that updating a value in the &lt;code&gt;StringMap&amp;lt;&amp;gt;&lt;&#x2F;code&gt;
updated the key whose pointer ended up being help somewhere else. Yep,
dangling pointer. The fix was to not update the key if it is the same.&lt;&#x2F;p&gt;
&lt;p&gt;On master only, I also started fixing the antiquated C++ syntax. For
some reason in C++ there was a lot of &lt;code&gt;typedef enum&lt;&#x2F;code&gt; and &lt;code&gt;typedef struct&lt;&#x2F;code&gt;, probably an artifact of the late 90&#x27;s code origin.  At the
same time moved to &lt;code&gt;#pragma once&lt;&#x2F;code&gt; for header includes. Let the compiler
handle it. Also fixed a crash with saving a document with revisions.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Friday links 27 June 2025</title>
        <published>2025-06-27T00:00:00+00:00</published>
        <updated>2025-06-27T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/friday-links-27-june-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/friday-links-27-june-2025/</id>
        
        <content type="html">&lt;p&gt;Some links for technical articles on various topics I read.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;blog.veeso.dev&#x2F;blog&#x2F;en&#x2F;std-mem-is-interesting&#x2F;&quot;&gt;std::mem is... interesting&lt;&#x2F;a&gt; -
Explore some of the functionalities in the &lt;code&gt;std::mem&lt;&#x2F;code&gt; module of the Rust
standard library.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;nnethercote.github.io&#x2F;2025&#x2F;06&#x2F;26&#x2F;how-much-code-does-that-proc-macro-generate.html&quot;&gt;How much code does that proc macro
generate?&lt;&#x2F;a&gt; -
Nicholas Nethercote tells us how you can answer this question with new
tooling in the Rust toolchain.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.programmax.net&#x2F;articles&#x2F;png-is-back&#x2F;&quot;&gt;PNG is back&lt;&#x2F;a&gt; - A
quick overview of the PNG spec 3. Spoiler: Animated PNG, HDR support
and Exif support.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.jonoalderson.com&#x2F;conjecture&#x2F;javascript-broke-the-web-and-called-it-progress&#x2F;&quot;&gt;JavaScript broke the web (and called it
progress)&lt;&#x2F;a&gt; -
How the JavaScript ecosystem is over complicated for no reason with
only making the user facing stuff worse.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;blog.davidedmundson.co.uk&#x2F;blog&#x2F;qt6_wayland_robustness&#x2F;&quot;&gt;QtWayland 6.6 Brings Robustness Through Compositor
Handoffs&lt;&#x2F;a&gt; -
Improvements in Wayland support in Qt 6.6, brought to kwin (KDE
compositor), fixing some stuff that Wayland should better at than X11,
but ended up being worse.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;jasone.github.io&#x2F;2025&#x2F;06&#x2F;12&#x2F;jemalloc-postmortem&#x2F;&quot;&gt;jemalloc
Postmortem&lt;&#x2F;a&gt; -
jemalloc from its inception to the end.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log April 2025</title>
        <published>2025-05-03T00:00:00+00:00</published>
        <updated>2025-05-03T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-april-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-april-2025/</id>
        
        <content type="html">&lt;p&gt;April was light.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;exempi&quot;&gt;exempi&lt;&#x2F;h1&gt;
&lt;p&gt;Released &lt;a href=&quot;https:&#x2F;&#x2F;libopenraw.freedesktop.org&#x2F;blog&#x2F;exempi-2-6-6&#x2F;&quot;&gt;Exempi
2.6.6&lt;&#x2F;a&gt; to fix
security issues from upstream.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h1&gt;
&lt;p&gt;Some minor fixes in the thumbnail extraction, with JXL support and
locate larger Panasonic previews. Extract the exposure bias for
Fuijfilm files. Added the latest Canon cameras (still the support of
CR3 is work in progress).&lt;&#x2F;p&gt;
&lt;p&gt;Released alpha.10 on May 1st.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Friday links 2 May 2025</title>
        <published>2025-05-02T00:00:00+00:00</published>
        <updated>2025-05-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/friday-links-2-may-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/friday-links-2-may-2025/</id>
        
        <content type="html">&lt;p&gt;Some links for technical articles on various topics I read.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;thephd.dev&#x2F;c2y-the-defer-technical-specification-its-time-go-go-go&quot;&gt;The Defer Technical Specification: It Is
Time&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
Explains the proposal for the next C language standard for &lt;code&gt;defer&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;maho.dev&#x2F;2024&#x2F;02&#x2F;a-guide-to-implement-activitypub-in-a-static-site-or-any-website&#x2F;&quot;&gt;A guide to implement ActivityPub in a static site (or any
website)&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
A guide to implement ActivityPub in a static website.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;blog.gitbutler.com&#x2F;20-years-of-git&#x2F;&quot;&gt;20 years of git&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
An history of git and its early days.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;about.gitlab.com&#x2F;blog&#x2F;2025&#x2F;04&#x2F;07&#x2F;celebrating-gits-20th-anniversary-with-creator-linus-torvalds&#x2F;&quot;&gt;Celebrating Git&#x27;s 20th anniversary with creator Linus
Torvalds&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
An interview with Linus Torvalds on the 20 years of git.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;idiallo.com&#x2F;blog&#x2F;zipbomb-protection&quot;&gt;I use Zip Bombs to Protect my
Server&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - A technique
of serving compressed zeros that a lot of bots don&#x27;t handle properly.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;developers.redhat.com&#x2F;articles&#x2F;2025&#x2F;04&#x2F;10&#x2F;6-usability-improvements-gcc-15#&quot;&gt;6 usability improvements in GCC
15&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
New in a GCC 15 near you, better error messages.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log March 2025</title>
        <published>2025-04-02T00:00:00+00:00</published>
        <updated>2025-04-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-march-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-march-2025/</id>
        
        <content type="html">&lt;p&gt;A long overdue dev log. The last one was for September 2024. That&#x27;s half a
year.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h1&gt;
&lt;p&gt;Released 0.4.0-alpha9 of the Rust crate. Added a bunch of
cameras. Fixed some Maker Note for some Fujifilm camera, and a fews
other, also fixed some thumbnailing.&lt;&#x2F;p&gt;
&lt;p&gt;The main API is now faillible with &lt;code&gt;Result&amp;lt;&amp;gt;&lt;&#x2F;code&gt; returned. This should
reduce the amount of panics (it shouldn&#x27;t panic).&lt;&#x2F;p&gt;
&lt;p&gt;Added support for user crops in Fujifilm files as I added support for
the GFX 100RF (sight unseen).&lt;&#x2F;p&gt;
&lt;h1 id=&quot;niepce&quot;&gt;Niepce&lt;&#x2F;h1&gt;
&lt;p&gt;Changed the catalog format. By changed, it&#x27;s just that it has an
extension &lt;code&gt;.npcat&lt;&#x2F;code&gt; and that it is standalone instead of being a
folder. The thumbnail cache will be in the same folder next to it.&lt;&#x2F;p&gt;
&lt;p&gt;Now we can open a different catalog. Also renamed some bits internally
to be consistent with the naming.&lt;&#x2F;p&gt;
&lt;p&gt;Removed some UI CSS hacks now that the is an API for
&lt;code&gt;Gtk.TreeExpander.set_hide_expander()&lt;&#x2F;code&gt; in Gtk 4.10. Fixed some bug
with the treeview not being updated. Removed &lt;code&gt;Gtk.ColorButton&lt;&#x2F;code&gt;
(deprecated). Fix some selection issues with the &lt;code&gt;Gtk.ListView&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Moved to Rust 2024.&lt;&#x2F;p&gt;
&lt;p&gt;Added video thumbnailing. Code was inspired from Totem&#x27;s.&lt;&#x2F;p&gt;
&lt;p&gt;Fixed some bugs with importing hierarchies of folders, and fix
deleting a folder with folders.&lt;&#x2F;p&gt;
&lt;p&gt;Still working on the import feature I mentionned previously. It is
getting there. My biggest issue that one can&#x27;t select a Gtk.ListView
item by item, only by index, which is complicated on a tree view. On
the other hand several of the fixes mentionned above came from this
work as I cherry-picked the patches to the main branch.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;i18n-format&quot;&gt;i18n-format&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;i18n-format&#x2F;issues&#x2F;1&quot;&gt;Fixed&lt;&#x2F;a&gt; my
&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;i18n-format&quot;&gt;i18n-format crate&lt;&#x2F;a&gt; as the minor
version of &lt;code&gt;gettext&lt;&#x2F;code&gt; removed the essential feature I was relying
on. Yes this is a semver breakage. I ended up having to split the
crate to have a non macro crate. From a usage standpoint it works the
same.&lt;&#x2F;p&gt;
&lt;p&gt;The long term is to have this crate be unnecessary.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;other&quot;&gt;Other&lt;&#x2F;h1&gt;
&lt;p&gt;Other stuff I contributed to.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;glycin&quot;&gt;Glycin&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;glycin&#x2F;-&#x2F;merge_requests&#x2F;159&quot;&gt;Submitted&lt;&#x2F;a&gt;
support for the rotation of camera raw files, and the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;loupe&#x2F;-&#x2F;merge_requests&#x2F;515&quot;&gt;Loupe
counterpart&lt;&#x2F;a&gt;.
This is a followup to the camera raw file support in glycin.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Friday links March 21st 2025</title>
        <published>2025-03-21T00:00:00+00:00</published>
        <updated>2025-03-21T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/friday-links-21-march-2025/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/friday-links-21-march-2025/</id>
        
        <content type="html">&lt;p&gt;Some links for technical articles on various topics I read.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;86box.net&#x2F;2025&#x2F;02&#x2F;25&#x2F;riva128-part-1.html&quot;&gt;NVIDIA emulation journey, part 1: RIVA 128 &#x2F; NV3 architecture
history and basic
overview&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; - From
the developers of 86Box emulators, some history and technical summary
about the first successful 3D GPU from Nvidia.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;trifectatech.org&#x2F;blog&#x2F;zlib-rs-is-faster-than-c&#x2F;&quot;&gt;zlib-rs is faster than
C&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
Something on the reimplementation of zlib in Rust, and how it performs
better. Safe + speed, pick 2.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;seb.jambor.dev&#x2F;posts&#x2F;understanding-activitypub&#x2F;&quot;&gt;Understanding
ActivityPub&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;
Part 1 to 4. - A four part explainer on how ActivityPub, the protocol
behind the Fediverse, works.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;developer.chrome.com&#x2F;blog&#x2F;memory-safety-fonts&quot;&gt;Memory safety for web
fonts&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
Chrome developers explain how they are replacing freetype to a memory
safe solution, written in Rust, called Skrifa.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;librearts.org&#x2F;2025&#x2F;03&#x2F;gimp-3-0-released&#x2F;&quot;&gt;GIMP 3.0
released&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; -
Aleksandr Prokudin summarize what&#x27;s new in the long awaited GIMP 3.0.
Don&#x27;t forget his &lt;a href=&quot;https:&#x2F;&#x2F;librearts.org&#x2F;categories&#x2F;weekly&#x2F;&quot;&gt;weekly
writeups&lt;&#x2F;a&gt; of Libre Arts
updates.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log September 2024</title>
        <published>2024-10-09T00:00:00+00:00</published>
        <updated>2024-10-09T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-september-2024/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-september-2024/</id>
        
        <content type="html">&lt;p&gt;A long overdue dev log. The last one was for September 2023. That&#x27;s a
year. Stuff in life has happened.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;compiano&quot;&gt;Compiano&lt;&#x2F;h1&gt;
&lt;p&gt;In November I switched Compiano to use pipewire directly for
sound. This mean removing bits of UI too.&lt;&#x2F;p&gt;
&lt;p&gt;I should look at a release, but I have a few blockers I need to
tackle. One key element is that there is a mechanism to download the
soundbanks and for now it doesn&#x27;t ask consent to do so. I don&#x27;t want a
release without this.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;raw-thumbnailer&quot;&gt;Raw thumbnailer&lt;&#x2F;h1&gt;
&lt;p&gt;I already &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;new-raw-thumbnailer&#x2F;&quot;&gt;posted about it&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h1&gt;
&lt;p&gt;Lot has happened on that front. I want it to be a foundation of Niepce
and others.&lt;&#x2F;p&gt;
&lt;p&gt;First adding it to glycin triggered an alpha release on
crates.io. There started a long cycle of alpha release, we are at
alpha 8 as of now. Various changes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Added the mp4parse crate directly as a module. A key reason is that
I already used a fork so it complicate things. Maybe I should make
these few bits upstreamable and use upstream.&lt;&#x2F;li&gt;
&lt;li&gt;Added a mime types API&lt;&#x2F;li&gt;
&lt;li&gt;Save up a lot of RAM when doing colour interpolation: it&#x27;s done in
place instead of allocating a new buffer. This is significant as
this is done using a 64-bit float per component.&lt;&#x2F;li&gt;
&lt;li&gt;Fixed the rendering in many ways. The only thing it needs it to
apply the colour balance.&lt;&#x2F;li&gt;
&lt;li&gt;Fixed unpack or decompression of Olympus and Fuji files.&lt;&#x2F;li&gt;
&lt;li&gt;Got an external contribution: &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;libopenraw&#x2F;libopenraw&#x2F;-&#x2F;merge_requests&#x2F;3&quot;&gt;Panasonic
decompression&lt;&#x2F;a&gt;. This
made me fix the loading of uncompressed Panasonic raw too. The more
recent Panasonic cameras are still failing though, there is a subtle
variant that needs to be handled.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Still missing from rendering: recent Nikon and all their exotic
variants and compression scheme, Canon CR3, GoPro, Sony.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;niepce&quot;&gt;Niepce&lt;&#x2F;h1&gt;
&lt;p&gt;Not so much work directly done on Niepce in the last few month, but
still.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ongoing-features&quot;&gt;Ongoing features&lt;&#x2F;h2&gt;
&lt;p&gt;Started a while ago some work towards the import and a rework of the
catalog (the main data storage).&lt;&#x2F;p&gt;
&lt;p&gt;The former is the implementation of a workflow that allow immporting
images into the catalog.&lt;&#x2F;p&gt;
&lt;p&gt;The latter involve reworking the catalog to become a self contained
storage as a sqlite3 database. One step I already did was to use it to
store the catalog preferences instead of a separate file. This should
also include fixing the UI open, creating, switching.&lt;&#x2F;p&gt;
&lt;p&gt;This big two things are user visible and are a stop forward what I
want to happen as an internal milestone. Then I can start pluging the
library import and maybe import my picture vault. A good starting
point towards managing the collection, but not really for photo
editing yet. Gotta make choices.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;images&quot;&gt;Images&lt;&#x2F;h2&gt;
&lt;p&gt;Implemented support for HEIF which is being adopted by camera
manufacturers.&lt;&#x2F;p&gt;
&lt;p&gt;I updated the RT engine to 5.11 which came with RawTherapee 5.11. This
is still a soft work of the code base to use strip out Gtk3 and a more
recent version of glibmm. The latter patch might no longer be needed
as I have since removed gtkmm from Niepce.&lt;&#x2F;p&gt;
&lt;p&gt;I also implemented the GEGL pipeline using
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;World&#x2F;Rust&#x2F;gegl-rs&quot;&gt;gegl-rs&lt;&#x2F;a&gt;, which I took
over to make it useful. At one I shall try to figure out how to write
a loader in Rust to use libopenraw with GEGL.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cleanups&quot;&gt;Cleanups&lt;&#x2F;h2&gt;
&lt;p&gt;The UI is slowly moving to use blueprint, and I removed all the
first-party C++ code outside of bindings, no more Gtkmm and Glibmm is
only here because RT engine needs it.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;other&quot;&gt;Other&lt;&#x2F;h1&gt;
&lt;p&gt;Stuff I contributed to.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stf&quot;&gt;STF&lt;&#x2F;h2&gt;
&lt;p&gt;I took part to the STF effort and worked on fixing issues with
the desktop portal. The big chunk of the work related to the USB
portal, taking over code by Georges that is itself based on code by
Ryan. It spreads through multiple component of the stack: flatpak,
xdg-desktop-portal, xdg-desktop-portal-gnome, libportal and ashpd.&lt;&#x2F;p&gt;
&lt;p&gt;I also did a bunch of bug fixes, crashes, memory leaks, etc in
flatpak, flatpak-builder, and the rest of the stack.&lt;&#x2F;p&gt;
&lt;p&gt;I also implemented &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;flatpak&#x2F;flatpak-builder&#x2F;issues&#x2F;1&quot;&gt;issue
#1&lt;&#x2F;a&gt; for
flatpak-builder: easy renaming of MIME files and icons, and also
properly fixing the &lt;code&gt;id&lt;&#x2F;code&gt; in the appstream file, a common problem in
flatpak.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;glycin&quot;&gt;Glycin&lt;&#x2F;h2&gt;
&lt;p&gt;Glycin is a sandboxed image loader. I did implement the &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;sophie-h&#x2F;glycin&#x2F;-&#x2F;merge_requests&#x2F;38&quot;&gt;raw camera
loader&lt;&#x2F;a&gt;
using libopenraw. It&#x27;s written in Rust, so is libopenraw now. Thank
you Sophie for merging it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;poppler&quot;&gt;Poppler&lt;&#x2F;h2&gt;
&lt;p&gt;Jeff was complaining about a &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;poppler&#x2F;poppler&#x2F;-&#x2F;issues&#x2F;1485&quot;&gt;file being super
slow&lt;&#x2F;a&gt;,
with sysprof flamegraph. That picked my curiosity and looked at
it. The peculiarity of the document is that it has 16000 pages and a
lot of cross references.&lt;&#x2F;p&gt;
&lt;p&gt;This lead to two patches:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;poppler&#x2F;poppler&#x2F;-&#x2F;merge_requests&#x2F;1554&quot;&gt;The first
one&lt;&#x2F;a&gt;
is in 24.06. There was a loop, calling for the length of the
container at each iteration. Turns out this is protected by a mutex
and that&#x27;s a lot of time spend for nothing since the value is
immutable. Call it once before the loop and voila.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;poppler&#x2F;poppler&#x2F;-&#x2F;merge_requests&#x2F;1556&quot;&gt;The other
one&lt;&#x2F;a&gt;,
merged for 24.09 change that loop to be a hash table lookup. The
problem is that it want to locate the page by object reference, but
iterate through the page list. Lots of ref and lots of a page mean
even more iterator. The more complex approach is when building the
page cache (it&#x27;s done on demand), we build a reference to page index
map. And the slow code is no longer slow and almost disappear from
the flamegraphs.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This make Evince and Okular faster to open that document and any
presenting similar attribute: a lot of bookmarks.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>New raw thumbnailer</title>
        <published>2024-09-22T00:00:00+00:00</published>
        <updated>2024-09-22T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/new-raw-thumbnailer/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/new-raw-thumbnailer/</id>
        
        <content type="html">&lt;p&gt;I have resurrected my camera old raw thumbnailer so that I can browse
directories full of of camera raw images in Nautilus. This is version
47.0.1, because GNOME 47 is out.&lt;&#x2F;p&gt;
&lt;p&gt;Like the old one, it uses libopenraw to extract the previews from the
raw files.&lt;&#x2F;p&gt;
&lt;p&gt;But, it now supports more raw formats, and if needed will render the
raw image to generate a preview, like it has to for my old Ricoh GR
Digital II images (the one from 2007). This leverage &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;libopenraw&#x2F;0.4.0-alpha.8&quot;&gt;libopenraw
0.4.0&lt;&#x2F;a&gt; (still in
alpha stage) that has been &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;libopenraw-rust-capi&#x2F;&quot;&gt;rewritten in Rust&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly to get is in the hands of users the only good solution is a
distribution package. At the time of writing there is none, but I put
together smething that allowed me to build a package for Fedora 40 to
install on my big rig.&lt;&#x2F;p&gt;
&lt;p&gt;If you feel like it you can download the &lt;a href=&quot;https:&#x2F;&#x2F;download.gnome.org&#x2F;sources&#x2F;raw-thumbnailer&#x2F;47&#x2F;&quot;&gt;source
code&lt;&#x2F;a&gt; from
GNOME, and &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;World&#x2F;gnome-raw-thumbnailer&quot;&gt;the
repository&lt;&#x2F;a&gt; is
on GNOME gitlab.&lt;&#x2F;p&gt;
&lt;p&gt;This is how it looks with Nautilus 46 with a bunch of images from my
old Olympus E-P1:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;new-raw-thumbnailer&#x2F;raw-thumbnailer-nautilus.png&quot; alt=&quot;Nautilus directory view with ORF images thumbnails&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log September 2023</title>
        <published>2023-10-01T00:00:00+00:00</published>
        <updated>2023-10-01T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-sept-2023/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-sept-2023/</id>
        
        <content type="html">&lt;p&gt;It&#x27;s October 2023.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;niepce&quot;&gt;Niepce&lt;&#x2F;h2&gt;
&lt;p&gt;Really very little.&lt;&#x2F;p&gt;
&lt;p&gt;Fixed a cosmetic issues with icons in the workspace. The short version
is that for symbolic icons to work, they must be in a &amp;quot;standard&amp;quot; path
even if they are loaded from resources.&lt;&#x2F;p&gt;
&lt;p&gt;Also some minor dependency checks, etc.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lrcat-extractor&quot;&gt;lrcat-extractor&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;lrcat-extractor&quot;&gt;&lt;code&gt;lrcat-extractor&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is
my Rust crate to export Lightroom™ catalogs. It&#x27;s used in Niepce. Just
a few bits of maintenance, like replacing &lt;code&gt;docopt&lt;&#x2F;code&gt; with &lt;code&gt;clap&lt;&#x2F;code&gt; for the
dumper tool, and using &lt;code&gt;thiserror&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aplib-extractor&quot;&gt;aplib-extractor&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;aplib-extractor&quot;&gt;&lt;code&gt;aplib-extractor&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is
the sibling of &lt;code&gt;lrcat-extractor&lt;&#x2F;code&gt;, a crate to export Aperture™
libraries. This is actually the oldest and one of my first projects in
Rust, which really shows. I worked on adding missing features so that
I can implement the importer in Niepce, including listing the volumes.&lt;&#x2F;p&gt;
&lt;p&gt;The reasoning in implementing the import is to help refine the data
model in Niepce to be able to handle the structure of an Aperture™
library as it offer organizational features that Ligthroom™
doesn&#x27;t. This actually might lead to deeper changes in Niepce internal
design.&lt;&#x2F;p&gt;
&lt;p&gt;Once the importer works, I will release the crate officially as I&#x27;ll
know the API is sound.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dia-on-gtk3&quot;&gt;Dia on Gtk3&lt;&#x2F;h2&gt;
&lt;p&gt;Two years after I started it, and mostly drop the ball, the &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;dia-gtk3&#x2F;&quot;&gt;GTK 3
port of Dia has been merged&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I also fixed a few other small issues, including some memory leaks.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dia with GTK 3</title>
        <published>2023-09-24T00:00:00+00:00</published>
        <updated>2023-09-24T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dia-gtk3/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dia-gtk3/</id>
        
        <content type="html">&lt;p&gt;If you are running &lt;a href=&quot;https:&#x2F;&#x2F;wiki.gnome.org&#x2F;Apps&#x2F;Dia&quot;&gt;Dia&lt;&#x2F;a&gt; from the
nigthly GNOME flatpak, the last update brought a big change: it is now
a GTK 3 app. The UI shouldn&#x27;t be much different, just some cosmetic
adjustments due to theming and other like widget spacing. Also it now
work with Wayland and HiDPI.&lt;&#x2F;p&gt;
&lt;p&gt;It is something I started over two years ago, and that for some reason
I left on the back burner. So I did a final push and many thanks to
Zander for reviewing and &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;dia&#x2F;-&#x2F;merge_requests&#x2F;85&quot;&gt;merging
it&lt;&#x2F;a&gt;. Now we
shall hunt for regression. I already have a &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;dia&#x2F;-&#x2F;merge_requests&#x2F;100&quot;&gt;fix for the touchpad
scrolling&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The version is numbered starting 0.98. So if it is Dia 0.98 or higher,
then it&#x27;s GTK 3.&lt;&#x2F;p&gt;
&lt;p&gt;There is still some more stuff to do. Fix a regression in the
navigator widget, build without deprecation post GTK 3.8, etc.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Dev Log August 2023</title>
        <published>2023-09-02T00:00:00+00:00</published>
        <updated>2023-09-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/dev-log-august-2023/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/dev-log-august-2023/</id>
        
        <summary type="html">&lt;p&gt;Didn&#x27;t really do anything on Niepce in August, so no updates on that
front.  However I worked on a few other things.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h2&gt;
&lt;p&gt;A lot of work done on it. See my &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;libopenraw-rust-capi&#x2F;&quot;&gt;other wlog
post&lt;&#x2F;a&gt;. The short version is that
I should look towards releasing 0.4.0 sometime soon.&lt;&#x2F;p&gt;
&lt;p&gt;Since that last post, I have added a long standing to-do item: code to
generate test cases so I can run a non regression test suite on
existing files. However I get hit with flaws in the various XML serde
crates.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;abiword&quot;&gt;AbiWord&lt;&#x2F;h2&gt;
&lt;p&gt;Did some work on
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;World&#x2F;AbiWord&#x2F;&quot;&gt;AbiWord&lt;&#x2F;a&gt;. Nothing ground
breaking, but I have a goal to try to release the next 3.0.x with one
or two bug fixes (UI), and then what I call &lt;em&gt;3.next&lt;&#x2F;em&gt; (likely 3.2) that
will focus on internal changes (stability) and UI fixes (anything
back-portable to 3.0.x will get back-ported).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;done&quot;&gt;Done&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Some code cleanup.&lt;&#x2F;li&gt;
&lt;li&gt;Removed the use of &lt;code&gt;boost&lt;&#x2F;code&gt; in many places where the standard C++
library would work.&lt;&#x2F;li&gt;
&lt;li&gt;Use C++17 more.&lt;&#x2F;li&gt;
&lt;li&gt;Making the build system less recursive. It&#x27;s less complex and should
be more parallel.&lt;&#x2F;li&gt;
&lt;li&gt;Removed some Gtk3 construct that are deprecated in provision of a
future Gtk4 port.&lt;&#x2F;li&gt;
&lt;li&gt;More removal of the legacy containers.&lt;&#x2F;li&gt;
&lt;li&gt;Rewrote the toolbars to use plain buttons and a &lt;code&gt;GtkBox&lt;&#x2F;code&gt; instead of
&lt;code&gt;GtkToolItem&lt;&#x2F;code&gt;. The look is slightly different.&lt;&#x2F;li&gt;
&lt;li&gt;Fixing some Gtk3 bug: the table creation widget was not behaving
properly. Will be on stable too (3.0.x)&lt;&#x2F;li&gt;
&lt;li&gt;Fixing some bugs with styling. (also on 3.0.x)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>libopenraw Rust with C API</title>
        <published>2023-08-28T00:00:00+00:00</published>
        <updated>2023-08-28T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/libopenraw-rust-capi/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/libopenraw-rust-capi/</id>
        
        <content type="html">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;release-day&#x2F;&quot;&gt;As I previously talked about&lt;&#x2F;a&gt;, I started
porting &lt;a href=&quot;https:&#x2F;&#x2F;libopenraw.freedesktop.org&#x2F;&quot;&gt;libopenraw&lt;&#x2F;a&gt; to Rust. It
is now in a state where it has more feature than the original.&lt;&#x2F;p&gt;
&lt;p&gt;When I started writing this post, I didn&#x27;t have 100% of the code Rust,
but since I have removed the last bit of C++, for which I had cut
corners to make sure to have a functional API for C.&lt;&#x2F;p&gt;
&lt;p&gt;The only C++ code left is the various utilities and the C++ test suite
to validate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-goal&quot;&gt;The goal&lt;&#x2F;h2&gt;
&lt;p&gt;The goal of the Rust rewrite is to have the digital camera raw
parsing library written in Rust instead of C++, while still being
available with a C API.&lt;&#x2F;p&gt;
&lt;p&gt;The goal of the updated C API is to be close to the original
API. However it&#x27;s also a good time to do some breaking
changes. Notably most of the &amp;quot;objects&amp;quot; are now immutable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rewrite&quot;&gt;Rewrite&lt;&#x2F;h2&gt;
&lt;p&gt;I did the rewrite in a branch, aiming to provide the same level of
functionality as the C++ code. One of the first step was to rewrite
the test suite to use the same data set. Doing so did allow verifying
the consistency in behaviour, a progressively implement all the
features and formats.&lt;&#x2F;p&gt;
&lt;p&gt;The C++ code use inheritance a bit to override some of the behaviours
based on which file format it was. One of the thing most camera raw
file have in common is that they are mostly a TIFF file. However Rust
doesn&#x27;t do object-oriented. It has traits that allow implementing some
level of polymorphism, but in that case the concept had to be
rethought a little bit.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;benefits&quot;&gt;Benefits&lt;&#x2F;h3&gt;
&lt;p&gt;This is where Rust shines.&lt;&#x2F;p&gt;
&lt;p&gt;First there are a lot of things Rust, or the ecosystem around, did for
me. In C++ I had re-implemented a stream system to allow IO on buffers
and handling endianess. In Rust you can just read from a slice (a
fixed size array of data) with the &lt;code&gt;Read&lt;&#x2F;code&gt; trait, and there are
built-in functions to read endian-specific values. I still have the
memory of trying to figure out which include to add depending on the
UNIX flavour, between Linux, macOS and the BSD.&lt;&#x2F;p&gt;
&lt;p&gt;Second, the &lt;code&gt;Debug&lt;&#x2F;code&gt; trait. Just derive &lt;code&gt;Debug&lt;&#x2F;code&gt; (it&#x27;s a simple macro)
and you can &amp;quot;print&amp;quot; an type like that, using string formats. In C++,
well, it&#x27;s a lot of work. And on enum types it will print a human
readable value, ie the one you write in code.&lt;&#x2F;p&gt;
&lt;p&gt;Third, the safety. A lot of the safety feature of Rust prevent
mistake. And at runtime, the bounds checking catch of a lot of things
too. Being required to use &lt;code&gt;Option&amp;lt;&amp;gt;&lt;&#x2F;code&gt; or &lt;code&gt;Result&amp;lt;&amp;gt;&lt;&#x2F;code&gt; to handle cases
where in C++ you&#x27;d get some null value.&lt;&#x2F;p&gt;
&lt;p&gt;At that point, a few bugs I identified porting &#x2F; rewriting the code
made their way to the 0.3.x series in C++.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;drawbacks&quot;&gt;Drawbacks&lt;&#x2F;h3&gt;
&lt;p&gt;libopenraw requires a Rust compiler (technically it already did, but I
know some packagers that did disable Rust&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#norust&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. This mean that non
current architecture might not be supported. To me it&#x27;s not a big
issue, I target modern computers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;&#x2F;h2&gt;
&lt;p&gt;As mentioned I rewrote the test suite with the same data set. This is
an essential part of making sure the features work as previously.&lt;&#x2F;p&gt;
&lt;p&gt;I also rewrote &lt;code&gt;ordiag&lt;&#x2F;code&gt; and the dumper &lt;code&gt;ordumper&lt;&#x2F;code&gt;. The dumper allow
analyzing the structure of the file, and I didn&#x27;t have this one in C++
(instead I had a more primitive &lt;code&gt;exifdump&lt;&#x2F;code&gt;). The dumper is heavily
inspired from &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;exifprobe&quot;&gt;&lt;code&gt;exifprobe&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
that has served me well and that I forked. Really I can see the amount
of work I didn&#x27;t need to do with Rust.&lt;&#x2F;p&gt;
&lt;p&gt;To add to this I wrote
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;libopenraw&#x2F;libopenraw-viewer&quot;&gt;&lt;code&gt;libopenraw-viewer&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
a small Rust application to view the content of camera raw files. This
allow much more easily to see the output. This has helped me to find
fundamental bugs in some of the parsing that led to some fixes
&amp;quot;upstream&amp;quot;, namely into the C++ version (0.3.x branch). I should have
done that a long time ago. This also allow me to test the Rust API.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;c-api-adaptation&quot;&gt;C API adaptation&lt;&#x2F;h2&gt;
&lt;p&gt;Last but not least I had to provide a C API. This allow using the
library.&lt;&#x2F;p&gt;
&lt;p&gt;Rust to C ffi has limitations. You can basically pass numbers,
pointers, and eventually simple structures.&lt;&#x2F;p&gt;
&lt;p&gt;The libopenraw API did return several types of &amp;quot;ref&amp;quot; which are just
pointers to opaque types. The idea was always to only have opaque
types through the API, which internally were C++ instances.&lt;&#x2F;p&gt;
&lt;p&gt;One of the key change is that the only object that can be explicitly
be created with the API is &lt;code&gt;ORRawFileRef&lt;&#x2F;code&gt;, because it&#x27;s the entry
point. Very few need to be released, most are held by the containing
objects.&lt;&#x2F;p&gt;
&lt;p&gt;Some other constraints of the C API directed some choices in the Rust
API.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Raw files are no longer &lt;code&gt;Box&amp;lt;&amp;gt;&lt;&#x2F;code&gt; but &lt;code&gt;Rc&amp;lt;&amp;gt;&lt;&#x2F;code&gt; due to the need to retain
them for the iterator.&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#threads&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Metadata::String()&lt;&#x2F;code&gt; contain a &lt;code&gt;Vec&amp;lt;u8&amp;gt;&lt;&#x2F;code&gt; instead of a &lt;code&gt;String&lt;&#x2F;code&gt; to
allow for the NUL terminated strings in the C API. They are maybe
not NUL terminated but ASCII.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;new-features&quot;&gt;New features&lt;&#x2F;h2&gt;
&lt;p&gt;Meanwhile I added a few new features:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;extracting the white balance on most files (saveral Nikon are not
yet handled).&lt;&#x2F;li&gt;
&lt;li&gt;color converting from the camera space to sRGB on rendering.&lt;&#x2F;li&gt;
&lt;li&gt;a multi stage processing pipeline.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This is still not enough to have a complete processing pipeline, but
it&#x27;s a start. It&#x27;s going towards the only two issue left in the issue
tracker. Not that I don&#x27;t expect more but it&#x27;s a nice goal post.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;integration&quot;&gt;Integration&lt;&#x2F;h2&gt;
&lt;p&gt;I &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dbrgn&#x2F;miniaturo&#x2F;pull&#x2F;15&quot;&gt;submitted a PR&lt;&#x2F;a&gt; for
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dbrgn&#x2F;miniaturo&#x2F;&quot;&gt;Miniaturo&lt;&#x2F;a&gt; to use the Rust
version of the library. This is not ready to be merged, but this
actually allowed me to fix a few API bits. The new Rust API is
relatively close to the old API that was the Rust to C bindings.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;norust&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;See &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;libopenraw&#x2F;libopenraw&#x2F;-&#x2F;issues&#x2F;13&quot;&gt;issue
13&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;threads&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;This is likely to change when I make libopenraw
multi-thread compatible.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce July 2023 updates</title>
        <published>2023-08-01T00:00:00+00:00</published>
        <updated>2023-08-01T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-july-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-july-2023-update/</id>
        
        <summary type="html">&lt;p&gt;This is the July 2023 update for Niepce.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-importer&quot;&gt;The importer&lt;&#x2F;h1&gt;
&lt;p&gt;Where we left, the workspace tree view didn&#x27;t display the hierarchy.&lt;&#x2F;p&gt;
&lt;p&gt;First, I discovered bug in the SQL triggers for folder path update. I
was missing the &lt;code&gt;AFTER&lt;&#x2F;code&gt; keyword to have it run after the update.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;workspace&quot;&gt;Workspace&lt;&#x2F;h2&gt;
&lt;p&gt;Second, I need to specify a parent when adding items to the model,
then locate the parent, add to it. The problem is that we get a list
of folders in some order (I can order by any of the SQL columns). The
problem is adding an item to a parent that is not yet int the
model. There are few ways to go about it.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Sort the folder list in order of a flattened tree. To be fair my
SQL skills are not good enough, and I&#x27;m not even sure I can do that
in sqlite. This would solve most of the problems.&lt;&#x2F;li&gt;
&lt;li&gt;Sort the folder list once received. But this might not always work.&lt;&#x2F;li&gt;
&lt;li&gt;Handle the case in the model: add with a placeholder parent and
re-parent as needed when the parent is added.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;For now I chose 3. The risk is that if the parent doesn&#x27;t exist then
the tree will stay lingering. It&#x27;s just the view though.&lt;&#x2F;p&gt;
&lt;p&gt;Here is the result:&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce June 2023 updates</title>
        <published>2023-07-01T00:00:00+00:00</published>
        <updated>2023-07-01T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-june-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-june-2023-update/</id>
        
        <summary type="html">&lt;p&gt;This is the June 2023 update for Niepce.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-importer&quot;&gt;The importer&lt;&#x2F;h1&gt;
&lt;p&gt;Back where we left, still working on the import.&lt;&#x2F;p&gt;
&lt;p&gt;It looks like there is more work than anticipated to be able to import
a tree a files.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Life update</title>
        <published>2023-06-30T00:00:00+00:00</published>
        <updated>2023-06-30T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/update/</id>
        
        <content type="html">&lt;p&gt;If you are looking for a Software Engineer with strong skills in C,
C++, Rust and JavaScript, with a strong FLOSS background, I am
available to hire.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;cv&#x2F;en&#x2F;&quot;&gt;My résumé&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce May 2023 updates</title>
        <published>2023-06-02T00:00:00+00:00</published>
        <updated>2023-06-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-may-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-may-2023-update/</id>
        
        <content type="html">&lt;p&gt;This is the May 2023 update for Niepce.&lt;&#x2F;p&gt;
&lt;p&gt;Life comes at you fast. And hit hard. tl;dr not as much progress as I
wished: I had to put this project a bit more on the sideline.&lt;&#x2F;p&gt;
&lt;p&gt;This will be a short update.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-importer&quot;&gt;The importer&lt;&#x2F;h1&gt;
&lt;p&gt;Some small bits:&lt;&#x2F;p&gt;
&lt;p&gt;Some fixing in the metadata processing on import, notably a better
handling of raw files. Turns out the previous logic broke getting
metadata from video files.&lt;&#x2F;p&gt;
&lt;p&gt;Also fixing some &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;felixc&#x2F;rexiv2&#x2F;pull&#x2F;70&quot;&gt;&lt;code&gt;rexiv2&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
&#x2F; &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;felixc&#x2F;gexiv2-sys&#x2F;pull&#x2F;25&quot;&gt;&lt;code&gt;gexiv2-sys&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; bugs
that are mostly memory leaks.&lt;&#x2F;p&gt;
&lt;p&gt;I am pondering directly binding Exiv2 now that 0.28 got rid of
&lt;code&gt;auto_ptr&amp;lt;&amp;gt;&lt;&#x2F;code&gt; that had been deprecated for over a decade. &lt;code&gt;cxx&lt;&#x2F;code&gt; should
make this easier. This would automatically resolve the problem above,
and I don&#x27;t need to bind all the API, just what I need.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;forecast&quot;&gt;Forecast&lt;&#x2F;h2&gt;
&lt;p&gt;To move forward the importer, I need to fix the recursive creation of
folders (it currently flatten them to a single level).&lt;&#x2F;p&gt;
&lt;h1 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h1&gt;
&lt;p&gt;There are always the other fixes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fedora-38&quot;&gt;Fedora 38&lt;&#x2F;h2&gt;
&lt;p&gt;I pulled the trigger and updated to Fedora 38. And Niepce failed to
build because of a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust-bindgen&#x2F;issues&#x2F;2312&quot;&gt;bug with bindgen with clang
16&lt;&#x2F;a&gt;, that was
already fixed, triggered by &lt;code&gt;libgphoto2-sys&lt;&#x2F;code&gt;. Submitted &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;maxicarlos08&#x2F;gphoto2-rs&#x2F;pull&#x2F;60&quot;&gt;the PR for
the crate&lt;&#x2F;a&gt; and we
are good to go. The short version is that clang 16 sent different data
for anonymous enums, that bindgen 0.60 couldn&#x27;t handle. But at that
bindgen 0.65 was fine.&lt;&#x2F;p&gt;
&lt;p&gt;This is the reason why I always check into git the generated bindings
and update them as needed, instead of doing it at build time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;application-id&quot;&gt;Application ID&lt;&#x2F;h2&gt;
&lt;p&gt;I have been using &lt;code&gt;org.gnome.Niepce&lt;&#x2F;code&gt; as an application ID. While it is
hosted in the main namespace repositories (it was back in the days of
Subversion, to which I am thankful), Niepce is not a core
app. Policies with the GNOME project do not allow using that namespace
for non core apps. So I had a perform a global change rename. Not a
big deal, and it doesn&#x27;t change anything for users since there is no
release. I just needed to get this out of the way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libopenraw&quot;&gt;libopenraw&lt;&#x2F;h2&gt;
&lt;p&gt;Pushed a bit on the Rust port to implement metadata extraction. This
is driven by the goal of not having three different libraries. Still
some parity gaps with the C++ code, but it&#x27;s closing in. I hope to be
able to release 0.4.0 based on the Rust code.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks you for reading.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce April 2023 updates</title>
        <published>2023-05-03T00:00:00+00:00</published>
        <updated>2023-05-03T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-april-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-april-2023-update/</id>
        
        <summary type="html">&lt;p&gt;This is the April 2023 update for Niepce. Between outages caused by an
unseasonbly ice storm, squirrels chewing cable, I discovered how
painful is being off the grid. This is not the excuse, just the events
that lead to downtime and April not being very productive.&lt;&#x2F;p&gt;
&lt;p&gt;The importer moved a little bit forward. I tried to use the brand new
&amp;quot;sort by date&amp;quot; importer tool, that is used to test and exercise the
logic. The improved importer address a few long standing issues,
including not using libgphoto2 for USB Mass Storage, including flash
card readers. This was a shortcut I had taken and the result was
suboptimal. The new approach is to use libgphoto2 to find the device,
and then switch to pure filesystem operations. That was &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;niepce&#x2F;-&#x2F;issues&#x2F;26&quot;&gt;issue
26&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I picked up my camera which I haden&#x27;t done much since the pandemic
started. After a firmware upgrade on the Fujifilm X-T3 (it&#x27;s a 4 year
old model, and the firmware is from this year, unlike most
smartphones), I notice a new feature that allow setting a picture as
favourite. My first question was &amp;quot;how is it stored?&amp;quot;. I put that on my
list for later.&lt;&#x2F;p&gt;
&lt;p&gt;After taking some pictures of the newly bloomed spring flowers, I
tried the importer. The new files cause a bug with metadata making the
importer unable to determine the creation date ; I hit this when
trying to sort these new pictures.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce March 2023 updates</title>
        <published>2023-04-01T00:00:00+00:00</published>
        <updated>2023-04-01T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-march-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-march-2023-update/</id>
        
        <summary type="html">&lt;p&gt;This is the March 2023 update for Niepce. This is not an April&#x27;s fool,
and this is not the year I can announce a release on April&#x27;s fool
day. Sorry about that.&lt;&#x2F;p&gt;
&lt;p&gt;Continuing with the renderer &#x2F; previewer cache.&lt;&#x2F;p&gt;
&lt;p&gt;I had to move &lt;code&gt;ncr&lt;&#x2F;code&gt; to Rust. I didn&#x27;t port it all, but the
widget and the main API are now in a Rust crate &lt;code&gt;npc-craw&lt;&#x2F;code&gt;, the
fourth one in the workspace. The goal of this crate is to provide the
interface to the rendering pipeline. Some of the work included moving
away from Cairo surface and using GdkTextures instead. The main
pipeline is still the original C++ code using GEGL, it&#x27;s easier for me
to bind the C++ code than to write wrappers for GEGL.&lt;&#x2F;p&gt;
&lt;p&gt;In the same way, I also ported most of the &lt;em&gt;darkroom&lt;&#x2F;em&gt; module to
Rust. This module is the one that will allow the image editing and
currently only handle displaying the images.&lt;&#x2F;p&gt;
&lt;p&gt;All of this was necessary to finish the render &#x2F; previewer integration
and making it work asynchronously: the image rendering happen in the
background without freezing the UI. There are still some issues but it
on overall, it works well.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Integrating the RawTherapee engine</title>
        <published>2023-03-18T00:00:00+00:00</published>
        <updated>2023-03-18T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/integrating-rtengine/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/integrating-rtengine/</id>
        
        <summary type="html">&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;rawtherapee.com&#x2F;&quot;&gt;RawTherapee&lt;&#x2F;a&gt; is one of the two major open
source RAW photo processing applications, the other is Darktable.&lt;&#x2F;p&gt;
&lt;p&gt;Can I leverage RawTherapee RAW processing code for use in Niepce? Yes
I can.&lt;&#x2F;p&gt;
&lt;p&gt;So let&#x27;s review of I did it.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce February 2023 updates</title>
        <published>2023-03-02T00:00:00+00:00</published>
        <updated>2023-03-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-february-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-february-2023-update/</id>
        
        <summary type="html">&lt;p&gt;This is the February 2023 update.&lt;&#x2F;p&gt;
&lt;p&gt;Not as much direct progress as I wished.&lt;&#x2F;p&gt;
&lt;p&gt;One big change is that now the binary is linked from Rust. And at the
same time the autotools buid system is gone. The latter came first, as
to not have to ignore it when doing the former.&lt;&#x2F;p&gt;
&lt;p&gt;Several challenges presented themselves with linked the app from Rust.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;We have to invert the dependency. We&#x27;d build the Rust code as a
library, generate the headers for the &lt;code&gt;cxx&lt;&#x2F;code&gt; bridge and then build
the C++ code, and link it.  Instead we generate the headers, build
the C++ code as libraries and then the Rust code.&lt;&#x2F;li&gt;
&lt;li&gt;We have to figure some tricks: the Rust executable needs to link to
some system libraries called directly from the C++ code, and also
need to link to asan if needed.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Otherwise, for the two previous topics, namely the importer and the
previewer.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Implementing i18n-format, a Rust procedural macro</title>
        <published>2023-02-05T00:00:00+00:00</published>
        <updated>2023-02-05T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/implementing-i18n-format/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/implementing-i18n-format/</id>
        
        <summary type="html">&lt;p&gt;This will relate my short learning journey in implementing a
procedural macro in Rust: &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;i18n-format&#x2F;&quot;&gt;i18n-format&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;&#x2F;h2&gt;
&lt;p&gt;Building Rust applications means having to deal with localization, ie
allowing the UI to be translated in other languages. This is a big
deal for users, and thanks to existing tooling, if you use gtk-rs and
if you use the &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;implementing-i18n-format&#x2F;niepce-suite.pot&quot;&gt;&lt;code&gt;rust-gtk-template&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to boostrap
your project you should be all set. The GNOME community has an history
of caring about this and most of the infrastructure is here.&lt;&#x2F;p&gt;
&lt;p&gt;However there is one sore point into this: gettext, the standard
package used to handle strings localization at runtime doesn&#x27;t support
Rust. For some reason &lt;a href=&quot;https:&#x2F;&#x2F;savannah.gnu.org&#x2F;bugs&#x2F;?56774&quot;&gt;the patch to fix it is stuck in
review&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While it mostly works, the lack of support cause one thing: the
&lt;code&gt;getttext!&lt;&#x2F;code&gt;  macro that allow the use of localized strings as format
is ignored by the &lt;code&gt;xgettext&lt;&#x2F;code&gt; command used to extract and strings and
generate the PO template. It is the &lt;code&gt;!&lt;&#x2F;code&gt;, a part of the macro
invocation syntax in Rust, that is the blocker. Another problem is
that in Rust, for safety reasons, you can only pass a string literal
to &lt;code&gt;format!&lt;&#x2F;code&gt;, which is why &lt;code&gt;gettext!&lt;&#x2F;code&gt;  exists in the first place.&lt;&#x2F;p&gt;
&lt;p&gt;Until &lt;code&gt;xgettext&lt;&#x2F;code&gt; is fixed, either these strings are missed in the
localization process, or you end up reimplementing it with less
flexibility. That&#x27;s what some applications do.&lt;&#x2F;p&gt;
&lt;p&gt;What if I implement a macro that would allow using a function syntax
and still use the macro underneath? Oh boy, that mean I need to
implement a procedural macro, something I have been
dreading because it looks like it has a steep learning curve. It&#x27;s a
topic so complicated that it is glanced over by most books about
Rust. Turns out it wasn&#x27;t that difficult, thanks to a great tooling.&lt;&#x2F;p&gt;
&lt;p&gt;The idea is as follow: convince &lt;code&gt;xgettext&lt;&#x2F;code&gt; to recognize the string. It
should look like a plain function, while we need to call a macro.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce January 2023 updates</title>
        <published>2023-02-02T00:00:00+00:00</published>
        <updated>2023-02-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-january-2023-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-january-2023-update/</id>
        
        <summary type="html">&lt;p&gt;This is the January 2023 update.&lt;&#x2F;p&gt;
&lt;p&gt;We start the year by a Rust implementation of the file import. It
landed very early as the final stretch of work in 2022.&lt;&#x2F;p&gt;
&lt;p&gt;Then a lot of cleanups, removing no longer needed &lt;code&gt;cxx&lt;&#x2F;code&gt; bindings and
no longer used C++ code. This also allow removing some &amp;quot;wrapper&amp;quot; type
used in the Rust code base.&lt;&#x2F;p&gt;
&lt;p&gt;The other &lt;code&gt;gphoto2-rs&lt;&#x2F;code&gt; patch has also been merged.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>i18n-format for Rust</title>
        <published>2023-01-22T00:00:00+00:00</published>
        <updated>2023-01-22T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/i18n-format/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/i18n-format/</id>
        
        <summary type="html">&lt;p&gt;A quick announcement for
&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;i18n-format&#x2F;&quot;&gt;&lt;code&gt;i18n-format&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, a Rust crate
to help with string localization. While it&#x27;s not GNOME specific as it
is only about gettext, I wrote it for GNOME applications.&lt;&#x2F;p&gt;
&lt;p&gt;The goal is to allow the use of &lt;code&gt;gettext!&lt;&#x2F;code&gt; and &lt;code&gt;ngettext!&lt;&#x2F;code&gt; while
xgettext can still extract the strings.&lt;&#x2F;p&gt;
&lt;p&gt;Simple use:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rs&quot; class=&quot;language-rs &quot;&gt;&lt;code class=&quot;language-rs&quot; data-lang=&quot;rs&quot;&gt;use i18n_format::i18n_fmt;

let number = 1;
let s = i18n_fmt! {
    i18n_fmt(&amp;quot;This is number {}, make it so !&amp;quot;, number)
};
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In your &lt;code&gt;po&#x2F;meson.build&lt;&#x2F;code&gt;, make sure to have:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;meson&quot; class=&quot;language-meson &quot;&gt;&lt;code class=&quot;language-meson&quot; data-lang=&quot;meson&quot;&gt;i18n.gettext(gettext_package,
  args [
    &amp;#x27;--keyword=i18n_fmt&amp;#x27;,
    &amp;#x27;--keyword=i18n_nfmt:1,2&amp;#x27;
  ],
  preset: &amp;#x27;glib&amp;#x27;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you use the regular
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;World&#x2F;Rust&#x2F;gtk-rust-template&#x2F;&quot;&gt;&lt;code&gt;gtk-rust-template&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
that&#x27;s probably all that needs to happen.&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t forget to check &lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;i18n-format&#x2F;0.2.0&#x2F;i18n_format&#x2F;&quot;&gt;the
documentation&lt;&#x2F;a&gt;, or
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;i18n-format&quot;&gt;the code&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing Toot That!</title>
        <published>2023-01-03T00:00:00+00:00</published>
        <updated>2023-01-03T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/toot-that/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/toot-that/</id>
        
        <summary type="html">&lt;p&gt;Introducing &lt;em&gt;Toot That!&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a small WebExtension (browser add-on) for Firefox.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s the successor of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hfiguiere&#x2F;tweet-that&quot;&gt;&lt;em&gt;Tweet
That!&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; but for use with
Mastodon (the Fediverse).&lt;&#x2F;p&gt;
&lt;p&gt;It allows posting a link to the current tab to your chosen Mastodon
instance. Only the server knows this is happening. The extension
doesn&#x27;t send anything else.&lt;&#x2F;p&gt;
&lt;p&gt;Install it as a &lt;a href=&quot;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;en-US&#x2F;firefox&#x2F;addon&#x2F;toot-that&#x2F;&quot;&gt;Firefox
Add-ons&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce December 2022 updates</title>
        <published>2023-01-02T00:00:00+00:00</published>
        <updated>2023-01-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-december-2022-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-december-2022-update/</id>
        
        <summary type="html">&lt;p&gt;Happy new year !&lt;&#x2F;p&gt;
&lt;p&gt;Here is some udpdate on Niepce work done in December 2022. Mostly changes
under the hood, but important ones to move forward with improving the
features. The short version: it feels great to remove C++ code.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Niepce November 2022 updates</title>
        <published>2022-12-02T00:00:00+00:00</published>
        <updated>2022-12-02T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-november-2022-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-november-2022-update/</id>
        
        <summary type="html">&lt;p&gt;Here are the updates in &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;niepce&quot;&gt;Niepce
development&lt;&#x2F;a&gt; for
November 2022.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll try to bring these updates on a more regular basis. In case you
missed it, there was a &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;wlog&#x2F;niepce-update&#x2F;&quot;&gt;May update&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Fall of releases</title>
        <published>2022-10-22T00:00:00+00:00</published>
        <updated>2022-10-22T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/fall-of-releases/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/fall-of-releases/</id>
        
        <content type="html">&lt;p&gt;A couple of Rust crate releases.&lt;&#x2F;p&gt;
&lt;p&gt;Now that the new glib-rs (and gtk-rs) are out, it&#x27;s time for an update
of &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;gudev&quot;&gt;&lt;code&gt;gudev&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; Rust bindings using the
newer version of &lt;code&gt;glib-rs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time I updated
&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;midi-control&quot;&gt;&lt;code&gt;midi-control&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to use a newer
version of &lt;code&gt;midir&lt;&#x2F;code&gt; to iron out a &lt;code&gt;cargo audit&lt;&#x2F;code&gt; warning.&lt;&#x2F;p&gt;
&lt;p&gt;Available from &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;&quot;&gt;crates.io&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing Compiano</title>
        <published>2022-09-23T00:00:00+00:00</published>
        <updated>2022-09-23T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/introducing-compiano/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/introducing-compiano/</id>
        
        <summary type="html">&lt;p&gt;I previously &lt;a href=&quot;https:&#x2F;&#x2F;www.figuiere.net&#x2F;hub&#x2F;blog&#x2F;?2020&#x2F;07&#x2F;11&#x2F;882-introducing-minuit&quot;&gt;introduced
Minuit&lt;&#x2F;a&gt;. Later
I got notified that there was also a music education application for
KDE named &lt;a href=&quot;https:&#x2F;&#x2F;minuet.kde.org&#x2F;&quot;&gt;Minuet&lt;&#x2F;a&gt;. So it was natural to yield
the name. It&#x27;s relatively easy to do when you haven&#x27;t had a release.&lt;&#x2F;p&gt;
&lt;p&gt;I decided to rename my application &lt;em&gt;Compiano&lt;&#x2F;em&gt;, a portemanteau word for
&lt;em&gt;Computer Piano&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>RTKit, portals, and Pipewire</title>
        <published>2022-08-12T00:00:00+00:00</published>
        <updated>2022-08-12T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/rtkit-portal-pipewire/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/rtkit-portal-pipewire/</id>
        
        <summary type="html">&lt;p&gt;Peeling an onion, or how a bug report in a flatpaked application
lead to fixes in three different part of the stack, but no change in
the application itself.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Release day</title>
        <published>2022-06-25T00:00:00+00:00</published>
        <updated>2022-06-25T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/release-day/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/release-day/</id>
        
        <summary type="html">&lt;p&gt;It&#x27;s release day, sorta. Both libopenraw and Exempi got a new release
within two days. Here is what&#x27;s up.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Update on Niepce</title>
        <published>2022-05-25T00:00:00+00:00</published>
        <updated>2022-05-25T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/niepce-update/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/niepce-update/</id>
        
        <summary type="html">&lt;p&gt;Here we go, when I started &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;niepce&quot;&gt;that
project&lt;&#x2F;a&gt; in 2006, I had plenty
of ideas. I still have, but everything else is in the way, including
me.&lt;&#x2F;p&gt;
&lt;p&gt;Since there have been some amazing apps, like
&lt;a href=&quot;https:&#x2F;&#x2F;www.rawtherapee.com&#x2F;&quot;&gt;RawTherapee&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;www.darktable.org&#x2F;&quot;&gt;Darktable&lt;&#x2F;a&gt;, and possibly some other I
miss, apps fullfilling some of the uses I envisioned for Niepce back
then. Not to mention a few other apps that did just disappear ; that&#x27;s
life, it&#x27;s hard to find maintainers or keep being motivated.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>New Again</title>
        <published>2022-05-24T00:00:00+00:00</published>
        <updated>2022-05-24T00:00:00+00:00</updated>
        <author>
          <name>Hubert Figuière</name>
        </author>
        <link rel="alternate" href="https://www.figuiere.net/hub/wlog/new-again/" type="text/html"/>
        <id>https://www.figuiere.net/hub/wlog/new-again/</id>
        
        <content type="html">&lt;p&gt;Old is new again. Apparently my blog was broken following a PHP
upgrade on the server. tl;dr PHP 8 broke things and code had to be
changed. I don&#x27;t do PHP so I had to guess (I can read it, patch it,
but it&#x27;s a lot of tries).&lt;&#x2F;p&gt;
&lt;p&gt;Anyway I decided to bite the bullet and use a generator. I use
&lt;a href=&quot;https:&#x2F;&#x2F;gohugo.io&quot;&gt;Hugo&lt;&#x2F;a&gt; in other places, but I decided to try
&lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt;. I the past I have used
&lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; but ended up having a bad experience
with the Ruby install. Hugo works fine, it&#x27;s written in Go and end up
being properly packaged in Fedora. Zola (see a naming theme?) is
written in Rust and also well packaged. So it&#x27;s &#x27;Les Misérables&#x27; or
&#x27;La bête humaine&#x27;.&lt;&#x2F;p&gt;
&lt;p&gt;Note that the old blog will stay in place, read only.&lt;&#x2F;p&gt;
&lt;p&gt;This is my wlog: Web Log.&lt;&#x2F;p&gt;
&lt;p&gt;More to come.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
