<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/templates/default/atom.css" type="text/css" ?>

<feed version="0.3" 
   xmlns="http://purl.org/atom/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    
    <link href="https://blog.raymond.burkholder.net/rss.php?version=atom0.3" rel="service.feed" title="Raymond P. Burkholder - Things I Do" type="application/x.atom+xml" />
    <link href="https://blog.raymond.burkholder.net/"                        rel="alternate"    title="Raymond P. Burkholder - Things I Do" type="text/html" />
    <link href="https://blog.raymond.burkholder.net/rss.php?version=2.0"     rel="alternate"    title="Raymond P. Burkholder - Things I Do" type="application/rss+xml" />
    <title mode="escaped" type="text/html">Raymond P. Burkholder - Things I Do</title>
    <tagline mode="escaped" type="text/html">In And Around Technology and The Arts</tagline>
    <id>https://blog.raymond.burkholder.net/</id>
    <modified>2026-07-09T03:48:44Z</modified>
    <generator url="http://www.s9y.org/" version="1.7.2">Serendipity 1.7.2 - http://www.s9y.org/</generator>
    <dc:language>en</dc:language>
    <info mode="xml" type="text/html">
        <div xmlns="http://www.w3.org/1999/xhtml">You are viewing an ATOM formatted XML site feed. Usually this file is inteded to be viewed in an aggregator or syndication software. If you want to know more about ATOM, please visist <a href="http://atomenabled.org/">Atomenabled.org</a></div>
    </info>

    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1363-Drogon-Install.html" rel="alternate" title="Drogon Install" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-07-09T01:42:08Z</issued>
        <created>2026-07-09T01:42:08Z</created>
        <modified>2026-07-09T03:48:44Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1363</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1363</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1363-guid.html</id>
        <title mode="escaped" type="text/html">Drogon Install</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p><a href="https://drogon.org/" target=_blank>drogon</a> is a fast C++ web framework.

<p>Some build notes:

<blockquote><pre>
sudo apt install git cmake build-essential
sudo apt install libjsoncpp-dev uuid-dev zlib1g-dev libsqlite3-dev  \
  libc-ares-dev dia libyaml-cpp-dev libssl-dev libbrotli-dev
git clone https://github.com/drogonframework/drogon
cd drogon
git submodule update --init
mkdir build
cd build
cmake ..
make
sudo make install
</pre></blockquote>

<p>Create a project:

<blockquote><pre>
drogon_ctl create project project_name
cd project_name/build
cmake ..
make
cd ..
# run project, default port is 5555
build/project_name

</pre></blockquote>



 <br /><a href="https://blog.raymond.burkholder.net/index.php?/archives/1363-Drogon-Install.html#extended">Continue reading "Drogon Install"</a>
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1362-Todays-Machine-Learning.html" rel="alternate" title="Today's Machine Learning" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-07-03T02:44:33Z</issued>
        <created>2026-07-03T02:44:33Z</created>
        <modified>2026-07-03T02:44:33Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1362</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1362</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1362-guid.html</id>
        <title mode="escaped" type="text/html">Today's Machine Learning</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p><a href="https://arxiv.org/abs/2607.02046" target=_blank>Fast and Accurate Anomaly Detection in Time Series</a> - is this the cat's meow?

<blockquote>
<p><Anomaly detection is a critical and evolving field in Machine Learning, with
applications targeting different domains such as cybersecurity, finance,
healthcare, manufacturing and IoT (Internet of Things) systems. Traditionally,
anomaly detection algorithms have been designed using both supervised and
unsupervised learning paradigms. 
<p>The fundamental challenge in real-world
anomaly detection scenarios is related to the inherent class imbalance
(anomalies are typically rare) and, for supervised methods, to the scarcity of
labelled anomalous data. Indeed, labelling is both expensive and
time-consuming. Conversely unsupervised methods do not require labelling, but
may suffer from high false positive rates when deployed in safety-critical
applications. 
<p>In this work we introduce a novel unsupervised algorithm for
anomaly detection in time series based on the Haar discrete wavelet and a
suitably designed $t$-test. We establish the theoretical foundation of the
proposed $t$-test and, through extensive experimentation across 343 datasets,
demonstrate that our algorithm outperforms state-of-the-art unsupervised and
self-supervised benchmarks.
</blockquote> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1361-Weekend-Reading.html" rel="alternate" title="Weekend Reading" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-06-28T18:15:12Z</issued>
        <created>2026-06-28T18:15:12Z</created>
        <modified>2026-06-28T18:20:18Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1361</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1361</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1361-guid.html</id>
        <title mode="escaped" type="text/html">Weekend Reading</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <ul>
  <li><a href="https://grep.be/blog//en/computer/Agentic_coding_and_Free_Software/" target=_blank>Agentic coding and Free Software</a> - getting started with LLMs with WindSurf
  <li><a href="https://gwolf.org/2026/06/systemd-for-linux-sysadmins.html" target=_blank>systemd for Linux SysAdmins</a> - there is a book out about systemd - history and usage
  <li><a href="https://abbbi.github.io//sync/" target=_blank>vmsync</a> - released <a href="https://github.com/abbbi/vmsync" target=_blank>vmsync</a>. A small golang utility that implements a simple replication tool using the NBD protocol to sync virtual machines to other hosts.
  </ul> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1360-NUT-USB-APC-BeagleBone.html" rel="alternate" title="NUT USB APC BeagleBone" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-06-28T01:10:00Z</issued>
        <created>2026-06-28T01:10:00Z</created>
        <modified>2026-06-28T02:07:09Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1360</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1360</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1360-guid.html</id>
        <title mode="escaped" type="text/html">NUT USB APC BeagleBone</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>I have an APC Smart UPS 1500 connected via USB cable to a BeagleBone Green running NUT 2.8.1-5 on Linux 6.18.36-bone40.  Even on earlier Linux kernels and versions of NUT, during some sort of UPS transition, I would start to get a log full of the these error messages:

<blockquote><pre>
usbhid-ups: nut_libusb_get_report: No such device (it may have been disconnected)
</pre></blockquote>

<p>In detail:

<blockquote><pre>
kernel: musb-hdrc musb-hdrc.1: Babble
kernel: usb 1-1: USB disconnect, device number 15
kernel: usb 1-1.4: USB disconnect, device number 16
kernel: usb 1-1: new high-speed USB device number 17 using musb-hdrc
kernel: usb 1-1: New USB device found, idVendor=1a40, idProduct=0201, bcdDevice= 1.00
kernel: usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
kernel: usb 1-1: Product: USB 2.0 Hub [MTT]
kernel: hub 1-1:1.0: USB hub found
kernel: hub 1-1:1.0: 7 ports detected
kernel: usb 1-1.4: new full-speed USB device number 18 using musb-hdrc
kernel: usb 1-1.4: New USB device found, idVendor=051d, idProduct=0003, bcdDevice= 0.01
kernel: usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: usb 1-1.4: Product: Smart-UPS_1500 FW:UPS 06.0 / ID=1028
kernel: usb 1-1.4: Manufacturer: American Power Conversion
kernel: usb 1-1.4: SerialNumber: unique_number
kernel: hid-generic 0003:051D:0003.0008: hiddev0,hidraw0: USB HID v1.11 Device [American Power Conversion  Smart-UPS_1500 FW:UPS 06.0 / ID=1028] on usb-musb-hdrc.1-1.4/input0
usbhid-ups[31894]: nut_libusb_get_report: No such device (it may have been disconnected)
usbhid-ups[31894]: nut_libusb_get_report: No such device (it may have been disconnected)
</pre></blockquote>

<p>For some reason, USB devices 'disconnect' and reconnect.  Then the device reconnects, a new DeviceID is assigned to the USB device.  This breaks the usbhid-ups drivers supplied by NUT the packages.  That is, usbhid-ups no longer sees the APC USB device.

<p>One forum article suggested that there is not enough power in the BeagleBone system to propery power a USB connection.  The suggested solution is to add a powered USB hub.  I gave that a try with no success in eliminating the problem.

<p> To resolve this, I'm not sure if recent versions of the driver fix this, but I used Debian's udev system to sense the device id change and to restart the NUT USB driver.

<p>In /home/debian, which is the default home directory, I created two files and ran 'chmod +x' on each to make them executable.  When a USB 'ADD' state is detected, nut.target is restarted to initiate the detection and connection process.  When a removal is detected, the service is stopped.  The stop does not seem to be reliable, but the restart appears to be reliable enough to get things started again.

<blockquote><pre>
$ cat usb_add.sh
#!/usr/bin/env bash

logger "USB state change detected: $1 $2 $3"
echo "$(date) USB state change detected: $1 $2 $3" >> /home/debian/usb-log.txt
systemctl restart nut.target
exit 0
</pre></blockquote>

<blockquote><pre>
$ cat usb_remove.sh
#!/usr/bin/env bash

logger "USB state change detected: $1 $2"
echo "$(date) USB state change detected: $1 $2" >> /home/debian/usb-log.txt
#systemctl stop nut.target
exit 0
</pre></blockquote>

<p>To determine useful attributes I used the following (the first is a shorter result than the second):

<blockquote><pre>
udevadm info --name=/dev/bus/usb/001/017 
udevadm info --name=/dev/bus/usb/001/017 --attribute-walk
</pre></blockquote>

<p>The rule which invokes these scripts is:

<blockquote><pre>
# cat  /etc/udev/rules.d/89-usb-ups-change.rules
SUBSYSTEM=="usb", MODE="0660", ACTION=="add",    ENV{ID_VENDOR_ID}=="051d", ENV{ID_MODEL_ID}=="0003", RUN+="/home/debian/usb_add.sh add '$env{DEVNAME}' '$env{ID_USB_SERIAL}'"
SUBSYSTEM=="usb", MODE="0660", ACTION=="remove", RUN+="/home/debian/usb_remove.sh remove $env{DEVNAME}"
</pre></blockquote>

<p>These command variations were suggested to simulate a cable re-connect but did not reliably work.  I resorted to physically disconnecting and reconnecting the cable to perform a proper test for tuning and production (using the major:minor usb device manufacturer code):

<blockquote><pre>
# major:minor usb device manufacturer code
usbreset 051d:0003
# dev bus id
udevadm test /dev/bus/usb/001/007
</pre></blockquote>

<p>Each rule change test required the following to reload the udev rules:

<blockquote><pre>
udevadm control --reload-rules
</pre></blockquote>

<p>To see what Nut sees:

<blockquote><pre>
# nut-scanner -U
Scanning USB bus.
[nutdev1]
        driver = "apc_modbus"
        port = "auto"
        vendorid = "051D"
        productid = "0003"
        product = "Smart-UPS_1500 FW:UPS 06.0 / ID=1028"
        serial = "unique id"
        vendor = "American Power Conversion"
        bus = "001"
        device = "017"
        busport = "002"
        ###NOTMATCHED-YET###bcdDevice = "0001"
</pre></blockquote>

<p>A linux command provides a concise device and manufacturer id:

<blockquote><pre>
# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 016: ID 050d:0234 Belkin Components F5U234 USB 2.0 4-Port Hub
Bus 001 Device 017: ID 051d:0003 American Power Conversion UPS
</pre></blockquote>

<p>Other troubleshooting commands include:

<blockquote><pre>
udevadm monitor
</pre><blockquote>

<p>This solution for those who might encounter <a href="https://github.com/networkupstools/nut/issues/3385" target=_blank>Update 2.7.4 to 2.8.4 CP UPS driver disconnect (nut_libusb_get_report: No such device)</a> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1359-Weekend-Reading.html" rel="alternate" title="Weekend Reading" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-05-31T21:16:10Z</issued>
        <created>2026-05-31T21:16:10Z</created>
        <modified>2026-05-31T21:16:10Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1359</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1359</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1359-guid.html</id>
        <title mode="escaped" type="text/html">Weekend Reading</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <ul>
  <li><a href="https://vincent.bernat.ch/en/blog/2026-akvorado-rib-sharding" target=_blank>Scaling Akvorado BMP RIB with sharding</a>
  <li><a href="http://www.hungry.com/~pere/blog/Command_line_Norse_God_of_Wind_Hr_svelg_move_the_clouds.html" target=_blank>Command line Norse God of Wind Hræsvelg move the clouds</a>
  <li><a href="https://github.com/danielmiessler/fabric/" target=_blank>Fabric</a> is an open-source framework for augmenting humans using AI. It provides a modular system for solving specific problems using a crowdsourced set of AI prompts that can be used anywhere. 
  <li><a href="https://blog.einval.com/2026/05/22#secure_boot_ca_rollover" target=_blank>Secure Boot and Microsoft CA Rollover</a> - a heads-up for distributions
  <li><a href="https://ram.tianon.xyz/post/2026/05/20/container-security.html" target=_blank>Containers Are a Security Boundary (some assembly required)</a>
  <li><a href="https://arma.sourceforge.net/" target=_blank>Armadillo</a> - C++ library for linear algebra &amp; scientific computing
  </ul>








 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1357-SSMS-22-Offline-Installation-SQL-Server-Management-Studio-22.html" rel="alternate" title="SSMS 22 Offline Installation - SQL Server Management Studio 22" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-05-25T01:42:00Z</issued>
        <created>2026-05-25T01:42:00Z</created>
        <modified>2026-05-25T03:21:28Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1357</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1357</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1357-guid.html</id>
        <title mode="escaped" type="text/html">SSMS 22 Offline Installation - SQL Server Management Studio 22</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>I had someone <a href="https://learn.microsoft.com/en-us/ssms/install/create-offline" target=_blank>Create an offline installation of SQL Server Management Studio</a> for me. It was a fun install.  Sarcasm intended.  The installer could be so much smaller I think if it didn't have so many language packs in one bundle.  Why not, if building an offline installer, why not allow a language selection right there.

<p>The first step was to learn to start the installer from the command line with:

<blockquote><pre>
SSMS_22.2.1\vs_SSMS_22.2.1.exe --noWeb
</pre></blockquote>

<p>At this point, it would unpack files and then silently quit.  No messages at the command line.  

<p>The logs indicate an invalid certificate:

<blockquote><pre>
Certificate is invalid: C:\temp\SSMS_22.2.1\vs_installer.opc
Error 0x80131509: Signature verification failed. 
Error: Unable to verify the integrity of the installation files: the certificate could not be verified.
</pre></blockquote>

<p>Three of the certificates can be installed with:

<blockquote><pre>
certutil.exe -addstore -f "Root" "SSMS_22.2.1\certificates\manifestCounterSignRootCertificate.cer"
certutil.exe -addstore -f "Root" "SSMS_22.2.1\certificates\manifestRootCertificate.cer.cer"
certutil.exe -addstore -f "Root" "SSMS_22.2.1\certificates\vs_installer_opc.RootCertificate.cer"
</pre></blockquote>

<p>By looking at the logs, there is a fourth certificate, but missing, so needs to be copied and installed in a similar manner from <a href="https://github.com/loopcoder/Visual-Studio-Tool/blob/master/Microsoft%20Windows%20Code%20Signing%20PCA%202024.crt" target=_blank>Microsoft Windows Code Signing PCA 2024.crt (github)</a> or <a href="http://www.microsoft.com/pkiops/certs/Microsoft Windows Code Signing PCA 2024.crt" target=_blank>Microsoft Windows Code Signing PCA 2024.crt (microsoft.com)</a>

<p>The final hurdle has to Microsoft ODBC Driver installation.  It installs Microsoft ODBC Driver 18 for SQL Server ok.  But it fails while installing Microsoft OLEDB Driver 19 for SQL Server with a message along the lines of:
<blockquote><pre>
This application requires 
Microsoft Visual C++ Redistributable for Visual Studio 2022 
(x64/x86, version 14.38 at minimum)
</pre></blockquote>

<p>It fails even when installing <a href="https://learn.microsoft.com/en-ca/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-supported-redistributable-version" target_blank>Latest supported redistributable version x64</a>.

<p>The secret here is that the x86 version also has to be downloaded and installed.  So you should have both installers:

<blockquote><pre>
VC_redist.x64.exe
VC_redist.x86.exe
</pre></blockquote>

<p>As a final note, the installer logs are in C:\Users\&lt;UserName&gt;\AppData\Local\Temp and are named dd_setup_yyyymmddhhmm_errors.log. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1358-Linux-Copying-file-to-clipboard.html" rel="alternate" title="Linux - Copying file to clipboard" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-05-25T02:25:44Z</issued>
        <created>2026-05-25T02:25:44Z</created>
        <modified>2026-05-25T02:25:44Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1358</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1358</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1358-guid.html</id>
        <title mode="escaped" type="text/html">Linux - Copying file to clipboard</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Install tool:
<blockquote><pre>
sudo apt install xclip
</pre></blockquote>

<p>Perform the copy:

<blockquote><pre>
cat filename.base64 | xclip -rmlastnl -selection clipboard
</pre></blockquote> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1356-Installing-Citrix-Workspace-on-Debian.html" rel="alternate" title="Installing Citrix Workspace on Debian" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-05-10T00:36:22Z</issued>
        <created>2026-05-10T00:36:22Z</created>
        <modified>2026-05-10T01:04:24Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1356</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1356</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1356-guid.html</id>
        <title mode="escaped" type="text/html">Installing Citrix Workspace on Debian</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>On installation, the Citrix Workspace installer will ask for libwebkit2gtk-4.0-37.  However, in the latest Debian, libwebkit2gtk-4.1-0 is installed.  That package brings in many other packages so there is no practical way to install an earlier version.

<p>The solution to this give the older <b>Debian Bookworm</b> a try where the package is available for installation.

<blockquote><pre>
> apt-cache search libwebkit2gtk
libwebkit2gtk-4.0-37 - Web content engine library for GTK
libwebkit2gtk-4.0-dev - Web content engine library for GTK - development files
libwebkit2gtk-4.0-doc - Web content engine library for GTK - documentation
libwebkit2gtk-4.1-0 - Web content engine library for GTK
libwebkit2gtk-4.1-dev - Web content engine library for GTK - development files
</pre></blockquote>

<p>To prep for Citrix installation, install the following:

<blockquote><pre>
# apt install libwebkit2gtk-4.0-37 libcurl4 libspeexdsp1
</pre></blockquote> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1355-Frigate-Running-in-Docker-inside-LXC-on-Proxmox.html" rel="alternate" title="Frigate Running in Docker inside LXC on Proxmox" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-28T01:58:50Z</issued>
        <created>2026-04-28T01:58:50Z</created>
        <modified>2026-04-28T02:37:31Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1355</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1355</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1355-guid.html</id>
        <title mode="escaped" type="text/html">Frigate Running in Docker inside LXC on Proxmox</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Once all the GPU and Docker prerequisites are in place, installing frigate-nve is easy: a) build a yaml file, b) docker compose the file.

<p>In the LXC container, create a frigate directory and move into it:

<blockquote><pre>
mkdir frigate
cd frigate
</pre></blockquote>

<p>In that directory, here is the content of my docker-compose-yaml file:

<blockquote><pre>
services:
  frigate:
    container_name: frigate
    #privileged: true # this may not be necessary for all setups
    restart: unless-stopped
    stop_grace_period: 30s # allow enough time to shut down the various services
    image: ghcr.io/blakeblackshear/frigate:stable
    shm_size: "1512mb" # updated for my camera list based upon error messages in the log
#    devices:
#      - /dev/dri/renderD128:/dev/dri/renderD128 # AMD / Intel GPU, needs to be updated for your hardware
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              #device_ids: ['0'] # this is only needed when using multiple GPUs
              count: 1 # number of GPUs
              capabilities: [gpu]
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /root/frigate/config:/config
      - /root/frigate/storage:/media/frigate
      - type: tmpfs # 1GB In-memory filesystem for recording segment storage
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
      - "8971:8971"
      # - "5000:5000" # Internal unauthenticated access. Expose carefully.
      - "8554:8554" # RTSP feeds
      - "8555:8555/tcp" # WebRTC over tcp
      - "8555:8555/udp" # WebRTC over udp
    environment:
      FRIGATE_RTSP_PASSWORD: "xxxxxxx"
</pre></blockquote>

<p>Get it started:

<blockquote><pre>
# in a foreground process:
docker compose up
# or, as a background process:
docker compose up -d frigate
</pre></blockquote>

<p>The login should be seen at something like (or your container's address):

<pre>
https://127.0.0.1:8971/
</pre>

<p>Official installation documentation:

<ul>
  <li><a href="https://docs.frigate.video/frigate/installation/" target=_blank>Frigage NVR Installation</a>
  </ul> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1347-Docker-Notes.html" rel="alternate" title="Docker Notes" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-05T00:26:37Z</issued>
        <created>2026-04-05T00:26:37Z</created>
        <modified>2026-04-28T01:39:45Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1347</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1347</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1347-guid.html</id>
        <title mode="escaped" type="text/html">Docker Notes</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Images vs Containers
<ul>
  <li>Docker Image: blueprint with app code and dependencies - static, read-only
  <li>Docker Container: running instance of an image - dynamic, executable
  </ul>

<p>Each instruction in the Dockerfile adds an extra layer to the Docker image. Minimize the number of layers by consolidating the instructions to increase the build’s performance and time.

<p>Avoid using multiple RUN commands as it creates multiple cacheable layers which will affect the efficiency of the build process.

<p>Use a single process per container: Each container should run a single process. This makes it easier to manage and monitor containers and helps to keep containers lightweight.

<p>Images can exist without containers, whereas a container needs an image to run. We can create multiple containers from the same image, each with its own unique data and state

<p>Docker commands
<ul>
  <li><b>Docker Run</b>: It used for launching the containers from images, with specifying the runtime options and commands. 
  <li><b>Docker Pull</b>: It fetches the container images from the container registry like Docker Hub to the local machine. 
  <li><b>Docker ps</b>: It helps in displaying the running containers along with their important information like container ID, image used and status. 
  <li><b>Docker Stop</b>: It helps in halting the running containers gracefully shutting down the processes within them. 
  <li><b>Docker Start</b>: It helps in restarting the stopped containers, resuming their operations from the previous state. 
  <li><b>Docker Login</b>: It helps to login in to the docker registry enabling the access to private repositories. 
  </ul>

<p>Docker network commands:
<ul>
  <li>docker network ls
  <li>docker network inspect <id>
  </ul>

<p>Docker image commands:
<ul>
  <li>docker image ls -a
  <li>docker container ls -a
  </ul>

<p>Documentation
<ul>
  <li><a href="https://docs.docker.com/reference/dockerfile" target=_blank>Dockerfile reference</a> - <a href="https://www.geeksforgeeks.org/devops/what-is-dockerfile-syntax/" target=_blank>examples</a>
  <li><a href="https://docs.docker.com/build/concepts/dockerfile/" target=_blank>Dockerfile overview</a> - with example
  <li><a href="https://docs.docker.com/engine/cli/completion/" target=_blank>Command Line Completion</a>
  <li><a href="https://docs.docker.com/build/building/base-images/" target=_blank>Base images</a> - includes building from scratch
  <li><a href="https://docs.docker.com/get-started/docker_cheatsheet.pdf" target=_blank>CLI Cheat Sheet</a>
  <li><a href="https://www.geeksforgeeks.org/devops/docker-tutorial/" target=_blank>tutorial</a>
  </ul>
 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1352-Prepping-nvidia-drivers-for-Frigate-Running-in-Docker-inside-LXC-on-Proxmox.html" rel="alternate" title="Prepping nvidia drivers for Frigate Running in Docker inside LXC on Proxmox" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-27T02:34:23Z</issued>
        <created>2026-04-27T02:34:23Z</created>
        <modified>2026-04-28T01:38:07Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1352</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1352</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1352-guid.html</id>
        <title mode="escaped" type="text/html">Prepping nvidia drivers for Frigate Running in Docker inside LXC on Proxmox</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Not having the desire to put frigate on a standalone server of some sort, I wanted it to run as a container in Proxmox.  Since Frigate is supplied as a Docker container, and I don't want to run Docker directly on the Proxmox host, there are two choices open to me:  

<ul>
  <li>run Frigate in a virtual machine - prevents sharing an Nvidia card with other machines or containers, or 
  <li>run Frigate in an LXC or an OCI container - an Nvidia card can be shared with multiple containers, and resource requirements are reduced, at the risk of security issues (which are reduced if the host is a private server)
  </ul>

<p>I'm running on Proxmox 9.1.9 with kernel SMP PREEMPT_DYNAMIC PMX 6.17.13-4 (2026-04-21T22:03Z) x86_64 GNU/Linux

<p>This installation is a privileged container as I had troubles with non-privileged.  I'll have to come back to this based upon:  
<a href="https://jocke.no/2022/02/23/plex-gpu-transcoding-in-docker-on-lxc-on-proxmox/#unprivileged-lxc" target=_blank>Running in rootless LXC</a>, and maybe require the user id mapping from <a href="https://pve.proxmox.com/wiki/Unprivileged_LXC_containers" target=_blank>Unprivileged LXC containers</a>.

<p>Some installation commands, based upon connecting Frigate to an Nvidia GPU.  Some instructions come from 
<a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html" target=_blank>Installing the NVIDIA Container Toolkit</a>, which is required for connecting to the Nvidia GPU (commands assume sudo or running as root, which is default in a basic LXC container).  The link contains installation, testing and troubleshooting instructions.

 <br /><a href="https://blog.raymond.burkholder.net/index.php?/archives/1352-Prepping-nvidia-drivers-for-Frigate-Running-in-Docker-inside-LXC-on-Proxmox.html#extended">Continue reading "Prepping nvidia drivers for Frigate Running in Docker inside LXC on Proxmox"</a>
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1343-NVidia-GPU-Passthrough-to-ProxMox-LXC-Container.html" rel="alternate" title="NVidia GPU Passthrough to ProxMox LXC Container" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-03-28T17:26:45Z</issued>
        <created>2026-03-28T17:26:45Z</created>
        <modified>2026-04-27T05:41:54Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1343</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1343</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1343-guid.html</id>
        <title mode="escaped" type="text/html">NVidia GPU Passthrough to ProxMox LXC Container</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p><a href="https://www.virtualizationhowto.com/2025/05/how-to-enable-gpu-passthrough-to-lxc-containers-in-proxmox/" target=_blank>How to Enable GPU Passthrough to LXC Containers in Proxmox</a> indicates that the process of providing passthrough of a GPU to both an LXC container as well as a Virtual Machine is not possible as the two types of configurations conflict with each other.

<p>As my own preference is to run whatever possible in LXC containers, I'll summarize the configuration I used, which is an amalgamation of configurations from several sites.
<p>My current installation is ProxMox v9.1.6 with:

<ul>
  <li>ProArt Z890-CREATOR WIFI
  <li>Intel(R) Core(TM) Ultra 9 285K
  <li>Corsair CMP64GX5M2X6600C32 (128G  4400 MT/s) - ECC would have been nice
  <li>NVIDIA Corporation AD103 [GeForce RTX 4070] (rev a1)
  </ul>

<p>In BIOS/UEFI, enable these:
<ul>
  <li>VT-d / IOMMU
  <li>Above 4G Decoding
  <li>PCIe Native Power Management (if available)
  </ul>

<p>Proxmox kernel parameters:
<blockquote><pre>
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"

update-grub
reboot
</pre></blockquote>

<p><a href="https://www.kernel.org/doc/html/latest/driver-api/vfio.html" target=_blank>VFIO Binding</a> - optional but recommended:
<blockquote><pre>
# /etc/modprobe.d/vfio.conf
options vfio_iommu_type1 allow_unsafe_interrupts=1
</pre></blockquote>

<p>Obtain Linux drivers from <a href="https://www.nvidia.com/en-us/drivers/" target=_blank>NVidia</a>.  The CUDA toolkit is not required.  Only the drivers are required in ProxMox.  Toolkits and add-ons are added within the container.

<p>Install the drivers:
<blockquote><pre>
apt install build-essential
apt install pve-headers-$(uname -r)
sh NVIDIA-Linux-x86_64-595.58.03.run
# note, use the open kernel, rather than proprietary
</pre></blockquote>

<p>Blacklist nouveau:
<blockquote><pre>
cat > /etc/modprobe.d/blacklist-nouveau.conf << EOF
blacklist nouveau
options nouveau modeset=0
EOF
</pre></blockquote>

<p>Test that the card is accessible:
<blockquote><pre>
nvidia-smi
</pre></blockquote>

<p>Enable <a href="https://docs.nvidia.com/deploy/driver-persistence/data-persistence.html" target=_blank>Data Persistence</a> to prevent the GPU from re-initializing with each use.
<blockquote><pre>
nvidia-persistenced --persistence-mode
systemctl enable nvidia-persistenced
</pre></blockquote>

<p>Then restart:
<blockquote><pre>
reboot
</pre></blockquote>

<p>Identify the nvidia devices requiring passthrough:
<blockquote><pre>
root@host02:~# ls -al /dev/nvidia*
crw-rw-rw- 1 root root 195,   0 Mar 28 11:58 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar 28 11:58 /dev/nvidiactl
crw-rw-rw- 1 root root 505,   0 Mar 28 11:58 /dev/nvidia-uvm
crw-rw-rw- 1 root root 505,   1 Mar 28 11:58 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
total 0
drwxr-xr-x  2 root root     80 Mar 28 11:58 .
drwxr-xr-x 21 root root   5060 Mar 28 11:58 ..
cr--------  1 root root 508, 1 Mar 28 11:58 nvidia-cap1
cr--r--r--  1 root root 508, 2 Mar 28 11:58 nvidia-cap2
</pre></blockquote>

<p>Note the numbers 195, 505 and 508 in this list (yours may be different).

<p>Construct a container, and prior to starting, place the following into /etc/pve/lxc/&lt;vmid&gt;.conf (based upon the device listing above):
<blockquote><pre>
dev0: /dev/nvidia0
dev1: /dev/nvidiactl
dev2: /dev/nvidia-modeset
dev3: /dev/nvidia-uvm
dev4: /dev/nvidia-uvm-tools
dev5: /dev/nvidia-caps/nvidia-cap1
dev6: /dev/nvidia-caps/nvidia-cap2
</pre></blockquote>

<p>These lines are optional in the config file, one site talks about them by my container seems to work without them  (they may be an old style cgroup2 style passthrough rather than the device oriented passthrough above):
<blockquote><pre>
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 505:* rwm
lxc.cgroup2.devices.allow: c 508:* rwm
</pre></blockquote>


<p>Start the container and push the driver file into the container:
<blockquote><pre>
pct push &lt;vmid&gt; downloads/NVIDIA-Linux-x86_64-595.58.03.run /root/NVIDIA-Linux-x86_64-595.58.03.run
</pre></blockquote>

<p>In the container, install the driver, minus the kernel module:
<blockquote><pre>
apt install kmod
sh NVIDIA-Linux-x86_64-595.58.03.run --no-kernel-modules
</pre></blockquote>

<p>Run nvidia-smi in the container to confirm the card is reachable.

<p>Add nvtop at the host or the container level to chart live GPU utllization:
<blockquote><pre>
apt install nvtop
</pre></blockquote>


<p>Additional resources:
<ul>
  <li><a href="https://www.reddit.com/r/Proxmox/comments/1s629rq/complete_gpu_passthrough_guide_for_ai_workloads_t/" target=_blank>Complete GPU passthrough guide for AI workloads, avoid the mistakes I made so you don't have to </a>
  <li><a href="https://forum.proxmox.com/threads/nvidia-drivers-instalation-proxmox-and-ct.156421/" target=_blank>[TUTORIAL] NVIDIA drivers instalation Proxmox and CT</a>
  <li><a href="https://www.virtualizationhowto.com/2025/05/how-to-enable-gpu-passthrough-to-lxc-containers-in-proxmox/" target=_blank>How to Enable GPU Passthrough to LXC Containers in Proxmox</a> - contains ollama startup examples with OpenWebUI
  </ul>

<p>Another type of test to run when pytorch is installed:
<blockquote><pre>
python -c "import torch; print(torch.cuda.is_available())"
</pre></blockquote>

<p>NOTE: for running in unprivileged container, some ideas in <a href="https://jocke.no/2025/04/20/plex-gpu-transcoding-in-docker-on-lxc-on-proxmox-v2/" target=_blank>Plex GPU transcoding in Docker on LXC on Proxmox v2</a>:

<blockquote><pre>
# if you're running in unprivileged mode, you also need to add permissions
# you either add the lines above, or the lines below -- not both
# gid/uid might need to be changed to suit your lxc-setup
dev0: /dev/nvidia0,gid=1000,uid=1000
dev1: /dev/nvidiactl,gid=1000,uid=1000
dev2: /dev/nvidia-modeset,gid=1000,uid=1000
dev3: /dev/nvidia-uvm,gid=1000,uid=1000
dev4: /dev/nvidia-uvm-tools,gid=1000,uid=1000
dev5: /dev/nvidia-caps/nvidia-cap1,gid=1000,uid=1000
dev6: /dev/nvidia-caps/nvidia-cap2,gid=1000,uid=1000
dev7: /dev/dri/card0,gid=1000,uid=1000
dev8: /dev/dri/renderD128,gid=1000,uid=1000
</pre></blockquote>
 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1354-Ensuring-nvidia-drivers-in-Proxmox-start-up-prior-to-containers.html" rel="alternate" title="Ensuring nvidia drivers in Proxmox start up prior to containers" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-27T03:33:14Z</issued>
        <created>2026-04-27T03:33:14Z</created>
        <modified>2026-04-27T03:35:16Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1354</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1354</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1354-guid.html</id>
        <title mode="escaped" type="text/html">Ensuring nvidia drivers in Proxmox start up prior to containers</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>From <a href="https://jocke.no/2025/04/20/plex-gpu-transcoding-in-docker-on-lxc-on-proxmox-v2/" target=_blank>Plex GPU transcoding in Docker on LXC on Proxmox v2</a>:

<blockquote><pre>
# make sure that all nvidia devices are loaded upon boot
cat >/etc/systemd/system/nvidia-pre-lxc-init.service <<'EOF'
[Unit]
Description=Initialize NVIDIA devices early (before Proxmox guests)
After=systemd-modules-load.service
Before=pve-guests.service
Wants=pve-guests.service

[Service]
Type=oneshot
RemainAfterExit=yes

ExecStartPre=-/sbin/modprobe nvidia
ExecStartPre=-/sbin/modprobe nvidia_uvm
ExecStart=-/usr/bin/nvidia-smi -L
ExecStart=-/usr/bin/nvidia-modprobe -u -c=0

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable nvidia-pre-lxc-init.service
</pre></blockquote>

<p>reboot then try nvidia-smi to confirm function. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1353-Some-Tools-to-Add.html" rel="alternate" title="Some Tools to Add" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-27T03:17:03Z</issued>
        <created>2026-04-27T03:17:03Z</created>
        <modified>2026-04-27T03:17:03Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1353</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1353</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1353-guid.html</id>
        <title mode="escaped" type="text/html">Some Tools to Add</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <ul>
  <li><a href="https://www.xda-developers.com/finally-found-local-llm-i-want-to-use-every-day/" target=_blank>Qwen 3.5 9B</a> - general purpose locally run LLM
  <li><a href="https://community-scripts.org/scripts/octoprint?id=octoprint" target=_blank>OctoPrint</a> - web-based 3D printer control software that allows you to remotely control and monitor your 3D printer from a web interface. It was designed to be compatible with a wide range of 3D printers.
  <li><a href="https://community-scripts.org/scripts/trilium?id=trilium" target=_blank>Trilium Notes</a> -  self-hosted note-taking and personal knowledge management application. It enables users to organize information in a hierarchical tree structure and supports rich text editing, internal linking, images, attachments, and powerful scripting capabilities. This version reflects the most current development efforts under the TriliumNext organization and replaces all prior forks or legacy variants. Trilium is ideal for building personal wikis, structured documentation, and long-term knowledge archives, giving users full local control and privacy.
  <li><a href="https://community-scripts.org/scripts/vaultwarden?id=vaultwarden" target=_blank>Vaultwarden</a> - self-hosted password manager which provides secure and encrypted password storage. It uses client-side encryption and provides access to passwords through a web interface and mobile apps.
  <li><a href="https://community-scripts.org/scripts/netbox?id=netbox" target=_blank>NetBox</a> - the source of truth for everything on your network, from physical components like power systems and cabling to virtual assets like IP addresses and VLANs. Network automation and observability tools depend on NetBox’s authoritative data to roll out configurations, monitor changes, and accelerate operations across the enterprise
  <li><a href="" target=_blank></a>
  </ul> 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1349-Git-Summaries.html" rel="alternate" title="Git Summaries" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-11T02:59:21Z</issued>
        <created>2026-04-11T02:59:21Z</created>
        <modified>2026-04-27T02:34:00Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1349</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1349</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1349-guid.html</id>
        <title mode="escaped" type="text/html">Git Summaries</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p><a href="https://piechowski.io/post/git-commands-before-reading-code/" target=_blank>The Git Commands I Run Before Reading Any Code</a> - some interesting simple queries on a git repository to gain some understanding on development patterns

<p>Most changed files in the last year:
<blockquote>
git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20
</blockquote>

<p>List of contributors:
<blockquote>
git shortlog -sn --no-merges
</blockquote>

<p>Example of looking for hot words in comment messages:
<blockquote>
git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20
</blockquote>

<p>Time line of commits:
<blockquote>
git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c
</blockquote>

<p>Another example of comment keyword searches:
<blockquote>
git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback'
</blockquote>

<p><a href="https://news.ycombinator.com/item?id=47687273" target=_blank>Hacker News</a> - referenced 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="https://blog.raymond.burkholder.net/index.php?/archives/1351-NUT-UPS-USB-Connected-to-Proxmox-Unprivileged-LXC.html" rel="alternate" title="NUT UPS USB Connected to Proxmox Unprivileged LXC" type="text/html" />
        <author>
            <name>Raymond P. Burkholder</name>
                    </author>
    
        <issued>2026-04-25T22:07:41Z</issued>
        <created>2026-04-25T22:07:41Z</created>
        <modified>2026-04-26T18:36:13Z</modified>
        <wfw:comment>https://blog.raymond.burkholder.net/wfwcomment.php?cid=1351</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>https://blog.raymond.burkholder.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=1351</wfw:commentRss>
    
        <id>https://blog.raymond.burkholder.net/index.php?/archives/1351-guid.html</id>
        <title mode="escaped" type="text/html">NUT UPS USB Connected to Proxmox Unprivileged LXC</title>
        <content type="application/xhtml+xml" xml:base="https://blog.raymond.burkholder.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Taking <a href="https://forum.proxmox.com/threads/rtl_433-in-unprivileged-lxc-container-with-automatic-device-path-change.157192/" target=_blank>RTL_433 in unprivileged LXC container, with automatic device path change</a> for inspiration, I was able to connect multiple APC and Eaton UPS USB cables to a server with the following mechanism.  I forwarded the USB connections into an LXC container as I use my <a href="https://github.com/rburkholder/nut2mqtt" target=_blank>nut2mqtt - Communication between Network UPS Tools (NUT) and MQTT</a> for monitoring.

<p>The Proxmox host is configured in a standard way using the primary UPS USB connection (still yet to try).

<p>As a USB cable is inserted, "journalctl -f" will log information similar to:

<blockquote><pre>
Apr 25 15:48:21 host02 kernel: usb 3-4: new full-speed USB device number 10 using xhci_hcd
Apr 25 15:48:21 host02 kernel: usb 3-4: New USB device found, idVendor=051d, idProduct=0002, bcdDevice= 0.90
Apr 25 15:48:21 host02 kernel: usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Apr 25 15:48:21 host02 kernel: usb 3-4: Product: Back-UPS XS 1300G FW:864.L6 .D USB FW:L6
Apr 25 15:48:21 host02 kernel: usb 3-4: Manufacturer: American Power Conversion
Apr 25 15:48:21 host02 kernel: usb 3-4: SerialNumber: 4B12P636
Apr 25 15:48:21 host02 kernel: hid-generic 0003:051D:0002.0007: hiddev3,hidraw5: ......
</pre></blockquote>

<p>Use "lsusb" to determine the bus and device assignment based upon the 'idVendor' and 'idProduct' assignments above:

<blockquote><pre>
# lsusb -d 051d:0002
Bus 003 Device 010: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
</pre></blockquote>

<p>Thus you'll see an associated entry in /dev:

<blockquote><pre>
~# ls -altr /dev/bus/usb/003/010
crw-rw-rw- 1 root root 189, 265 Apr 25 15:48 /dev/bus/usb/003/010
</pre></blockquote>

<p>Note the cgroup2 '189, 265' identifiers.  Adding an entry to your /etc/pve/lxc/&lt;lxc-id&gt;.conf entry will be required:

<blockquote><pre>
lxc.cgroup2.devices.allow: c 189:* rwm
</pre></blockquote>

<p>Whenever the USB cable is plugged in, a different device may be constructed.  To pass that information to Proxmox for when it starts the container, use something like:

<blockquote><pre>
# cat /etc/udev/rules.d/50-ups-usb.rules
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="051d", ENV{ID_MODEL_ID}=="0002", ENV{ID_SERIAL_SHORT}=="4B12P636", MODE="0666", RUN="/usr/sbin/pct set &lt;lxc-id&gt; --dev0 mode=0666,path=$devnode"
</pre></blockquote>

<p>If the file is changed, it can be processed with:

<blockquote><pre>
# reload rules and rerun
udevadm control --reload-rules
udevadm trigger
# optional cable test simulation
udevadm test /dev/bus/usb/003/010
</pre></blockquote>

<p>The ENV{ID_VENDOR_ID}, ENV{ID_MODEL_ID} &amp; ENV{ID_SERIAL_SHORT} variable names and content can be confirmed with:

<blockquote><pre>
# udevadm info  /dev/bus/usb/003/010
P: /devices/pci0000:80/0000:80:14.0/usb3/3-4
M: 3-4
R: 4
J: c189:265
U: usb
T: usb_device
D: c 189:265
N: bus/usb/003/010
L: 0
V: usb
E: DEVPATH=/devices/pci0000:80/0000:80:14.0/usb3/3-4
E: DEVNAME=/dev/bus/usb/003/010
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=51d/2/90
E: TYPE=0/0/0
E: BUSNUM=003
E: DEVNUM=010
E: MAJOR=189
E: MINOR=265
E: SUBSYSTEM=usb
E: USEC_INITIALIZED=2435707957355
E: ID_BUS=usb
E: ID_MODEL=Back-UPS_XS_1300G_FW:864.L6_.D_USB_FW:L6
E: ID_MODEL_ENC=Back-UPS\x20XS\x201300G\x20FW:864.L6\x20.D\x20USB\x20FW:L6\x20
E: ID_MODEL_ID=0002
E: ID_SERIAL=American_Power_Conversion_Back-UPS_XS_1300G_FW:864.L6_.D_USB_FW:L6_4B1233P63346
E: ID_SERIAL_SHORT=4B12P636
E: ID_VENDOR=American_Power_Conversion
E: ID_VENDOR_ENC=American\x20Power\x20Conversion
E: ID_VENDOR_ID=051d
E: ID_REVISION=0090
E: ID_USB_MODEL=Back-UPS_XS_1300G_FW:864.L6_.D_USB_FW:L6
E: ID_USB_MODEL_ENC=Back-UPS\x20XS\x201300G\x20FW:864.L6\x20.D\x20USB\x20FW:L6\x20
E: ID_USB_MODEL_ID=0002
E: ID_USB_SERIAL=American_Power_Conversion_Back-UPS_XS_1300G_FW:864.L6_.D_USB_FW:L6_4B1233P63346
E: ID_USB_SERIAL_SHORT=4B12P636
E: ID_USB_VENDOR=American_Power_Conversion
E: ID_USB_VENDOR_ENC=American\x20Power\x20Conversion
E: ID_USB_VENDOR_ID=051d
E: ID_USB_REVISION=0090
E: ID_USB_INTERFACES=:030000:
E: ID_VENDOR_FROM_DATABASE=American Power Conversion
E: ID_MODEL_FROM_DATABASE=Uninterruptible Power Supply
E: ID_PATH_WITH_USB_REVISION=pci-0000:80:14.0-usbv2-0:4
E: ID_PATH=pci-0000:80:14.0-usb-0:4
E: ID_PATH_TAG=pci-0000_80_14_0-usb-0_4
E: ID_FOR_SEAT=usb-pci-0000_80_14_0-usb-0_4
E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
<pre></blockquote>

<p>Resources:
<ul>
  <li><a href="https://www.man7.org/linux/man-pages/man7/udev.7.html" target=_blank>udev(7) — Linux manual page</a> - Dynamic device management
  <li><a href="https://inegm.dev/persistent-names-for-usb-serial-devices-in-linux-dev-ttyusbx-dev-custom-name-fd49b5db9af1" target=_blank>Persistent names for USB-serial devices in Linux (/dev/ttyUSBx -> /dev/custom-name)</a> - I first looked at doing symlinks, but realized it is not required if I can perform a 'pct set' directly on the container configuration.
  </ul> 
            </div>
        </content>

        
    </entry>
</feed>