Set up Ubuntu 16.04 with xfce and VNC server

I was installing vCenter on my ESXi server.  Since this was my first time installing vCenter, I decided that installing via UI was a far better choice than install from the CLI.  But then that meant I needed to get a UI on to the Ubuntu VM I had stood up to do the install from.  So this is what I did.

  1. Install the xfce4 and tightvnc packages.  Xfce is a desktop environment for Unix and Unix-like OS’s.  We will use Xfce, but you could use a different desktop environment if you want.
    sudo apt install xfce4 xfce4-goodies tightvncserver
  2. Validate that the server can be started and create an access password for view and control (you can also setup a separate password for view only)
    vncserver
  3. Configure vncserver to always use Xfce
    The configurations for vncserver are kept in the ~/.vnc/xstartup file.  Out of the box, it looks like this:

    #!/bin/sh
    
    xrdb $HOME/.Xresources
    xsetroot -solid grey
    #x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    #x-window-manager &
    # Fix to make GNOME work
    export XKL_XMODMAP_DISABLE=1
    /etc/X11/Xsession

    We need to change this so it uses Xfce instead of GNOME.  You could edit the xstartup file directly (not recommended) or make a back up of it and start fresh with:

    #!/bin/bash
    
    xrdb $HOME/.Xresources
    startxfce4 &
  4. Make the startup script executable
    sudo chmod +x ~/.vnc/xstartup
  5. Start VNC server
    vncserver
  6. Test from a Mac OS X machine.
    1. Open an ssh session with port forwarding
      ssh -L 5901:127.0.0.1:5901 -N -f -l username server_ip_address
    2. Open Screen Sharing
      1. From Safari or from Spotlight, type:
        vnc://server_ip_address:5901
    3. You should see something like this:
  7. Daemonize the VNC Server
    1. Create the service
      sudo vi /etc/systemd/system/vncserver@.service

      Add the following to it.  Replace $user with your username

      [Unit]
      Description=Start TightVNC server at startup
      After=syslog.target network.target
      
      [Service]
      Type=forking
      User=$user
      PAMName=login
      PIDFile=/home/$user/.vnc/%H:%i.pid
      ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
      ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i
      ExecStop=/usr/bin/vncserver -kill :%i
      
      [Install]
      WantedBy=multi-user.target
    2. Register the service with the system
      sudo systemctl daemon-reload
      sudo systemctl enable vncserver@1.service
    3. Kill any currently running instances
      vncserver -kill :1
    4. Start the service
      sudo systemctl start vncserver@1
References:
  1. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-16-04

How to write html test reports while keeping console output for ScalaTest

Recently I decided that I wanted to have html reports of my ScalaTest unit tests.  What I didn’t realize was that it would *remove* my console output!

When I first added html reports, I discovered that the required a dependency I wasn’t aware of: pegdown.

 

Adding html reports was as easy as setting it in the testOptions:

(testOptions in Test) += Tests.Argument(TestFrameworks.ScalaTest, "-h", "target/report")

As I mentioned above, this caused the following error:

java.lang.NoClassDefFoundError: org/pegdown/PegDownProcessor

So I added the latest version of PegDown to my build.sbt and set its scope to test:

"org.pegdown" % "pegdown" % "1.6.0" % "test"

But then I discovered that I wasn’t getting any console output for my tests!

The answer is to simply add both to your testOptions sequence:

testOptions in Test ++= Seq(Tests.Argument(TestFrameworks.ScalaTest, "-o"), Tests.Argument(TestFrameworks.ScalaTest, "-h", "target/test-reports"))

 

How to create an enumeration in Scala with custom values and names

There has been some back and forth about whether Scala devs should even be creating enumerations to begin with.  (https://www.wlangiewicz.com/2016/03/20/scala-case-classes-vs-enumeration/)

But in the case you wanted to, here’s how to do it:

object MyEnumeration extends Enumeration {
  type MyEnumeration = Value
  val First = Value(1, "Custom Name")
  val Second = Value(2, "Custom Name2")
  val Third = Value(3, "Custom Name3")
}

Happy Coding!

 

How to suppress Scalastyle rules

Sometimes Scalastyle will bark at you for reasons that aren’t always constructive.  For example, the magic number rule is generally a good one except when you are trying to create an enumeration with a particular indexing.  Because Scala will automatically 0-base the enumeration entries, if you wanted to 1-base them, you will need to reindex them.  But then this means you need to set them as below:

object MyEnumeration extends Enumeration {
  type MyEnumeration = Value
  val `First` = Value(1)
  val `Second` = Value(2)
  val `Third` = Value(3)
}

As you can see, the numbers 1, 2, 3 are considered ‘magic numbers’.

So the way to suppress the rule is to a) find the offending rule id (in this case magic.number) then b) make the following change:

object MyEnumeration extends Enumeration {
  // scalastyle:off magic.number
  type MyEnumeration = Value
  val `First` = Value(1)
  val `Second` = Value(2)
  val `Third` = Value(3)
 // scalastyle:on magic.number
}

Happy coding!

How to set up a git commit message template

  1. Create a template in your user directory. Name the file .gitmessage
    vi ~/.gitmessage
  2. Add the following as your template:
     [commit message title]
    
     Reviewers:
    
     Subscribers:
    
     Summary:
    
     Test Plan:
  3. Then set it as part of your global configuration:
    git config —global commit.template = ~/.gitmessage