<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alfonso Siciliano</title>
    <description>The latest articles on DEV Community by Alfonso Siciliano (@alfonsosiciliano).</description>
    <link>https://dev.to/alfonsosiciliano</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F597101%2Fad685ec8-db9b-4d7b-93c4-921a86b283dc.jpg</url>
      <title>DEV Community: Alfonso Siciliano</title>
      <link>https://dev.to/alfonsosiciliano</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alfonsosiciliano"/>
    <language>en</language>
    <item>
      <title>SysctlTUI is Out!</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Sat, 31 May 2025 00:07:16 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/sysctltui-is-out-9i1</link>
      <guid>https://dev.to/alfonsosiciliano/sysctltui-is-out-9i1</guid>
      <description>&lt;p&gt;The &lt;a href="https://man.freebsd.org/sysctl/3" rel="noopener noreferrer"&gt;sysctl()&lt;/a&gt; system call can get or set the state of the system, the &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; kernel exposes the parameters for &lt;em&gt;sysctl()&lt;/em&gt; as objects of a &lt;em&gt;Management information Base&lt;/em&gt; (MIB).  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/alfix/sysctltui" rel="noopener noreferrer"&gt;sysctltui&lt;/a&gt; is a Text User Interface sysctl MIB explorer. It allow to view a parameter's properties and get or set its value. The first version 0.0.1 is out.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install sysctlmibinfo2 bsddialog
% git clone https://gitlab.com/alfix/sysctltui.git
% cd sysctltui
% make
% ./sysctltui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The utility provides three windows: a main one with the tree, one to view information about the parameter, and one to set a new value.&lt;/p&gt;

&lt;p&gt;Main Window:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/alfix/sysctltui/-/raw/main/screenshots/1.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93il2nrwg37mu9m5nmew.png" alt="Main Window with sysctl mib tree" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parameter Properties:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/alfix/sysctltui/-/raw/main/screenshots/2.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb8jvqq7yex6i0uj6quu.png" alt="Window with parameter's properties" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set Value:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/alfix/sysctltui/-/raw/main/screenshots/3.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F716otycxfyy1ng45dbmj.png" alt="Window with a form to set a new parameter value" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% ./sysctltui -h
usage: sysctltui [-h|v]
       sysctltui [-d|V] [-f] [-e &amp;lt;label&amp;gt;] [-l &amp;lt;label&amp;gt;] [-i &amp;lt;indent&amp;gt;] [-s &amp;lt;label&amp;gt;]

 -d     Show parameter descriptions in the main window.
 -e &amp;lt;label&amp;gt; Set prefix for nodes with expandable subtree.
 -f     Display full parameter names in the main window.
 -h     Show this help message and exit.
 -i &amp;lt;indent&amp;gt;    Set the visual depth of subtrees.
 -l &amp;lt;label&amp;gt; Set prefix for leaf nodes.
 -s &amp;lt;label&amp;gt; Set prefix for nodes with expanded subtrees.
 -V     Display parameter values in the main window.
 -v     Show version and exit.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;, layout similar to &lt;a href="https://man.freebsd.org/cgi/man.cgi?sysctl(8)" rel="noopener noreferrer"&gt;sysctl&lt;/a&gt; or &lt;a href="https://www.freshports.org/sysutils/nsysctl/" rel="noopener noreferrer"&gt;sysutils/nsysctl&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;[n]sysctl&lt;/th&gt;
&lt;th&gt;sysctltui&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;% [n]sysctl -a&lt;/td&gt;
&lt;td&gt;% sysctltui -fV -i 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;% [n]sysctl -an&lt;/td&gt;
&lt;td&gt;% sysctltui -f -i 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;% [n]sysctl -ad&lt;/td&gt;
&lt;td&gt;% sysctltui -fd -i 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;sysctltui is still in its early stages; it is currently at version 0.0.1. It provides some functionality similar to &lt;a href="https://www.freshports.org/sysutils/nsysctl/" rel="noopener noreferrer"&gt;nsysctl&lt;/a&gt; and &lt;a href="https://www.freshports.org/deskutils/sysctlview" rel="noopener noreferrer"&gt;sysctlview&lt;/a&gt;, but many features still need to be implemented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TODO list&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add: [View] menu: Rebuild Tree, Expande Tree, Collapse Tree,
Show desc, Show Value, Clear screen.&lt;/li&gt;
&lt;li&gt;Add: kelvin format.&lt;/li&gt;
&lt;li&gt;Add: Opaque(s).&lt;/li&gt;
&lt;li&gt;Improve: sort children.&lt;/li&gt;
&lt;li&gt;Add: /etc/sysctl.conf and /boot/loader.conf.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suggestions, feedback, and new ideas are welcome.&lt;/p&gt;




</description>
      <category>freebsd</category>
      <category>kernel</category>
      <category>terminal</category>
    </item>
    <item>
      <title>WebSysctl is Now Live!</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Mon, 28 Apr 2025 06:54:48 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/websysctl-is-now-live-1m0l</link>
      <guid>https://dev.to/alfonsosiciliano/websysctl-is-now-live-1m0l</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; Operating System provides the sysctl system call and utility to get and set system state at runtime. The kernel exposes available parameters for sysctl as objects in a Management Information Base (MIB).&lt;/p&gt;

&lt;p&gt;Today, FreeBSD includes thousands of sysctl parameters. Moreover, parameters can be added or removed dynamically. Each computer probably builds a different MIB. To help navigate this, the kernel provides additional features for exploring the MIB and retrieving extra information about each object (such as name, description, format, and so on).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://websysctl.alfonsosiciliano.net" rel="noopener noreferrer"&gt;WebSysctl&lt;/a&gt; aims to collect all possible sysctl parameters along with their properties.&lt;/strong&gt; The MIB is represented as a &lt;a href="http://websysctl.alfonsosiciliano.net/table" rel="noopener noreferrer"&gt;table&lt;/a&gt;, &lt;a href="http://websysctl.alfonsosiciliano.net/list" rel="noopener noreferrer"&gt;list&lt;/a&gt;, and a &lt;a href="http://websysctl.alfonsosiciliano.net/tree" rel="noopener noreferrer"&gt;tree&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48bzdgcctckle19oj071.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48bzdgcctckle19oj071.png" alt="FreeBSD sysctl MIB represented like a tree. Actually it is a screen shot of the web page: http://websysctl.alfonsosiciliano.net/tree" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, WebSysctl provides a page for each parameter, available both in dot notation (for example, &lt;a href="http://websysctl.alfonsosiciliano.net/kern.ostype" rel="noopener noreferrer"&gt;kern.ostype&lt;/a&gt;) and in path notation (for example, &lt;a href="http://websysctl.alfonsosiciliano.net/kern/ostype" rel="noopener noreferrer"&gt;kern/ostype&lt;/a&gt;).&lt;/p&gt;




&lt;p&gt;Currently WebSysctl is available at &lt;a href="http://websysctl.alfonsosiciliano.net/" rel="noopener noreferrer"&gt;http://websysctl.alfonsosiciliano.net/&lt;/a&gt;. It will probably move to alfonsosiciliano.dev in the future. (I already own the domain but I am waiting to obtain an SSL certificate. I will post updates on &lt;a href="https://alfonsosiciliano.gitlab.io/" rel="noopener noreferrer"&gt;https://alfonsosiciliano.gitlab.io/&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Please note: I am not a web/frontend/backend/full-stack developer, nor a database expert. WebSysctl is my first web project, and it can certainly be improved.&lt;/p&gt;




</description>
      <category>unix</category>
      <category>freebsd</category>
      <category>kernel</category>
      <category>sysctl</category>
    </item>
    <item>
      <title>MixerTUI 1.5</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Sat, 24 Feb 2024 13:41:36 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/mixertui-15-254h</link>
      <guid>https://dev.to/alfonsosiciliano/mixertui-15-254h</guid>
      <description>&lt;p&gt;&lt;a href="https://gitlab.com/alfix/mixertui" rel="noopener noreferrer"&gt;MixerTUI&lt;/a&gt; is an audio mixer with a terminal user interface (TUI) for the &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; sound system. It allow to switch easily between laptop and HDMI, headphones and speakers,and so on. Features include: show the current driver configuration, select an audio device to get information, change the volume, or make the device the default. The version 1.5 is out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funiwp8ycppzq657q8pct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funiwp8ycppzq657q8pct.png" alt="Window in a terminal with bars to select volume" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;To install the port &lt;a href="https://www.freshports.org/audio/mixertui" rel="noopener noreferrer"&gt;audio/mixertui&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/audio/mixertui/ &amp;amp;&amp;amp; make install clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install mixertui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build from sources:&lt;/p&gt;

&lt;p&gt;Step 1. Install deps&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install bsddialog libsysctlmibinfo2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2. Download, build, and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% git clone https://gitlab.com/alfix/mixertui.git
% cd mixertui
% make
% ./mixertui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Version 1.5 Changes and Improvements
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1)&lt;/strong&gt; Pop-ups are implemented using &lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;libbsddialog&lt;/a&gt;, for example the screenshot shows a bsddialog menu. Curiosity, the first version of bsddialog was just a copy of the mixertui pop-ups to implement dialogs, now mixertui uses libbsddialog to show pop-ups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2)&lt;/strong&gt; Improvements for the menu to select the device/pcm.&lt;br&gt;
The item with the default pcm (&lt;em&gt;sysctl hw.snd.default_unit&lt;/em&gt;) has the "(Default)" prefix; pcm4 in the screenshot. Opening the menu the selected item is the current pcm; pcm2 in the screenshot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7xd35e6x4k61nv3eevk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7xd35e6x4k61nv3eevk.png" alt="Window in a terminal with bars to select volume" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3)&lt;/strong&gt; Fix fault with terminals without colors. Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% env TERM=vt220 mixertui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2wwxlxcc9c286ncvqat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd2wwxlxcc9c286ncvqat.png" alt="Window in a terminal with bars to select volume" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4)&lt;/strong&gt; Few internal refactoring. Probably this is the last C/ncurses version, (see Future subsection below).&lt;/p&gt;




&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;MixerTUI started out as a personal project (...game :D). I spent 30 minutes to set up my microphone to record my &lt;a href="https://papers.freebsd.org/author/alfonso-s.-siciliano/" rel="noopener noreferrer"&gt;BSDCan presentation&lt;/a&gt; during the first lockdown. I set audio quickly via alsamixer in the past. Now my main laptop runs FreeBSD, so I wrote mixertui to avoid to waste time setting up a microphone, headphones, &lt;a href="//2023-01-21-freebsd-disable-stereo-sound.html"&gt;accessibility&lt;/a&gt;, and so on.&lt;/p&gt;

&lt;p&gt;The first version was just 1000 lines of code; mainly ncurses stuff because the sound system interface is actually easy: just some &lt;em&gt;ioctl&lt;/em&gt; and &lt;em&gt;sysctl&lt;/em&gt;. However several users started to use it. I received a lot of tips, feedback, merge request, iussues, email, and so on.&lt;/p&gt;

&lt;p&gt;The utility grew messy to implement the user requests. Mainly I spent time to use libncurses, because it does not provides widgets (buttons, title, bars, ...), it is just a "render" library. I would have preferred to spend time implementing new audio features instead of "drawing" a bar. ncurses is not suitable. I am considering other TUI libraries to rewrite MixerTUI in the next version 2.0. Under the radar: brick/haskell, tui-rs/rust, FTXUI/C++.&lt;/p&gt;

&lt;p&gt;Conclusion, this is just a TUI improvements version. I' ll rewite mixertui. TODO, Ideas and new audio features in the future: mouse, virtual_oss, devd, sound(4) improvements, accessibility, and so on.&lt;/p&gt;




</description>
      <category>audio</category>
      <category>mixer</category>
      <category>freebsd</category>
      <category>unix</category>
    </item>
    <item>
      <title>PortOptsCLI - Ports Collection Accessibility</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Fri, 20 Oct 2023 13:46:38 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/portoptscli-ports-collection-accessibility-4abl</link>
      <guid>https://dev.to/alfonsosiciliano/portoptscli-ports-collection-accessibility-4abl</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; Operating System provides the &lt;a href="https://www.freebsd.org/ports/" rel="noopener noreferrer"&gt;Ports Collection&lt;/a&gt; to give users and administrators a simple way to install applications.&lt;/p&gt;

&lt;p&gt;It is possible to configure a port before the building and installation. The configuration consists of a set of lists: checklists to enable or disable an option, radiolist to select at the most one option. Some list is mandatory, at least one option has to be active.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freshports.org/ports-mgmt/dialog4ports/" rel="noopener noreferrer"&gt;ports-mgmt/dialog4ports&lt;/a&gt; and &lt;a href="https://www.freshports.org/ports-mgmt/portconfig/" rel="noopener noreferrer"&gt;ports-mgmt/portconfig&lt;/a&gt; allow to set up a port via an interactive Text User Interface. They are implicitly used by "&lt;em&gt;make config&lt;/em&gt;", example editors/vim port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/editors/vim
# make config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8b9xfos0k5463r1bsa8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8b9xfos0k5463r1bsa8.png" alt="Window in a terminal with checklists and radiolist to set up the FreeBSD vim port" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The black and white theme can provide high-contrast accessibility for users with low vision, for portconfig &amp;gt;= 0.6:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# env NO_COLOR="YES" make config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Older versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# env PORTCONFIG_THEME="blackwhite" make config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qgcnjoqhwo4rxelize4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qgcnjoqhwo4rxelize4.png" alt="High-contrast window in a terminal with checklists and radiolist to set up the FreeBSD vim port" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  PortOptsCLI
&lt;/h2&gt;

&lt;p&gt;Unfortunately screen readers perform terrible with TUI, it is a well-known accessibility problem. FreeBSD provides tens of thousands of ports, port configuration is a key feature, unfortunately it is inaccessible to users with vision impairment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/alfix/portoptscli" rel="noopener noreferrer"&gt;PortOptsCLI&lt;/a&gt; (Port Options CLI) is an utility for setting the port options via a Command Line Interface. Properly PortOptsCLI provides commands to navigate lists (checklists and/or radiolists) and set up their items interactively also suitable for a speech synthesizer. Currently it is tested with the speech synthesizer of orca &lt;a href="https://wiki.gnome.org/Projects/Orca" rel="noopener noreferrer"&gt;https://wiki.gnome.org/Projects/Orca&lt;/a&gt;, FreeBSD provides a port and a package &lt;a href="https://www.freshports.org/accessibility/orca/" rel="noopener noreferrer"&gt;https://www.freshports.org/accessibility/orca/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Preview &lt;a href="https://twitter.com/alfsiciliano/status/1694858990440648711" rel="noopener noreferrer"&gt;https://twitter.com/alfsiciliano/status/1694858990440648711&lt;/a&gt;, video description and transcription are available in the Demo section later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To install the port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/ports-mgmt/portoptscli/ &amp;amp;&amp;amp; make install clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or to install the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install portoptscli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the installation, add to /etc/make.conf:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#DIALOG4PORTS?= ${LOCALBASE}/bin/dialog4ports
DIALOG4PORTS=${LOCALBASE}/bin/portoptscli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now 'make config' uses portoptscli automatically. To start to set up a port are sufficient few commands:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;h&lt;/strong&gt;: specific port help if exist.&lt;br&gt;
&lt;strong&gt;n&lt;/strong&gt;: next element (header, list, option, end line).&lt;br&gt;
&lt;strong&gt;p&lt;/strong&gt;: previous element.&lt;br&gt;
&lt;strong&gt;r&lt;/strong&gt;: reprint current element.&lt;br&gt;
&lt;strong&gt;space&lt;/strong&gt;: enable or disable a checklist item, select a radiolist item.&lt;br&gt;
&lt;strong&gt;a&lt;/strong&gt;: abandon without saving.&lt;br&gt;
&lt;strong&gt;q&lt;/strong&gt;: save and quit.&lt;br&gt;
All features are linked in the Documentation section later.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;PortOptsCLI disables ECHO and ENTER. However this demo surrounds runtime commands and comments by square brackets in a new line for ease of understanding. To note some speech synthesizer can read the typed keys depending on the current setting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/editors/neovim
[ENTER]
# make config
[ENTER, start implicitly portoptscli]
Configuration for neovim-0.9.1 port, 1 list total 2 options.
[v]
Verbose mode on.
n: next, p: previous, r: reprint, space: select or unselect.
[n]
List 1. Generic options. Checklist with 2 options.
[n]
1 NLS: Native Language Support. Enabled.
[n]
2 PYNVIM: Enable support for plugins written in python. Disabled.
[SPACE]
option PYNVIM enabled.
[n]
End configuration. q: save and quit, a: abandon without saving, t: go to top.
[q]
Save and quit.
#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another demo without commands and comments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/editors/vim
# make config
Configuration for vim-9.0.1671 port, 3 lists total 12 options.
Verbose mode on.
n: next, p: previous, r: reprint, space: select or unselect.
List 1. Generic options. Checklist with 3 options.
1 MAKE_JOBS: Enable parallel build. Disabled.
2 NLS: Native Language Support. Enabled.
3 XTERM_SAVE: Restore xterm screen after exit. Disabled.
option XTERM_SAVE enabled.
List 2. Optional language bindings. Checklist with 6 options.
1 LUA: Lua scripting language support. Disabled.
2 PERL: Perl scripting language support. Disabled.
3 PYTHON: Python bindings or support. Enabled.
4 RUBY: Ruby bindings or support. Disabled.
5 SCHEME: MzScheme (Racket) bindings. Disabled.
6 TCL: Tcl scripting language support. Disabled.
List 3. CTAGS. RadioList with 3 options, mandatory list select at least one option.
1 CTAGS_BASE: Use system ctags. Selected.
2 CTAGS_EXUBERANT: Use exctags instead of ctags.
3 CTAGS_UNIVERSAL: Use uctags instead of ctags.
option CTAGS_UNIVERSAL selected previous CTAGS_BASE unselected.
End configuration. q: save and quit, a: abandon without saving, t: go to top.
Save and quit.
#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Manual : &lt;em&gt;$ man 1 portoptscli&lt;/em&gt;, &lt;a href="//2023-08-20-manual-portoptscli.html"&gt;online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;README &lt;a href="https://gitlab.com/alfix/portoptscli/-/raw/main/README.txt" rel="noopener noreferrer"&gt;https://gitlab.com/alfix/portoptscli/-/raw/main/README.txt&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;p&gt;Verbose mode can be set by the PORTOPTSCLI_VERBOSE="YES" environment variable.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;c&lt;/em&gt; key prints the short commands list described in the Getting Started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# make config
Configuration for neovim-0.9.1 port, 1 list total 2 options.
[c]
Short commands list.
h: specific port help if exist.
i: port and lists info.
n: next element.
p: previouse element.
r: reprint element.
space: select or unselect an option.
a: abandon without saving.
q: save and quit.
[a]

===&amp;gt; Options unchanged
#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some port has a specific help file, if it exists PortOptsCLI informs at startup/top, h key to print it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/devel/pcre/
# make config
Configuration for pcre-8.45_3 port, 2 lists total 6 options.
The port has a help file, h: to print.
[h]
Help file /usr/ports/devel/pcre/pkg-help.
Using the heap rather than the stack for recursion (i.e., turning the
STACK_RECURSION knob off) is slower but less prone to segfaults from
stack exhaustion when matching certain patterns.
End help file.
[a]

===&amp;gt; Options unchanged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Suggestions, bug report, new ideas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;My &lt;a href="https://alfonsosiciliano.gitlab.io/about.html" rel="noopener noreferrer"&gt;contacts&lt;/a&gt; for private discussions.&lt;/li&gt;
&lt;li&gt;FreeBSD &lt;a href="https://lists.freebsd.org/subscription/freebsd-accessibility" rel="noopener noreferrer"&gt;Accessibility&lt;/a&gt; mailing list to share and to track discussions in a public place.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Extras
&lt;/h2&gt;

&lt;p&gt;FreeBSD also allows you to configure a port using environment variables or configuration files, both ways are described in the &lt;a href="https://man.freebsd.org/ports/7" rel="noopener noreferrer"&gt;port(7)&lt;/a&gt; manual.&lt;/p&gt;

&lt;p&gt;Resources and links for further information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ports intro, &lt;a href="https://www.freebsd.org/ports/" rel="noopener noreferrer"&gt;online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Manual: &lt;em&gt;$ man 7 ports&lt;/em&gt;, &lt;a href="https://man.freebsd.org/ports/7" rel="noopener noreferrer"&gt;online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;/usr/ports/README&lt;/em&gt;, &lt;a href="https://cgit.freebsd.org/ports/plain/README" rel="noopener noreferrer"&gt;online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;FreeBSD Handbook "&lt;em&gt;4.5. Using the Ports Collection&lt;/em&gt;",    &lt;a href="https://docs.freebsd.org/en/books/handbook/ports/#ports-using" rel="noopener noreferrer"&gt;online&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>a11y</category>
      <category>freebsd</category>
      <category>unix</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>bsddialog 1.0</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Tue, 01 Aug 2023 12:40:08 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/bsddialog-10-35hk</link>
      <guid>https://dev.to/alfonsosiciliano/bsddialog-10-35hk</guid>
      <description>&lt;p&gt;The &lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;bsddialog&lt;/a&gt; project provides &lt;em&gt;bsddialog&lt;/em&gt; and &lt;em&gt;libbsddialog&lt;/em&gt;, an utility and a library to build TUI dialogs and widgets.&lt;br&gt;
The version 1.0 is out!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% git clone https://gitlab.com/alfix/bsddialog.git
% cd bsddialog
% make
% ./bsddialog --msgbox "`./bsddialog --version`" 0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dahtje8cb5x487bgf14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dahtje8cb5x487bgf14.png" alt="Image description" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 1.0 Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;New features: dynamic exit codes, new environments variables, generic buttons, startup theme file, --datebox-format d/m/y | m/d/y | y/m/d, other escapes for --text-escape, comments in --save-theme output file.&lt;/p&gt;

&lt;p&gt;Important changes: --generic-button1 -&amp;gt; --right1-button, --generic-button2 -&amp;gt; right2-button, --no-names and --no-descriptions mutually exclusive.&lt;/p&gt;

&lt;p&gt;The library has some API change (see CHANGELOG), feel free to &lt;a href="https://alfonsosiciliano.gitlab.io/about.html" rel="noopener noreferrer"&gt;contact&lt;/a&gt; me for any explanation.&lt;/p&gt;

&lt;p&gt;CHANGELOG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2023-08-01 Version 1.0

    Utility:
    * add: comments to --save-theme output file.
    * add: blink, halfbright, highlight to --save-theme and --load-theme.
    * add: theme.menu.[f_]prefixcolor to --save-theme and --load-theme.
    * add: --datebox-format &amp;lt;d/m/y|m/d/y|y/m/d&amp;gt; to set --datebox UI.
    * add: --help-print-items (--help-status becomes alias).
    * add: --text-escape (--colors becomes alias).
    * add: new escapes \Zd, \Zk, \Zs, \ZD, \ZK, \ZS, for --text-escape.
    * add: env NO_COLOR, to set blackwhite theme.
    * add: $HOME/.bsddialog.conf startup theme file.
    * add: env BSDDIALOG_THEMEFILE startup theme file.
    * add: --left1-button &amp;lt;label&amp;gt;.
    * add: --left2-button &amp;lt;label&amp;gt;.
    * add: --left3-button &amp;lt;label&amp;gt;.
    * add: --right1-button &amp;lt;label&amp;gt;.
    * add: --right2-button &amp;lt;label&amp;gt;.
    * add: --right3-button &amp;lt;label&amp;gt;.
    * add: dynamic exit codes.
        - add: --error-exit-code.
        - add: --ok-exit-code.
        - add: --cancel-exit-code.
        - add: --help-exit-code.
        - add: --extra-exit-code.
        - add: --timeout-exit-code.
        - add: --esc-exit-code.
        - add: --left1-exit-code.
        - add: --left2-exit-code.
        - add: --left3-exit-code.
        - add: --right1-exit-code.
        - add: --right2-exit-code.
        - add: --right3-exit-code.
        - add: env BSDDIALOG_ERROR.
        - add: env BSDDIALOG_OK.
        - add: env BSDDIALOG_CANCEL.
        - add: env BSDDIALOG_HELP.
        - add: env BSDDIALOG_EXTRA.
        - add: env BSDDIALOG_TIMEOUT.
        - add: env BSDDIALOG_ESC.
        - add: env BSDDIALOG_LEFT1.
        - add: env BSDDIALOG_LEFT2.
        - add: env BSDDIALOG_LEFT3.
        - add: env BSDDIALOG_RIGHT1.
        - add: env BSDDIALOG_RIGHT2.
        - add: env BSDDIALOG_RIGHT3.
    * add: undocumented envs for bsdconfig(8) compatibility.
        - env BSDDIALOG_COMPATRC for use_shadow setting.
        - env BSDDIALOG_ITEM_HELP to add/set exit code.
    * change: rename themes --theme &amp;lt;3d|blackwhite|flat&amp;gt;.
    * change: --no-names and --no-descriptions mutually exclusive (via lia).
    * change: quote only checklist output items if necessary. Previously
        also radiolist item.
    * change: dialogs with user input print always values except with ERROR,
        ESC, Cancel. Previously the situation was quite heterogeneous.
    * improve: DIAGNOSTIC messages adding fmt string errors.
    * improve: disable theme setting (opt and env) with no-color terminals.
    * improve: menus on|off status (strcasecmp, diagnostic, real off check).
    * improve: --bikeshed with button delimiter and --date-format.
    * improve: --textbox accepts button options.
    * improve: Forms with Help button.
        - print "HELP" (like menus).
        - accept --help-list-items.
        - accept --help-print-name.
    * fix: --load-theme attributes.
    * fix: --clear-screen with --and-dialog.
    * delete: --theme &amp;lt;bsddialog&amp;gt; (partially implemented).
    * delete: --esc-return-cancel (replaced by new env and option).
    * delete: --generic-button1 (replaced by --right1-button).
    * delete: --generic-button2 (replaced by --right2-button).
    * refactor: modularize in more files (main, cli, builders, theme).

    Library:
    * add: bsddialog_inmode().
    * add: bsddialog_clear(y) for utility --clear-screen.
    * add: bsddialog_refresh() for utility terminal mode options.
    * add: conf.date.format="d/m/y"|"m/d/y"|"y/m/d" to customize
        bsddialog_datebox() UI (boxes) with a date format.
    * add: 'const char *end' to bsddialog_gauge().
    * add: draw focus on the shortcut-key-selected button at exit.
    * add: escapes for conf.text.highlight \Zd, \Zk, \Zs, \ZD, \ZK, \ZS.
    * add: other theme flags.
        - BSDDIALOG_BLINK.
        - BSDDIALOG_HALFBRIGHT.
        - BSDDIALOG_HIGHLIGHT.
    * add: generic buttons.
        - conf.button.left1_label, BSDDIALOG_LEFT1 return value.
        - conf.button.left2_label, BSDDIALOG_LEFT2 return value.
        - conf.button.left3_label, BSDDIALOG_LEFT3 return value.
        - conf.button.right1.label, BSDDIALOG_RIGHT1 return value.
        - conf.button.right2.label, BSDDIALOG_RIGHT2 return value.
        - conf.button.right3.label, BSDDIALOG_RIGHT3 return value.
    * add: unused bsddialog_menugroup.min_on for future features.
    * add: theme.menu.f_prefixcolor and theme.menu.prefixcolor.
    * improve: check (when possible) API pointers.
    * improve: circolar buttons with left and right keys for msgbox, yesno,
        menus, rangebox and pause.
    * improve: bsddialog_textbox() handles conf.buttons.
    * improve: bsddialog_datebox() a box change affects the others as well.
    * improve: bsddialog_geterror() with fmt strings.
    * change: API NULL strings handled like "", except gauge *sep and *end.
    * change: menus and form less restrictive with text, hide text with
        little screens (same behavior as other dialogs).
    * change: mixedgauge BSDDIALOG_MG_BLANK does not draw minibar but prints
        minilabel. The change allows mixedgauge to add sections. To restore
        the previous behavior setting minilabel to "".
    * change: check/set bsddialog_gauge() perc max 100.
    * change: check/set bsddialog_mixedgauge() mainperc max 100.
    * change: conf.menu.no_name and conf.menu.no_desc mutually exclusive.
    * change: bsddialog_pause() sec -&amp;gt; *sec to know remaining time at exit.
    * change: add *focusitem to bsddialog_form() like menus.
    * change: "pointer" values are always set except when BSDDIALOG_ERROR
        occurs. Examples *yy/*mm/*ss, rangebox *value.
        - delete conf.menu.on_without_ok.
        - delete conf.form.value_without_ok.
    * rename: conf.text.highlight -&amp;gt; conf.text.escape.
    * rename: theme.menu.namesepcolor -&amp;gt; theme.menu.sepnamecolor.
    * rename: theme.menu.descsepcolor -&amp;gt; theme.menu.sepdesccolor.
    * fix: bsddialog_pause() elevation bar after resize.
    * fix: bsddialog_textbox() key '0'.
    * fix: timebox.c checksize (boxes width).
    * fix: extend menurows after shrink and enlarge.
    * fix: menu pad and form pad "re-expansion" after shrink and enlarge.
    * fix: shadow top-left corner (trick wresize() before wmove()).
    * fix: increment bsddialog_total_progview size for more general use.
    * delete: BSDDIALOG_THEME_BSDDIALOG (partially implemented).
    * delete: conf.button.generic1_label (for new conf.button.right1_label).
    * delete: BSDDIALOG_GENERIC1 return value (new BSDDIALOG_RIGHT1).
    * delete: conf.button.generic2_label (for new conf.button.right2_label).
    * delete: BSDDIALOG_GENERIC2 return value (new BSDDIALOG_RIGHT2).
    * delete: bsddialog_clearterminal(), replaced by bsddialog_clear(y).
    * refactor: internal implementation.
        - add: internal structures to represent components.
        - merge: (when possible) dialogs autosize.
        - merge: (when possible) dialogs checksize.
        - merge: for each dialog "build" with "update" -&amp;gt; &amp;lt;dialog&amp;gt;_redraw().
        - merge: new_dialog() with update_dialog() -&amp;gt; draw_dialog().
        - merge: infobox.c with messagebox.c (delete infobox.c)
        - merge: bsddialog_datebox() + bsddialog_calendar() -&amp;gt; datebox.c
        - change: flat and blackwhite real themes, 3d adapted from flat.
        - improve: replace wrefresh() -&amp;gt; wnoutrefresh()/doupdate().
        - improve: replace prefresh() -&amp;gt; pnoutrefresh()/doupdate().
        - improve: menu split code to build private items.
        - improve: form split code to build private items.
        - delete: -Wno-implicit-fallthrough.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extra Info&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual Utility &lt;a href="https://alfonsosiciliano.gitlab.io/posts/2022-01-26-manual-bsddialog.html" rel="noopener noreferrer"&gt;bsddialog(1)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Manual Library &lt;a href="https://alfonsosiciliano.gitlab.io/posts/2022-01-15-manual-libbsddialog.html" rel="noopener noreferrer"&gt;bsddialog(3)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;README and examples &lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;https://gitlab.com/alfix/bsddialog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>terminal</category>
      <category>unix</category>
      <category>coding</category>
      <category>scripting</category>
    </item>
    <item>
      <title>FreeBSD disable stereo sound</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Thu, 02 Feb 2023 00:20:00 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/freebsd-disable-stereo-sound-2b49</link>
      <guid>https://dev.to/alfonsosiciliano/freebsd-disable-stereo-sound-2b49</guid>
      <description>&lt;p&gt;We have two ears, so we hear the world in stereo. Two ears give us a sense of distance and direction. Therefore, the &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; Operating System provides and enables multichannel audio by default, popularly referred to as "surround sound". Properly, by default only 2 channels are enabled: "s16le:2.0, Stereo, 2 channels (left, right)".&lt;/p&gt;

&lt;p&gt;Unfortunately, stereo audio is quite useless and annoying for a person with single sided deafness or unilateral hearing loss. Some utility allows to select mono, for example, &lt;a href="https://www.videolan.org/vlc/" rel="noopener noreferrer"&gt;vlc&lt;/a&gt; (port/package &lt;a href="https://www.freshports.org/multimedia/vlc/" rel="noopener noreferrer"&gt;multimedia/vlc&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzaxp7292wfwlj7otqwjq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzaxp7292wfwlj7otqwjq.png" alt="vlc main menu: Audio -&amp;gt; Stereo Mode -&amp;gt; Mono" width="553" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not all utilities are so advanced. Fortunately, the FreeBSD Audio Subsystem is very powerful. It is possible to select mono for each device via:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# sysctl dev.pcm.%d.play.vchanformat="s16le:1.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;em&gt;%d&lt;/em&gt; is a device number listed by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sysctl dev.pcm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To automatically set the mode each time the machine boots (let's say for the device number 3), add to /etc/sysctl.conf.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mono for device 3
&lt;/span&gt;&lt;span class="nv"&gt;dev.pcm.3.play.vchanformat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;s16le:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Laptops typically have two speakers (left and right). The speaker to "bad" ear can be annoying for people with unilateral hearing loss. Fortunately (again), the FreeBSD Audio Subsystem is very powerful. It is possible to set the volume for each speaker, for example, via &lt;a href="https://gitlab.com/alfix/mixertui" rel="noopener noreferrer"&gt;mixertui&lt;/a&gt; (port/package &lt;a href="https://www.freshports.org/audio/mixertui/" rel="noopener noreferrer"&gt;audio/mixertui&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswc1ou7j4lxq46ev6r4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswc1ou7j4lxq46ev6r4n.png" alt="Volume bar in muxertui: left speaker 85, right speaker 0" width="668" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To save pressing 'p' key and to load/set after a reboot&lt;br&gt;
(without starting the TUI):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mixertui -p audio-profile.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;. Refer to the &lt;a href="https://man.freebsd.org/sound/4" rel="noopener noreferrer"&gt;sound(4)&lt;/a&gt; manual and the &lt;a href="https://wiki.freebsd.org/Sound" rel="noopener noreferrer"&gt;Sound&lt;/a&gt; Wiki Page to know more about FreeBSD audio features and customizations.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>crypto</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>LibBSDDialog</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Sun, 16 Jan 2022 14:21:13 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/libbsddialog-125p</link>
      <guid>https://dev.to/alfonsosiciliano/libbsddialog-125p</guid>
      <description>&lt;p&gt;&lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;LibBSDDialog&lt;/a&gt; provides an API to build TUI dialogs and widgets to show messages, to get input and to inform about a computation status.&lt;/p&gt;

&lt;p&gt;Example to build a &lt;em&gt;msgbox&lt;/em&gt; with &lt;em&gt;Hello World!&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;bsddialog.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;bsddialog_conf&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;bsddialog_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;bsddialog_initconf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;bsddialog_msgbox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;bsddialog_end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://gitlab.com/alfix/bsddialog/-/raw/main/screenshot.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwvd3ciabbnidlz3t8qh.png" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Of course, it is possible to get user input and to change the UI, "Yes-No Question" example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;bsddialog.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;bsddialog_theme.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;bsddialog_conf&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;bsddialog_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;bsddialog_set_default_theme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BSDDIALOG_THEME_BSDDIALOG&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;bsddialog_initconf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;" yesno "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;highlight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bsddialog_yesno&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Hello &lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;Z3World&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;Zn!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;bsddialog_end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;BSDDIALOG_YES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"YES&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;BSDDIALOG_NO&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"NO&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7up17onzdfgou8al9o7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7up17onzdfgou8al9o7.png" alt="Image description" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And to show computation status:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pbs.twimg.com/media/FHADLyaWYAwR473?format=png&amp;amp;name=large" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FFHADLyaWYAwR473%3Fformat%3Dpng%26name%3Dlarge" width="1188" height="796"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;To compile the examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% git clone https://gitlab.com/alfix/bsddialog.git
% cd bsddialog
% make
% cc -I./lib example.c -o example -L./lib -lbsddialog -Wl,-rpath=./lib
% ./example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Dialogs and widgets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infobox, msgbox, yesno.&lt;/li&gt;
&lt;li&gt;radiolist, checklist, menu, mixedlist.&lt;/li&gt;
&lt;li&gt;form.&lt;/li&gt;
&lt;li&gt;gauge, pause, mixedgauge, rangebox.&lt;/li&gt;
&lt;li&gt;datebox, timebox.&lt;/li&gt;
&lt;li&gt;textbox.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Documentation:&lt;/p&gt;

&lt;p&gt;The library has a &lt;a href="https://alfonsosiciliano.gitlab.io/posts/2022-01-16-libbsddialog.html" rel="noopener noreferrer"&gt;manual&lt;/a&gt; to describe the API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% man ./lib/bsddialog.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and a collection of &lt;a href="https://gitlab.com/alfix/bsddialog/-/tree/main/examples_library" rel="noopener noreferrer"&gt;examples&lt;/a&gt; in the Public Domain to build new projects&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% cd examples_library
% sh compile
% ./datebox
% ./form
% ./infobox
% ./menu
% ./mixedlist
% ./msgbox
% ./pause
% ./radiolist
% ./rangebox
% ./theme
% ./timebox
% ./yesno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;LibBSDDialog is an open source project released under the term of the BSD 2 Clause License, repository: &lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;https://gitlab.com/alfix/bsddialog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy Coding!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>c</category>
      <category>terminal</category>
      <category>ui</category>
    </item>
    <item>
      <title>BSDDialog 0.0.1</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Sat, 11 Dec 2021 03:38:05 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/bsddialog-001-4bl7</link>
      <guid>https://dev.to/alfonsosiciliano/bsddialog-001-4bl7</guid>
      <description>&lt;p&gt;&lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;BSDDialog&lt;/a&gt; is an utility to write a script with a Text User Interface. It can build widgets/dialogs: to show messages, to get input and to inform about a computation status.&lt;/p&gt;

&lt;p&gt;Example to build a &lt;em&gt;msgbox&lt;/em&gt; with &lt;em&gt;Hello World!&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% bsddialog --msgbox "Hello World!" 8 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://gitlab.com/alfix/bsddialog/-/raw/main/screenshot.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwvd3ciabbnidlz3t8qh.png" alt="Hello World Example: a dialog with " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, it is possible to use &lt;em&gt;bsddialog&lt;/em&gt; in a shell script, "Yes-No Question" example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BSDDIALOG_YES&lt;/span&gt;&lt;span class="p"&gt;=0&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BSDDIALOG_NO&lt;/span&gt;&lt;span class="p"&gt;=1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

bsddialog &lt;span class="nt"&gt;--theme&lt;/span&gt; bsddialog &lt;span class="nt"&gt;--color&lt;/span&gt; &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;" yesno "&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--yesno&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Hello &lt;/span&gt;&lt;span class="se"&gt;\Z&lt;/span&gt;&lt;span class="s2"&gt;3World&lt;/span&gt;&lt;span class="se"&gt;\Z&lt;/span&gt;&lt;span class="s2"&gt;n!"&lt;/span&gt; 10 30

&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="nv"&gt;$BSDDIALOG_YES&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"YES!"&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nv"&gt;$BSDDIALOG_NO&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NO!"&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7fg5s09dxq93q1avzc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7fg5s09dxq93q1avzc4.png" alt="Yes-No Question example" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The utility is designed and developed mainly for &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt;, the first &lt;a href="https://gitlab.com/alfix/bsddialog/-/tags" rel="noopener noreferrer"&gt;version 0.0.1&lt;/a&gt; is out, please consider this a &lt;em&gt;testing&lt;/em&gt; version, let me know any problem.&lt;/p&gt;

&lt;p&gt;To install the port &lt;a href="https://www.freshports.org/devel/bsddialog/" rel="noopener noreferrer"&gt;devel/bsddialog&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/devel/bsddialog/ &amp;amp;&amp;amp; make install clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install bsddialog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build from sources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone https://gitlab.com/alfix/bsddialog.git
$ cd bsddialog
$ make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% bsddialog --version
bsddialog 0.0.1 (libbsddialog 0.1-devel).
% bsddialog --help

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="/images/bsddialog001help.png"&gt;&lt;img src="/images/bsddialog001help.png" alt="Terminal prints output "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Messages&lt;/strong&gt;: infobox, msgbox, yesno.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Menus&lt;/strong&gt;: radiolist, checklist, menu, treeview, buildlist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forms&lt;/strong&gt;: inputbox, form, mixedform, passwordbox, passwordform, &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bars&lt;/strong&gt;: gauge, pause, mixedgauge, rangebox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date and time&lt;/strong&gt;: datebox, timebox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt;: textbox.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project has a list of &lt;a href="https://gitlab.com/alfix/bsddialog/-/tree/main/examples_utility" rel="noopener noreferrer"&gt;examples&lt;/a&gt;, some &lt;a href="https://www.flickr.com/photos/alfonsosiciliano/albums/72157720215006074" rel="noopener noreferrer"&gt;screenshot&lt;/a&gt;, preview:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.flickr.com/photos/alfonsosiciliano/albums/72157720215006074" title="BSDDialog" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flive.staticflickr.com%2F65535%2F51731768988_ed6090d28c_c.jpg" alt="BSDDialog" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;BSDDialog is an open source project released under the term of the BSD 2 Clause License, repository: &lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;https://gitlab.com/alfix/bsddialog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy Hacking!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>unix</category>
      <category>terminal</category>
      <category>script</category>
      <category>freebsd</category>
    </item>
    <item>
      <title>portconfig</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Sat, 20 Nov 2021 23:07:32 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/portconfig-35g4</link>
      <guid>https://dev.to/alfonsosiciliano/portconfig-35g4</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; Operating Systems provides the &lt;em&gt;Ports Collection&lt;/em&gt; to allow a simple way for users and administrators to install applications, to know more &lt;a href="https://www.freebsd.org/ports/" rel="noopener noreferrer"&gt;https://www.freebsd.org/ports/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is possible to configure a port before the building and installation, &lt;a href="https://www.freshports.org/ports-mgmt/dialog4ports/" rel="noopener noreferrer"&gt;ports-mgmt/dialog4ports&lt;/a&gt; is a well known TUI utility for the port options, unfortunately &lt;em&gt;dialog4ports&lt;/em&gt; depends on non-permissive open source software. &lt;a href="https://gitlab.com/alfix/portconfig" rel="noopener noreferrer"&gt;portconfig&lt;/a&gt; is a new utility to provide the same features of &lt;em&gt;dialog4ports&lt;/em&gt;, it and its dependecies (&lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;bsddialog&lt;/a&gt; and &lt;a href="https://invisible-island.net/ncurses/" rel="noopener noreferrer"&gt;ncurses&lt;/a&gt;) are  completely permissive.&lt;/p&gt;

&lt;p&gt;Getting Started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone https://gitlab.com/alfix/portconfig.git
$ cd portconfig
$ make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now edit /usr/ports/Mk/bsd.commands.mk, comment &lt;em&gt;DIALOG4PORTS&lt;/em&gt; and add the absolute path to &lt;em&gt;portconfig&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
#DIALOG4PORTS?= ${LOCALBASE}/bin/dialog4ports
DIALOG4PORTS?= /absolute/path/to/portconfig
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;em&gt;make config&lt;/em&gt; uses &lt;em&gt;portconfig&lt;/em&gt; instead of dialog4ports*, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/editor/vim
# make config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://gitlab.com/alfix/portconfig/-/raw/main/images/screenshot1.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hqfh2pdjjvs2069jxh3.png" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is possible to customize &lt;em&gt;portconfig&lt;/em&gt; via environment variables, for example to set the &lt;em&gt;dialog4ports&lt;/em&gt; theme (properly &lt;em&gt;dialog&lt;/em&gt;) with tcsh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# env PORTCONFIGTHEME="dialog" make config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://gitlab.com/alfix/portconfig/-/raw/main/images/screenshot2.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbjw2ywjrx84kzkd3rug.png" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;D4PHEIGHT&lt;/em&gt;: hight (otherwise autosize)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;D4PWIDTH&lt;/em&gt;: width (otherwise autosize)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;D4PFULLSCREEN&lt;/em&gt;: fullscreen mode&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;D4PALIGNCENTER&lt;/em&gt;: align menu text to centre (default left)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;D4PASCIILINES&lt;/em&gt;: draw borders with &lt;em&gt;+ - |&lt;/em&gt; charachters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Please NOTE&lt;/strong&gt;: &lt;em&gt;portconfig&lt;/em&gt; is under development and distributed without any warranty.&lt;/p&gt;

&lt;p&gt;Project repository &lt;a href="https://gitlab.com/alfix/portconfig" rel="noopener noreferrer"&gt;https://gitlab.com/alfix/portconfig&lt;/a&gt;,&lt;br&gt;
&lt;em&gt;Happy Hacking!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ports</category>
      <category>freebsd</category>
      <category>tui</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>bsddialog</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Fri, 09 Apr 2021 22:17:53 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/bsddialog-2b55</link>
      <guid>https://dev.to/alfonsosiciliano/bsddialog-2b55</guid>
      <description>&lt;p&gt;Currently I am coding a script with a Text User Interface to set up my &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; Desktop Environment, the idea is to use &lt;a href="https://invisible-island.net/dialog" rel="noopener noreferrer"&gt;dialog&lt;/a&gt; to build graphical &lt;em&gt;widgets&lt;/em&gt;, the previous post of the "My FreeBSD Desktop Setting" series shows a preview.&lt;/p&gt;

&lt;p&gt;Unfortunately I realized that &lt;em&gt;dialog&lt;/em&gt; is released under the GNU GPL License (&lt;a href="https://en.wikipedia.org/wiki/GNU_General_Public_License" rel="noopener noreferrer"&gt;Wikipedia link&lt;/a&gt;) despite it is in the FreeBSD source code &lt;a href="https://cgit.freebsd.org/src/tree/gnu" rel="noopener noreferrer"&gt;https://cgit.freebsd.org/src/tree/gnu&lt;/a&gt;. Although my script is under a permissive license I will be bound to the GPL and I will not be able to use my script for personal/commercial/freelance purposes. In conclusion, I am working on a new project: &lt;a href="https://gitlab.com/alfix/bsddialog" rel="noopener noreferrer"&gt;bsddialog&lt;/a&gt; to provide the features of dialogs under the BSD-2-Clause license, &lt;em&gt;Hello World!&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1379412400311562240-979" src="https://platform.twitter.com/embed/Tweet.html?id=1379412400311562240"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1379412400311562240-979');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1379412400311562240&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>freebsd</category>
      <category>helloworld</category>
      <category>coding</category>
      <category>unix</category>
    </item>
    <item>
      <title>SoftwareSets</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Sat, 27 Mar 2021 02:23:30 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/softwaresets-5hjj</link>
      <guid>https://dev.to/alfonsosiciliano/softwaresets-5hjj</guid>
      <description>&lt;p&gt;&lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; is my daily operating system: to browse the web, to play 3D games, to write this post, and so on. Some time ago, I tried to produce a solution to set up quickly a desktop environment on my laptop.&lt;/p&gt;

&lt;p&gt;The solution was &lt;em&gt;SoftwareSets&lt;/em&gt;, a script for &lt;a href="https://man.freebsd.org/sh/1" rel="noopener noreferrer"&gt;sh(1)&lt;/a&gt; with an User Interface to install software collections (obviously focused on a GUI environment):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bfcq136xn7zeryfdujr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bfcq136xn7zeryfdujr.png" alt="Alt Text" width="694" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was my first project based on a shell script, unfortunately not completed and now obsolete. However this post is the first of the series "&lt;em&gt;My FreeBSD Desktop Setting&lt;/em&gt;" to implement a new solution.&lt;br&gt;
Stay tuned!&lt;/p&gt;

</description>
      <category>freebsd</category>
      <category>desktop</category>
      <category>laptop</category>
      <category>scripting</category>
    </item>
    <item>
      <title>sysctlbyname-improved v20210223</title>
      <dc:creator>Alfonso Siciliano</dc:creator>
      <pubDate>Fri, 19 Mar 2021 21:27:01 +0000</pubDate>
      <link>https://dev.to/alfonsosiciliano/sysctlbyname-improved-v20210223-5ejh</link>
      <guid>https://dev.to/alfonsosiciliano/sysctlbyname-improved-v20210223-5ejh</guid>
      <description>&lt;p&gt;&lt;strong&gt;sysctlbyname-improved version 20210223 is out!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.freebsd.org" rel="noopener noreferrer"&gt;FreeBSD&lt;/a&gt; Operating System maintains a Management Information Base ("MIB") where an object represents a parameter of the system, the &lt;a href="https://man.freebsd.org/sysctl/3" rel="noopener noreferrer"&gt;sysctl&lt;/a&gt; system call explores the MIB to find an object by its Object Identifier ("OID") to get or set the value of the parameter.&lt;/p&gt;

&lt;p&gt;An OID is a series of numbers, it is possible to replace a number with a string to obtain an object name, example [1.1] -&amp;gt; "&lt;em&gt;kern.ostype&lt;/em&gt;", the &lt;em&gt;sysctlbyname&lt;/em&gt; system call finds an object by its name.&lt;/p&gt;

&lt;p&gt;The purpose of &lt;a href="https://gitlab.com/alfix/sysctlbyname-improved" rel="noopener noreferrer"&gt;sysctlbyname-improved&lt;/a&gt; is to allow &lt;em&gt;sysctlbyname&lt;/em&gt; to handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a name with an empty string level, example "&lt;strong&gt;security.jail.param.allow.mount.&lt;/strong&gt;"&lt;/li&gt;
&lt;li&gt;an extended name for a CTLTYPE_NODE with a defined handler, example "&lt;strong&gt;kern.proc.pid.&amp;lt;pid&amp;gt;&lt;/strong&gt;"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example with "&lt;em&gt;kern.proc.pid.0&lt;/em&gt;", the implementation of &lt;em&gt;sysctlbyname_improved()&lt;/em&gt; is in the project repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/sysctl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/user.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;valuelen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;kinfo_proc&lt;/span&gt; &lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"  ## sysctlbyname ##&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;valuelen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sysctlbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kern.proc.pid.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;valuelen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"effective user id: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ki_uid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kern.proc.pid.1: error&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"  ## sysctlbyname_improved ##&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;valuelen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sysctlbyname_improved&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kern.proc.pid.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;valuelen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kern.proc.pid.1: (effective user id) %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ki_uid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kern.proc.pid.1: error&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ## sysctlbyname ##
kern.proc.pid.1: error
  ## sysctlbyname_improved ##
kern.proc.pid.1: (effective user id) 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Furthermore this project can be useful to convert an extended name in the corresponding OID, example "&lt;em&gt;kern.proc.pid.2021&lt;/em&gt;" -&amp;gt; [1.14.1.2021], this feature is used by &lt;em&gt;sysctlmif_oidextendedbybame()&lt;/em&gt; function of the &lt;a href="https://gitlab.com/alfix/sysctlmibinfo2" rel="noopener noreferrer"&gt;sysctlmibinfo2&lt;/a&gt; library.&lt;/p&gt;




&lt;p&gt;Properly, &lt;em&gt;sysctlbyname-improved&lt;/em&gt; is an extension of &lt;em&gt;sysctlinfo&lt;/em&gt;, so this new version takes advantages of the improvements (mainly efficiency) of &lt;a href="https://dev.toalfonsosiciliano/sysctlinfo-20210222-b10"&gt;sysctlinfo 20210222&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To install the port &lt;a href="https://www.freshports.org/sysutils/sysctlbyname-improved-kmod/" rel="noopener noreferrer"&gt;sysutils/sysctlbyname-improved-kmod&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd /usr/ports/sysutils/sysctlbyname-improved-kmod/ &amp;amp;&amp;amp; make install clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install sysctlbyname-improved-kmod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To know more&lt;/strong&gt;: &lt;a href="https://gitlab.com/alfix/sysctlbyname-improved" rel="noopener noreferrer"&gt;https://gitlab.com/alfix/sysctlbyname-improved&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>freebsd</category>
      <category>unix</category>
      <category>kernel</category>
      <category>sysctl</category>
    </item>
  </channel>
</rss>
