.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"

Looping through filenames in Bash

To loop through the subdirectories in a folder, when those subdirectories may contain spaces in the file names, use the following procedure.

OLD_IFS=$IFS && IFS=$'\n'
 for directory in $HOME/somefolder/*/; do
 echo “some code here”
 done
 IFS=$OLD_IFS