Simple SSL configuration for Apache-Tomcat

For the official instructions (Tomcat 8), read this page

The following instructions are for development servers only:

Step 1: Create a keystore file to store the server’s private key and self-signed certificate:

For Windows:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA

For Unix/Linux:

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

You will be asked for various information. Remember the password you typed at this step.

At the end of the procedure, keytool will create a file named “.keystore” to your home directory. By default it is hidden. This file should be moved to Apache-Tomcat home directory and can be renamed (eg to “keystore”).

Step 2: Disable APR:

Edit server.xml and comment out the following line:

<!--
    Listener
    className="org.apache.catalina.core.AprLifecycleListener"
    SSLEngine="on"
/-->

Step 3: Activate the SSL connector

Edit server.xml and add (or uncomment and modify) the following lines:

<Connector 
    port="8443" 
    SSLEnabled="true" 
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" 
    scheme="https" 
    secure="true"      
    keystoreFile="keystore" 
    keyAlias="tomcat"
    keystorePass="12345678"
    clientAuth="false" 
    sslProtocol="TLS" />

You will have you replace “12345678” with your password.

You will also have to replace “keystore” with the full path to the keystore file generated at Step 1.

Step 4: Restart Tomcat

Do not forget to restart Apache-Tomcat

 

 

Audio staggering in Windows 10

Before upgrading to Windows 10, check if there are drivers written for your hardware specifically for Windows 10. You should definitely check that drivers exists for your network card and your audio card.

This is because Windows 10 suffer from the same (and important) problem Windows 8 suffer: High DPC (deferred procedure call) latency. If the drivers do not work properly you may have high DPC latency, which may result to audio staggering, lag, clicks, drop outs even if your CPU does not reach 100%. This means that there is a high chance you won’t be able to playback movies flawlessly while using the network card! What a break dealer!!!

You can verify if your system suffers from high DPC latency by using LatencyMon. To learn what DPC latency is read this article.

If there is no Windows 10 driver for your network card, the easiest thing to do is not to upgrade to Windows 10 !!!

Now, what do we do if we have upgraded to Windows 10 and do suffer from undesired DPC latency? There are numerous solutions in the net. Most of which do not work.

Imho, You should complete the following steps by that order. If the problem is solved at any point, you don’t have to (and better not to) do the rest of the steps.

Step 1: Update your system.

Step 2: If possible, remove 3rd party antivirus and firewall software.

Step 3: Remove any software you don’t need (you should do that anyway)

Step 4: Update all drivers to latest version.

At this point, if the problem persists then most probably one of your drivers is faulty or not completely compatible with Windows 10. You can find which by using LatencyMon but you can bet it is the network/wireless driver.

The only thing you can do is rollback to an older version. So there are two more steps to do:

Step 5: Verify that the driver installed is for the correct hardware and not just for the correct hardware family. If your card is named 6200 then your driver should be for 6200. Anything else like 6201, 6205, 6300 is not acceptable.

Step 6: Find the proper driver for Windows 7 and install it

If the last step does not work, then you can try other drivers from the same family.

Lastly, if the problem still persists then there are two more steps but they are a long shot:

Step 7: Optimize BIOS :

Important settings to disable and may help are:

  • Virtualization
  • High precision timer

Step 8: Update the BIOS

Personally, I don’t think the last step helps. But many people claim it does, so you have nothing to lose.

 

Recommended settings for 802.11n

Here are the official recommended settings for Wifi 802.11n from Intel:

Property Value
802.11n channel width for band 2.4 Auto (not in 20 MHz only)
802.11n channel width for band 5.2 Auto (not in 20 MHz only)
802.11n mode Enabled
Fat channel intolerant Disabled
Roaming aggressiveness Medium (or less)
Throughput enhancement Disabled
Transmit power Highest
Wireless mode 802.11a/b/g
HT mode VHT mode

On the wireless router, check the following options:

Property Value
Auto channel scan Enable
802.11 mode Use 802.11n only
Channel width 40 MHz

References:

https://www.intel.com/content/www/us/en/support/network-and-i-o/wireless-networking/000005544.html

Give your cat liquid medicine, the easy way

Verify that your cat does not health problems that prevent her from consuming milk.

You will give her only a small amount of milk.

You need:

  1. a plastic cup
  2. white milk
  3. scissors

 

Step 1: Get a plastic cup:

maxcups_c_maxvalu_pk50_maxvalue_plastic_cup_180ml_clear

Step 2: Cut the cup with scissors. Keep the base of the cup with 1cm approx height:

Clipboard02

Step 3: Fill the cup with the milk, leave about 2mm empty

Step 4: Pour the medicine inside the cut cup.

Step 5: Stir

Step 6: Give it to the cat!

Done 🙂

 

 

 

 

 

 

Generate random weighted variables

In this post I describe the common problem how to generate random weighted variables. For example you have a die with 6 faces that is fixed, so the probability of an 1 is not the same with the probability of a 2 etc.

The table below shows an example:

Face Probability
1  25
2  25
3  20
4  20
5  5
6  5

One easy solution is to reduce the problem to another one with a die with 100 faces that is not fixed.

You generate a random value from 0-99 that follows the uniform distribution. Do not use the modulo function to do that. See this post instead.

Once you have that value you perform the following steps:

You check the space within which that value relies.

  1. between 0 and 24, you generate 1 as the weighted variable
  2. between 25 and 49, you generate 2 as the weighted variable
  3. between 50 and 69, you generate 3 as the weighted variable
  4. between 70 and 89, you generate 4 as the weighted variable
  5. between 90 and 94, you generate 5 as the weighted variable
  6. between 95 and 99, you generate 6 as the weighted variable

 

 

 

Generate uniformly distributed random variables

Formulas shown below generate values that follow uniform distribution.

Using simple modulo methods is not considered as a good solution (although used a lot by students) as the module function does not generate all the variables with the same frequency.

Random integer between [ 0, 1 ]

int r = (int) (rand() / (RAND_MAX + 0.0));

Random integer between [ 0, 1 )

int r = (int) (rand() / (RAND_MAX + 1.0));

Random integer between [ 0, N ]

int r = (int) (N * (rand() / (RAND_MAX + 0.0)));

Random integer between [ 0, N )

int r = (int) (N * (rand() / (RAND_MAX + 1.0)));

Random integer between [ M, N ]

int r = (int) (Μ + (rand() / (RAND_MAX + 0.0))*(N-M+1));

Random integer between [ M, N )

int r = (int) (Μ + (rand() / (RAND_MAX + 1.0))*(N-M+1));

Summary

The general formula is:

int r = (int) (A + (rand() / (RAND_MAX + C))*B);

Values of M, N, K are shown in the following table:

Range A B  C
 [ 0, 1 ]  0  1  0.0
 [ 0, N ]  0  N  0.0
 [ M, N ]  M  N – M + 1  0.0
 [ 0, 1 )  0  1  1.0
 [ 0, N )  0  N  1.0
 [ M, N )  M  N – M + 1  1.0

Generating values of normal distribution – Marsaglia method

Assuming you can already produce variables of uniform distribution, you can produce variables of normal distribution using various formulas. Two of the most important are:

  1. Box–Muller method
  2. Marsaglia polar method

Most methods are based on Box-Muller method.

The Marsaglia method is my favorite since it does not require using sin() or cos() functions and the steps are very easily to implement.

Here is a sequence of the steps:

  1. Generate a value that follows uniform distribution in any space you want (eg: [ 0 , 1 ))
  2. Map that value to space (-1, +1) and assign it to variable U
  3. Repeat steps 1 and 2 and assign the result to variable V
  4. Calculate S = U*U + V*V
  5. if S = 0 or S >= 1 then free all variables if needed and restart from the beginning
  6. The following two variables will be independent and standard normally distributed (mean = 0, variance = 1):

marsaglia

Optionally you can add m to the quantities above to change the mean value of the distribution.

 

Java – Appending objects to binary files

Java is tricky, you cannot add objects to already existent files with default classes.

Here is the solution:

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class Test{
    private static String filename = "test";

    public static void main(String[] args) {
        writeToBinary (filename, "a", true);
        writeToBinary (filename, "b", true);
        writeToBinary (filename, "c", true);
        readFromBinaryFile (filename);
    }

    public static void writeToBinary (String filename, Object obj, boolean append){
        File file = new File (filename);
        ObjectOutputStream out = null;

        try{
            if (!file.exists () || !append) out = new ObjectOutputStream (new FileOutputStream (filename));
            else out = new AppendableObjectOutputStream (new FileOutputStream (filename, append));
            out.writeObject(obj);
            out.flush ();
        }catch (Exception e){
            e.printStackTrace ();
        }finally{
            try{
                if (out != null) out.close ();
            }catch (Exception e){
                e.printStackTrace ();
            }
        }
    }

    public static void readFromBinaryFile (String filename){
        File file = new File (filename);

        if (file.exists ()){
            ObjectInputStream ois = null;
            try{
                ois = new ObjectInputStream (new FileInputStream (filename));
                while (true){
                    String s = (String)ois.readObject ();
                    System.out.println (s);
                }
            }catch (EOFException e){

            }catch (Exception e){
                e.printStackTrace ();
            }finally{
                try{
                    if (ois != null) ois.close();
                }catch (IOException e){
                    e.printStackTrace ();
                }
            }
        }
    }

    private static class AppendableObjectOutputStream extends ObjectOutputStream {
          public AppendableObjectOutputStream(OutputStream out) throws IOException {
            super(out);
          }

          @Override
          protected void writeStreamHeader() throws IOException {}
    }
}

 

References:

https://stackoverflow.com/questions/4646272/appending-objects-to-a-binary-file

Personal portal to the Internet