Online Board Games

March 20, 2020 1 comment

Fans of board games might be missing the social interaction that goes with playing, while we’re locked away inside from the coronavirus pandemic. A lot of app-based board games provide online play options, so you can gather friends & family for a game while you chat via Skype or FaceTime. Here’s a list of some good options.

Ticket To Ride

Small World 2

Twilight Struggle



San Juan

Scotland Yard

Catan Classic

Catan Universe


  • iOS $5
  • not on Android


  • iOS $5 (This version is developed by a different company and probably won’t work with the other platforms. It was set to expire but was just given a reprieve.)
  • Android $5
  • Steam (Windows) $10
  • Nintendo Switch $20

Neuroshima Hex

7 Wonders



  • iOS $3
  • not on Android

Exploding Kittens

Trickster Cards

Categories: miscellaneous

Tailing Multiple Logs with Cygwin

August 14, 2013 1 comment

I just joined a new project at work building a workflow system using the Documentum successor Alfresco and its Business Process Management engine Activiti. When the project dev lead gave me a tour of developing for and using the system, I noticed that he opened Cygwin bash shells to tail three different Alfresco log files to look for errors. If you’re not of the software dev persuasion but are trying to make sense of this post for some reason, let me try to explain. Tail is a standard UNIX tool to show the end of a file from the command prompt, and using the -f option dynamically updates the display when new stuff gets added to the file. Thus tailing logs allows you to see the under-the-hood output from your software so you can figure out what the heck is really happening.

I realized that I would lose my mind tailing 3 different log files in 3 different Cygwin shells constantly, and immediately set out to make this process easier.

The first problem is that Alfresco makes new log files for each day, and uses the date in the filename. Thus the tail command needs the smarts to tail today’s log using the date. Here’s my bash script to tail Alfresco’s stdout log.

today=`date +%Y-%m-%d`
tail --lines=200 -f /cygdrive/c/Alfresco/tomcat/logs/alfrescotomcat-stdout.$today.log

For this I want to run a single Windows batch file that kicks off 3 separate Cygwin shells for tailing the logs. That batch file is simple:

start /d "C:\cygwin64" Cygwin-tail-localhost.bat
start /d "C:\cygwin64" Cygwin-tail-stdout.bat
start /d "C:\cygwin64" Cygwin-tail-stderr.bat

Now comes the slightly tricky part, the batch files that kick off the Cygwin shells. Here’s what the standard Cygwin.bat script looks like:

@echo off
chdir C:\cygwin64\bin
bash --login -i

I tried appending to the above bash command to run my ~/.tail-*.sh script, but no matter what I tried I could not customize the title of the window. This gave me 3 windows that looked the same and I couldn’t tell which window displayed which log file. So I abandoned the bash command and switched to Google’s mintty terminal emulator, and everything came together nicely. Here’s what Cygwin-tail-stdout.bat looks like:

@echo off
chdir C:\cygwin64\bin
start mintty.exe -s 120,60 -t stdout /bin/bash -l -e './'

Now I click on one icon in my Start menu and instantly 3 bash consoles appear tailing Alfresco’s logs. There are probably smarter ways to do this, but I’m pretty happy with this approach.

Categories: code Tags: , ,

Online Security Tips

May 15, 2013 Leave a comment

In my latest role as a developer focused on security, I thought I should round up some tips I’ve gathered on using the Internet more securely in 2013.

  • Use an web browser other than Internet Explorer. Google Chrome has been rated as the most secure browser, and has some nice auto-updating features.
  • Uninstall the Java browser plug-in. This is one of the most popular attack vectors for malware, and Oracle doesn’t make it very easy for users to keep Java up to date. You can also disable the browser plug-in functionality in the Java control panel if you prefer to keep Java installed. If you need Java for a specific website, consider installing the Java plug-in in a different browser, such as Safari or Firefox, that you use only for that website.
  • Adobe Flash and Adobe Reader are also prevalent attack vectors, though Adobe Reader has gotten a lot more secure with recent updates. Keep these programs up to date. Chrome keeps its version of Flash updated for you, another great reason to use it.
  • Use a free updating tool such as FileHippo to alert you to out of date and potentially vulnerable software on your computer.
  • On the second Tuesday of the month, Microsoft regularly releases critical software patches to Windows and other Microsoft software. If you are in charge of keeping your computer up to date with Windows Update, make sure to apply these patches ASAP. If your system administrator applies these patches, remember that these often require your computer to restart and plan accordingly. The window of time between the public release of these patches and your application of them is a period of heightened risk as attackers learn of these vulnerabilities and attempt to exploit them.
  • Password reuse is both a reality and a danger. We all have way too many passwords to remember, but reusing the same password on multiple sites increases the risk that one site will lose your password to criminals and compromise much more of your online identity. Use a secure password manager such as 1Password (stores passwords in a secure lockbox on your hard drive or Dropbox) or LastPass (stores passwords in its secure cloud service) to generate secure passwords for all your logins and populate them in your browser for you.
  • Many online services are now implementing 2 step authentication. This feature sends a code to your mobile device which is required to login from a previously unused browser or location. Services that support 2 step authentication include Yahoo, Google, Apple, Facebook and Dropbox, and the list is growing constantly. Enabling this can prevent your critical email, identity and cloud accounts from compromise by criminals.

Please consider following all of these steps to keep yourself safe and secure online.

Categories: security

Programming Fonts

October 26, 2011 1 comment

On the way in this morning I was listening to the most recent episode of the This Developer’s Life podcast which is all about fonts. I decided to spend a few minutes this morning sprucing up the fonts on my Windows XP desktop. The first thing I found was the ClearType Tuner PowerToy from Microsoft . Microsoft developed ClearType ages ago, but it was disabled by default on XP (enabled on Vista and 7). I turned that on and instantly everything looked better. Highly recommended if you still have XP.

Then I set about finding a better monospaced font in Eclipse than Courier. I found a number of suggestions for Consolas, a font Microsoft developed for Visual Studio. Download it if you don’t already have it. Other popular suggestions were DejaVu Mono and Andale Mono. Give them a try.

Categories: code Tags:

Patch Accepted

April 14, 2011 1 comment

Woo hoo! My patch to the maven-scala-plugin has been accepted!

That means that my GitHub pull request was accepted into the main repository. Users can get the fix by pulling down the code and building the plugin. The fix will be included in the next version of the plugin, which I will be sure to mention here!

Categories: code Tags: , ,


April 1, 2011 Leave a comment

Continuing from my last post: With the Scala script written, I wanted to integrate it into our Maven build as an optional step. But this didn’t go so well.

When running mvn scala:script with a link to my script file in the configured pom.xml, I got a Fatal Error. I also couldn’t get a simple helloWorld script to run, as a separate file or scripted right into the pom.xml file. This is the error I got:

[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] scala/ScalaObject
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.NoClassDefFoundError: scala/ScalaObject
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(
at java.lang.ClassLoader.defineClass(
at Method)
at java.lang.ClassLoader.loadClass(
at java.lang.ClassLoader.loadClass(
at org_scala_tools_maven.ScalaScriptMojo.runScript(
at org_scala_tools_maven.ScalaScriptMojo.doExecute(
at org_scala_tools_maven.ScalaMojoSupport.execute(
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(
at org.apache.maven.DefaultMaven.doExecute(
at org.apache.maven.DefaultMaven.execute(
at org.apache.maven.cli.MavenCli.main(
at org.apache.maven.cli.compat.CompatibleMain.main(
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
at java.lang.reflect.Method.invoke(
at org.codehaus.classworlds.Launcher.launchEnhanced(
at org.codehaus.classworlds.Launcher.launch(
at org.codehaus.classworlds.Launcher.mainWithExitCode(
at org.codehaus.classworlds.Launcher.main(
Caused by: java.lang.ClassNotFoundException: scala.ScalaObject
at Method)
at java.lang.ClassLoader.loadClass(
at java.lang.ClassLoader.loadClass(
... 33 more
[INFO] ------------------------------------------------------------------------

The maven-scala-plugin couldn’t even find the ScalaObject class, which is analagous to Java Object. Of course I googled the heck out of this error and found a few people suffering the same problem, but no one posted a solution. Then I found maven-scala-plugin’s repo on GitHub and discovered that this issue has been reported but not yet fixed. So I decided to download the source code and take a look.

Here’s what I found, in

    private URLClassLoader createScriptClassloader(File scriptDir,
            Set<String> classpath) throws MalformedURLException {
        List<URL> urls = new ArrayList<URL>();

        // add the script directory to the classpath

        for (String string : classpath) {
            urls.add(new URL("file://" + string));

        URLClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls
                .size()]), getClass().getClassLoader());
        return loader;

That seemed like a pretty hinky way to me to send files to the URLClassLoader. The code that generates the Set of classpath Strings uses File.getCanonicalPath() to create the Strings. Thus they are platform-dependent Strings, and on a Windows box you can’t use them to create a valid File URL by prepending “file://” to them because the path separators are “\”. I assume that the plugin contributors are on Linux machines and couldn’t replicate the problem to fix it.

Like all the best bug fixes, this one was a one-liner:

for (String string : classpath) {
    urls.add(new File(string).toURI().toURL());

Now the URLs will be correct no matter what platform you’re on.

I forked the maven-scala-plugin repository on GitHub and checked in my fix. I was waiting to post this entry until my Pull Request was accepted by the repo owner, but I guess he is too busy working on other efforts. Until the request is accepted, please check out my forked repo.

Categories: code Tags: , ,

Scala script

March 31, 2011 Leave a comment

In my day job recently I found a way to sneak some Scala code into the project. I developed a datamodel module containing POJOs and JiBX bindings to marshal Objects into XML documents conforming to our XML schema. Some elements were constrained by enumerations, located either in the schema documents themselves or elsewhere in SQL dataload scripts. I stored these enumerations as properties files, so they could be easily edited when enumeration values changed.

Obviously this solution is not perfect. It violates the DRY (Don’t Repeat Yourself) principle, and enumeration value updates are likely to be forgotten. I decided to write a script that pulls the enumeration values out of their original locations and generates the properties files fresh, to ease maintainability. Scala includes the ability to run as a script, and its XML support is a lot better than Java’s, so I picked it.

Here’s an edited version of the script:

 import io.Source
 import{FileWriter, PrintWriter}
 import xml.{Node, Elem, XML}
  * This script will extract enumerations from schema and dataload files and write corresponding properties files.
 val schemaDir = "C:\\Schemas\\ixm-ws-5.5\\xsd\\"
 val outputDir = "C:\\testharness\\datamodel\\src\\conf\\"
 // Get the enumerations out of jxdm.xsd
 var xsd = XML.loadFile(schemaDir + "subset\\jxdm\\3.0.3\\jxdm.xsd")
 extractEnumeration(xsd, "", "element", "ActivityTypeText", {node => (node \ "@value").text})
 extractEnumeration(xsd, "", "element", "StatusText", {node => (node \ "@value").text})
 // Get the enumerations out of ansi-nist.xsd
 xsd = XML.loadFile(schemaDir + "subset\\niem\\ansi-nist\\2.0\\ansi-nist.xsd")
 extractEnumeration(xsd, "", "simpleType", "SLCCodeSimpleType", {node => (node \\ "documentation").text})
 def extractEnumeration(xsd: Elem, propFileName: String, elementType: String, elementName: String, p: (Node) => String) {
   val out = new PrintWriter(outputDir + propFileName)
   xsd \\ elementType filter(node => (node \ "@name").text == elementName) foreach{(element) =>
     element \\ "enumeration" foreach{(enumeration) =>
       val value = (enumeration \ "@value").text
       val key = p(enumeration).trim.replace(" ", "\\ ")
       out.println(key + "=" + value)

The neatest part about this code is the last parameter to the extractEnumeration function: a function converting a Node to a String. Some of the enumeration values appear in nodes with the attribute “value” and some appear in nodes called “documentation”. I created closures that extracted the text out of each type of node and sent those functions as parameters to the extractEnumeration method. In Java I’d have to create a switch statement for each type of enumeration value extract and sent in a parameter to indicate which option to use. This way, when a new value extraction function is needed, we don’t have to touch the extractEnumeration function at all. I could have assigned the two closures to objects and reused them for all the extractEnumeration calls, but I thought this way made the code a little more readable.

My next idea for this was to integrate this script as an optional step in our maven build. But this didn’t go so well. Full details in the next post!

Categories: code Tags:

Book Review: Pragmatic Thinking & Learning

February 24, 2011 1 comment

Pragmatic Thinking & Learning Cover

Andy Hunt is best known as co-author of The Pragmatic Programmer and co-head of the publishing company spawned by that book. The mission of Andy’s 2008 book Pragmatic Thinking & Learning: Refactor Your Wetware is to get software professionals to engage their whole brain. I had heard about the division between left-brain and right-brain thinking, or conscious and subconscious thought, but Andy laid this division out in a new and very insightful way. He describes two modes of thinking: linear-mode, or L-mode and rich-mode, or R-mode. These two modes operate in very different ways. To unlock our full thinking power, we must learn to use the techniques Andy describes to quiet the chatter of our overused L-mode and let R-mode take over. As a novice yoga practitioner, the end-of-class meditation called savasana suddenly made sense not just as a relaxation technique, but also a way to engage R-mode thinking. Someone on Twitter recently posted “Meditation is a muscle”, and clearly this is an important one to exercise for knowledge workers.

The book describes a number of techniques for improving your learning, like mind maps and SQ3R (survey, question, read, recite, review). Andy also devotes a chapter to investigating your cognitive biases, including a very interesting discussion of the theory of Generational Affinity, or why the Boomers, Gen X and the Millennials think so differently. There’s also a much-needed section on managing your focus. Doing complex software work requires an immense amount of concentration, and distractions such as Outlook email notifications, Twitter feeds, unnecessary meetings or innocuous interruptions by co-workers can totally derail productivity. Especially in busy and distracting cubicle work environments, it’s important to find a way to achieve intense concentration, but it’s also important to find the time and environment to allow your R-mode a chance to work for you.

Pragmatic Thinking & Learning was a fantastic book. While I’m not sure Andy’s mind maps are really my thing, there was plenty in this book to absorb and use to further my career. I recently installed Evernote on all my computing devices to expand my exocortex and make sure I can capture ideas and thoughts wherever I am. This sort of deliberate thinking about thinking is what Pragmatic Thinking & Learning has to teach us, and I heartily recommend it even to non-technical people.

Categories: book review Tags:


January 21, 2011 Leave a comment

At the end of 2010, I decided it was time to buy a new laptop, specifically an Ubuntu laptop, to improve my Unix skills. I picked out a Pangolin laptop from System 76 with Ubuntu 10.10 “Maverick Meekrat” on it.

Moving from the Mac OS X and Windows XP paradigms to the Ubuntu paradigm is a bit jarring so far. My first annoyance has been installing the software I need on my new laptop. Ubuntu provides two GUIs for this, the Ubuntu Software Center and the Synaptic Package Manager. Synaptic is a developer-level GUI slapped onto the apt-get command line tool, and Ubuntu Software Center is clearly the snazzy way Canonical wants you to load new software.

But the stuff in their repositories is old! Sun Java is at 1.6.0_22 (latest is 23), Scala is at 2.7.7 (latest is 2.8.1), Eclipse is at 3.5.2 (latest is 3.6.1), git is at 1.7.1 (latest is This bothers me. I want the latest stuff!

After a lot of searching, I discovered that some projects have accounts on By adding the correct PPA URLs to the Other Repositories section of Software Sources, you could use both Synaptic and the Ubuntu Software Center to install the latest versions. Success!

Here are the PPA URLs I’ve found useful so far:

I don’t know why Scala, Eclipse, Netbeans and Sun Java don’t have accounts to enable the easy package installation and updating features of Synaptic and USC.

My other bugaboo also applies to the USC. It’s clearly going for the same sort of functionality you find in Apple’s Mac App Store and iOS Store. But what I’m really missing is user feedback. For example, I did a search on GMail Notifiers and found multiple choices. Which one do I want? And I look at the Games section and there are A TON of games that sound cool, but which ones are essential? I don’t want to waste time installing and trying out game after game searching for the ones that are top notch. This should be integrated!

Categories: linux Tags:

Book Review: The Passionate Programmer by Chad Fowler

January 11, 2011 Leave a comment

The Passionate Programmer cover image

The Passionate Programmer is actually a second edition book; the first edition was entitled My Job Went To India (And All I Got Was This Lousy Book): 52 Ways To Save Your Job. Big improvement already!

The Passionate Programmer’s subtitle is Creating A Remarkable Career in Software Development. Through 53 short chapters, Chad Fowler inspires readers to do better and go further in our careers. Chad was a jazz saxophonist before making a change to software and his book illustrates many connections between the two fields. One point that stuck with me is practicing. Musicians obviously have to practice a lot before they get on stage and perform. Chad says developers should practice as well, before getting on the “stage” of delivering for a customer. He recommends doing your own studying, such as learning regular expressions or APIs that you are unfamiliar with, to increase your chops. Open source project work is an excellent way to gain experience implementing features, studying the code of other contributors of the project, and getting feedback by having your contribution reviewed.

The book is divided into five parts: Choosing Your Market; Investing In Your Product; Executing; Marketing… Not Just For Suits; and Maintaining Your Edge. Choosing Your Market focuses on planning your career by taking a high level view of the landscape and positioning yourself for maximum benefit. Investing In Your Product gives advice on how to improve your skills. Executing talks about the daily grind and how to make work more productive and enjoyable. Marketing is pretty self explanatory, giving some great advice on communicating how great you are to others. Maintaining Your Edge tells you how to avoid becoming a one hit wonder.

One topic that resonated with me was Chapter 36: Being Present. Chad talked about his time as CTO of a software development center in Bangalore, India and his troubles being so far removed geographically from the rest of the management team. His performance review mentioned a lack of “presence”, which is pretty obvious problem when you have such a hard time communicating with your managers. He relates this to coders’ sometimes antisocial tendencies to hole up in the cubicle and get into “the zone” of programming. This is an issue for us at Blackstone sometimes, because of the distributed nature of the projects and client sites. Maintaining that presence in the community of Blackstone is difficult but very important for both management perceptions and being able to leverage teamwork to achieve great things.

A few points in this book tied in tightly with the direction I feel Blackstone’s Company Contribution evaluation has been heading. Chapter 38: Change The World advises “Have a mission. Make sure people know it.” Chapter 42: Remarkability talks about doing things significantly different than those around you to be remarkable, such as releasing open source software, writing books and articles, and speaking at conferences. It’s not enough in this field to show up to work on time, write code on schedule and fix bugs quickly. Keeping up with the technology wave is important, but the ultimate goal should be to get out in front of it and show everyone a new way to go.

In the acknowledgments, Chad Fowler admits a huge debt to Dave Thomas and Andy Hunt’s great 1999 book The Pragmatic Programmer, which kicked off their entire book line. Both books contain a lot of great tips wrapped in short chapters that I will come back to frequently. I consider both to be essential and valuable, providing quick inspiration to improve both software and my career.

Categories: code Tags: