1
0

m4ify software

This commit is contained in:
dtb 2022-08-31 14:31:36 -04:00
parent 569c901167
commit d3bdf4c3b5
6 changed files with 173 additions and 175 deletions

View File

@ -3,7 +3,7 @@
MAKE = make MAKE = make
RM = rm -f RM = rm -f
generate: index.html css/index.html home/index.html phones/index.html generate: index.html subdirs
index.html: \ index.html: \
index.m4 \ index.m4 \
@ -23,16 +23,13 @@ trinitisms.m4 \
zelda.m4 zelda.m4
m4 index.m4 >index.html m4 index.m4 >index.html
css/index.html: head.m4 css/index.m4 subdirs:
$(MAKE) -C css $(MAKE) -C css
home/index.html: head.m4 home/index.m4
$(MAKE) -C home $(MAKE) -C home
phones/index.html: head.m4 html.m4 phones/index.m4
$(MAKE) -C phones $(MAKE) -C phones
$(MAKE) -C software
clean: clean:
$(RM) index.html css/index.html home/index.html phones/index.html $(RM) index.html css/index.html home/index.html phones/index.html software/index.html
.PHONY: generate clean .PHONY: generate clean

View File

@ -1,4 +1,6 @@
define(`td', `<TD>$1</TD>') define(`_code', `<CODE>$1</CODE>')
define(`th', `<TH>$1</TH>') define(`_hyperlink', `<A HREF="$1">$2</A>')
define(`tr', `<TR>$1</TR>') define(`_td', `<TD>$1</TD>')
define(`_th', `<TH>$1</TH>')
define(`_tr', `<TR>$1</TR>')
define(`_BAR', `<HR ALIGN="left" SIZE="1" WIDTH="25%" />') define(`_BAR', `<HR ALIGN="left" SIZE="1" WIDTH="25%" />')

4
homepage/navreturn.m4 Normal file
View File

@ -0,0 +1,4 @@
<P><A HREF="/">~ Return to the rest of the site</A></P>
<SCRIPT SRC="/js/cookies.js" TYPE="application/javascript"></SCRIPT>
<SCRIPT SRC="/js/sheets.js" TYPE="application/javascript"></SCRIPT>
<SCRIPT TYPE="application/javascript">window.onload = window.initializesheets;</SCRIPT>

View File

@ -19,14 +19,14 @@ include(`../html.m4')dnl
<H3>updated 2022-08-30</H3> <H3>updated 2022-08-30</H3>
_BAR _BAR
<TABLE> <!-- This looks awful in HTML because there are too many columns and the class=whatever stuff adds even more length. Open in lynx if stuck in a buffer. --> <TABLE> <!-- This looks awful in HTML after generation. Open in Lynx or clone the git repo and read the m4 file. -->
<TR> th(`Phone') th(`Battery') th(`Charging jack') th(`Codecs') th(`Firmware') th(`Headphone jack') th(`Keyboard') th(`OS') th(`SD') th(`WLAN')</TR> <TR> _th(`Phone') _th(`Battery') _th(`Charging jack') _th(`Codecs') _th(`Firmware') _th(`Headphone jack') _th(`Keyboard') _th(`OS') _th(`SD') _th(`WLAN')</TR>
<TR>td(`Samsung SCH-R390') good(`Good') bad(`Micro USB-B, no OTG') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') good(`3.5mm') good(`Hardware') bad(`Proprietary') good(`Micro') bad(`No')</TR> <TR>_td(`Samsung SCH-R390') good(`Good') bad(`Micro USB-B, no OTG') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') good(`3.5mm') good(`Hardware') bad(`Proprietary') good(`Micro') bad(`No')</TR>
<TR> td(`LG UN280') good(`Decent') bad(`Micro USB-B, no OTG') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') good(`3.5mm') good(`Hardware') bad(`Proprietary') good(`Micro') bad(`No')</TR> <TR> _td(`LG UN280') good(`Decent') bad(`Micro USB-B, no OTG') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') good(`3.5mm') good(`Hardware') bad(`Proprietary') good(`Micro') bad(`No')</TR>
<TR>td(`iPhone SE (2016)') bad(`Dismal') bad(`Proprietary') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') good(`3.5mm') bad(`Software') bad(`Proprietary') bad(`None') good(`Yes')</TR> <TR>_td(`iPhone SE (2016)') bad(`Dismal') bad(`Proprietary') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') good(`3.5mm') bad(`Software') bad(`Proprietary') bad(`None') good(`Yes')</TR>
<TR> td(`Unihertz Titan') good(`Excellent') good(`USB-C PD') good(`Configurable') bad(`Proprietary') good(`3.5mm') good(`Hardware') bad(`Proprietary') good(`Micro') good(`Yes')</TR> <TR> _td(`Unihertz Titan') good(`Excellent') good(`USB-C PD') good(`Configurable') bad(`Proprietary') good(`3.5mm') good(`Hardware') bad(`Proprietary') good(`Micro') good(`Yes')</TR>
<TR> td(`Pinephone') good(`Upgradeable') good(`USB-C PD') good(`Configurable') good(`Changeable') good(`3.5mm') good(`Software or hardware') good(`Open') good(`Micro') good(`Yes')</TR> <TR> _td(`Pinephone') good(`Upgradeable') good(`USB-C PD') good(`Configurable') good(`Changeable') good(`3.5mm') good(`Software or hardware') good(`Open') good(`Micro') good(`Yes')</TR>
<TR> td(`Punkt MP-02') good(`Excellent') bad(`USB-C but no PD') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') bad(`over USB-C') good(`Hardware') bad(`Proprietary') bad(`None') good(`Yes')</TR> <TR> _td(`Punkt MP-02') good(`Excellent') bad(`USB-C but no PD') bad(`No FLAC, no Vorbis, no VP8') bad(`Proprietary') bad(`over USB-C') good(`Hardware') bad(`Proprietary') bad(`None') good(`Yes')</TR>
</TABLE> </TABLE>
<H2>Samsung SCH-R390</H2> <H2>Samsung SCH-R390</H2>

View File

@ -0,0 +1,2 @@
index.html: index.m4 ../head.m4 ../html.m4 ../navreturn.m4
m4 index.m4 >index.html

View File

@ -1,22 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<HTML LANG="en"> <HTML LANG="en">
<HEAD> define(`_TITLE', `guide to software')dnl
<LINK HREF="http://www.trinity.moe/knowledge/software" REL="canonical" /> define(`_DESCRIPTION', `do not read')dnl
<LINK HREF="https://raw.githubusercontent.com/devenblake/homepage/main/favicon.ico" REL="shortcut icon" TYPE="image/x-icon" /> define(`_PAGE', `software/')dnl
<LINK HREF="/css/blank.css" ID="styling" REL="stylesheet" /> define(`_STYLE', `')dnl
<META CHARSET="UTF-8" /> include(`../html.m4')dnl
<META CONTENT="noindex" NAME="googlebot" /> <!-- FUCK GOOGLE --> include(`../head.m4')dnl
<META CONTENT="interest-cohort=()" HTTP-EQUIV="Permissions-Policy" /> <!-- FUCK GOOGLE -->
<META NAME="viewport" CONTENT="width=device-width, initial-scale=1" />
<TITLE>knowledge/software</TITLE>
</HEAD>
<BODY> <BODY>
<P><A HREF="/">~ Return to the rest of the site</A></P> include(`../navreturn.m4')dnl
<SCRIPT SRC="/js/cookies.js" TYPE="application/javascript"></SCRIPT>
<SCRIPT SRC="/js/sheets.js" TYPE="application/javascript"></SCRIPT>
<SCRIPT TYPE="application/javascript">window.onload = window.initializesheets;</SCRIPT>
<H1>software</H1> <H1>software</H1>
<HR ALIGN="left" SIZE="1" WIDTH="25%" /> _BAR
<H2>Foreword</H2> <H2>Foreword</H2>
<P> <P>
Due to the majority of designers having typical ability, use of computers may be significantly more challenging for users with disabilities, especially affecting sight and reading. Due to the majority of designers having typical ability, use of computers may be significantly more challenging for users with disabilities, especially affecting sight and reading.
@ -40,8 +33,8 @@ Non-standard, proprietary operating systems such as Microsoft Windows or OS/2 ar
<H2>UNIX</H2> <H2>UNIX</H2>
<UL> <UL>
<LI><A HREF="https://en.wikipedia.org/wiki/Unix">Unix</A> (Wikipedia)</LI> <LI>_hyperlink(`https://en.wikipedia.org/wiki/Unix', `Unix') (Wikipedia)</LI>
<LI><A HREF="https://github.com/dspinellis/unix-history-repo">unix-history-repo</A> (GitHub)</LI> <LI>_hyperlink(`https://github.com/dspinellis/unix-history-repo', `unix-history-repo') (GitHub)</LI>
</UL> </UL>
<H2>Advanced Configuration and Power Interface</H2> <H2>Advanced Configuration and Power Interface</H2>
@ -53,28 +46,28 @@ The Advanced Configuration and Power Interface, or ACPI, is the interface throug
Usually this is used with an ACPI client or opaquely controlled by the operating environment. Usually this is used with an ACPI client or opaquely controlled by the operating environment.
</P> </P>
<P> <P>
On Linux, <CODE>acpi(1)</CODE> can be used to read and control ACPI events manually. On Linux, _code(`acpi(1)') can be used to read and control ACPI events manually.
<CODE><A HREF="https://sourceforge.net/projects/acpid2/">acpid</A>(8)</CODE>, <CODE><A HREF="#logind">elogind</A>(8)</CODE>, _code(`<A HREF="https://sourceforge.net/projects/acpid2/">acpid</A>(8)'), _code(`<A HREF="#logind">elogind</A>(8)'),
SystemD, and many desktop environments can control the ACPI automatically. SystemD, and many desktop environments can control the ACPI automatically.
</P> </P>
<P> <P>
On NetBSD, see <CODE>acpi(4)</CODE>. On NetBSD, see _code(`acpi(4)').
</P> </P>
<H2>C Language</H2> <H2>C Language</H2>
<P> <P>
For compilation, <CODE>tcc(1)</CODE>, <CODE>gcc(1)</CODE>, and <CODE>clang(1)</CODE> are all reasonable choices depending on your needs. For compilation, _code(`tcc(1)'), _code(`gcc(1)'), and _code(`clang(1)') are all reasonable choices depending on your needs.
</P> </P>
<P> <P>
On Alpine Linux, the standard library headers are in the <CODE>musl-dev</CODE> package. On Alpine Linux, the standard library headers are in the _code(`musl-dev') package.
</P> </P>
<P> <P>
In most system package managers, standard library documentation can be found in the <CODE>man-pages</CODE> and <CODE>man-pages-posix</CODE> packages. In most system package managers, standard library documentation can be found in the _code(`man-pages') and _code(`man-pages-posix') packages.
</P> </P>
<P> <P>
Many Linux software distributions' system package managers have meta-packages that pull all necessities for C development as dependencies. Many Linux software distributions' system package managers have meta-packages that pull all necessities for C development as dependencies.
Alpine has <CODE>build-base</CODE> and Debian has <CODE>build-essential</CODE>. Alpine has _code(`build-base') and Debian has _code(`build-essential').
</P> </P>
@ -83,9 +76,9 @@ Alpine has <CODE>build-base</CODE> and Debian has <CODE>build-essential</CODE>.
<LI><A HREF="https://www.in-ulm.de/~mascheck/various/echo+printf/">Variations in echo implementations</A></LI> <LI><A HREF="https://www.in-ulm.de/~mascheck/various/echo+printf/">Variations in echo implementations</A></LI>
</UL> </UL>
<P> <P>
Don't use <CODE>echo(1)</CODE>, use <CODE>printf(1)</CODE>. Don't use _code(`echo(1)'), use _code(`printf(1)').
<CODE>printf(1)</CODE> simulates the <CODE>printf(3)</CODE> function in the C standard I/O library which has no significant variations, whereas the functionality of <CODE>echo(1)</CODE> can vary between vendors. _code(`printf(1)') simulates the _code(`printf(3)') function in the C standard I/O library which has no significant variations, whereas the functionality of _code(`echo(1)') can vary between vendors.
The following <CODE>sh(1)</CODE> program provides <CODE>echo(1)</CODE> through <CODE>printf(1)</CODE>: The following _code(`sh(1)') program provides _code(`echo(1)') through _code(`printf(1)'):
</P> </P>
<PRE> <PRE>
#!/bin/sh #!/bin/sh
@ -100,11 +93,11 @@ printf "%s" "$*"
<H2 ID="fonts">Fonts</H2> <H2 ID="fonts">Fonts</H2>
<H2 ID="fstab">fstab</H2> <H2 ID="fstab">fstab</H2>
<P>See <CODE>fstab(5).</CODE></P> <P>See _code(`fstab(5).')</P>
<P>postmarketOS requires that the <CODE>localmount</CODE> OpenRC service be enabled for the system to read <CODE>fstab(5)</CODE>. <P>postmarketOS requires that the _code(`localmount') OpenRC service be enabled for the system to read _code(`fstab(5)').
<P>Arch and Artix have fstab generators at <CODE>genfstab(8)</CODE> and <CODE>fstabgen(8)</CODE> respectively in their installation scripts.</P> <P>Arch and Artix have fstab generators at _code(`genfstab(8)') and _code(`fstabgen(8)') respectively in their installation scripts.</P>
<H2>Linux</H2> <H2 ID="linux">Linux</H2>
<UL> <UL>
<LI><A HREF="http://tldp.yolinux.com/HOWTO/subdir/HOWTO-INDEX.html">How to Linux</A></LI> <LI><A HREF="http://tldp.yolinux.com/HOWTO/subdir/HOWTO-INDEX.html">How to Linux</A></LI>
<LI><A HREF="https://christine.website/blog/howto-usermode-linux-2019-07-07">How to Use User Mode Linux</A></LI> <LI><A HREF="https://christine.website/blog/howto-usermode-linux-2019-07-07">How to Use User Mode Linux</A></LI>
@ -118,7 +111,7 @@ printf "%s" "$*"
<H3>Audio</H3> <H3>Audio</H3>
<P> <P>
Most audio servers recommend that they be run in userspace with user privileges, with PulseAudio going so far as to exiting when run as root without additional configuration. Most audio servers recommend that they be run in userspace with user privileges, with PulseAudio going so far as to exiting when run as root without additional configuration.
The Alpine wiki currently recommends <CODE>pipewire(1)</CODE>, with postmarketOS, which is based on Alpine, coming pre-configured with PipeWire. The Alpine wiki currently recommends _code(`pipewire(1)'), with postmarketOS, which is based on Alpine, coming pre-configured with PipeWire.
PipeWire is relatively new and the typical audio server used is PulseAudio; Debian and many popular Debian-based distributions come pre-configured with PulseAudio. PipeWire is relatively new and the typical audio server used is PulseAudio; Debian and many popular Debian-based distributions come pre-configured with PulseAudio.
</P> </P>
<H4>ALSA</H4> <H4>ALSA</H4>
@ -128,14 +121,14 @@ PipeWire is relatively new and the typical audio server used is PulseAudio; Debi
<LI><A HREF="https://dev.to/setevoy/linux-alsa-lib-pcmdmixc1108sndpcmdmixopen-unable-to-open-slave-38on">ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave</A></LI> <LI><A HREF="https://dev.to/setevoy/linux-alsa-lib-pcmdmixc1108sndpcmdmixopen-unable-to-open-slave-38on">ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave</A></LI>
</UL> </UL>
<P> <P>
The Alpine wiki ("Adding sound") says to install <CODE>alsa-conf</CODE>, <CODE>alsa-lib</CODE>, and <CODE>alsa-utils</CODE>, The Alpine wiki ("Adding sound") says to install _code(`alsa-conf'), _code(`alsa-lib'), and _code(`alsa-utils'),
add yourself to the <CODE>audio</CODE> group, and then do some more configuration that I've never needed to do: add yourself to the _code(`audio') group, and then do some more configuration that I've never needed to do:
Use <CODE>alsamixer(1)</CODE> to find a working sound card (press <CODE>F6</CODE> from the first screen ALSAMixer presents) Use _code(`alsamixer(1)') to find a working sound card (press _code(`F6') from the first screen ALSAMixer presents)
and edit <CODE>/usr/share/alsa/alsa.conf</CODE> and change <CODE>defaults.ctl.card</CODE> and <CODE>defaults.pcm.card</CODE> to the sound card that works. and edit _code(`/usr/share/alsa/alsa.conf') and change _code(`defaults.ctl.card') and _code(`defaults.pcm.card') to the sound card that works.
</P> </P>
<P> <P>
The Alpine wiki doesn't mention this but you'll need to enable the <CODE>alsa</CODE> OpenRC service and either start it or reboot. The Alpine wiki doesn't mention this but you'll need to enable the _code(`alsa') OpenRC service and either start it or reboot.
I also installed <CODE>gstreamer</CODE> but I don't know why. I also installed _code(`gstreamer') but I don't know why.
</P> </P>
<P> <P>
ALSA is clunky, many people prefer to use a frontend such as Pipewire or PulseAudio that exposes its own interface while remaining compatible with ALSA. ALSA is clunky, many people prefer to use a frontend such as Pipewire or PulseAudio that exposes its own interface while remaining compatible with ALSA.
@ -150,18 +143,18 @@ Deprecated, unfortunately.
<LI><A HREF="https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home">PipeWire</A> (FreeDesktop Wiki)</LI> <LI><A HREF="https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home">PipeWire</A> (FreeDesktop Wiki)</LI>
</UL> </UL>
<P> <P>
Provided by the <CODE>pipewire</CODE> package on Alpine. Provided by the _code(`pipewire') package on Alpine.
</P> </P>
<PRE> <PRE>
RTKit error: org.freedesktop.DBus.Error.ServiceUnknown RTKit error: org.freedesktop.DBus.Error.ServiceUnknown
</PRE> </PRE>
<P> <P>
This means you need <CODE>rtkit</CODE> installed and running through your initialization system. This means you need _code(`rtkit') installed and running through your initialization system.
</P> </P>
<H4>PulseAudio</H4> <H4>PulseAudio</H4>
<P> <P>
On Alpine you'll need the <CODE>pulseaudio</CODE>, <CODE>pulseaudio-alsa</CODE>, and <CODE>alsa-plugins-pulse</CODE> packages for PulseAudio with ALSA compatibility. On Alpine you'll need the _code(`pulseaudio'), _code(`pulseaudio-alsa'), and _code(`alsa-plugins-pulse') packages for PulseAudio with ALSA compatibility.
Start <CODE>pulseaudio(1)</CODE> when you want audio, ideally in your <CODE>.xinitrc</CODE>. Start _code(`pulseaudio(1)') when you want audio, ideally in your _code(`.xinitrc').
</P> </P>
<H3>Distribution</H3> <H3>Distribution</H3>
@ -175,8 +168,8 @@ Linux is usually obtained as part of a software distribution put together to for
</UL> </UL>
<H5>Always install manual pages</H5> <H5>Always install manual pages</H5>
<P> <P>
Alpine doesn't include man pages in program packages to save on space, instead keeping them in <CODE>[<I>package</I>]-doc</CODE> sibling packages. Alpine doesn't include man pages in program packages to save on space, instead keeping them in _code(`[<I>package</I>]-doc') sibling packages.
To always install doc packages with program packages, <CODE>apk add docs</CODE>. To always install doc packages with program packages, _code(`apk add docs').
</P> </P>
<H4>Arch</H4> <H4>Arch</H4>
@ -185,18 +178,18 @@ Arch is known for using the latest versions of programs, which has given it an u
</P> </P>
<H5>Bootstrapping</H5> <H5>Bootstrapping</H5>
<P> <P>
Use <CODE>pacstrap(8)</CODE>. Use _code(`pacstrap(8)').
</P> </P>
<P> <P>
At a minimum you need the <CODE>base</CODE> package. At a minimum you need the _code(`base') package.
Select a kernel and install the corresponding package; <CODE>linux</CODE>, <CODE>linux-lts</CODE>, or another Linux configuration or fork. Select a kernel and install the corresponding package; _code(`linux'), _code(`linux-lts'), or another Linux configuration or fork.
The Arch wiki says you need to install <CODE>linux-firmware</CODE>, this isn't strictly necessary but it is recommended. The Arch wiki says you need to install _code(`linux-firmware'), this isn't strictly necessary but it is recommended.
Install <CODE>base-devel</CODE> if you plan on using the AUR or if you don't know what the AUR is yet. Install _code(`base-devel') if you plan on using the AUR or if you don't know what the AUR is yet.
</P> </P>
<P> <P>
It's also a good idea to install any utilities you'll need on the bootstrapped system. It's also a good idea to install any utilities you'll need on the bootstrapped system.
Text editors, network managers or utilities, and other administration tools, for example. Text editors, network managers or utilities, and other administration tools, for example.
Manual utilities such as <CODE>man-db</CODE> and others would also be useful. Manual utilities such as _code(`man-db') and others would also be useful.
</P> </P>
<H5>Ubiquitous packages missing</H5> <H5>Ubiquitous packages missing</H5>
<P>From the anals of my notes, 2021-06-04:</P> <P>From the anals of my notes, 2021-06-04:</P>
@ -244,9 +237,9 @@ Artix refers to the series of Arch derivatives which use initialization systems
<H5>Bootstrapping</H5> <H5>Bootstrapping</H5>
<P> <P>
This process differs from Arch's bootstrapping process. This process differs from Arch's bootstrapping process.
Artix uses <CODE>basestrap(8)</CODE> rather than <CODE>pacstrap(8)</CODE>; Artix uses _code(`basestrap(8)') rather than _code(`pacstrap(8)');
you need to select the initialization you want to use: <CODE>66</CODE>, <CODE>dinit</CODE>, <CODE>openrc</CODE>, <CODE>runit</CODE>, or <CODE>s6-base</CODE>, as a package separate from <CODE>base</CODE>; you need to select the initialization you want to use: _code(`66'), _code(`dinit'), _code(`openrc'), _code(`runit'), or _code(`s6-base'), as a package separate from _code(`base');
and Artix's official wiki says you need to install the appropriate <A HREF="#logind"><CODE>elogind</CODE></A> package (<CODE>elogind-[<I>initialization system</I>]</CODE> e.g. <CODE>elogind-66</CODE>) but like <CODE>linux-firmware</CODE> though it is helpful it isn't strictly necessary. and Artix's official wiki says you need to install the appropriate <A HREF="#logind">_code(`elogind')</A> package (_code(`elogind-[<I>initialization system</I>]') e.g. _code(`elogind-66')) but like _code(`linux-firmware') though it is helpful it isn't strictly necessary.
</P> </P>
<H4>Debian</H4> <H4>Debian</H4>
@ -273,14 +266,14 @@ postmarketOS is an Alpine-based Linux software distribution that makes configuri
<P> <P>
By default, postmarketOS will generate a random software MAC address when connecting to a new WLAN network. By default, postmarketOS will generate a random software MAC address when connecting to a new WLAN network.
You can disable this by adding a NetworkManager rule. You can disable this by adding a NetworkManager rule.
In <CODE>/etc/NetworkManager/conf.d/</CODE> you can make a file with any name that has the following: In _code(`/etc/NetworkManager/conf.d/') you can make a file with any name that has the following:
</P> </P>
<PRE><CODE> <PRE>
[device] [device]
wifi.scan-rand-mac-address=no wifi.scan-rand-mac-address=no
</CODE></PRE> </PRE>
<P> <P>
On a live system you can then <CODE>rc-service networkmanager restart</CODE> to restart NetworkManager and have it load the new configuration. On a live system you can then _code(`rc-service networkmanager restart') to restart NetworkManager and have it load the new configuration.
</P> </P>
<H4>Ubuntu</H4> <H4>Ubuntu</H4>
@ -299,12 +292,12 @@ Ubuntu is a derivative of Debian.
<LI><A HREF="https://nixos.wiki/wiki/Logind">logind</A> (NixOS Wiki)</LI> <LI><A HREF="https://nixos.wiki/wiki/Logind">logind</A> (NixOS Wiki)</LI>
</UL> </UL>
<P> <P>
logind (<CODE>systemd-logind.service(8)</CODE>) is a component of SystemD that exposes information about active users on the system via the org.freedesktop.login1 D-Bus interface which is used by the popular desktop environments GNOME and KDE. logind (_code(`systemd-logind.service(8)')) is a component of SystemD that exposes information about active users on the system via the org.freedesktop.login1 D-Bus interface which is used by the popular desktop environments GNOME and KDE.
It also handles <A HREF="#acpi">ACPI</A> events. It also handles <A HREF="#acpi">ACPI</A> events.
It can be configured in <CODE>logind.conf(5)</CODE>. It can be configured in _code(`logind.conf(5)').
</P> </P>
<P> <P>
On systems without SystemD and with conflicting software, <CODE>elogind(8)</CODE> may be used. On systems without SystemD and with conflicting software, _code(`elogind(8)') may be used.
</P> </P>
<H3>Xenia</H3> <H3>Xenia</H3>
@ -318,23 +311,23 @@ Xenia was an entry for the Linux logo competition which Tux eventually won.
<H2>Make utility</H2> <H2>Make utility</H2>
<P> <P>
<CODE>make(1)</CODE> in modern times is fragmented into the GNU version (in context, <I><CODE>gmake</CODE></I>) and the {Free,Open,Net}BSD version (<I><CODE>bmake</CODE></I>). _code(`make(1)') in modern times is fragmented into the GNU version (in context, <I>_code(`gmake')</I>) and the {Free,Open,Net}BSD version (<I>_code(`bmake')</I>).
Complex Makefiles may not be useable in both. Complex Makefiles may not be useable in both.
It's custom for Linux systems to have <CODE>make(1)</CODE> as GNU Make and <CODE>bmake(1)</CODE> as BSD Make, and BSD-based systems to have <CODE>make(1)</CODE> as BSD Make and <CODE>gmake(1)</CODE> as GNU Make. It's custom for Linux systems to have _code(`make(1)') as GNU Make and _code(`bmake(1)') as BSD Make, and BSD-based systems to have _code(`make(1)') as BSD Make and _code(`gmake(1)') as GNU Make.
</P> </P>
<H2>On-line manual</H2> <H2>On-line manual</H2>
<P> <P>
In the context of POSIX and UNIX-like systems, an "on-line" manual is a manual that is accessible via the computer system it documents. In the context of POSIX and UNIX-like systems, an "on-line" manual is a manual that is accessible via the computer system it documents.
Particularly, the <CODE>man(1)</CODE> utility and the manual "pages" it references. Particularly, the _code(`man(1)') utility and the manual "pages" it references.
</P> </P>
<P> <P>
Alpine by default uses <CODE>mandoc</CODE>. Alpine by default uses _code(`mandoc').
</P> </P>
<H2>Paging</H2> <H2>Paging</H2>
<P> <P>
<CODE>less(1)</CODE> is <CODE>more(1)</CODE>; more or less. _code(`less(1)') is _code(`more(1)'); more or less.
</P> </P>
<H2 ID="partitioning">Partitions and filesystems</H2> <H2 ID="partitioning">Partitions and filesystems</H2>
@ -359,17 +352,17 @@ Your needs will vary.
Check out the linked pages in the "See also" section. Check out the linked pages in the "See also" section.
</P> </P>
<P> <P>
Use <CODE>mkfs(8)</CODE> for creating filesystems and <CODE>mount(8)</CODE> for mounting partitions' filesystems. Use _code(`mkfs(8)') for creating filesystems and _code(`mount(8)') for mounting partitions' filesystems.
</P> </P>
<H3>gpart</H3> <H3>gpart</H3>
<UL> <UL>
<LI><A HREF="https://en.wikipedia.org/wiki/Gpart">Gpart</A> (Wikipedia)</LI> <LI><A HREF="https://en.wikipedia.org/wiki/Gpart">Gpart</A> (Wikipedia)</LI>
</UL> </UL>
<P> <P>
Available as <CODE>sysutils/gpart</CODE> in pkgsrc. Available as _code(`sysutils/gpart') in pkgsrc.
</P> </P>
<P> <P>
<CODE>gpart(8)</CODE> is a tool that scans a file (or block device presented as a file) for drive partitions regardless of any table present on the medium. _code(`gpart(8)') is a tool that scans a file (or block device presented as a file) for drive partitions regardless of any table present on the medium.
</P> </P>
<H3 ID="luks">LUKS</H3> <H3 ID="luks">LUKS</H3>
<UL> <UL>
@ -381,40 +374,40 @@ Available as <CODE>sysutils/gpart</CODE> in pkgsrc.
<LI><A HREF="https://wiki.alpinelinux.org/wiki/LVM_on_LUKS">LVM on LUKS</A> (Alpine Wiki)</LI> <LI><A HREF="https://wiki.alpinelinux.org/wiki/LVM_on_LUKS">LVM on LUKS</A> (Alpine Wiki)</LI>
</UL> </UL>
<P> <P>
<CODE>e2fsprogs</CODE> is needed for the <CODE>dm_mod</CODE> kernel module used for LUKS partition decryption. _code(`e2fsprogs') is needed for the _code(`dm_mod') kernel module used for LUKS partition decryption.
</P> </P>
<P> <P>
To format a partition to a LUKS volume, determine the physical block device location for that partition and run <CODE>cryptsetup luksFormat [<I>partition</I>]</CODE>. To format a partition to a LUKS volume, determine the physical block device location for that partition and run _code(`cryptsetup luksFormat [<I>partition</I>]').
The passphrase used can be changed or removed after creation. The passphrase used can be changed or removed after creation.
</P> </P>
<P> <P>
To open a LUKS volume, use <CODE>cryptsetup luksOpen [<I>partition</I>] [<I>name</I>]</CODE>. To open a LUKS volume, use _code(`cryptsetup luksOpen [<I>partition</I>] [<I>name</I>]').
This <I>name</I> is the name the <I>decrypted block device</I> location will take in <CODE>/dev/mapper/</CODE>. This <I>name</I> is the name the <I>decrypted block device</I> location will take in _code(`/dev/mapper/').
</P> </P>
<P> <P>
Before the decrypted block device has a filesystem it'll just be cleared space - format as normal but use the decrypted block device location. Before the decrypted block device has a filesystem it'll just be cleared space - format as normal but use the decrypted block device location.
</P> </P>
<P> <P>
To mount a partition in an opened LUKS volume, use <CODE>mount(8)</CODE> as normal, just with the decrypted block device location. To mount a partition in an opened LUKS volume, use _code(`mount(8)') as normal, just with the decrypted block device location.
</P> </P>
<P> <P>
To close an open LUKS volume, <CODE>umount(8)</CODE> any mapped and mounted partitions from the volume and <CODE>cryptsetup luksClose [<I>name</I>]</CODE>. To close an open LUKS volume, _code(`umount(8)') any mapped and mounted partitions from the volume and _code(`cryptsetup luksClose [<I>name</I>]').
</P> </P>
<P> <P>
To make the LUKS partition openable via keyfile, first make a keyfile (<CODE>dd if=/dev/urandom of=/root/keyfile bs=1024 count=4</CODE> seems to work), and optionally make it readable by root only (<CODE>chmod 0400 [<I>keyfile</I>]</CODE>). To make the LUKS partition openable via keyfile, first make a keyfile (_code(`dd if=/dev/urandom of=/root/keyfile bs=1024 count=4') seems to work), and optionally make it readable by root only (_code(`chmod 0400 [<I>keyfile</I>]')).
Then add the keyfile to the partition's LUKS header with <CODE>cryptsetup luksAddKey [<I>physical partition block device</I>] [<I>keyfile</I>]</CODE>. Then add the keyfile to the partition's LUKS header with _code(`cryptsetup luksAddKey [<I>physical partition block device</I>] [<I>keyfile</I>]').
</P> </P>
<H4>dm-crypt</H4> <H4>dm-crypt</H4>
<P> <P>
<CODE>dm-crypt</CODE> is a service that automatically mounts LUKS volumes at boot. _code(`dm-crypt') is a service that automatically mounts LUKS volumes at boot.
</P> </P>
<P> <P>
On most OpenRC-initialized distributions, the <CODE>cryptsetup-openrc</CODE> package provides <CODE>dmcrypt</CODE>. On most OpenRC-initialized distributions, the _code(`cryptsetup-openrc') package provides _code(`dmcrypt').
Make sure that service is added to runlevel boot. Make sure that service is added to runlevel boot.
</P> </P>
<P> <P>
Configuration is in <CODE>/etc/conf.d/dmcrypt</CODE> and further configuration should be done in <CODE><A HREF="#fstab">fstab</A></CODE>. Configuration is in _code(`/etc/conf.d/dmcrypt') and further configuration should be done in _code(`<A HREF="#fstab">fstab</A>').
<CODE>dm-crypt</CODE> will need the UUID of the <I>physical</I> block device while fstab (if being configured with UUIDs will need the UUID of the decrypted block device in the device mapper. _code(`dm-crypt') will need the UUID of the <I>physical</I> block device while fstab (if being configured with UUIDs will need the UUID of the decrypted block device in the device mapper.
</P> </P>
<H3>TestDisk</H3> <H3>TestDisk</H3>
<UL> <UL>
@ -428,38 +421,38 @@ Configuration is in <CODE>/etc/conf.d/dmcrypt</CODE> and further configuration s
<LI><A HREF="https://www.netbsd.org/docs/pkgsrc/">pkgsrc Guide</A></LI> <LI><A HREF="https://www.netbsd.org/docs/pkgsrc/">pkgsrc Guide</A></LI>
</UL> </UL>
<H3>Battery</H3> <H3>Battery</H3>
<P><CODE>envstat(1)</CODE> can show the current battery status.</P> <P>_code(`envstat(1)') can show the current battery status.</P>
<H3>Mounting filesystems</H3> <H3>Mounting filesystems</H3>
<OL> <OL>
<LI>Connect the drive with the filesystem you want to access.</LI> <LI>Connect the drive with the filesystem you want to access.</LI>
<LI>Use <CODE>dmesg(8)</CODE> to determine the location in <CODE>/dev/</CODE> of the disk.</LI> <LI>Use _code(`dmesg(8)') to determine the location in _code(`/dev/') of the disk.</LI>
<LI><CODE>disklabel(8)</CODE> the drive to determine which partition on the disk you want to access (<CODE>disklabel /dev/<I>disk</I></CODE>)</LI> <LI>_code(`disklabel(8)') the drive to determine which partition on the disk you want to access (_code(`disklabel /dev/<I>disk</I>'))</LI>
<LI><CODE>mount(8)</CODE> the filesystem.</LI> <LI>_code(`mount(8)') the filesystem.</LI>
<LI><CODE>umount(8)</CODE> the filesystem when done using it.</LI> <LI>_code(`umount(8)') the filesystem when done using it.</LI>
</OL> </OL>
<H4>ext4</H4> <H4>ext4</H4>
<P> <P>
Install <CODE>filesystems/fuse</CODE> and <CODE>filesystems/fuse-ext2</CODE>. Install _code(`filesystems/fuse') and _code(`filesystems/fuse-ext2').
<CODE>disklabel(8)</CODE> will list ext4 filesystems as of type "Linux Ext2". _code(`disklabel(8)') will list ext4 filesystems as of type "Linux Ext2".
Use <CODE>fuse-ext2(1)</CODE> to mount the filesystem. Use _code(`fuse-ext2(1)') to mount the filesystem.
</P> </P>
<P> <P>
<CODE>fuse-ext2(1)</CODE> is spotty in places and may not work correctly. _code(`fuse-ext2(1)') is spotty in places and may not work correctly.
</P> </P>
<H4>exFAT</H4> <H4>exFAT</H4>
<P> <P>
Install <CODE>filesystems/fuse</CODE> and <CODE>filesystems/fuse-exfat</CODE>. Install _code(`filesystems/fuse') and _code(`filesystems/fuse-exfat').
Use <CODE>mount.exfat</CODE> to mount the filesystem (the manual page for which is <CODE>mount.exfat-fuse(8)</CODE>). Use _code(`mount.exfat') to mount the filesystem (the manual page for which is _code(`mount.exfat-fuse(8)')).
</P> </P>
<H3>Fix <CODE>SSL certificate problem: unable to get local issuer certificate</CODE></H3> <H3>Fix _code(`SSL certificate problem: unable to get local issuer certificate')</H3>
<UL> <UL>
<LI><A HREF="http://mail-index.netbsd.org/pkgsrc-users/2021/07/19/msg034147.html">Depending on security/ca-certificates?</A></LI> <LI><A HREF="http://mail-index.netbsd.org/pkgsrc-users/2021/07/19/msg034147.html">Depending on security/ca-certificates?</A></LI>
<LI><A HREF="https://www.cambus.net/installing-ca-certificates-on-netbsd/">Installing CA certificates on NetBSD</A></LI> <LI><A HREF="https://www.cambus.net/installing-ca-certificates-on-netbsd/">Installing CA certificates on NetBSD</A></LI>
<LI><A HREF="https://github.com/ohmyzsh/ohmyzsh/issues/8321#issuecomment-863493503">SSL Certificate Problem</A> (ohmyzsh/ohmyzsh#8321)</LI> <LI><A HREF="https://github.com/ohmyzsh/ohmyzsh/issues/8321#issuecomment-863493503">SSL Certificate Problem</A> (ohmyzsh/ohmyzsh#8321)</LI>
</UL> </UL>
<P>Install <CODE>security/mozilla-rootcerts-openssl</CODE>.</P> <P>Install _code(`security/mozilla-rootcerts-openssl').</P>
<P> <P>
<I>Do not</I> use SSL workarounds like (in the case of git) <CODE>GIT_SSL_NO_VERIFY</CODE>. <I>Do not</I> use SSL workarounds like (in the case of git) _code(`GIT_SSL_NO_VERIFY').
These leave your system open to man-in-the-middle attacks. These leave your system open to man-in-the-middle attacks.
</P> </P>
<H3>rc.d</H3> <H3>rc.d</H3>
@ -470,8 +463,8 @@ These leave your system open to man-in-the-middle attacks.
<UL> <UL>
<LI><A HREF="https://www.unitedbsd.com/d/548-system-instability-on-unstable-version-how-do-i-get-logs/7">System instability on unstable version - how do I get logs?</A></LI> <LI><A HREF="https://www.unitedbsd.com/d/548-system-instability-on-unstable-version-how-do-i-get-logs/7">System instability on unstable version - how do I get logs?</A></LI>
</UL> </UL>
<P>See <CODE>syslogd(8)</CODE> and <CODE>syslog.conf(5)</CODE>, which pertain to system logging.</P> <P>See _code(`syslogd(8)') and _code(`syslog.conf(5)'), which pertain to system logging.</P>
<P>Setting <CODE>DDB_ONPANIC</CODE> (see <CODE>options(4)</CODE> and <CODE>sysctl(8)</CODE>) will save a crash dump at <CODE>/var/crash</CODE> on kernel panic. <P>Setting _code(`DDB_ONPANIC') (see _code(`options(4)') and _code(`sysctl(8)')) will save a crash dump at _code(`/var/crash') on kernel panic.
<H3>Upgrading</H3> <H3>Upgrading</H3>
<UL> <UL>
<LI>The NetBSD Guide - <A HREF="https://www.netbsd.org/docs/guide/en/chap-upgrading.html">Chapter 4: Upgrading NetBSD</A></LI> <LI>The NetBSD Guide - <A HREF="https://www.netbsd.org/docs/guide/en/chap-upgrading.html">Chapter 4: Upgrading NetBSD</A></LI>
@ -483,15 +476,15 @@ These leave your system open to man-in-the-middle attacks.
<LI><A HREF="https://github.com/pciutils/pciutils">pciutils/pciutils</A> (GitHub)</LI> <LI><A HREF="https://github.com/pciutils/pciutils">pciutils/pciutils</A> (GitHub)</LI>
</UL> </UL>
<P> <P>
Available as <CODE>sysutils/pciutils</CODE> from pkgsrc. Available as _code(`sysutils/pciutils') from pkgsrc.
Supplies <CODE>lspci(8)</CODE>, <CODE>setpci(8)</CODE>, and <CODE>update-pciids(8)</CODE>. Supplies _code(`lspci(8)'), _code(`setpci(8)'), and _code(`update-pciids(8)').
</P> </P>
<P> <P>
<CODE>update-pciids(8)</CODE> is not part of the <CODE>pciutils</CODE> package in Alpine Linux repositories. _code(`update-pciids(8)') is not part of the _code(`pciutils') package in Alpine Linux repositories.
</P> </P>
<P> <P>
NetBSD includes <CODE>pcictl(8)</CODE> which offers similar functionality. NetBSD includes _code(`pcictl(8)') which offers similar functionality.
<CODE>pcictl pci0 list</CODE> outputs roughly the same information as <CODE>lspci(8)</CODE>, though <CODE>lspci(8)</CODE> may offer slightly more detailed information. _code(`pcictl pci0 list') outputs roughly the same information as _code(`lspci(8)'), though _code(`lspci(8)') may offer slightly more detailed information.
</P> </P>
<H2 ID="pkgsrc">pkgsrc</H2> <H2 ID="pkgsrc">pkgsrc</H2>
@ -504,7 +497,7 @@ NetBSD includes <CODE>pcictl(8)</CODE> which offers similar functionality.
<LI><A HREF="https://wiki.netbsd.org/cgi-bin/cvsweb/wikisrc/pkgsrc/how_to_upgrade_packages.mdwn?rev=1.9;content-type=text%2Fx-cvsweb-markup">how to upgrade packages</A> (NetBSD Developer Wiki <B>snapshot; 2020-09-09</B>)</LI> <LI><A HREF="https://wiki.netbsd.org/cgi-bin/cvsweb/wikisrc/pkgsrc/how_to_upgrade_packages.mdwn?rev=1.9;content-type=text%2Fx-cvsweb-markup">how to upgrade packages</A> (NetBSD Developer Wiki <B>snapshot; 2020-09-09</B>)</LI>
</UL> </UL>
<P> <P>
See <CODE>pkgtools/pkg_rolling_replace</CODE>. See _code(`pkgtools/pkg_rolling_replace').
</P> </P>
<H2 ID="power">Power settings</H2> <H2 ID="power">Power settings</H2>
@ -518,11 +511,11 @@ Power is managed by <A HREF="#acpi">ACPI</A>.
<LI><A HREF="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/checking-for-existing-ssh-keys">Checking for existing SSH keys</A> (GitHub Docs)</LI> <LI><A HREF="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/checking-for-existing-ssh-keys">Checking for existing SSH keys</A> (GitHub Docs)</LI>
<LI><A HREF="Generating a new SSH key and adding it to the ssh-agent">Generating a new SSH key and adding it to the ssh-agent</A> (GitHub Docs)</LI> <LI><A HREF="Generating a new SSH key and adding it to the ssh-agent">Generating a new SSH key and adding it to the ssh-agent</A> (GitHub Docs)</LI>
</UL> </UL>
<P>SSH keys are typically stored in <CODE>$HOME/.ssh</CODE>.</P> <P>SSH keys are typically stored in _code(`$HOME/.ssh').</P>
<P>Typically, the public key's filename will be suffixed with <CODE>.pub</CODE>, while the private key will not.</P> <P>Typically, the public key's filename will be suffixed with _code(`.pub'), while the private key will not.</P>
<P>You can generate an SSH key with <CODE>ssh-keygen(1)</CODE>. Currently the preferred implementation is <CODE>openssh-keygen</CODE>, part of the OpenSSH suite.</P> <P>You can generate an SSH key with _code(`ssh-keygen(1)'). Currently the preferred implementation is _code(`openssh-keygen'), part of the OpenSSH suite.</P>
<P> <P>
Microsoft GitHub documentation suggests a user create a key with <CODE>ssh-keygen -t ed25519 -C "[<I>e-mail address</I>]"</CODE>. Microsoft GitHub documentation suggests a user create a key with _code(`ssh-keygen -t ed25519 -C "[<I>e-mail address</I>]"').
This generates an <A HREF="https://en.wikipedia.org/wiki/EdDSA#Ed25519">Ed25519</A> SSH key with an e-mail address in the key comment. This generates an <A HREF="https://en.wikipedia.org/wiki/EdDSA#Ed25519">Ed25519</A> SSH key with an e-mail address in the key comment.
</P> </P>
@ -531,26 +524,26 @@ This generates an <A HREF="https://en.wikipedia.org/wiki/EdDSA#Ed25519">Ed25519<
<LI><A HREF="https://www.linux.org/threads/common-pronunciations-of-linux-directories-commands-etc.4445/">Common pronunciations of Linux directories, commands, etc</A></LI> <LI><A HREF="https://www.linux.org/threads/common-pronunciations-of-linux-directories-commands-etc.4445/">Common pronunciations of Linux directories, commands, etc</A></LI>
</UL> </UL>
<H2>Task management</H2> <H2>Task management</H2>
<P><CODE>top(1)</CODE> comes with busybox, otherwise use <CODE>htop</CODE>.</P> <P>_code(`top(1)') comes with busybox, otherwise use _code(`htop').</P>
<H2 ID="text_editing">Text editing</H2> <H2 ID="text_editing">Text editing</H2>
<P> <P>
<CODE>nano(1)</CODE> is a text editor that's usually recommended for beginners because its controls are more intuitive. _code(`nano(1)') is a text editor that's usually recommended for beginners because its controls are more intuitive.
<CODE>ne(1)</CODE> is like <CODE>nano(1)</CODE> but with different superpowers. Not yet in pkgsrc. _code(`ne(1)') is like _code(`nano(1)') but with different superpowers. Not yet in pkgsrc.
</P> </P>
<H3>ed</H3> <H3>ed</H3>
<UL> <UL>
<LI><A HREF="https://catonmat.net/ftp/ed.text.editor.cheat.sheet.txt">Ed Cheat Sheet</A></LI> <LI><A HREF="https://catonmat.net/ftp/ed.text.editor.cheat.sheet.txt">Ed Cheat Sheet</A></LI>
</UL> </UL>
<P> <P>
A particularly shoddy attempt at <CODE>ed(1)</CODE> is provided by <CODE>busybox</CODE>. A particularly shoddy attempt at _code(`ed(1)') is provided by _code(`busybox').
A traditional <CODE>ed(1)</CODE> implementation is in plan9ports. A traditional _code(`ed(1)') implementation is in plan9ports.
I'm pretty sure some later UNIX-based OSes doubled the <CODE>ed(1)</CODE> buffers, there's pretty much no downside to doing so in the modern era but it should be very easy to do yourself if it hasn't already been done (just double some of the array sizes in the beginning of <CODE>ed.c</CODE>). I'm pretty sure some later UNIX-based OSes doubled the _code(`ed(1)') buffers, there's pretty much no downside to doing so in the modern era but it should be very easy to do yourself if it hasn't already been done (just double some of the array sizes in the beginning of _code(`ed.c')).
</P> </P>
<H3>vi</H3> <H3>vi</H3>
<P> <P>
Unlike <CODE>busybox</CODE>'s <CODE>ed(1)</CODE> implementation, its <CODE>vi(1)</CODE> is very useable. Unlike _code(`busybox')'s _code(`ed(1)') implementation, its _code(`vi(1)') is very useable.
<CODE>vim(1)</CODE> is a popular re-implementation of <CODE>vi(1)</CODE>. _code(`vim(1)') is a popular re-implementation of _code(`vi(1)').
</P> </P>
<H3>emacs</H3> <H3>emacs</H3>
<P> <P>
@ -560,8 +553,8 @@ Linus Torvalds uses his own fork of uEmacs ("micro Emacs"), an Emacs without the
</P> </P>
<H3>cat</H3> <H3>cat</H3>
<P> <P>
Technically <CODE>cat(1)</CODE> and other UNIX utilities can be used in a hacky way for text editing functions. Technically _code(`cat(1)') and other UNIX utilities can be used in a hacky way for text editing functions.
You'd be better off using <CODE>ed(1)</CODE>; the UX is very similar. You'd be better off using _code(`ed(1)'); the UX is very similar.
</P> </P>
<H2 ID="true">true(1)</H2> <H2 ID="true">true(1)</H2>
@ -576,45 +569,45 @@ You'd be better off using <CODE>ed(1)</CODE>; the UX is very similar.
</UL></LI> </UL></LI>
</UL> </UL>
<P> <P>
<CODE>true(1)</CODE> is a tool that <I>only</I> quits silently with an exit status of 0. _code(`true(1)') is a tool that <I>only</I> quits silently with an exit status of 0.
Similarly, <CODE>false(1)</CODE> is a tool that <I>only</I> quits silently with an exit status of 1. Similarly, _code(`false(1)') is a tool that <I>only</I> quits silently with an exit status of 1.
Recognizing arguments, printing to standard output, reading from standard input, or otherwise exiting with any other status of 0, is a violation of the POSIX specification for <CODE>true(1)</CODE>. Recognizing arguments, printing to standard output, reading from standard input, or otherwise exiting with any other status of 0, is a violation of the POSIX specification for _code(`true(1)').
These utilities find use in shell scripting, which, though extremely relevant to these utilities, is beyond the scope of this article. These utilities find use in shell scripting, which, though extremely relevant to these utilities, is beyond the scope of this article.
</P> </P>
<P> <P>
Because <CODE>true(1)</CODE>'s required functionality is so simple a POSIX-compliant implementation is a one-liner in most languages, so long as you're willing to make an exception in your code styling. Because _code(`true(1)')'s required functionality is so simple a POSIX-compliant implementation is a one-liner in most languages, so long as you're willing to make an exception in your code styling.
For example, in C: For example, in C:
</P> </P>
<PRE><CODE CLASS="language-c" DATA-LANG="c"> <PRE>
int main(void) { return 0; } int main(void) { return 0; }
</CODE></PRE> </PRE>
<P> <P>
Because executing an empty shellscript file will in most shells do nothing and return an exit status of 0, technically an empty shellscript file is a POSIX-compliant <CODE>true(1)</CODE> implementation in 0 bytes. Because executing an empty shellscript file will in most shells do nothing and return an exit status of 0, technically an empty shellscript file is a POSIX-compliant _code(`true(1)') implementation in 0 bytes.
This was the <CODE>true(1)</CODE> implementation on early versions of UNIX, including Research UNIX, System V, and Sun's Solaris, according to both Rob Pike and John Chambers. This was the _code(`true(1)') implementation on early versions of UNIX, including Research UNIX, System V, and Sun's Solaris, according to both Rob Pike and John Chambers.
A more explicit implementation also exists in POSIX shell: A more explicit implementation also exists in POSIX shell:
</P> </P>
<PRE><CODE CLASS="language-shell" DATA-LANG="shell"> <PRE>
#!/bin/sh #!/bin/sh
exit 0 exit 0
</CODE></PRE> </PRE>
<P> <P>
This happens to be nearly identical in source to the implementation used by NetBSD. This happens to be nearly identical in source to the implementation used by NetBSD.
</P> </P>
<P> <P>
Python has the same 0 byte <CODE>true(1)</CODE> implementation feature as most shells. Python has the same 0 byte _code(`true(1)') implementation feature as most shells.
Here's <CODE><I>false</I>(1)</CODE> in Python rather than <CODE>true(1)</CODE> to demonstrate how exiting with an arbitrary exit status can be done: Here's _code(`<I>false</I>(1)') in Python rather than _code(`true(1)') to demonstrate how exiting with an arbitrary exit status can be done:
</P> </P>
<PRE><CODE CLASS="language-python" DATA-LANG="python"> <PRE>
import sys import sys
sys.exit(1) sys.exit(1)
</CODE></PRE> </PRE>
<P> <P>
In some shells, <CODE>true(1)</CODE> is a shell built-in command, so running <CODE>true</CODE> will run the shell author's implementation of <CODE>true(1)</CODE> rather than the system implementation. In some shells, _code(`true(1)') is a shell built-in command, so running _code(`true') will run the shell author's implementation of _code(`true(1)') rather than the system implementation.
</P> </P>
<P> <P>
GNU <CODE>true(1)</CODE>, from the GNU coreutils, is well known for being a maximalist implementation - it's eighty lines long and directly includes four C header files. GNU _code(`true(1)'), from the GNU coreutils, is well known for being a maximalist implementation - it's eighty lines long and directly includes four C header files.
Their <CODE>true.c</CODE> is 2.3 kilobytes and parses the arguments <CODE>--help</CODE> and <CODE>--version</CODE> (only if either are the first argument to the program). Their _code(`true.c') is 2.3 kilobytes and parses the arguments _code(`--help') and _code(`--version') (only if either are the first argument to the program).
The GNU coreutils implementation of <CODE>true(1)</CODE> is not POSIX compliant. The GNU coreutils implementation of _code(`true(1)') is not POSIX compliant.
</P> </P>
<H2>util-linux</H2> <H2>util-linux</H2>
@ -622,13 +615,13 @@ The GNU coreutils implementation of <CODE>true(1)</CODE> is not POSIX compliant.
<LI><A HREF="https://en.wikipedia.org/wiki/Util-linux">util-linux - Wikipedia</A></LI> <LI><A HREF="https://en.wikipedia.org/wiki/Util-linux">util-linux - Wikipedia</A></LI>
</UL> </UL>
<P> <P>
<CODE>util-linux</CODE> is distributed on all popular Linux distributions and contains utilities users may expect to be already present on their systems, like <CODE>more(1)</CODE> or <CODE>hexdump(1)</CODE>. _code(`util-linux') is distributed on all popular Linux distributions and contains utilities users may expect to be already present on their systems, like _code(`more(1)') or _code(`hexdump(1)').
</P> </P>
<H2>WiFi</H2> <H2>WiFi</H2>
<H3>wpa_supplicant</H3> <H3>wpa_supplicant</H3>
<P> <P>
<CODE>wpa_supplicant(1)</CODE> is usually good enough for establishing WiFi connections. _code(`wpa_supplicant(1)') is usually good enough for establishing WiFi connections.
</P> </P>
<P> <P>
Here's an example configuration for a simple WPA-2 PSK access point. Here's an example configuration for a simple WPA-2 PSK access point.
@ -642,7 +635,7 @@ network={
} }
</PRE> </PRE>
<P> <P>
See <CODE>wpa_supplicant.conf(5)</CODE>. See _code(`wpa_supplicant.conf(5)').
</P> </P>
<H2>X</H2> <H2>X</H2>
@ -652,38 +645,38 @@ See <CODE>wpa_supplicant.conf(5)</CODE>.
</UL> </UL>
<P> <P>
X is a graphical windowing system that can be used on Linux, FreeBSD, OpenBSD, NetBSD, and some proprietary operating systems as well. X is a graphical windowing system that can be used on Linux, FreeBSD, OpenBSD, NetBSD, and some proprietary operating systems as well.
X is not the only windowing system; <CODE>twin(1)</CODE> exists for windowed multitasking within a framebuffer and Wayland is another windowing system intended to replace X. X is not the only windowing system; _code(`twin(1)') exists for windowed multitasking within a framebuffer and Wayland is another windowing system intended to replace X.
</P> </P>
<P> <P>
Xorg requires the user to be a member of the <CODE>input</CODE> and <CODE>video</CODE> groups (or superuser), otherwise it won't be able to access the relevent device files. Xorg requires the user to be a member of the _code(`input') and _code(`video') groups (or superuser), otherwise it won't be able to access the relevent device files.
These errors look like <CODE>Failed to open /dev/input/event[<I>number</I>] (Permission denied)</CODE> when not in the <CODE>input</CODE> group These errors look like _code(`Failed to open /dev/input/event[<I>number</I>] (Permission denied)') when not in the _code(`input') group
and <CODE>Failed to open /dev/tty[<I>number</I>] (Permission denied)</CODE> when not in the <CODE>video</CODE> group. and _code(`Failed to open /dev/tty[<I>number</I>] (Permission denied)') when not in the _code(`video') group.
</P> </P>
<P> <P>
Some Linux software distributions have included scripts to automatically fetch and install an X server. Some Linux software distributions have included scripts to automatically fetch and install an X server.
Alpine has <CODE>setup-xorg-base</CODE>, which adds the packages <CODE>xorg-server</CODE>, <CODE>xf86-input-libinput</CODE>, <CODE>eudev</CODE>, and <CODE>mesa</CODE>, and then enables the OpenRC services for udev. Alpine has _code(`setup-xorg-base'), which adds the packages _code(`xorg-server'), _code(`xf86-input-libinput'), _code(`eudev'), and _code(`mesa'), and then enables the OpenRC services for udev.
</P> </P>
<P> <P>
<CODE>startx(1)</CODE> is provided as part of xinit. _code(`startx(1)') is provided as part of xinit.
</P> </P>
<P> <P>
Arch has the <CODE><A HREF="https://archlinux.org/groups/x86_64/xorg/">xorg</A></CODE> and <CODE><A HREF="https://archlinux.org/groups/x86_64/xorg-apps/">xorg-apps</A></CODE> package groups. Arch has the _code(`<A HREF="https://archlinux.org/groups/x86_64/xorg/">xorg</A>') and _code(`<A HREF="https://archlinux.org/groups/x86_64/xorg-apps/">xorg-apps</A>') package groups.
Documentation can be found within <CODE>xorg-docs</CODE>, Documentation can be found within _code(`xorg-docs'),
drivers within the <CODE><A HREF="https://archlinux.org/groups/x86_64/xorg-drivers/">xorg-drivers</A></CODE> package group, drivers within the _code(`<A HREF="https://archlinux.org/groups/x86_64/xorg-drivers/">xorg-drivers</A>') package group,
the server itself as <CODE>xorg-server</CODE>, the server itself as _code(`xorg-server'),
the X event monitor as <CODE>xorg-xev</CODE>, the X event monitor as _code(`xorg-xev'),
xinit as <CODE>xorg-xinit</CODE>, xinit as _code(`xorg-xinit'),
xinput as <CODE>xorg-xinput</CODE>, xinput as _code(`xorg-xinput'),
XRandR as <CODE>xorg-xrandr</CODE>, XRandR as _code(`xorg-xrandr'),
the X resource database manager as <CODE>xorg-xrdb</CODE>, the X resource database manager as _code(`xorg-xrdb'),
xset as <CODE>xorg-xset</CODE>, xset as _code(`xorg-xset'),
and xsetroot as <CODE>xorg-xsetroot</CODE>. and xsetroot as _code(`xorg-xsetroot').
</P> </P>
<P>Alpine has xinput as <CODE>xinput</CODE>.</P> <P>Alpine has xinput as _code(`xinput').</P>
<H3>Media</H3> <H3>Media</H3>
<P> <P>
<CODE>mpv(1)</CODE> and <CODE>vlc(1)</CODE> are good options. _code(`mpv(1)') and _code(`vlc(1)') are good options.
</P> </P>
<H3>Window Management</H3> <H3>Window Management</H3>
@ -699,7 +692,7 @@ Contrary to what is now popular belief, window managers are not necessary (thoug
<H3>Web Browsing</H3> <H3>Web Browsing</H3>
<H4>TOR Browser</H4> <H4>TOR Browser</H4>
<P> <P>
TOR Browser is available through pkgsrc at <CODE>security/tor-browser</CODE>. TOR Browser is available through pkgsrc at _code(`security/tor-browser').
</P> </P>
</BODY> </BODY>