Scala: Calling higher-order functions on Maps


As I’m learning Scala, I played with Maps. The subtlety of Maps has to do with the fact that they are tuples of (key,value) pairs. Let’s look at the various ways of calling higher-order functions on them.

Let’s consider a map of bears and they weights created as follows.

scala> val myMap = Map("Brown Bear" -> 635, "Grizzly Bear" -> 360, "American Black Bear" -> 270, "Polar Bear" -> 680)
myMap: scala.collection.immutable.Map[String,Int] = Map(Brown Bear -> 635, Grizzly Bear -> 360, American Black Bear -> 270, Polar Bear -> 680)

Filtering bears that weigh more than 300kg

If I want to filter bears that weigh more than 300kg, I’ll use the filter function. I can do it by passing in a function (x) => x._2 > 300.

scala> myMap.filter((x) => x._2 > 300)
res0: scala.collection.immutable.Map[String,Int] = Map(Brown Bear -> 635, Grizzly Bear -> 360, Polar Bear -> 680)

I can also use a wildcard instead of defining defining the parameter x.

scala> myMap.filter(_._2 > 300)
res0: scala.collection.immutable.Map[String,Int] = Map(Brown Bear -> 635, Grizzly Bear -> 360, Polar Bear -> 680)

A third way would be to use a case in order have the tuple split for us into its two parts as input to the function.

scala> myMap.filter {case (x,y) => y>300}
res2: scala.collection.immutable.Map[String,Int] = Map(Brown Bear -> 635, Grizzly Bear -> 360, Polar Bear -> 680)

As I don’t car about the first part of the tuple, I can just use a wildcard instead of (x,y).

scala> myMap.filter {case (_,y) => y>300}
res12: scala.collection.immutable.Map[String,Int] = Map(Brown Bear -> 635, Grizzly Bear -> 360, Polar Bear -> 680)

Averaging the weights of the bears

Let’s say that I want to average the weight of the various bears. To do so, I have to use foldLeft on the map and then divide the outcome by the size of the map.

scala> myMap.foldLeft (0) ((sum,v) => sum+v._2) / myMap.size
res5: Int = 486

Instead of using defining the signature of the anonymous function, I can also use wildcards.

scala> myMap.foldLeft (0) (_+_._2) / myMap.size
res7: Int = 486

Now I can even use the scala shorthand for foldLeft even though I’m no real fan of it.

scala> (0/:myMap) (_+_._2) / myMap.size
res9: Int = 486

The shorthand is equivalent to the following as methods that end with a colon associate to the right.

scala> (myMap./:(0)) (_+_._2) / myMap.size
res10: Int = 486

Actually, the easiest way can also be to directly work on the values and call the sum function on those values.

scala> myMap.values.sum / myMap.size
res6: Int = 486

Averaging the weights of the bears that weigh more than 300kg

If I now want to average the weights of the bears that weight more than 300kg, I can first filter the weights that are greater than 300kg. I can  do that by filtering a Map and returning a Map using filter. I can also filter the values by first calling values

Let’s first calculate the average on the filtered list of values.

scala> myMap.values.filter(_>300).sum / myMap.size
res18: Int = 418

Let’s now do it by always working on a Map and using FoldLeft.

scala> myMap.filter(_._2>300).foldLeft(0)(_+_._2) / myMap.size
res0: Int = 418

Final thoughts

With Scala, there are so many ways to do the same thing that in the end, it’s just a matter or taste. Nevertheless, when working in a team, it’s good practice to try to keep the style uniform throughout the code base.

This post did not aim at listing all the possible ways to implement the examples. Given the nature of Scala, I even imagine that there are more clever ways to do it.

A last consideration has to do with performance. Given the size of my example, all solutions run pretty fast. This shall no doubt be different with larger collections.

Scala: Fixing the pesky java.lang.OutOfMemoryError: PermGen space with SBT


When I started to use SBT, I continuously ran in to the pesky PermGen space error.

[error] java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
[error] Use 'last' for the full log.

To solve the problem, I added the following environment variable to my bash profile:

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"

Setting up password-less SSH and SCP


In this post, I will explore how to perform a secure copy, the Linux scp command.

To this end, I will first detail how to setup password-less authentication with OpenSSH.

Setting up openssh on the guest and the host

What I want to achieve is to be able to ssh the remote host from my guest computer with the following

$ ssh username@hostname

Let’s consider that I have both the host and the guest running ubuntu. I have to install the openssh-client package on the guest with the following command:

$ sudo apt-get install openssh-client

For testing this how-to, I have set up a fresh virtualized Ubuntu install. When I attempt to connect to the host for the first time, I get the following error for example:

$ ssh stephan@10.211.55.10
ssh: connect to host 10.211.55.10 port 22: Connection refused

I have to install openssh-server on the host with the following command:

$ sudo apt-get install openssh-server    

Now, I can open an SSH connection between my guest and my host. As this is the first time I connect to the host, I have to accept that the host be added to the list of known hosts recognized by opens. The list is available in

~/.ssh/known_hosts

For example:

~ $ ssh username@10.211.55.10
The authenticity of host '10.211.55.10 (10.211.55.10)' can't be established.
RSA key fingerprint is 9c:f5:b7:93:7a:eb:d8:fe:e5:38:a8:52:e8:06:9b:2d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.211.55.10' (RSA) to the list of known hosts.
username@10.211.55.10's password: 
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

156 packages can be updated.
28 updates are security updates.

The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.

username@host:~$ 

Now that openssh is configured on the host, we can set up password-less authentication.

Setting up password-less authentication with OpenSSH

Password-less authentication with OpenSSH works as follows. In order to secure the communication between the guest and the host without the need to provide a password, they will use the private key and public key of the client along with a username known on the server. The server will add the public key of the client to its lists of authorized keys.

As I authenticate as a particular user known on the host, I will set up the openssh configuration for the host to allow the user to ssh from the guest. I will generate a private/public key pair on the guest and add the public key to the list of authorized keys on the host.

The ~$ ssh username@hostname command will use the private key available in the ~/.ssh/id_rsafile of the user executing the command on the guest computer. If I wanted to use any other key file, I could use the -i pathToKeyFile parameter and specify another key file. For example:

$ ssh -i pathToMyFile username@hostname

Now that I know what I want to achieve, let’s configure both the guest and the host.

With the default key file

The first step is to generate a private and a public key on the guest computer. I will issue the following command to generate an RSA key. I could use -t dsa to generate a DSA private key.

ssh-keygen -t rsa

The command will yield the following output. It is important not to type in a passphrase and to simply hit enter twice.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/stephan/.ssh/id_rsa): 
Created directory '/home/stephan/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/stephan/.ssh/id_rsa.
Your public key has been saved in /home/stephan/.ssh/id_rsa.pub.
The key fingerprint is:
24:c9:61:0f:c5:f3:69:24:92:21:2a:bf:6e:64:0b:17 stephan@stephan-Parallels-Virtual-Platform
The key's randomart image is:
+--[ RSA 2048]----+
|    . ==.        |
|   . +o=+ .      |
|. .   +.o= .     |
| oE    o  +      |
|  ..    S.       |
|. +.             |
| =..             |
| .o              |
| ..              |
+-----------------+

Now, I have two files in the ~/.sshdirectory of my guest computer: id_rsa and id_rsa.pub

I will now copy it to my host server with the OpenSSH scp command:

$ scp ~/.ssh/id_rsa.pub username@hostname:/home/username/.ssh/myguest_id_rsa.pub

On the host, I will now add the contents of the key to the list of authorized keys:

$ cat myguest_id_rsa.pub >> ~/.ssh/authorized_keys

The above command will append the contents of the myguest_id_rsa.pub file to the file authorized_keys. If the file does not exist, the command creates it.

Let’s now remove the no longer necessary file

$ rm myguest_id_rsa.pub

For better security, let’s set the proper rights on the authorized_keys file. 600 means that the owner only can read and write.

$ chmod 600 authorized_keys

Now, when I open an SSH connection with the given username from the guest computer (logged in as the user whose key is authorized on the host) to the host computer, I no longer have to provide a password. Instead of:

~/$ ssh stephan@10.211.55.10
stephan@10.211.55.10's password: 
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Sun Jun  3 16:44:22 2012 from stephans-macbook-pro.local

I now have

~/.ssh $ ssh stephan@10.211.55.10
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Sun Jun  3 17:26:52 2012 from stephans-macbook-pro.local
stephan@stephan-Parallels-Virtual-Platform:~$ 

With any key file

Let’s generate a key file outside of the ~/.ssh directory.

~/temp $ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/stephan/.ssh/id_rsa): ./standalone_id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ./standalone_id_rsa.
Your public key has been saved in ./standalone_id_rsa.pub.
The key fingerprint is:
d4:48:5d:30:10:80:f6:2d:75:1d:49:51:47:9f:5b:eb stephan@stephan-Parallels-Virtual-Platform
The key's randomart image is:
+--[ RSA 2048]----+
|     ...++o===..o|
|    o  ..oo.o  .o|
|   . . oo..    .o|
|      o..       +|
|       .S      o |
|              .  |
|               E |
|                 |
|                 |
+-----------------+

I generated the file in the folder I was in with ./standalone_id_rsa.

Let’s now copy the file to the host:

~$ scp ./standalone_id_rsa.pub username@hostname:/home/username/.ssh/myguest_id_rsa.pub

On the host, let’s add the public key to the list of authorized_keys:

~$ cat myguest_id_rsa.pub >> authorized_keys

Let’s remove the no longer necessary key file:

~$ rm myguest_id_rsa.pub

I can now connect with the provided file:

~/temp $ ssh -i ./standalone_id_rsa stephan@10.211.55.10
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Sun Jun  3 17:52:36 2012 from stephans-macbook-pro.local
stephan@stephan-Parallels-Virtual-Platform:~$ 

If I want to In this case, we must make sure that only the owner of the file has the rights to access the file. To achieve that, we will set the appropriate rights with chmod.

$ chmod 600 pathToMyKeyFile

References

Where are the system icons in Ubuntu?


One can find the system icons in:

/usr/share/icons/

There are multiple directories underneath, where one can find many icons.

Calculating a value whether one column of several is not null in PL/SQL


I wanted to calculate in a SQL query whether one of three columns in a table was not null. I did not want to do it in the Java code to keep code clean.

First, I started to used DECODE and NVL2 to reproduce a kind of IF-THEN-ELSE to lazily compare my values:

IF <field one> IS NOT NULL THEN true ELSE IF <field two> IS NOT NULL THEN true ELSE IF <field three> IS NOT NULL THEN true ELSE FALSE

This was a bit convoluted and resulted in the following code:

SELECT DECODE(NVL2(remarks_f, 'true','false'), 'true', 'true','false',DECODE(NVL2(remarks_n, 'true','false'), 'true', 'true','false',DECODE(NVL2(remarks_d, 'true','false'), 'true', 'true','false','false'))) AS hasRemarks
FROM bulletin;

After discussion with a colleague of mine, he suggested that I concatenated the values of the three fields and check whether the outcome was null or not like:

IF <field one> + <field two> + <field three> IS NOT NULL THEN true ELSE FALSE

This resulted in the following code:

SELECT DECODE(NVL2(remarks_f || remarks_n || remarks_d, 'true','false'), 'true', 'true','false','false') AS hasRemarks
FROM bulletin;

Then, I realised that NVL2 was more than enough to achieve what I wanted and I ended up with the following code:

SELECT NVL2(remarks_f || remarks_n || remarks_d, 'true','false') AS hasRemarks
FROM bulletin;

Launching gnome-terminal with custom parameters


I wanted to create a custom launcher to launch gnome-terminal with a specific profile, set the working directory and maximise the window. Here’s the command to do it:

gnome-terminal --window-with-profile="Server Console"  --working-directory=/home/stephan/Development/servers --maximize

As the name of my profile contained white spaces, I had to use double quotes do delimit it.

Highlighting input fields with CSS and JQuery


The interface of our current Web Application is rather complex and contains loads of fields. The end users wanted us to make the active field or element more visible. The only hitch is that the supported browsers are IE7, IE8 and Firefox 3.6+.

The CSS dynamic pseudo-class :focus should have done the trick. The :focus selector is supported as such by Firefox, Chrome and IE9.

Here is an example of how to use it. Don’t pay attention to the ugliness of the outcome :-). In the case of the check box and radion I could only manage to change the border style and width and not the colour.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<style type="text/css">
input:focus, textarea:focus, select:focus {
        background: #FFFFCC;
        border: 2px solid red
}
</style>
</head>

<body>
            Text Field: <input type="text" /><br />
            Password Field: <input type="password" /><br />
            Text Area: <textarea></textarea><br />
            Radio Button: <input type="radio" /><br />
            Check box: <input type="checkbox" /><br />
            Button: <input type="submit" value="Submit" /><br />
            Select box:<select>
                                  <option>One</option>
                                  <option>Two</option>
                                  <option>Three</option>
                                  </select> <br />
</body>
</html>

To make it work in IE8, the page must declare a <!DOCTYPE>, as illustrated below. Furthermore, one must disable the compatibility view settings for the Web site in order to have the CSS working. Go to Tools->Compatibility View Settings and uncheck the adequate check boxes.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Unfortunately, that does not work in IE7. However, I found a JQuery plugin that makes it work with IE7 at http://james.padolsey.com/javascript/fixing-focus-in-internet-explorer/. The only problem that I found was with select, that does not work.

Here is an example of how to use it:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<style type="text/css">
input:focus, textarea:focus, select:focus {
        background: #FFFFCC;
        border: 2px solid red
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
<script type="text/javascript" src="pseudofocus.js"></script>

</head>

<body>
            Text Field: <input type="text" /><br />
            Password Field: <input type="password" /><br />
            Text Area: <textarea></textarea><br />
            Radio Button: <input type="radio" /><br />
            Check box: <input type="checkbox" /><br />
            Button: <input type="submit" value="Submit" /><br />
            Select box:<select>
                                  <option>One</option>
                                  <option>Two</option>
                                  <option>Three</option>
                                  </select> <br />
        <script type="text/javascript">
            $.pseudoFocus();
        </script>
</body>
</html>

Links

Fixing MW_HOME problem with the Domain Wizard in WebLogic 11g


After having installed a WebLogic server on my Ubuntu machine, I wanted to use the wizard to create a domain. I then ran into the following problem when I ran the configure.sh script

$ ./configure.sh

./configure.sh: 19: [[: not found ./configure.sh: 19: -d: not found ERROR: You must set MW_HOME and it must point to a directory. where an installation of WebLogic exists. Ensure you point this variable to the extract location of the zip distribution. config.sh

The problem is simple. The first line of the script as it comes out of the box is

#!/bin/sh

In order to run it properly, I changed that first line to refer to bash as follows

#!/bin/bash

That did the trick

Fixing the pesky perl: warning: Setting locale failed on Ubuntu Server


After having installed an new instance of Ubuntu Server, I run into the following error message

Setting locale failed.
perl: warning: Please check that your locale settings: LANGUAGE = “en_GB:en”, LC_ALL = (unset), LC_CTYPE = “UTF-8″, LANG = “en_GB.UTF-8″ are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).

To fix it, I had to do the following:

$ sudo dpkg-reconfigure locales

That generated the following output:

Generating locales...
  en_AG.UTF-8... up-to-date
  en_AU.UTF-8... up-to-date
  en_BW.UTF-8... up-to-date
  en_CA.UTF-8... up-to-date
  en_DK.UTF-8... up-to-date
  en_GB.UTF-8... up-to-date
  en_HK.UTF-8... up-to-date
  en_IE.UTF-8... up-to-date
  en_IN.UTF-8... up-to-date
  en_NG.UTF-8... up-to-date
  en_NZ.UTF-8... up-to-date
  en_PH.UTF-8... up-to-date
  en_SG.UTF-8... up-to-date
  en_US.UTF-8... up-to-date
  en_ZA.UTF-8... up-to-date
  en_ZM.UTF-8... up-to-date
  en_ZW.UTF-8... up-to-date
Generation complete.

Then, I ran:

$ sudo locale-gen en_GB

That generated the following output:

Generating locales...
  en_GB.ISO-8859-1... done
Generation complete.

And I eventually ran:

$ sudo update-locale LANG=en_GB.UTF-8

Then, I added the following to my .profile

export LC_CTYPE=en_GB.UTF-8 export LC_ALL=en_GB.UTF-8

That did the trick.

Creating Self-Signed Certificates on Ubuntu Server


As I investigated how to set up Apache2 on Ubuntu/Debian, I found out that there were different ways of generating self-signed certificates.

I’ll try to summarise what I gathered in this post, for the sake of understanding and remembering.

Procedure 1: The Ubuntu/Debian way

On Ubuntu/Debian,there is a utility named make-ssl-cert that is a debconf to openssl wrapper whose description is available at http://man.he.net/man8/make-ssl-cert
The utility will generate a .pem file containing both a certificate and a private key

$sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf ./myCertificate.pem

The commands needs a template (/usr/share/ssl-cert/ssleay.cnf) to generate the certificate.

The generated PEM file contains both the private key and the certificate:

—–BEGIN PRIVATE KEY—–

—–END PRIVATE KEY—–
—–BEGIN CERTIFICATE—–

—–END CERTIFICATE—–

Procedure 2: The OpenSSL way with a passphrase

To generate a self-signed certificate with OpenSSL, one must go through several steps. To generate the certificate, one needs:

  • A private key
  • A Certificate Signing Request (CSR)

To generate a private key using the RSA algorithm, run the following command:

$ openssl genrsa -des3 -out myKey.pem 2048

The command works as follows:

  • The command genrsa generates an RSA private key
  • The option -des3 encrypts the private key with triple DES
  • The option -out outputs to the provided filename
  • 2048 is the size of the private key to generate in bits

The outcome of the command will be

Generating RSA private key, 2048 bit long modulus
..........+++
...................................................+++
e is 65537 (0x10001)
Enter pass phrase for myKey.pem:
Verifying - Enter pass phrase for myKey.pem:

The key is generated in a PEM format.
The contents of the generated file looks as follows:

Here is an example
----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,B86D06044242EA6B

...
-----END RSA PRIVATE KEY-----

Caveat: As the key was used to generate a passphrase, you will have to keep it preciously. For example, when using the certificate with Apache2, the passphrase will be requested at each startup of the server.

Now that we have a private key, we have two possibilities. Either we generate the Certificate Signing Request and the Certificate in one command, or we do it with two commands

Variant a – step 1: Generate a Certificate Signing Request

Run the command:

$ openssl req -new -key myKey.pem -out server.csr

The command will request you to enter quite some information as you can see on the following output:

Enter pass phrase for myKey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BE
State or Province Name (full name) [Some-State]:Brabant
Locality Name (eg, city) []:Brussels
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:My Division
Common Name (eg, YOUR name) []:My Name
Email Address []:my.name@myorganisation.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

The contents of the generated server.csr looks like this:

-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----

Variant a – step 2: Generate the self-signed certificate based on the CSR

Run the following command to issue a certificate that will be valid for 365 days.

$ openssl x509 -req -days 365 -in server.csr -signkey myKey.pem -out myCertificate.pem

The output will look like:

Signature ok
subject=/C=BE/ST=Brabant/L=Brussels/O=My Company/OU=My Division/CN=My Name/emailAddress=my.name@myorganisation.com
Getting Private key
Enter pass phrase for myKey.pem:

The contents of the certificate file looks liks:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Variant b: Generate the Certificate without generating the CSR

Run the following command to issue a certificate that will be valid for 365 days. You will have to enter the data as for the CSR but none will be generated.

$ openssl req -new -x509 -key myKey.pem -out myCertificate.pem -days 365

The output will look like:

Enter pass phrase for myKey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BE
State or Province Name (full name) [Some-State]:Brabant
Locality Name (eg, city) []:Brussels
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organisation
Organizational Unit Name (eg, section) []:My Division
Common Name (eg, YOUR name) []:My Name
Email Address []:my.name@mycompany.com

Variant c: Remove the passphrase from the key

It is also possible to remove the Triple DES encryption from the key and therefore the need to input the passphrase. This requires that one knows the passphrase and that the access rights on the certificate be well set and be only readable by the root user.

$ openssl rsa -in myKey.pem -out myCertificate.pem

The output of the command looks like:

Enter pass phrase for myKey.pem:
writing RSA key

The contents of the generated PEM file looks like this:


-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

Procedure 3:  The OpenSSL way without a passphrase

The procedure using OpenSSL without the passphrase differs at the key generation phase. In order to generate the private key this way, run the following command, which does not request to use Triple DES:

$ openssl genrsa -out myKey.pem 2048

The output looks like:

Generating RSA private key, 2048 bit long modulus
.......+++
...+++
e is 65537 (0x10001)

The contents of the server.key file looks like:

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

Let’s now generate the Certificate with generating an intermediate CSR

$ openssl req -new -x509 -key myKey.pem -out myCertificate.pem -days 365

The output looks like:

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BE
State or Province Name (full name) [Some-State]:Brabant
Locality Name (eg, city) []:Brussels
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:My Division
Common Name (eg, YOUR name) []:My Name
Email Address []:my.name@mycompany.com
Follow

Get every new post delivered to your Inbox.

Join 163 other followers

%d bloggers like this: