BCS WaterFox Browser of Choice

FireFox has exhausted my patience. The discontinuance of tools that makes my programming job easier, their willingness to install plugins without permission, selling my information as well as unbridled advertising has made me switch to WaterFox web browser.

The WaterFox web site home page is available by clicking here.

To learn more about WaterFox by clicking here and selecting the About option.

The source code may be located by clicking here.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Install Unreal Engine 4 on Linux Mint

This article explains an installation process for the Unreal Engine after the source code is downloaded to its target location.

The first script to execute is Setup.sh. As the name implies this script will check dependencies and install the application.


The second script to execute is the GenerateProjectFiles.sh. As its name implies project file will be setup for the Mint environment.


Each process may be quite lengthy in execution time.  The speed of your machine and the Internet connection determine the actual length execution.

Now we are ready to make all the associated executables.

make -j4 ShaderCompileWorker UnrealLightmass UnrealPak UE4Editor

We are now ready to execute the unreal editor.

cd /home/ure/Desktop/UnrealEngine-release/Engine/Binaries/Linux

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS SDK Manager Install

The Software Development Kit Manager

SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It provides a convenient Command Line Interface (CLI) and API for installing, switching, removing and listing Candidates. Formerly known as GVM the Groovy enVironment Manager, it was inspired by the very useful RVM and rbenv tools, used at large by the Ruby community.

The zip and unzip applications must be installed prior to installing SDK manager.

sudo apt-get install zip
sudo apt-get install unzip

The SDK install can commence by issuing the following commands.

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk version

At this point installations may commence.

sdk list
sdk list >> lst.txt

The following depicts the list of available candidates on this workstation.

Available Candidates
q-quit                                  /-search down
j-down                                  ?-search up
k-up                                    h-help
Ant (1.10.1)                                             https://ant.apache.org/
Apache Ant is a Java library and command-line tool whose mission is to drive
processes described in build files as targets and extension points dependent
upon each other. The main known usage of Ant is the build of Java applications.
Ant supplies a number of built-in tasks allowing to compile, assemble, test and
run Java applications. Ant can also be used effectively to build non Java
applications, for instance C or C++ applications. More generally, Ant can be
used to pilot any type of process which can be described in terms of targets and
                                                               $ sdk install ant
AsciidoctorJ (1.5.6)                                     http://asciidoctor.org/
AsciidoctorJ is the official library for running Asciidoctor on the JVM. Using
AsciidoctorJ, you can convert AsciiDoc content or analyze the structure of a
parsed AsciiDoc document from Java and other JVM languages.
                                                      $ sdk install asciidoctorj
Ceylon (1.3.3)                                           http://ceylon-lang.org/
Ceylon is a modern, modular, statically typed programming language for the Java
and JavaScript virtual machines. The language features a flexible and very
readable syntax, a unique and uncommonly elegant static type system, a powerful
module architecture, and excellent tooling.
                                                            $ sdk install ceylon
CRaSH (1.3.0)                                            http://www.crashub.org/
The Common Reusable SHell (CRaSH) deploys in a Java runtime and provides
interactions with the JVM. Commands are written in Groovy or Java and can be
developed at runtime making the extension of the shell very easy with fast
development cycle.
                                                             $ sdk install crash
Gaiden (1.1)                                       http://kobo.github.io/gaiden/
Gaiden is a tool that makes it easy to create documentation with Markdown.
                                                            $ sdk install gaiden
Glide (0.9.2)                                      http://glide-gae.appspot.com/
Glide makes it incredibly easy to develop apps that harness the power of Google
App Engine for Java using expressiveness of Groovy and sweetness of Gaelyk's
syntactic sugar.
                                                             $ sdk install glide
Gradle (4.4)                                                  http://gradle.org/
Gradle is a build automation tool that builds upon the concepts of Apache Ant
and Apache Maven and introduces a Groovy-based domain-specific language (DSL)
instead of the more traditional XML form of declaring the project configuration.
Gradle uses a directed acyclic graph (DAG) to determine the order in which tasks
can be run.
                                                            $ sdk install gradle
Grails (3.3.2)                                               https://grails.org/
Grails is a powerful web framework, for the Java platform aimed at multiplying
developers productivity thanks to a Convention-over-Configuration, sensible
defaults and opinionated APIs. It integrates smoothly with the JVM, allowing you
to be immediately productive whilst providing powerful features, including
integrated ORM, Domain-Specific Languages, runtime and compile-time
meta-programming and Asynchronous programming.
                                                            $ sdk install grails
Griffon (1.5.0)                                    http://griffon-framework.org/
Griffon is desktop application development platform for the JVM.Inspired by
Grails, Griffon leverages the use of the Groovy language and concepts like
Convention over Configuration. The Swing toolkit is the default UI toolkit of
choice however others may be used, for example JavaFX.
                                                           $ sdk install griffon
Groovy (2.4.13)                                      http://www.groovy-lang.org/
Groovy is a powerful, optionally typed and dynamic language, with static-typing
and static compilation capabilities, for the Java platform aimed at multiplying
developers' productivity thanks to a concise, familiar and easy to learn syntax.
It integrates smoothly with any Java program, and immediately delivers to your
application powerful features, including scripting capabilities, Domain-Specific
Language authoring, runtime and compile-time meta-programming and functional
                                                            $ sdk install groovy
GroovyServ (1.1.0)                            https://kobo.github.io/groovyserv/
GroovyServ reduces startup time of the JVM for runnning Groovy significantly. It
depends on your environments, but in most cases, it’s 10 to 20 times faster than
regular Groovy.
                                                        $ sdk install groovyserv
Java (8u152-zulu)                                              https://zulu.org/
Java Platform, Standard Edition (or Java SE) is a widely used platform for
development and deployment of portable code for desktop and server environments.
Java SE uses the object-oriented Java programming language. It is part of the
Java software-platform family. Java SE defines a wide range of general-purpose
APIs – such as Java APIs for the Java Class Library – and also includes the Java
Language Specification and the Java Virtual Machine Specification.
                                                              $ sdk install java
JBake (2.5.1)                                                  http://jbake.org/
JBake is a Java based, open source, static site/blog generator for developers
and designers.
                                                             $ sdk install jbake
Kobalt (0.720)                                           http://beust.com/kobalt
Kobalt is a build system inspired by Gradle and Maven. It reuses the best
concepts from these two successful and popular build systems while adding a few
modern features of its own. Kobalt is written entirely in Kotlin and its build
files are valid Kotlin files as well.
                                                            $ sdk install kobalt
Kotlin (1.2.0)                                           https://kotlinlang.org/
Kotlin is a statically-typed programming language that runs on the Java Virtual
Machine and can also be compiled to JavaScript source code.
                                                            $ sdk install kotlin
kscript (2.2.1)                          https://github.com/holgerbrandl/kscript
Enhanced scripting support for Kotlin on *nix-based systems. kscript provides an
easy-to-use, very flexible, and almost zero-overhead solution to write
self-contained mini-applications with Kotlin.
                                                           $ sdk install kscript
Lazybones (0.8.3)                        https://github.com/pledbrook/lazybones/
Lazybones allows you to create a new project structure for any framework or
library for which the tool has a template.
                                                         $ sdk install lazybones
Leiningen (2.7.1)                                          http://leiningen.org/
Leiningen is the easiest way to use Clojure. With a focus on project automation
and declarative configuration, it gets out of your way and lets you focus on
your code.
                                                         $ sdk install leiningen
Maven (3.5.2)                                          https://maven.apache.org/
Apache Maven is a software project management and comprehension tool. Based on
the concept of a project object model (POM), Maven can manage a project's build,
reporting and documentation from a central piece of information.
                                                             $ sdk install maven
sbt (1.0.4)                                            http://www.scala-sbt.org/
SBT is an open source build tool for Scala and Java projects, similar to Java's
Maven or Ant. Its main features are: native support for compiling Scala code and
integrating with many Scala test frameworks; build descriptions written in Scala
using a DSL; dependency management using Ivy (which supports Maven-format
repositories); continuous compilation, testing, and deployment; integration with
the Scala interpreter for rapid iteration and debugging; support for mixed
Java/Scala projects
                                                               $ sdk install sbt
Scala (2.12.4)                                        http://www.scala-lang.org/
Scala is a programming language for general software applications. Scala has
full support for functional programming and a very strong static type system.
This allows programs written in Scala to be very concise and thus smaller in
size than other general-purpose programming languages. Scala source code is
intended to be compiled to Java bytecode, so that the resulting executable code
runs on a Java virtual machine. Java libraries may be used directly in Scala
code and vice versa. Scala is object-oriented, and uses a curly-brace syntax.
Scala has many features of functional programming languages, including currying,
type inference, immutability, lazy evaluation, and pattern matching. It also has
an advanced type system supporting algebraic data types, covariance and
contravariance, higher-order types, and anonymous types. Other features of Scala
include operator overloading, optional parameters, named parameters, raw
strings, and no checked exceptions.
                                                             $ sdk install scala
Spark (2.2.0)                                          https://spark.apache.org/
Apache Spark is an open-source cluster-computing framework. Spark provides an
interface for programming entire clusters with implicit data parallelism and
                                                             $ sdk install spark
Spring Boot (1.5.9.RELEASE)               http://projects.spring.io/spring-boot/
Spring Boot takes an opinionated view of building production-ready Spring
applications. It favors convention over configuration and is designed to get you
up and running as quickly as possible.
                                                        $ sdk install springboot
Sshoogr (0.9.25)                             https://github.com/aestasit/sshoogr
Sshoogr is a Groovy based DSL and command line tool for working with remote
servers through SSH.
                                                           $ sdk install sshoogr
Vert.x (3.5.0)                                                  http://vertx.io/
Vert.x is a tool-kit for building reactive applications on the JVM.
                                                             $ sdk install vertx
VisualVM (1.3.9)                                     https://visualvm.github.io/
VisualVM is a tool that provides a visual interface for viewing detailed
information about Java applications while they are running on a Java Virtual
                                                          $ sdk install visualvm

To review the usage of SDKMAN! click here.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Eclipse Oxygen c++ Compiler Installation

The first task is to install the Eclipse Installer. Click here to download the 64 bit Eclipse Installer for Ubuntu. Extract the contents of the downloaded zip to the primary Eclipse sub folder in your workstation.
When occasionally there are updates for the installer. There will be an orange blot on the hamburger for the Eclipse Installer. Be sure and keep the installer up to date.

Traverse the installer until the Eclipse Platform option appears and click on it.

Click on the Eclipse Platform to install Eclipse.

Now the c++ Oxygen Eclipse compiler is installed. Click on the Launch option after install.

Click on the Help Option Followed by the Install New Software Option to arrive at the next screen.

Select All Available Sites and key in marketplace in the available search box. When the list box is populated select the Eclipse Marketplace item and click Next. Click Next again and Accept Terms and License Agreement. Next click on the Finish Option.

After the Marketplace software is intalled Eclipse will need to restart select the Yes option.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS gtkmm Simple Application

The minimal source code for Gtk c++ application is listed below.

// Name        : gla01.cpp
// Author      : Mr. Arch Brooks
// Version     : 0.0
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
#include <iostream>
#include <gtkmm.h>
using namespace std;
int main(int argc, char *argv[]) {
	Gtk::Main kit(argc, argv);
	Gtk::Window window;
	return 0;


Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS c++ App That Creates Eclipse c++ Project And Class

This application accepts a workspace path, family id and class name to create a fully functional Eclipse Oxygen c++ project.

After this application executes the developer should import the newly created project into the Eclipse Oxygen IDE for c++ and continue developing the application.

Initially all libraries for GTK3+ (via gtkmm), Boost and other capabilities are available as well as some custom routines which are useful for in the design and coding of c++ applications.

What is generated is the complete project development environment and the source code for the mainline as well as aforementioned class.  This is accomplished by using a completed project as a template  while simultaneously creating and naming all component parts based on the family id and the class name provided.

Below is the structure to suppling input to the application.

struct gen_params {
	string projHome = "/home/archman/workspace/cpp/";
	string famId = "Gen01";
	string clas = "cl01";

Here is the main flow for accomplishing this task.

void utils::gen02(gen_params gp) {
	cout << "In Gen 02" << endl;
	utils::forceDirectories(gp.td + "Debug");
	utils::forceDirectories(gp.td + "src");
	utils::forceDirectories(gp.td + ".settings");
			gp.td + ".cproject");
			gp.td + ".project");
	utils::fileCopy("/home/archman/workspace/cpp/skelp/.settings/language.settings.xml", gp.td + ".settings/language.settings.xml");
	utils::fileCopy("/home/archman/workspace/cpp/skelp/Debug/makefile", gp.td +"Debug/makefile");
	utils::fileCopy("/home/archman/workspace/cpp/skelp/Debug/objects.mk", gp.td +"Debug/objects.mk");
	utils::fileCopy("/home/archman/workspace/cpp/skelp/Debug/sources.mk", gp.td +"Debug/sources.mk");
	utils::forceDirectories(gp.td + "Debug/src/");
	utils::fileCopy("/home/archman/workspace/cpp/skelp/Debug/src/subdir.mk", gp.td +"Debug/src/subdir.mk");
	mod_rec mr;
	utils::init_repl(mr, gp);
	string str[sizeOfStringArray];
	int lcnt;
	lcnt = utils::fin("/home/archman/workspace/cpp/skelp/src/skelp.cpp", str);
	utils::upd(mr, str, lcnt);
	utils::fot(gp.td + "src/" + gp.famId + "p.cpp", str, lcnt);
	lcnt = utils::fin("/home/archman/workspace/cpp/skelp/src/skelh.h", str);
	utils::upd(mr, str, lcnt);
	utils::fot(gp.td + "src/" + gp.famId + "h.h", str, lcnt);
	lcnt = utils::fin("/home/archman/workspace/cpp/skelp/src/skelh.cpp", str);
	utils::upd(mr, str, lcnt);
	utils::fot(gp.td + "src/" + gp.famId + "h.cpp", str, lcnt);

The following structure identifies the replacement values from the skeleton template to the newly generated source code.

void utils::init_repl(mod_rec& mr, gen_params gp) {
	mr.numPair = 3;
	mr.mp[0].from = "skelp";
	mr.mp[0].to = gp.famId + "p";
	mr.mp[1].from = "skelh";
	mr.mp[1].to = gp.famId + "h";
	mr.mp[2].from = "SKELH";
	mr.mp[2].to = boost::to_upper_copy(gp.famId + "h");
	mr.mp[3].from = "utils";
	mr.mp[3].to = gp.clas;

The workhorse to the application is the section of code listed below.

void utils::upd(mod_rec rmrp, string stv[sizeOfStringArray], int cnt) {
	int ii = rmrp.numPair;
	string rline;
	int j = 0;
	while (j < cnt) {
		int i = 0;
		while (i <= ii) {
			boost::replace_all(stv[j], rmrp.mp[i].from, rmrp.mp[i].to);
		rline = stv[j];

The initial loop goes through each line of source code in the subject file. The innermost loop iterates from the first replacement pair until the last replacement pair is processed. This process is repeated until all lines in the subject source code is processed.


Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Install Tomcat 9 Mint

The web application for Java and Grails is the Apache Tomcat Server 9.

Step 1. Verify Java


Step 2. Get the server.

cd /opt
sudo wget http://www.us.apache.org/dist/tomcat/tomcat-9/v9.0.0.M22/bin/apache-tomcat-9.0.0.M22.tar.gz

Below observe the result of the wget command.

Next we must unzip Tomcat 9 and move the extracted sub directory to its permanent location.

Issue the following commands to facilitate installation.

sudo tar xzf apache-tomcat-9.0.0.M22.tar.gz
sudo mv apache-tomcat-9.0.0.M22 tomcat9

Below you can observe each command execution followed by the dir command to reveal the contents of the directory.

At this point we are ready to start the server by issuing the following two commands.

cd /opt/tomcat9/bin

The screen below illustrates the tomcat startup script.

Now issue the following command at the browser http://localhost:8080 and the following screen will appear.

The next step provides credentials for Tomcat Managers.

<user username="tomcat" password="secretPassword" roles="admin-gui,manager-gui"/>

Make sure you have this entry in the tomcat-users.xml file.

By default if Tomcat (version 9) is loaded on a server you use a client to access the interface but additional configuration is required.

Two files must be modified to relax the default restriction.  Both files are named context.xml.

The first location is /opt/tomcat9/webapps/host-manager/META-INF.  The second location is /opt/tomcat9/webapps/manager/META-INF.

<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>

This value should be commented out as indicated below.

<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/> -->

You should be able to access all components of Tomcat (version 9) at this point without restrictions.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Linux Mint Installation

Linux Mint is the operating system for choice for software development platform.

Primary IDE include Eclipse for JavaFX, PhP and c++.  Anaconda along with Spyder is available for Python development.

Wt (pronounced witty) is available for web application development.

A Grails stack is also available for additional Java application development.

LAMP is also operational.

This level of firepower and the latest version of Mint is installed in less than 16 gigabytes of disk space.

This is simply outstanding.

Mr. Arch Brooks, Software Engineer, Brooks Computing Systems, LLC authored this article.

BCS Pure Linux Distribution

There are tons of Linux distributions available. I have used a few of the more popular distributions. In an effort to better understand what comprises a Linux distribution I have decided to build my own from source code at ground zero.

To accomplish building the distribution a host Linux system is required. In this example I have chosen Mint as a host.

There is a certain layer of software required to build the distribution. Two scripts are employed to ensure the proper environment exists on the host.  The first script determines the existence of the required development environment.

cat > version-check.sh << "EOF"
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
echo "yacc not found"
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -h /usr/bin/awk ]; then
echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
echo awk is `/usr/bin/awk --version | head -n1`
echo "awk not found"
gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1
echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
then echo "g++ compilation OK";
else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
bash version-check.sh

The above file should be placed on the host and be made executable.  After the file is executed the following script is generated.  The resulting script may be found in the file “version-check.sh” (minus double quotes).

# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
echo "yacc not found"
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -h /usr/bin/awk ]; then
echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
echo awk is `/usr/bin/awk --version | head -n1`
echo "awk not found"
gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1
echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
then echo "g++ compilation OK";
else echo "g++ compilation failed"; fi
rm -f dummy.c dummy

The second script determines the required libraries exist prior to commencing the build.

cat > library-check.sh << "EOF"
for lib in lib{gmp,mpfr,mpc}.la; do
echo $lib: $(if find /usr/lib* -name $lib|
grep -q $lib;then :;else echo not;fi) found
unset lib
bash library-check.sh

The above file should be placed on the host and be made executable.  After the file is executed the following script is generated.  The resulting script may be found in the file “library-check.sh” (minus double quotes).

for lib in lib{gmp,mpfr,mpc}.la; do
echo $lib: $(if find /usr/lib* -name $lib|
grep -q $lib;then :;else echo not;fi) found
unset lib


The Acrobat Reader will be useful in this endeavor.  The latest version supported by Mint can be accessed by clicking here.  Once the package is downloaded use GDebi to install to the proper location.

To create the source code repository for the build a scrip and a take (input) file were created.

The script is listed below.

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

The take or input file is listed below.



Mr. Arch Brooks, CEO / Software Engineer, Brooks Computing Systems, LLC. authored this article.

BCS Burn DVD Mint

The need to create information to be stored on a DVD is quite common. I have tried several burners for Ubuntu and Mint by far the K3b application is best suited for those occasions. Click here for the home site of K3b.

K3b also happens to be the fastest DVD burning Software I have used via Linux.

Mr. Arch Brooks, CEO / Software Engineer Brooks Computing Systems, LLC authored this article.