Skip to content

Building an anti-bitrot bunker

When I first obtained a CompTIA A+ certification some time ago, the concept of bit rot related to what happens to software reliability as the number of updates to the system increases. Over time, software that worked in years past ceases to work as new system updates block system calls or change permissions and files that the software originally relied upon. This slow decaying of reliability was called bit rot. There are some other definitions floating around on the internet, but that is the one most relevant for me.

To prevent this and reduce the amount of time spent in sorting out the bit rot introduced to my investments by Microsoft’s proclivities, I have standardized on two operating systems for major time investments in computing that occupy my life.  Windows still has a place since I sometimes use Windows only games to play with my child.  Other than that necessity, I have built the things I rely on for use with Linux.  The two versions that I have standardized on are Debian and Fedora. Specifically Debian 12 and Fedora 38.  These are not what is used for the website, but they are the major components of my anti-bitrot infrastructure.  I am aware this may not be good security practice, but this isn’t to get me a job, this is to serve an aging man and his family reliably over time.

There are a few reasons that I selected Fedora 38 and Debian 12. Fedora 38 still has Python 2.7 in the repositories.  It was within 2 versions for upgrading from Fedora 36. Fedora 36 was what I was running in my Windows Subsystem for Linux instance, and I upgraded it to Fedora 38.   When deciding to move back to bare metal for my Linux software development and automation needs, I decided to standardize on that one.  Debian has a 32 bit version. I have both the 32-bit and 64-bit deployed in my network.  Debian 32 bit allows on to easily 32-bit builds of Java on a Linux server.  One can add the testing repository and have the latest Java in 32 bit form.  32-bit Java is necessary to run older Minecraft versions.  My family has a large set of mod-collections and old Java Minecraft instances and maps going back about 8 years. I can then run the latest JVM and the latest Minecraft on the same server because the 32bit JVM is available.  It is very annoying to try and  manage 32bit and 64bit Java virtual machines on the same host, so having it all 32-bit solves a huge problem.  One can add the Debian 11 repository and install Python2.7 if one wants to use old Python versions.  I need this old Python version for a project that I worked on over the course of the last 8 years.

The general anti-bit rot measure for Debian is to always use apt-get to install packages as this will leave the .deb file in the cache.  Then copy those .deb files on a regular basis to another location for use as a repository for other Debian installations.  This can be configured to work via a cron job.  Debian is really the only long-term viable game in town if one wants a 32-bit anti-bitrot bunker that will last into the future, over say, a ten year time horizon. Save the .deb files on a private web-server inside the network and periodically update that repository with the files copied via the sweeps from the cache directory.

For Fedora, this should work with any version.  Fedora 38 is the one I use.  Edit the /etc/dnf/dnf.conf file to say keep_cache=True, and this will save the dowloaded RPMS.  One can then build their repository using only what they need if so desired.  The other genuine long term standardization option is to mirror the entire repositories to the private webserver within one’s network.  To do this, install yumdownloader.   Then, move all of the .repo files from /etc/yum.repos.d except for one to a temporary location.  Then, go into a directory with a lot of space.  For Fedora 38, the complete mirror was 229GB.  Then use yumdownloader * and it will download all files from that repository.  Then, use yumdownloader –source * and it will download all source packages for the packages that it just downloaded.  Then, go back to /etc/yum.repos.d and switch that .repo file out with one that was moved previously, and repeat the process until all repositories have been completely downloaded.  Then, copy all downloaded RPMS to one large directory on the webserver and use createrepo to create the meta data.  Then on the client machines, create a .repo pointing to your own webserver, and move the existing .repo files in /etc/yum.repos.d to an archival location.   Then all of your installations will occur from your own webserver and all machines will have the same versions of packages.

In my case, I then install the data science specifics that I need for the automated software that I created.  The process varies slightly depending on whether the system is Fedora or Debian.

For Debian:

Add bullseye to sources.list
Install python2 via bullseye repositories
Install pip via the downloaded file from https://linuxhint.com/install-pip-on-debian-11/ that is to say,
1. wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
2. python2 ./get-pip.py
Apt-get install libcurl4-openssl-dev

R:
Install.packages(‘curl’)
Install.packages(‘fpp2’)
Install.packages(‘magrittr’)
Install.packages(‘urca’)
Install.packages(‘vars’)
Install.packages(‘psych’)
Apt-get install r-cran-rjava
Install.packages(‘rJava’)
Install.packages(‘xlsx’)
Install.packages(‘Hmisc’)
Install.packages(‘prophet’)
Install.packages(‘dplyr’)
pip2 install parsedatetime==2.5
apt-get install awscli
pip2 install boto3
apt-get install r-cran-car

Troubleshooting steps if .xlsx and others are not built:
Are all R packages installed successfully with a 0 exit status?

On Fedora, the repositories do not contain R components in the same way the Debian repositories do.  Here is the process for Fedora 38.

Used the script https://bootstrap.pypa.io/pip/2.7/get-pip.py
pip2 install parsedatetime==2.5 –user
dnf install libcurl
dnf install libcurl-devel
dnf install R
dnf install awscli
pip2 install boto3 –user
dnf install cmake

Within R:
install.packages(‘car’)
install.packages(‘curl’)
install.packages(‘fpp2′)
install.packages(‘magrittr’)
install.packages(‘urca’)
install.packages(‘vars’)
install.packages(‘psych’)
install.packages(‘rJava’)
install.packages(‘xlsx’)
install.packages(‘Hmisc’)
install.packages(‘prophet’)
install.packages(‘dplyr’)

Interlinear Greek New Testament

The Interlinear Literal Translation of the Greek New Testament with the Authorized Version (1897). This is an interlinear Bible with the Authorized Version (King James) along with a Greek text along with it.

A Caution of Claude AI

The Claude AI terms of service at Anthropic, as of 14 October 2024, say that

you may not use the service to “develop any products or services that compete with our Services, including to develop or train any artificial intelligence or machine learning algorithms or models.”

Claude’s terms further state

“Equitable relief. You agree that (a) no adequate remedy exists at law if you breach Section 3 (Use of Our Services); (b) it would be difficult to determine the damages resulting from such breach, and any such breach would cause irreparable harm; and (c) a grant of injunctive relief provides the best remedy for any such breach. You waive any opposition to such injunctive relief, as well as any demand that we prove actual damage or post a bond or other security in connection with such injunctive relief.”

Machine learning includes linear regression. Other Machine Learning algorithms include Logistic Regression, decision trees, random forests, support vector machines, K-Nearest Neighbors, & Bayes Algorithms. It seems to me, that as of 14 October 2024, no one seeking to handle any data science can legitimately use Claude. They are driving toward Claude working as the replacement of human co-workers according to some of the latest marketing.  If the users are forbidden from using the results of the services to strengthen their own work, it seems like it will produce a walled garden without machine learning expertise within the businesses.

Greek letters

This is a list of Greek letters and their names.

α alpha
β beta
γ gamma
δ delta
ε epsilon
ζ zeta
η eta
θ theta
ι iota
κ kappa
λ lamda
μ mu
ν nu
ξ xi
ο omicron
π pi
ρ rho
σ/ς sigma/final sigma
τ tau
υ upsilon
φ phi
χ chi
ψ psi
ω omega

 

Holy Bible Geneva Bible – 1579

Holy Bible – Geneva Bible – 1579

Create a systemd service for YaCy

Create file /usr/lib/systemd/system/yacy.service and add this content:

[Unit]
Description=YaCy search server
After=network.target
Restart=always

[Service]
Type=forking
User=yacy
ExecStart=/opt/yacy/startYACY.sh
ExecStop=/opt/yacy/stopYACY.sh
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target

Then use systemctl enable yacy.service.

Hydrogen Infrastructure

Zero Hedge reported on California launching a hydrogen hub infrastructure for hydrogen refueling infrastructure. https://www.zerohedge.com/political/california-launch-hydrogen-hub-expand-zero-emission-technology.  The California government’s official press release on the Hydrogen Hub was released 17 July 2024 at https://www.gov.ca.gov/2024/07/17/california-launches-world-leading-hydrogen-hub/. Clean Technica produced an article about the Hydrogen Hub grant program that covers multiple states.

This blog will follow Nikola and Hyla, which are available online at https://www.nikolamotor.com/ and https://www.hyla.co/. Nikola produces the TRE FCEV.

General Motors has a partnership with the U.S. Department of Energy and Honda for Hydrogen development. Hyundai has the XCIENT fuel cell truck. Kenworth has the T680. Like the Hyundai the T680 places the fuel tanks behind the driver from floor to ceiling.  The Kenworth is a partnership with Toyota with Toyota producing the fuel cell power plant and Kenworth producing the trucks.  All of these are limited to around 400-450 miles of range, with the exception of one of the XCIENTS which listed 400km, which is 248 miles. Hyundai has a class 8 truck in partnership with a company called Plus, and they claim to be fully autonomous.

Volvo has fuel cell trucks with a range of up to 1000 km.  International Trucks has a hydrogen fuel cell technology designed for routes 300+ miles in testing.  They use the General Motors fuel cell platform, and OneH2 mobile hydrogen production and fueling technology to bring the fuel station to the customer in a manner similar to Hyla.

Mistral Instruct using the above as Local Documents input:

The Hydrogen Hub infrastructure launched by California is an important step towards expanding zero-emission transportation options. With more refueling stations available, it will be easier for consumers to switch to hydrogen-powered vehicles and reduce their carbon footprint. It’s great to see multiple companies working together on developing hydrogen technology, including Nikola, Hyla, General Motors, Honda, Kenworth, Toyota, Volvo, International Trucks, and more. The range of these vehicles varies, but it’s clear that there is a growing interest in producing longer-range hydrogen fuel cell trucks.

Addendum 9/21/24:  Ford has a hydrogen vehicle in the works with an outsourced power train, but it was not included at the time of original writing.

Simon Says and use Mojeek

The Simon Says blog has been online for a long time. Here is an entry from 2008 about ripping CDs on a Mac.  In a way this site shows what is wrong with the web.  Twenty years ago blogs and websites had favorites and blog rolls.  Through this people discovered many great sites.  Around 2012 WordPress removed the Link Manager from the default WordPress and the blog-sphere began to fade away because the links began to fray.  From there, Google began to limit search results to the chosen few.  Recently Bing search has begun allowing scrolling to many different search results again. I went to page 16 the other day just to see.  To use a Search Engine like it’s 2009, which was way better than now, use Mojeek.  I hope they don’t break it.  That’s how I found that 2008 entry about ripping CDs on a Mac.  That is a discovery that one would never find on Google.  It was like stepping into a time machine.

Shrink Firefox Interface

Use about:config –> browser.uidensity .

browser.uidensity is set to 0 by default.  Changer the  value to 1 and it takes immediate effect.

VirtualBox Disk Conversion

To convert a dynamic VirtualBox disk to a Fixed disk, run the following command:

vboxmanage clonemedium disk /path/disk.vdi /path/newdisk.vdi -variant Fixed

using –variant Standard would create a dynamic disk.  Then open the virtual machine and remove the existing disk and attach the new disk.  Then use the media manager to delete the unused media.

Use the following command to list registered virtual disks:

vboxmanage list hdds

Browser Extensions

Chromium:

Joplin Web Clipper, Zotero Connector, floccus bookmarks sync, uBlock Origin, Quick Javascript Switcher, SingleFile, uMatrix

Firefox:

floccus bookmarks sync, Joplin Web Clipper, Search by Image, uMatrix, Undo Close Tab, Zotero, uBlock Origin

 

Last modified on March 5th, 2026 at 9:57 PM

[x]  Removed some Firefox/LibreWolf extensions

[+] Added Zotero and uBlock Origin, which have been long used, but neglected with regards to appearing in this list.

Debian 12 PATH and X11

A few quirks with Debain 12 include that path not being set in similar fashion to Fedora, Ubuntu, and other distributions.  One must regularly set

export PATH=$PATH:/usr/sbin

In Gnome, applications will open on the server instead of the client when using X11 forwarding.  This will occur even though xcalc opens on the client normally.  The way to avoid this is to add the following to .bashrc

unset XDG_RUNTIME_DIR 
unset GDK_BACKEND

The general rule is compress, then encrypt.1, 2

1. https://stackoverflow.com/questions/4676095/when-compressing-and-encrypting-should-i-compress-first-or-encrypt-first

2. https://crypto.stackexchange.com/questions/33737/is-it-better-to-encrypt-before-compression-or-vice-versa

Move /var to new disk

To add a new virtual disk and move the existing Linux partition to the new disk use the following process. The process assumes standard partitions without the use of Logical Volume Manager (LVM).

1. Backup the existing VM. One good way to do that is to clone the Virtual Machine and use the procedure on the new Virtual Machine.

2. Create the partition and format it.

$ mount /dev/sbd /mnt
$ shopt -s dotglob
$ rsync -aulvXpogtr /var/* /mnt
$ nano /etc/fstab

Add this line, replacing sdb and ext4 as necessary:

/dev/sdb /var ext4 defaults,noatime,nofail 0 2

Then

$ mv /var/ /var.old

Reboot and enjoy the new drive.

Install Java 21 in Debian 12

Minecraft Java edition lost compatibility with Java 17 between 1.20.4 and 1.20.6. Version 1.20.4 works with Java 17, and 1.20.6 no longer works with Java 17.  Several guides appear online for installing downloaded packages of the 64-bit runtime from Oracle or other sources.  Since Debian offers 32-bit server operating systems in the present day, the package manager versions are the easiest option if one uses the 32-bit version of Debian.  One of the reasons to use the 32-bit version of Debian is for use with older versions of Minecraft such as 1.10 and 1.12.  The older versions’ ecosystem contain an incredible number of mods.  The older versions require 32-bit java runtimes and the easiest way to handle that is to use a 32-bit operating system and then one can have newer versions of Java alongside older versions of Java and then one can run any version of Minecraft and Minecraft Forge that they desire.

Edit /etc/apt/sources.list to contain the following lines:

deb http://deb.debian.org/debian testing main
deb-src http://deb.debian.org/debian testing main

Then, run the following commands.

apt-get update
apt-get install openjdk-21-jre
java –version

https://wiki.debian.org/DebianTesting contains a good reference guide for using Debian Testing, including details on upgrading to the next distribution.  The approximate Java lifecycle can be found at https://www.oracle.com/java/technologies/java-se-support-roadmap.html.

Hypothesis test memo no. 1


1. R2 is the coefficient of determination, which is the square of the Pearson correlation coefficient, r, the formula for which is ρ=β1(σx/σy), where β1 is the parameter estimate. ASCI and Unicode text does not have a circumflex, ^, on top of the β. For this documentation the objective is multiplatform long-term readability so an equation editor with specialized support for circumflexes is out of the question.

2. There is also the existence of the rejection region method. We reject the null hypothesis if the test statistic’s absolute value is greater than the critical value, which we can express with the formula Reject if |t| > tα/2,n-1

Disable updates in Thunderbird

Open the Thunderbird program folder (e.g. C:\Program Files (x86)\Thunderbird)
create a new folder named distribution
Create a file named policies.json with the following content:

 

{
    "policies": {
    "DisableAppUpdate": true
    }
}

Thanks to sifferedd.

Print environmental variables in Bash

Use printenv to see what environment variables are set.

#!/usr/bin/env bash
printenv
    set -x

.nanorc in CentOS

Edit $HOME/.nanorc to contain the following:

include /usr/share/nano/java.nanorc
include /usr/share/nano/man.nanorc
include /usr/share/nano/nanorc.nanorc
include /usr/share/nano/python.nanorc
include /usr/share/nano/sh.nanorc
include /usr/share/nano/html.nanorc
include /usr/share/nano/perl.nanorc
include /usr/share/nano/php.nanorc

CentOS 7 uses a much older version of nano than the one that presently ships on most distributions. The php.nanorc on newer The following should appear in /usr/share/nano/php.nanorc on CentOS7 to allow syntax highlighting for php:

 

## Syntax highlighting for PHP

syntax "php" "\.(php[23457s~]?|phtml|ctp)$"

# PHP markings.
color brightgreen "()"

# Function names.
color white "\

The .bashrc file I use on CentOS6

The .bashrc file I use on CentOS6

 

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# system variables
export VISUAL=nano  # sets nano as the crontab editor
export GZIP=-9      # maximum compression
export XZ_OPT=-9    # maximum compressions

# ls modifications
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# calculator
calc() { echo "$*" | bc -l; }

# Generate a UUID
uuid() { UUID=$(cat /proc/sys/kernel/random/uuid) && echo $UUID; }

# CHANGE SHELL/WINDOW TITLE
# Works on Opensuse 15.3
# PS1=$PS1"\[\e]0;test1\a\]"
shellrename() { read -p "Enter new shell name: " name && PS1=$PS1"\[\e]0;${name}\a\]"; }

# For older versions of gnome-terminal
# shellrename() { read -p "Enter new shell name: " name && PROMPT_COMMAND='echo -ne "\033]0;${name}\007"'; }

# Zen Burn
# Another old way that works great in gnome-terminal while causing problems
# in some configurations involving SSH:
echo -ne '\e]12;#BFBFBF\a'
echo -ne '\e]10;#DCDCCC\a'
echo -ne '\e]11;#3F3F3F\a'
echo -ne '\e]4;0;#3F3F3F\a'
echo -ne '\e]4;1;#705050\a'
echo -ne '\e]4;2;#60B48A\a'
echo -ne '\e]4;3;#DFAF8F\a'
echo -ne '\e]4;4;#506070\a'
echo -ne '\e]4;5;#DC8CC3\a'
echo -ne '\e]4;6;#8CD0D3\a'
echo -ne '\e]4;7;#DCDCCC\a'
echo -ne '\e]4;8;#709080\a'
echo -ne '\e]4;9;#DCA3A3\a'
echo -ne '\e]4;10;#C3BF9F\a'
echo -ne '\e]4;11;#F0DFAF\a'
echo -ne '\e]4;12;#94BFF3\a'
echo -ne '\e]4;13;#EC93D3\a'

The best Alias for ls

The best alias for ls is

ls –halF

It is easy to remember, and produces easy to read output with human readable file sizes and / marks present by the directory names.

 

Document z240302wa, last modified 2 March, 2024

 

Install iftop on Oracle Linux 9

dnf install oracle-epel-release-el9
dnf install iftop

iptraf is already in the default repositories.

A good version of ll

A really good version of the ll alias is:

ls –lahF, although on some versions ls –lahp looks better than F.

LS alias and Mozilla DRM bar

Some useful aliases that are not always preconfigured on every Linux version:

alias ll=’ls -alF’
alias la=’ls -A’
alias l=’ls –CF’

To eliminate the DRM warning in Firefox and Librewolf without enable DRM, add this to “userChrome.css”:

 notification[value="drmContentDisabled"]{ display:none !important; }

toolkit.legacyUserProfileCustomizations.stylesheets must be set to true in about config.

Double Sided Scan and PDF

The following script scans PDFs via an auto-document feeder in Hp-Lip and then collates the pages to the correct order when there are reverse sides. No scans will be saved if no data is transmitted for the second set of scans. The second set of scans is the reverse of the pages.

#!/usr/bin/env bash

YMD=$(date +"%Y-%m-%d")
Y=$(date +"%Y")
WORKDIR=/home/username/Temp/
OUTPATH=/home/username/Scans/${Y}/
#  Create a folder, ~/Temp and create a folder, ~/Scans
mkdir -p "/home/username/Scans/${Y}"

hp-scan --adf --mode=color &&
PART=hpscan
LATESTSCAN=`ls -t ${PART}*pdf | sed "1q"`
echo "${LATESTSCAN} ready for ${FILEOUTPUT}"

#  Why you shouldn't parse the output of ls
#  http://mywiki.wooledge.org/ParsingLs 
#  This does not use the FILEOUTPUT variable itself because the cp command
#  seems to have trouble copying the file correctly, even with switches. 

# Thanks Elektropepi at https://github.com/qpdf/qpdf/issues/259
function pdfscanmerge() {
	if [ $# -ne 3 ]; then 
		echo "Usage: pdfscanmerge"; return; fi let odd_pages=$(qpdf --show-npages $1) let even_page=$(qpdf --show-npages $2) argument= for (( odd_page=1; odd_page0 ]; then argument+="$2 $even_page " fi let even_page-- done qpdf --empty --pages $argument -- $3 } cp ${LATESTSCAN} "$WORKDIR$1-uncompressed-scanned-${YMD}.pdf" gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -sOutputFile="$OUTPATH${YMD}-$1.pdf" ${LATESTSCAN} sleep 1 rm -f ${LATESTSCAN} rm -f "$WORKDIR$1-uncompressed-scanned-${YMD}.pdf" killall evince read -p "Load the reverse sides and press any key:" n hp-scan --adf --mode=color && PART=hpscan LATESTSCAN=`ls -t ${PART}*pdf | sed "1q"` echo "${LATESTSCAN} ready for ${FILEOUTPUT}" cp ${LATESTSCAN} "$WORKDIR$1-uncompressed-scanned-reverse-${YMD}.pdf" gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -sOutputFile="$OUTPATH${YMD}-$1-reverse.pdf" ${LATESTSCAN} sleep 1 rm -f ${LATESTSCAN} rm -f "$WORKDIR$1-uncompressed-scanned-reverse-${YMD}.pdf" killall evince pdfscanmerge "$OUTPATH${YMD}-$1.pdf" "$OUTPATH${YMD}-$1-reverse.pdf" "$OUTPATH${YMD}-$1-collated.pdf" rm -f "$OUTPATH${YMD}-$1.pdf" rm -f "$OUTPATH${YMD}-$1-reverse.pdf"

Automated Database Restart

Here is a script that checks to ensure the database is running and restarts the service if it is not running.  This was used on a very low memory server to ensure a database remained operational, despite it sometimes crashing due to out of memory errors.

#!/bin/bash

timestamp="$(date)"
systemctl stop httpd && echo "${timestamp}" Stopping Apache... >> /home/centos/administration/apache.log
systemctl is-active mariadb && echo "${timestamp}" MariaDB is active so not starting >> /home/centos/administration/mariadb_active.log || echo "${timestamp}" MariaDB is not Active >> /home/centos/administration/mariadb_inactive.log
systemctl is-active mariadb && echo "${timestamp}" No need to restart MariaDB || systemctl start mariadb
systemctl start httpd && echo "${timestamp}" restarting apache...>> /home/centos/administration/apache.log

AppImage Integration

To install AppImages and integrate them with the desktop environment like a conventional package,  use the AppImage Launcher. LibreWolf’s documentation contains a how-to document on using AppImage Launcher.

Thunderbird Row Highlighting

Revisions: 21 January 2024, first publication

The Thunderbird developers are moving to a new user interface code base for Thunderbird 115 and Thunderbird 102 is the last version that will work with the historical userChrome.css customizations. The userbase for Mozilla products has continually shrunk over the past few years and the chances of equivalent customization abilities being discovered and written about strike me as pretty low.  Because of the change, I have mirrored Thunderbird 102.14 for Windows and Linux in 64-bit and 32-bit versions in the event that the old versions disappear from the Mozilla site. The Source is available on the Mozilla mirror as of August 11, 2023.  The releases are located here.

The userChrome.css below allows the following persistent tag colors.  It also contains text customization for the interface.  And it contains alternate row highlighting, where one row is light grey and the other white.  The alternate row highlighting conflicts with the background colors for tags.  One must choose which feature to have. The userChrome.css goes in the profile directory in a subfolder called chrome.

Screenshot 2024-01-21 151250
The code for highlighting the tag backgrounds was found on a French website located here. E.g. C:\Users\username\AppData\Roaming\Thunderbird\Profiles\1a2b3cde.default-release\chrome

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* set default namespace to XUL */
/* thanks to Jean-Claude, */
/* https://forums.mozfr.org/viewtopic.php?t=143173 */
/*Important tag IMPORTANT*/ 
treechildren::-moz-tree-row(T_24label1)
{
      border-bottom: 1px solid #FFFFFF !important;
      background-color:  #FF0033   !important;
}
treechildren::-moz-tree-cell-text(T_24label1)
{
      color: #FFFFFF !important;
}
treechildren::-moz-tree-row(T_24label1, selected)
{
      background-color: #b71c1c !important;
}
treechildren::-moz-tree-cell-text(T_24label1, selected)
{
  color: #00FF00  !important;
}

/*Travail tag   WORK*/
treechildren::-moz-tree-row(T_24label2)
{
  border-bottom: 1px solid #FFFFFF !important;
  background-color:  #FF9900   !important;
}
treechildren::-moz-tree-cell-text(T_24label2)
{
  color: #FFFFFF !important;
}
treechildren::-moz-tree-row(T_24label2, selected)
{
  background-color: #FF9900 !important;
}
treechildren::-moz-tree-cell-text(T_24label2, selected)
{
  color: #00FF00  !important;
}

/*Personnel tag PERSONAL*/ 
treechildren::-moz-tree-row(T_24label3)
{
  border-bottom: 1px solid #FFFFFF !important;
  background-color:  #009900   !important;
}
treechildren::-moz-tree-cell-text(T_24label3)
{
  color: #FFFFFF !important;
}
treechildren::-moz-tree-row(T_24label3, selected)
{
  background-color: #009900 !important;
}
treechildren::-moz-tree-cell-text(T_24label3, selected)
{
  color: #00FF00  !important;
}

/*A faire tag*/
treechildren::-moz-tree-row(T_24label4)
{
  border-bottom: 1px solid #FFFFFF !important;
  background-color:  #3333FF   !important;
}
treechildren::-moz-tree-cell-text(T_24label4)
{
  color: #FFFFFF !important;
}
treechildren::-moz-tree-row(T_24label4, selected)
{
  background-color: #3333FF !important;
}
treechildren::-moz-tree-cell-text(T_24label4, selected)
{
  color: #00FF00  !important;
}

/*Peut attendre tag*/
treechildren::-moz-tree-row(T_24label5)
{
  border-bottom: 1px solid #FFFFFF !important;
  background-color:  #993399  !important;
}
treechildren::-moz-tree-cell-text(T_24label5)
{
  color: #FFFFFF !important;
}
treechildren::-moz-tree-row(T_24label5, selected)
{
  background-color: #993399 !important;
}
treechildren::-moz-tree-cell-text(T_24label5, selected)
{
  color: #00FF00  !important;
}

/*test tag*/
treechildren::-moz-tree-row(Ttest)
{
  border-bottom: 1px solid #FFFFFF !important;
  background-color:  #FFCC33  !important;
}
treechildren::-moz-tree-cell-text(Ttest)
{
  color: #FFFFFF !important;
}
treechildren::-moz-tree-row(Ttest, selected)
{
  background-color: #FFCC33 !important;
}
treechildren::-moz-tree-cell-text(Ttest, selected)
{
  color: #00FF00  !important;
}

/* 9 August 2023 Additions */
/* Set Font Size In Folder Pane */

#folderTree >treechildren::-moz-tree-cell-text {
  /*font-family: Lucida Sans !important;*/
  font-size: 9pt !important; }

/* Set Font Size In Thread Pane */

#threadTree >treechildren::-moz-tree-cell-text {
  /*font-family: Lucida Sans !important;*/
  font-size: 9pt !important; }

#threadTree treechildren::-moz-tree-row    {
/*  border-bottom: 1px dotted grey !important;  */
  height: 24px !important; }

/* folder list spacing */

#folderTree treechildren::-moz-tree-row    {
  height: 24px !important; }

/* The silver background color on alternating rows */
#threadTree treechildren::-moz-tree-row(odd) {
  -moz-appearance: none !important;
  background-image: none !important;
  /* the !important property overrides previous styling rules */
  /* this line enables alternate color row highlighting, but
  tag backgrounds on this row cannot be highlighted.  Only one 
  background highlighting can be applied Disabled 9 August 2023
  to enable tag background highlights*/
  /* background-color:#F3F6FA !important; */

}

#threadTree treechildren::-moz-tree-row(selected) {
  background-color: -moz-Dialog !important;
}
#threadTree treechildren::-moz-tree-row(selected, focus) {
  background-color: Highlight !important;
}

#folderTree treechildren::-moz-tree-row(selected) {
  -moz-appearance: none !important;
  background-image: none !important;
  background-color: Highlight !important;
}
#folderTree treechildren::-moz-tree-row(selected, focus) {
  -moz-appearance: none !important;
  background-image: none !important;
  background-color: Highlight !important;
}

Functions in Bash

This is the code for a function in Bash script.

 #!/bin/bash
 # Define a function
 greet() {
 echo "Hello, $1"
 }
 # Call the function with "World" as the argument
 greet "World"