Updated solaris install manual

Updated solaris install manual

Building Enduro/X On Oracle Solaris Platform
============================================
Madars Vitolins
v1.0, 2016-06:
	Initial draft
:doctype: book

== About manual

This manual describes how to build 'Enduro/X' Oracle Solaris platform.
Document is based on Solaris 11 on x86 machine. Compiler used to Enduro/X is GCC.

== Overview

This manual includes basic installation of Enduro/X which does not
include building of documentation and does not use GPG-ME encryption for bridges.

Enduro/X on Solaris platform is Using System V message queues.

== Operating System Configuration

For OS configuration settings
see ex_adminman(guides)(Enduro/X Administration Manual, Setup System chapter).
This step is mandatory be executed, before continuing.

== Installation process

The installation process will install required pen source packages from
'http://www.opencsw.org'. You may install packages with different approach.
This is just a sample process for getting build system working on under Solaris.
For getting Enduro/X to work basically we need following packages:

. git

. cmake

. flex

. bison

. libxml2

. gcc/g++

=== Packages to be installed

The following operations will be done from root user. This will download
and install open source packages to local machine:

---------------------------------------------------------------------
$ su - root
# pkgadd -d http://get.opencsw.org/now
# /opt/csw/bin/pkgutil -U
# /opt/csw/bin/pkgutil -y -i git libxml2_dev flex bison cmake gmake
---------------------------------------------------------------------

=== If installing GCC...

---------------------------------------------------------------------
$ su - root
# /opt/csw/bin/pkgutil -y -i gcc4core gcc4g++
---------------------------------------------------------------------

=== If installing Sun Studio (on Solaris 11)...

- According to: https://pkg-register.oracle.com/register/product_info/6/

- Register and request access, download the
and pkg.oracle.com.key.pem pkg.oracle.com.certificate.pem from Oracle
to server.

Installation shows process for 12.4 version, but any later available should
be installed. Also note that *.profile* and *$HOME/ndrx_home* later needs to
match the path, for example */opt/developerstudio12.6*.

---------------------------------------------------------------------
$ su - root
# mkdir -m 0775 -p /var/pkg/ssl
# cp -i download-directory/pkg.oracle.com.key.pem /var/pkg/ssl
# cp -i download-directory/pkg.oracle.com.certificate.pem /var/pkg/ssl

# pkg set-publisher \
-k /var/pkg/ssl/pkg.oracle.com.key.pem \
-c /var/pkg/ssl/pkg.oracle.com.certificate.pem \
-G '*' -g https://pkg.oracle.com/solarisstudio/release solarisstudio

# pkg list -af 'pkg://solarisstudio/developer/solarisstudio-124/*'

# pkg install -nv solarisstudio-124

# pkg install solarisstudio-124
---------------------------------------------------------------------

If plan to run

=== If installing Sun Studio (on Solaris 10)...

Firstly download the "tarfile" version from Oracle, visit
http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/tarfiles-studio-12-4-3048109.html

Next once the tar file is on your server, extract it and start the install:

---------------------------------------------------------------------
# bzip2 -d SolarisStudio12.4-solaris-x86-bin.tar.bz2
# tar -xf SolarisStudio12.4-solaris-x86-bin.tar
# cd SolarisStudio12.4-solaris-x86-bin
# ./install_patches.sh
# mv solarisstudio12.4 /opt
---------------------------------------------------------------------

For Solaris 10 also we need gmake to work as "make", thus
---------------------------------------------------------------------
# ln -s /opt/csw/bin/gmake /usr/bin/make
---------------------------------------------------------------------

This will put the compiler in "/opt/solarisstudio12.4" the path later used in
this tutorial.

Also for solaris 10 we need "ar" tool which we will use from GNU package:

---------------------------------------------------------------------
# /opt/csw/bin/pkgutil -y -i gcc4core gcc4g++
---------------------------------------------------------------------

== Getting the source code

Firstly we need to add "user1" under which we will perform build actions.
For test purposes we will parepare new user for which Enduro/X will built
(this adds the  in the path the /opt/csw/bin. You may modify that of your needs.
(add /opt/solarisstudio12.4/bin if Sun studio is installed)

=== Adding user on Solaris 11
We add the user "user1" and also set the open file limit to 4096, by
default it is 256 which is too low for unit testing.

---------------------------------------------------------------------
$ su - root
# useradd -m user1
# passwd user1
# projadd -K "process.max-file-descriptor=(basic,10000,deny)" enduroxproject
# usermod -K "project=enduroxproject" user1
# su - user1
---------------------------------------------------------------------

=== Adding user on Solaris 10

---------------------------------------------------------------------
$ su - root
# useradd -d \$HOME -m -s /usr/bin/bash -c "User1 User1" user1
# mkdir \$HOME
# chown user1:staff \$HOME
# su - user1
---------------------------------------------------------------------

=== Preparing the user environment

---------------------------------------------------------------------

$ bash
$ cat << EOF >> .profile
export PATH=\$PATH:/opt/csw/bin:/opt/solarisstudio12.4/bin
# Needed if building with postgres...
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/opt/csw/lib/64
EOF
$ chmod +x .profile
$ source .profile
$ cd \$HOME
$ GIT_SSL_NO_VERIFY=true git clone https://github.com/endurox-dev/endurox
$ cd endurox
$ git config http.sslVerify "false"
---------------------------------------------------------------------

=== Enduro/X basic Environment configuration for HOME directory

This code bellow creates 'ndrx_home' executable file which loads basic environment,
so that you can use sample configuration provided by Enduro/X in 'sampleconfig' directory.
This also assumes that you are going to install to '$HOME/endurox/dist' folder.
The file bellow will override the sample configuration.

---------------------------------------------------------------------
$ cat << EOF > $HOME/ndrx_home
#!/bin/bash

echo "Loading ndrx_home..."
# Where app domain lives
export NDRX_APPHOME=$HOME/endurox
# Where NDRX runtime lives
export NDRX_HOME=\$HOME/endurox/dist/bin
# Debug config too
export NDRX_DEBUG_CONF=\$HOME/endurox/sampleconfig/debug.conf
# NDRX config too.
export NDRX_CONFIG=\$HOME/endurox/sampleconfig/ndrxconfig.xml

export FLDTBLDIR=\$HOME/endurox/ubftest/ubftab

export PATH=/usr/bin:/usr/sbin:/opt/csw/bin:/opt/solarisstudio12.4/bin:/opt/csw/bin:\$HOME/endurox/dist/bin
export LD_LIBRARY_PATH=/usr/lib/sparcv9:\$HOME/endurox/dist/lib64:/opt/solarisstudio12.4/lib:/usr/lib64:/opt/csw/lib/64

################################################################################
# In case if building with Postgresql DB database testing support
# or building endurox-java with Oracle DB tests (03_xapostgres), then
# configure bellow setting (demo values provided):
# If so - uncomment bellow
################################################################################
#export EX_PG_HOST=localhost
#export EX_PG_USER=exdbtest
#export EX_PG_PASS=exdbtest1
# currently uses default port
#export EX_PG_PORT=5432
#export EX_PG_DB=xe

#
# If using PostgreSQL for Solaris 11 uncomment:
#
#export PATH=$PATH:/opt/csw/libexec/postgresql/93

EOF

$ chmod +x $HOME/ndrx_home
---------------------------------------------------------------------

=== Configuring PostgreSQL

If Enduro/X PostgreSQL driver is needed to be build for AIX, the PostgreSQL
needs to be installed for build and test purposes. On Solaris 10, PostgreSQL
comes with the operating system, thus only access rights and users needs to be
configured.

Note if you plan to use ECPG mode, then ecpg pre-compiler needs to know where
the ecpg libraries live. Thus LD_LIBRARY_PATH must be set during the build time.

It can be done in following way:

--------------------------------------------------------------------------------

# su - user1
$ cat << EOF >> .profile
export LD_LIBRARY_PATH=/opt/csw/lib/amd64
EOF

--------------------------------------------------------------------------------

after this login and log out from user1 to apply the .profile settings.

Also to active the PostgreSQL inclusion to the build, add *-DENABLE_POSTGRES=ON*
flag to cmake command line (later in build section).

For Solaris 11 it needs to be installed:

--------------------------------------------------------------------------------

$ su - root

-- Install with:
# /opt/csw/bin/pkgutil -y -i postgresql93

-- Install dev
# /opt/csw/bin/pkgutil -y -i postgresql_dev

-- enable for auto start
# svcadm enable cswpostgresql-93

# su - postgres

-- Create profile entry to have path to postgres binaries

$ cat << EOF > ~/.profile

#!/bin/bash

export PATH=$PATH:/opt/csw/libexec/postgresql/93/

EOF

$ chmod +x ~/.profile

-- Start postgres from Postgres user
$ /opt/csw/bin/pg_ctl-93 -D /var/opt/csw/postgresql/93 -l logfile start
server starting

--------------------------------------------------------------------------------

For Solaris 10, just enable it:

--------------------------------------------------------------------------------

$ su - root
# svcadm enable svc:/application/database/postgresql:version_82

--------------------------------------------------------------------------------

Now create the database for Enduro/X tests (Solaris 10 & 11):

--------------------------------------------------------------------------------
# su - postgres

$ createuser exdbtest

$ createdb xe

$ psql -d template1

> alter user exdbtest with encrypted password 'exdbtest1';
> grant all privileges on database xe to exdbtest;
> \q

--------------------------------------------------------------------------------

Configuration files needs to be updated for authentication and distributed
transactions must be enabled too.

Edit *postgresql.conf*, set "max_prepared_transactions"
to 1000.

Solaris 10: */var/postgres/8.2/data/postgresql.conf*

Solaris 11(.4): */var/opt/csw/postgresql/93/postgresql.conf*

--------------------------------------------------------------------------------

max_prepared_transactions = 1000                # zero disables the feature

--------------------------------------------------------------------------------

For access permissions and network configuration, update
*pg_hba.conf*, so that it contains following:

Solaris 10: */var/postgres/8.2/data/pg_hba.conf*

Solaris 11: */var/opt/csw/postgresql/93/pg_hba.conf*

--------------------------------------------------------------------------------

local   all             all                                     trust
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

--------------------------------------------------------------------------------

Restart PostgreSQL, Solaris 10:

--------------------------------------------------------------------------------

# svcadm restart svc:/application/database/postgresql:version_82

--------------------------------------------------------------------------------

Restart PostgreSQL, Solaris 11:

--------------------------------------------------------------------------------

# svcadm restart cswpostgresql-93

--------------------------------------------------------------------------------

== Building the code with GCC

It is assumed that gcc is default compiler on the system (i.e. Oracle Studio not installed),
thus following cmake will pick up gcc by default:

=== Solaris 11

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc\
-DDEFINE_DISABLEDOC=ON -DDEFINE_DISABLEGPGME=ON -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DCMAKE_LIBRARY_PATH=/opt/csw/lib/amd64 .
$ make
$ make install
---------------------------------------------------------------------

=== Solaris 10

Also note that CC variable needs to be exported as it is used by
buildclient script for view test cases.

---------------------------------------------------------------------
$ export CC=gcc
$ cd \$HOME/endurox
$ cmake -D CMAKE_AR=/opt/csw/gnu/ar -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc \
-DDEFINE_DISABLEDOC=ON -DDEFINE_DISABLEGPGME=ON -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist .
$ make
$ make install
---------------------------------------------------------------------

== Building the code with Solaris Studio

The compilation will be done in 64bit mode

=== Solaris 11

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DDEFINE_DISABLEGPGME=ON -DDEFINE_DISABLEDOC=ON .
---------------------------------------------------------------------

In case if errors like

---------------------------------------------------------------------
ld: fatal: file /usr/lib/values-xpg6.o: wrong ELF class: ELFCLASS32
---------------------------------------------------------------------

appears, temporary solution is to replace that particular file with 64bit version.
It appears that Solaris Studio compiler ignores the "-m64" architecture flags
and does not use "/usr/lib/amd64/values-xpg6.o" where it requires.

---------------------------------------------------------------------
# su - root
# mv /usr/lib/values-xpg6.o /usr/lib/values-xpg6.o.OLD
# ln -s /usr/lib/amd64/values-xpg6.o /usr/lib/values-xpg6.o
---------------------------------------------------------------------

=== Solaris 10 (NOT SUPPORTED)

This assumes that GCC is installed, and "ar" from gcc will be used.

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ cmake -D CMAKE_AR=/opt/csw/gnu/ar \
-DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DDEFINE_DISABLEGPGME=ON -DDEFINE_DISABLEDOC=ON .
---------------------------------------------------------------------

The support is not available for Solaris Studio on Solaris 10 due
to Thread Local Storage errors like during the linking:

---------------------------------------------------------------------
ld: fatal: relocation error: R_SPARC_TLS_LDO_LOX10: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.first: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_ADD: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.first: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_HIX22: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_LOX10: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_ADD: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_HIX22: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_LOX10: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_ADD: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
---------------------------------------------------------------------

Thus at this time only GCC is supported for Solaris 10.

== Building the code

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ make
$ make install
---------------------------------------------------------------------

This will produce binaries in '\$HOME/endurox/dist' folder.

== Unit Testing

Enduro/X basically consists of two parts:
. XATMI runtime;
. UBF/FML buffer processing.
Each of these two sub-systems have own units tests.

=== UBF/FML Unit testing

---------------------------------------------------------------------
$ cd \$HOME/endurox/sampleconfig
$ source setndrx
$ cd \$HOME/endurox/ubftest
$ ./ubfunit1 2>/dev/null
Running "main" (76 tests)...
Completed "ubf_basic_tests": 198 passes, 0 failures, 0 exceptions.
Completed "ubf_Badd_tests": 225 passes, 0 failures, 0 exceptions.
Completed "ubf_genbuf_tests": 334 passes, 0 failures, 0 exceptions.
Completed "ubf_cfchg_tests": 2058 passes, 0 failures, 0 exceptions.
Completed "ubf_cfget_tests": 2232 passes, 0 failures, 0 exceptions.
Completed "ubf_fdel_tests": 2303 passes, 0 failures, 0 exceptions.
Completed "ubf_expr_tests": 3106 passes, 0 failures, 0 exceptions.
Completed "ubf_fnext_tests": 3184 passes, 0 failures, 0 exceptions.
Completed "ubf_fproj_tests": 3548 passes, 0 failures, 0 exceptions.
Completed "ubf_mem_tests": 4438 passes, 0 failures, 0 exceptions.
Completed "ubf_fupdate_tests": 4613 passes, 0 failures, 0 exceptions.
Completed "ubf_fconcat_tests": 4768 passes, 0 failures, 0 exceptions.
Completed "ubf_find_tests": 5020 passes, 0 failures, 0 exceptions.
Completed "ubf_get_tests": 5247 passes, 0 failures, 0 exceptions.
Completed "ubf_print_tests": 5655 passes, 0 failures, 0 exceptions.
Completed "ubf_macro_tests": 5666 passes, 0 failures, 0 exceptions.
Completed "ubf_readwrite_tests": 5764 passes, 0 failures, 0 exceptions.
Completed "ubf_mkfldhdr_tests": 5770 passes, 0 failures, 0 exceptions.
Completed "main": 5770 passes, 0 failures, 0 exceptions.

---------------------------------------------------------------------

=== XATMI Unit testing
ATMI testing might take some time. Also ensure that you have few Gigabytes of free
disk space, as logging requires some space (about ~10 GB).

---------------------------------------------------------------------
$ cd \$HOME/endurox/atmitest
$ nohup ./run.sh &
$ tail -f \$HOME/endurox/atmitest/test.out
...
************ FINISHED TEST: [test028_tmq/run.sh] with 0 ************
Completed "atmi_test_all": 28 passes, 0 failures, 0 exceptions.
Completed "main": 28 passes, 0 failures, 0 exceptions.
---------------------------------------------------------------------

== Troubleshooting

This section lists some notes about fixing most common problems with Solaris build.

=== Problems with library modes

If having issues with linking particular library version, for example building
in 64bit mode, but for some reason CMake is linking with 32bit libs (for example
with PostgreSQL), then following flag may be applied *CMAKE_LIBRARY_PATH* to
point to correct path for libraries. For example:

---------------------------------------------------------------------
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DDEFINE_DISABLEDOC=ON\
    -DENABLE_POSTGRES=ON -DDEFINE_DISABLEGPGME=ON -DCMAKE_LIBRARY_PATH=/opt/csw/lib/amd64 .
---------------------------------------------------------------------

== Conclusions

At finish you have a configured system which is read to process the transactions
by Enduro/X runtime. It is possible to copy the binary version ('dist') folder
to other same architecture machines and run it there with out need of building.

:numbered!:

[bibliography]
Additional documentation
------------------------
This section lists additional related documents.

[bibliography]
.Resources
- [[[BINARY_INSTALL]]] See Enduro/X 'binary_install' manual.

////////////////////////////////////////////////////////////////
The index is normally left completely empty, it's contents being
generated automatically by the DocBook toolchain.
////////////////////////////////////////////////////////////////

Building Enduro/X On Oracle Solaris Platform
============================================
Madars Vitolins
v1.0, 2016-06:
	Initial draft
:doctype: book

== About manual

This manual describes how to build 'Enduro/X' Oracle Solaris platform.
Document is based on Solaris 11 on x86 machine. Compiler used to Enduro/X is GCC.

== Overview

This manual includes basic installation of Enduro/X which does not
include building of documentation and does not use GPG-ME encryption for bridges.

Enduro/X on Solaris platform is Using System V message queues.

== Operating System Configuration

For OS configuration settings
see ex_adminman(guides)(Enduro/X Administration Manual, Setup System chapter).
This step is mandatory be executed, before continuing.

== Installation process

The installation process will install required pen source packages from
'http://www.opencsw.org'. You may install packages with different approach.
This is just a sample process for getting build system working on under Solaris.
For getting Enduro/X to work basically we need following packages:

. git

. cmake

. flex

. bison

. libxml2

. gcc/g++

=== Packages to be installed

The following operations will be done from root user. This will download
and install open source packages to local machine:

---------------------------------------------------------------------
$ su - root
# pkgadd -d http://get.opencsw.org/now
# /opt/csw/bin/pkgutil -U
# /opt/csw/bin/pkgutil -y -i git libxml2_dev flex bison cmake gmake
---------------------------------------------------------------------

=== If installing GCC...

---------------------------------------------------------------------
$ su - root
# /opt/csw/bin/pkgutil -y -i gcc4core gcc4g++
---------------------------------------------------------------------

=== If installing Sun Studio (on Solaris 11)...

- According to: https://pkg-register.oracle.com/register/product_info/6/

- Register and request access, download the
and pkg.oracle.com.key.pem pkg.oracle.com.certificate.pem from Oracle
to server.

Installation shows process for 12.4 version, but any later available should
be installed. Also note that *.profile* and *$HOME/ndrx_home* later needs to
match the path, for example */opt/developerstudio12.6*.

---------------------------------------------------------------------
$ su - root
# mkdir -m 0775 -p /var/pkg/ssl
# cp -i download-directory/pkg.oracle.com.key.pem /var/pkg/ssl
# cp -i download-directory/pkg.oracle.com.certificate.pem /var/pkg/ssl

# pkg set-publisher \
-k /var/pkg/ssl/pkg.oracle.com.key.pem \
-c /var/pkg/ssl/pkg.oracle.com.certificate.pem \
-G '*' -g https://pkg.oracle.com/solarisstudio/release solarisstudio

# pkg list -af 'pkg://solarisstudio/developer/solarisstudio-124/*'

# pkg install -nv solarisstudio-124

# pkg install solarisstudio-124
---------------------------------------------------------------------

If plan to run

=== If installing Sun Studio (on Solaris 10)...

Firstly download the "tarfile" version from Oracle, visit
http://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/tarfiles-studio-12-4-3048109.html

Next once the tar file is on your server, extract it and start the install:

---------------------------------------------------------------------
# bzip2 -d SolarisStudio12.4-solaris-x86-bin.tar.bz2
# tar -xf SolarisStudio12.4-solaris-x86-bin.tar
# cd SolarisStudio12.4-solaris-x86-bin
# ./install_patches.sh
# mv solarisstudio12.4 /opt
---------------------------------------------------------------------

For Solaris 10 also we need gmake to work as "make", thus
---------------------------------------------------------------------
# ln -s /opt/csw/bin/gmake /usr/bin/make
---------------------------------------------------------------------

This will put the compiler in "/opt/solarisstudio12.4" the path later used in
this tutorial.

Also for solaris 10 we need "ar" tool which we will use from GNU package:

---------------------------------------------------------------------
# /opt/csw/bin/pkgutil -y -i gcc4core gcc4g++
---------------------------------------------------------------------

== Getting the source code

Firstly we need to add "user1" under which we will perform build actions.
For test purposes we will parepare new user for which Enduro/X will built
(this adds the  in the path the /opt/csw/bin. You may modify that of your needs.
(add /opt/solarisstudio12.4/bin if Sun studio is installed)

=== Adding user on Solaris 11
We add the user "user1" and also set the open file limit to 4096, by
default it is 256 which is too low for unit testing.

---------------------------------------------------------------------
$ su - root
# useradd -m user1
# passwd user1
# projadd -K "process.max-file-descriptor=(basic,10000,deny)" enduroxproject
# usermod -K "project=enduroxproject" user1
# su - user1
---------------------------------------------------------------------

=== Adding user on Solaris 10

---------------------------------------------------------------------
$ su - root
# useradd -d \$HOME -m -s /usr/bin/bash -c "User1 User1" user1
# mkdir \$HOME
# chown user1:staff \$HOME
# su - user1
---------------------------------------------------------------------

=== Preparing the user environment

---------------------------------------------------------------------

$ bash
$ cat << EOF >> .profile
export PATH=$PATH:/opt/csw/bin:/opt/solarisstudio12.4/bin
EOF
$ chmod +x .profile
$ source .profile
$ cd \$HOME
$ GIT_SSL_NO_VERIFY=true git clone https://github.com/endurox-dev/endurox
$ cd endurox
$ git config http.sslVerify "false"
---------------------------------------------------------------------

=== Enduro/X basic Environment configuration for HOME directory

This code bellow creates 'ndrx_home' executable file which loads basic environment,
so that you can use sample configuration provided by Enduro/X in 'sampleconfig' directory.
This also assumes that you are going to install to '$HOME/endurox/dist' folder.
The file bellow will override the sample configuration.

---------------------------------------------------------------------
$ cat << EOF > $HOME/ndrx_home
#!/bin/bash

echo "Loading ndrx_home..."
# Where app domain lives
export NDRX_APPHOME=$HOME/endurox
# Where NDRX runtime lives
export NDRX_HOME=\$HOME/endurox/dist/bin
# Debug config too
export NDRX_DEBUG_CONF=\$HOME/endurox/sampleconfig/debug.conf
# NDRX config too.
export NDRX_CONFIG=\$HOME/endurox/sampleconfig/ndrxconfig.xml

export FLDTBLDIR=\$HOME/endurox/ubftest/ubftab

export PATH=/usr/bin:/usr/sbin:/opt/csw/bin:/opt/solarisstudio12.4/bin:/opt/csw/bin:\$HOME/endurox/dist/bin
export LD_LIBRARY_PATH=/usr/lib/sparcv9:\$HOME/endurox/dist/lib64:/opt/solarisstudio12.4/lib:/usr/lib64:/opt/csw/lib/64

################################################################################
# In case if building with Postgresql DB database testing support
# or building endurox-java with Oracle DB tests (03_xapostgres), then
# configure bellow setting (demo values provided):
# If so - uncomment bellow
################################################################################
#export EX_PG_HOST=localhost
#export EX_PG_USER=exdbtest
#export EX_PG_PASS=exdbtest1
# currently uses default port
#export EX_PG_PORT=5432
#export EX_PG_DB=xe

#
# If using PostgreSQL for Solaris 11 uncomment:
#
#export PATH=$PATH:/opt/csw/libexec/postgresql/93

EOF

$ chmod +x $HOME/ndrx_home
---------------------------------------------------------------------

=== Configuring PostgreSQL

If Enduro/X PostgreSQL driver is needed to be build for AIX, the PostgreSQL
needs to be installed for build and test purposes. On Solaris 10, PostgreSQL
comes with the operating system, thus only access rights and users needs to be
configured.

Note if you plan to use ECPG mode, then ecpg pre-compiler needs to know where
the ecpg libraries live. Thus LD_LIBRARY_PATH must be set during the build time.

It can be done in following way:

--------------------------------------------------------------------------------

# su - user1
$ cat << EOF >> .profile
export LD_LIBRARY_PATH=/opt/csw/lib/amd64
EOF

--------------------------------------------------------------------------------

after this login and log out from user1 to apply the .profile settings.

Also to active the PostgreSQL inclusion to the build, add *-DENABLE_POSTGRES=ON*
flag to cmake command line (later in build section).

For Solaris 11 it needs to be installed:

--------------------------------------------------------------------------------

$ su - root

-- Install with:
# /opt/csw/bin/pkgutil -y -i postgresql93

-- Install dev
# /opt/csw/bin/pkgutil -y -i postgresql_dev

-- enable for auto start
# svcadm enable cswpostgresql-93

# su - postgres

-- Create profile entry to have path to postgres binaries

$ cat << EOF > ~/.profile

#!/bin/bash

export PATH=$PATH:/opt/csw/libexec/postgresql/93/

EOF

$ chmod +x ~/.profile

-- Start postgres from Postgres user
$ /opt/csw/bin/pg_ctl-93 -D /var/opt/csw/postgresql/93 -l logfile start
server starting

--------------------------------------------------------------------------------

For Solaris 10, just enable it:

--------------------------------------------------------------------------------

$ su - root
# svcadm enable svc:/application/database/postgresql:version_82

--------------------------------------------------------------------------------

Now create the database for Enduro/X tests (Solaris 10 & 11):

--------------------------------------------------------------------------------
# su - postgres

$ createuser exdbtest

$ createdb xe

$ psql -d template1

> alter user exdbtest with encrypted password 'exdbtest1';
> grant all privileges on database xe to exdbtest;
> \q

--------------------------------------------------------------------------------

Configuration files needs to be updated for authentication and distributed
transactions must be enabled too.

Edit *postgresql.conf*, set "max_prepared_transactions"
to 1000.

Solaris 10: */var/postgres/8.2/data/postgresql.conf*

Solaris 11(.4): */var/opt/csw/postgresql/93/postgresql.conf*

--------------------------------------------------------------------------------

max_prepared_transactions = 1000                # zero disables the feature

--------------------------------------------------------------------------------

For access permissions and network configuration, update
*pg_hba.conf*, so that it contains following:

Solaris 10: */var/postgres/8.2/data/pg_hba.conf*

Solaris 11: */var/opt/csw/postgresql/93/pg_hba.conf*

--------------------------------------------------------------------------------

local   all             all                                     trust
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

--------------------------------------------------------------------------------

Restart PostgreSQL, Solaris 10:

--------------------------------------------------------------------------------

# svcadm restart svc:/application/database/postgresql:version_82

--------------------------------------------------------------------------------

Restart PostgreSQL, Solaris 11:

--------------------------------------------------------------------------------

# svcadm restart cswpostgresql-93

--------------------------------------------------------------------------------

== Building the code with GCC

It is assumed that gcc is default compiler on the system (i.e. Oracle Studio not installed),
thus following cmake will pick up gcc by default:

=== Solaris 11

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc\
-DDEFINE_DISABLEDOC=ON -DDEFINE_DISABLEGPGME=ON -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DCMAKE_LIBRARY_PATH=/opt/csw/lib/amd64 .
$ make
$ make install
---------------------------------------------------------------------

=== Solaris 10

Also note that CC variable needs to be exported as it is used by
buildclient script for view test cases.

---------------------------------------------------------------------
$ export CC=gcc
$ cd \$HOME/endurox
$ cmake -D CMAKE_AR=/opt/csw/gnu/ar -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc \
-DDEFINE_DISABLEDOC=ON -DDEFINE_DISABLEGPGME=ON -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist .
$ make
$ make install
---------------------------------------------------------------------

== Building the code with Solaris Studio

The compilation will be done in 64bit mode

=== Solaris 11

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DDEFINE_DISABLEGPGME=ON -DDEFINE_DISABLEDOC=ON .
---------------------------------------------------------------------

In case if errors like

---------------------------------------------------------------------
ld: fatal: file /usr/lib/values-xpg6.o: wrong ELF class: ELFCLASS32
---------------------------------------------------------------------

appears, temporary solution is to replace that particular file with 64bit version.
It appears that Solaris Studio compiler ignores the "-m64" architecture flags
and does not use "/usr/lib/amd64/values-xpg6.o" where it requires.

---------------------------------------------------------------------
# su - root
# mv /usr/lib/values-xpg6.o /usr/lib/values-xpg6.o.OLD
# ln -s /usr/lib/amd64/values-xpg6.o /usr/lib/values-xpg6.o
---------------------------------------------------------------------

=== Solaris 10 (NOT SUPPORTED)

This assumes that GCC is installed, and "ar" from gcc will be used.

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ cmake -D CMAKE_AR=/opt/csw/gnu/ar \
-DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DDEFINE_DISABLEGPGME=ON -DDEFINE_DISABLEDOC=ON .
---------------------------------------------------------------------

The support is not available for Solaris Studio on Solaris 10 due
to Thread Local Storage errors like during the linking:

---------------------------------------------------------------------
ld: fatal: relocation error: R_SPARC_TLS_LDO_LOX10: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.first: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_ADD: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.first: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_HIX22: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_LOX10: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_ADD: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_HIX22: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_LOX10: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
ld: fatal: relocation error: R_SPARC_TLS_LDO_ADD: file CMakeFiles/nstd.dir/ndebug.c.o: symbol $XBaBAqASPv3bHaz.__ndrx_debug__.ostid: bound to: CMakeFiles/nstd.dir/ndebug.c.o: relocation illegal when not bound to object being created
---------------------------------------------------------------------

Thus at this time only GCC is supported for Solaris 10.

== Building the code

---------------------------------------------------------------------
$ cd \$HOME/endurox
$ make
$ make install
---------------------------------------------------------------------

This will produce binaries in '\$HOME/endurox/dist' folder.

== Unit Testing

Enduro/X basically consists of two parts:
. XATMI runtime;
. UBF/FML buffer processing.
Each of these two sub-systems have own units tests.

=== UBF/FML Unit testing

---------------------------------------------------------------------
$ cd \$HOME/endurox/sampleconfig
$ source setndrx
$ cd \$HOME/endurox/ubftest
$ ./ubfunit1 2>/dev/null
Running "main" (76 tests)...
Completed "ubf_basic_tests": 198 passes, 0 failures, 0 exceptions.
Completed "ubf_Badd_tests": 225 passes, 0 failures, 0 exceptions.
Completed "ubf_genbuf_tests": 334 passes, 0 failures, 0 exceptions.
Completed "ubf_cfchg_tests": 2058 passes, 0 failures, 0 exceptions.
Completed "ubf_cfget_tests": 2232 passes, 0 failures, 0 exceptions.
Completed "ubf_fdel_tests": 2303 passes, 0 failures, 0 exceptions.
Completed "ubf_expr_tests": 3106 passes, 0 failures, 0 exceptions.
Completed "ubf_fnext_tests": 3184 passes, 0 failures, 0 exceptions.
Completed "ubf_fproj_tests": 3548 passes, 0 failures, 0 exceptions.
Completed "ubf_mem_tests": 4438 passes, 0 failures, 0 exceptions.
Completed "ubf_fupdate_tests": 4613 passes, 0 failures, 0 exceptions.
Completed "ubf_fconcat_tests": 4768 passes, 0 failures, 0 exceptions.
Completed "ubf_find_tests": 5020 passes, 0 failures, 0 exceptions.
Completed "ubf_get_tests": 5247 passes, 0 failures, 0 exceptions.
Completed "ubf_print_tests": 5655 passes, 0 failures, 0 exceptions.
Completed "ubf_macro_tests": 5666 passes, 0 failures, 0 exceptions.
Completed "ubf_readwrite_tests": 5764 passes, 0 failures, 0 exceptions.
Completed "ubf_mkfldhdr_tests": 5770 passes, 0 failures, 0 exceptions.
Completed "main": 5770 passes, 0 failures, 0 exceptions.

---------------------------------------------------------------------

=== XATMI Unit testing
ATMI testing might take some time. Also ensure that you have few Gigabytes of free
disk space, as logging requires some space (about ~10 GB).

---------------------------------------------------------------------
$ cd \$HOME/endurox/atmitest
$ nohup ./run.sh &
$ tail -f \$HOME/endurox/atmitest/test.out
...
************ FINISHED TEST: [test028_tmq/run.sh] with 0 ************
Completed "atmi_test_all": 28 passes, 0 failures, 0 exceptions.
Completed "main": 28 passes, 0 failures, 0 exceptions.
---------------------------------------------------------------------

== Troubleshooting

This section lists some notes about fixing most common problems with Solaris build.

=== Problems with library modes

If having issues with linking particular library version, for example building
in 64bit mode, but for some reason CMake is linking with 32bit libs (for example
with PostgreSQL), then following flag may be applied *CMAKE_LIBRARY_PATH* to
point to correct path for libraries. For example:

---------------------------------------------------------------------
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist -DDEFINE_DISABLEDOC=ON\
    -DENABLE_POSTGRES=ON -DDEFINE_DISABLEGPGME=ON -DCMAKE_LIBRARY_PATH=/opt/csw/lib/amd64 .
---------------------------------------------------------------------

== Conclusions

At finish you have a configured system which is read to process the transactions
by Enduro/X runtime. It is possible to copy the binary version ('dist') folder
to other same architecture machines and run it there with out need of building.

:numbered!:

[bibliography]
Additional documentation
------------------------
This section lists additional related documents.

[bibliography]
.Resources
- [[[BINARY_INSTALL]]] See Enduro/X 'binary_install' manual.

////////////////////////////////////////////////////////////////
The index is normally left completely empty, it's contents being
generated automatically by the DocBook toolchain.
////////////////////////////////////////////////////////////////


Add markdown-to-asciidoc template

Add markdown-to-asciidoc template

This is a very simple hackish regexp-based implementation, but works for
the simple formatting used by the current and past versions of the
covenant.

I've gone ahead and manually checked all languages and versions and all
seem to be correctly converted to asciidoc. Wohoo!

{{- /*
Very hacky way of converting markdown to asciidoc.
Because the covenant uses rather simple syntax, we can get away with this :)

Order of operations is:
* Replace markdown # headers for = asciidoc
* Transform links in the form of [text][reference] to text + remove reference links at end.
  This is similar to what the txt conversion does, and it's very hard to convert with just regexps -- if we want to
  keep these links it'll probably be easier to just convert them to [text](url) format.
* Transform links in the form of [text](url) to asciidoc's link:url[text]
* Transform links in the <url> form to asciidoc's link:url[url]

*/ -}}
{{ .RawContent | replaceRE "#" "=" | replaceRE "\\[([^\\]]*)\\][ \\n]*\\[[^\\]]*\\]" "$1" | replaceRE "\\[[^\\]]*\\]: .*" "" | replaceRE "\\[([^\\]]*)\\]\\((https{0,1}:.*)\\)" "link:$2[$1]" | replaceRE "<(https{0,1}:.*)>" "link:$1[$1]" | safeHTML }}


feat(plan): add links in day1 schedule

feat(plan): add links in day1 schedule

// build_options:
Java Performance Tuning - Training Plan
=======================================
Arnauld Van Muysewinkel <avm@pendragon.be>
v1.0, 15-Nov-2015: First complete version
:backend: slidy
//:theme: volnitsky
:data-uri:
:copyright: Creative-Commons-Zero (Arnauld Van Muysewinkel)
:br: pass:[<br>]

Day 1 - AM
----------

*****
Writing performance tests
*****

* link:../1-intro/0-introduction.html#_introduction_to_the_course[Introduction]
* _link:../1-intro/w0-install.html#_content[Workshop 0: install the training toolsuite]_

* link:../2-benchmark/1-benchmark_design.html#_rtri_anatomy_of_a_test[Designing your benchmarks]: Anatomy of a test

* link:../2-benchmark/2-benchmark_tool.html#_content[Benchmarking tools]:
** Basics (Injector, Market overview, Threading model, Back-pressure)
** Introduction to JMeter

* _link:../2-benchmark/w1-first_benchmark.html#_content[Workshop 1: write your first performance tests]_

* link:../4-process/0-perf_test_process.html#_content[Performance testing process]

Day 1 - PM
----------

*****
Writing performance tests (cont'd)
*****

* link:../2-benchmark/1-benchmark_design.html#_rtri_introduction[Designing your benchmarks]:
** Planning your test
** Load profiles
** Metrics

* link:../2-benchmark/2-benchmark_tool.html#_jmeter_expressions_amp_functions[Benchmarking tools]:
** JMeter: expressions & functions, shell
** becoming en expert: randomization, data analysis, mock-ups

* _Workshop 2: wrap up your performance tests_

Day 2 - AM
----------

*****
Investigating performance issues
*****

* Performance Diagnostic Model (PDM): Introduction{br}
* ⌖ Reminder about OSes internals (scheduling...)
* PDM: Layer 1 (OS)
* OS Monitoring tools
* _Workshop 3 (interactive): PDM Layer 1 (OS) in practice_

Day 2 - PM
----------

*****
Investigating performance issues (cont'd)
*****

* PDM: Layer 2 (JVM)
* ⌖ Reminder of some JVM internals (GC, JIT...)
* JVM Monitoring tools
* _Workshop 4 (interactive): PDM Layer 2 (JVM) in practice_

Day 3 - AM
----------

*****
Investigating performance issues (cont'd)
*****

* PDM: Layer 3 (Application)
* Application Monitoring tools
* _Workshop 5 (interactive): PDM Layer 3 (Application) in practice_

Day 3 - PM
----------

*****
Going further
*****

* Other analysis tools (RG, Excel, R, ELK...)
* _Workshop 6: Using the Report Generator (beta)_ (?)
// Is it feasible to share the RG with a broader audience?
* Introduction to Hyperion (?)
* Best Practices (JSF, JPA, SQL...)
* Web front-end performance (?)

Presentations
-------------

* link:../1-intro/0-introduction.html#_content[Introduction]
* link:../1-intro/1-objectives.html#_content[Objectives]
* link:../2-benchmark/1-benchmark_design.html#_content[Designing your benchmarks]
* link:../2-benchmark/2-benchmark_tool.html#_content[Benchmarking tools]
* link:../3-pdm/0-pdm_intro.html#_content[Performance Diagnostic Model (introduction)]
* link:../3-pdm/1-pdm_l1-os.html#_content[PDM Layer 1: Operating System]
* link:../3-pdm/2-pdm_l2-jvm.html#_content[PDM Layer 2: Java Virtual Machine]
* link:../3-pdm/3-pdm_l3-app.html#_content[PDM Layer 3: Application]
* link:../4-process/0-perf_test_process.html#_content[Performance Testing Process]
* link:../5-analysis/1-analysis_tools.html#_content[Analysis Tools]

Workshops
---------

* link:../1-intro/w0-install.html#_content[Install the training toolsuite]
* link:../2-benchmark/w1-first_benchmark.html#_content[First performance test]
* link:../2-benchmark/w2-wrapup_benchmark.html#_content[Wrap-up the performance test]
* link:../3-pdm/w3-dominant_os.html#_content[PDM Layer 1 (OS) in practice]
* link:../3-pdm/w4-dominant_jvm.html#_content[PDM Layer 2 (JVM) in practice]
* link:../3-pdm/w5-dominant_app.html#_content[PDM Layer 3 (Application) in practice]

Extras
------

* link:../0-extra/0-course_description.html#_content[Course Description]
* link:../0-extra/1-training_plan.html#_content[Course Plan]
* link:../0-extra/2-internals_os.html#_content[Operating Systems Internals]
* link:../0-extra/3-internals_jvm.html#_content[Java VM Internals]
* link:../0-extra/4-best_practices.html#_content[Best Practices]

// build_options:
Java Performance Tuning - Training Plan
=======================================
Arnauld Van Muysewinkel <avm@pendragon.be>
v1.0, 15-Nov-2015: First complete version
:backend: slidy
//:theme: volnitsky
:data-uri:
:copyright: Creative-Commons-Zero (Arnauld Van Muysewinkel)
:br: pass:[<br>]

Day 1 - AM
----------

*****
Writing performance tests
*****

* Introduction
* _Workshop 0: install training toolsuite_
* Anatomy of a test
* Benchmarking tool: basics
* _Workshop 1: write your first performance tests_

* Performance testing process

Day 1 - PM
----------

*****
Writing performance tests (cont'd)
*****

* Planning your test
* Load profiles
* Metrics
* Benchmarking tool: threading model, timers
* Benchmarking tool: parameters
* _Workshop 2: wrap up your performance tests_

Day 2 - AM
----------

*****
Investigating performance issues
*****

* Performance Diagnostic Model (PDM): Introduction{br}
* ⌖ Reminder about OSes internals (scheduling...)
* PDM: Layer 1 (OS)
* OS Monitoring tools
* _Workshop 3 (interactive): PDM Layer 1 (OS) in practice_

Day 2 - PM
----------

*****
Investigating performance issues (cont'd)
*****

* PDM: Layer 2 (JVM)
* ⌖ Reminder of some JVM internals (GC, JIT...)
* JVM Monitoring tools
* _Workshop 4 (interactive): PDM Layer 2 (JVM) in practice_

Day 3 - AM
----------

*****
Investigating performance issues (cont'd)
*****

* PDM: Layer 3 (Application)
* Application Monitoring tools
* _Workshop 5 (interactive): PDM Layer 3 (Application) in practice_

Day 3 - PM
----------

*****
Going further
*****

* Other analysis tools (RG, Excel, R, ELK...)
* _Workshop 6: Using the Report Generator (beta)_ (?)
// Is it feasible to share the RG with a broader audience?
* Introduction to Hyperion (?)
* Best Practices (JSF, JPA, SQL...)
* Web front-end performance (?)

Presentations
-------------

* link:../1-intro/0-introduction.html#_content[Introduction]
* link:../1-intro/1-objectives.html#_content[Objectives]
* link:../2-benchmark/1-benchmark_design.html#_content[Designing your benchmarks]
* link:../2-benchmark/2-benchmark_tool.html#_content[Benchmarking tools]
* link:../3-pdm/0-pdm_intro.html#_content[Performance Diagnostic Model (introduction)]
* link:../3-pdm/1-pdm_l1-os.html#_content[PDM Layer 1: Operating System]
* link:../3-pdm/2-pdm_l2-jvm.html#_content[PDM Layer 2: Java Virtual Machine]
* link:../3-pdm/3-pdm_l3-app.html#_content[PDM Layer 3: Application]
* link:../4-process/0-perf_test_process.html#_content[Performance Testing Process]
* link:../5-analysis/1-analysis_tools.html#_content[Analysis Tools]

Workshops
---------

* link:../1-intro/w0-install.html#_content[Install the training toolsuite]
* link:../2-benchmark/w1-first_benchmark.html#_content[First performance test]
* link:../2-benchmark/w2-wrapup_benchmark.html#_content[Wrap-up the performance test]
* link:../3-pdm/w3-dominant_os.html#_content[PDM Layer 1 (OS) in practice]
* link:../3-pdm/w4-dominant_jvm.html#_content[PDM Layer 2 (JVM) in practice]
* link:../3-pdm/w5-dominant_app.html#_content[PDM Layer 3 (Application) in practice]

Extras
------

* link:../0-extra/0-course_description.html#_content[Course Description]
* link:../0-extra/1-training_plan.html#_content[Course Plan]
* link:../0-extra/2-internals_os.html#_content[Operating Systems Internals]
* link:../0-extra/3-internals_jvm.html#_content[Java VM Internals]
* link:../0-extra/4-best_practices.html#_content[Best Practices]