Quick Guide to Packaging Python2 libraries on Ubuntu (Mint 19)

First, set up your directories:

mkdir fair_flow/

mkdir fair_flow/fair_flow

cd fair_flow

sudo apt-get install python-pip python-setuptools

vi setup.py

import setuptools

with open(“README.md”, “r”) as fh:
long_description = fh.read()

author=”Joe Fair”,
description=”Simple Workflow Library”,
“Programming Language :: Python :: 2”,
“License :: OSI Approved :: MIT License”,
“Operating System :: OS Independent”,

In the example/__init__.py put something simple, for testing.

name = "fair_flow"

def doit():
  return "Did It"

Install it locally

pip install .

Test it from the command line

python -c 'import fair_flow; print fair_flow.doit()'

Once you're ready, you can upload it to Pypi.

python -c 'import fair_flow; print fair_flow.doit()'

Then you can see it on Pypi


Thanks for hints and tips from:

  • https://python-packaging.readthedocs.io/en/latest/minimal.html
  • https://packaging.python.org/tutorials/packaging-projects/

Fixing Citrix alt-tab issue on windows 10 (remoting to windows 7)

Last week we upgraded Citrix, which for some reason broke the ability to alt-tab in fullscreen mode to send that command to the remote computer.

There are instructions in the connection window to set it so it goes to the remote, but those instructions didn’t work for me on windows 10 host going to a windows 7 remote box.

After going without it for a week, I got time this morning to google the fix, which is updating a registry key.

Computer\HKEY_CURRENT_USER\Software\Citrix\ICA Client\Engine\Lockdown Profiles\All Regions\Lockdown\Virtual Channels\Keyboard


Now when I log in to work, the windows, alt- keys and everything else works much better!

Cloud Training

I’ve been looking at cloud training this summer, and I went with Linux Academy for a couple reasons:

  1. It was pretty inexpensive.
  2. The videos are really helpful.
  3. One subscription covers a LOT of technologies (AWS, Open Stack, Linux, Security, Azure).
  4. There is a new feature for the Associate Architect called The Orion Papers.

This last point is really helpful. During the videos you get a lecture about the latest version of AWS, which is what you’d expect.

But on the right side of the screen there is a very detailed multi-level diagram of what’s going on. Each video starts with the top-level diagram and zooms in to the area that the video is going to talk about.

For training, this gives you and idea of where you are in the landscape before digging down in the details. It gives you more hooks to relate the content to each other rather than stand-alone, 7 minute videos.  It’s the ‘scaffolding’ that you can hang new knowledge on.

For visual learners I think it’s great. I’ve been trying to figure out how to steal this idea for the docs for my current project.  If I find out how, I’ll let you know.

If you’re interested check it out here. If you sign up with this link, I’ll get a free month.

Lone-Ranger Productivity Tips

Next week I will celebrate my 5 year anniversary of working from home full-time. Here are some tips I’ve picked up.

Work Space

  • A good chair makes all the difference.  A good desk doesn’t make any difference.
  • Good headphones are handy when you need to block noise.  I use over-the ear Sony noise canceling headphones I’ve had for a decade, but if I had to do it over again I’d go cheaper and keep the comfort.
  • For my working telephone I use a battery-powered phone with a speaker option on my home line for work.  It’s Ok, but it ties up the home line.  Recently I splurged on a $20 set of earbuds and started using my cell phone instead.  The calls are clear, and I filter out external noise.
  • I have a great big laptop.  It’s criminally overpowered for what I use it for.  But, if I want to do something ELSE while I’m working, I have power to spare.
  • Walking desks are terrible for typing.  They are worse for detailed mouse-ing.
  • Some people have a problem stopping work.  They feel compelled to check email and see what’s going on on the evenings and week ends.  I avoid that by setting up my work space out of sight. If I saw it all evening I’d be tempted to log in, but since I don’t think about it, I can go all weekend without thinking about work.


  • I keep track of tasks with my own system.  Starting with the Pomodoro technique, I simplified it to a spiral bound notebook for tasks.  Instead of a pomodoro timer, I use Shoutcast.com to remind me not to get distracted.  There are fewer commercials and more choice than regular radio.  Using all other task-keeping systems (TidlyWiki, Rally, Getting Things Done) takes too much effort.
  • Communication is key.  You can get about 3 days worth of work done in a day if you have everything you need.  You can waste days and weeks waiting for information.  I do a short daily meeting and I check in with my co-workers at least once or twice a day.
  • It can get lonely.  I get antsy and have to run errands once or twice a week.  Shopping, lunch with others, and driving in the country all help.  Working on housework and working on my own computer-based projects does not.  I don’t go out to coffee shops as much as I thought I would.  Part of that is the comfy chair, part of it is the 10 pound laptop with 90 minutes of battery life.
  • You never, ever, get good gossip.  I’ve been through two layoffs, and I didn’t know about either of them until the day of.

These work for me.  Your mileage may vary.

Log4j2 Note

If you really only need to get log4j2 working in your maven build, do this.

1. Start with deps














2.  Import these

import org.apache.logging.log4j.LogManager;

import org.apache.logging.log4j.Logger;


3. Use this

 private static Logger log = LogManager.getLogger();

Make your life easier: Briefing Books

One of the most difficult parts of working with other people is getting the right information.  Sometimes it pays to have all the information in one place.  One form of this idea is the Briefing Book.

Briefing Books are usually used to give a speaker an overview of a topic before they begin an interview or debate.  It’s not an in-depth tutorial, but more of a refresher before the meeting.  It will include an overview of what the topic is, what questions are likely to come up and the appropriate answers, an agenda for what should happen, and background info for all the people involved.

For example, in 1963, President Kennedy’s advisors prepared briefing books for a meeting in Honolulu with representatives of the South Vietnam government.  It’s what the advisors would review before the meeting to make sure they were prepared with the latest information.  It’s very practical instead of academic.

  • It starts out with travel plans and a short summary of what to expect: the meeting should be about 8 hours, in a specific room room, with about 100 people.
  • It goes on to outline the agenda for the meeting, where each topic has a 3-4 line summary.  You can see that if you walked in to the middle of this meeting, you could find your place in the agenda and get up to speed quickly.
  • The next section is a political review of the situation, recent events, topics for discussion, and a list of “problem areas”, which look like questions that need to be answered. There are also lists of people expected to be there, with their title and a 1 line summary of their experience, or a description of their position.  Some of the leaders also have a separate, longer description of their background. There is also a military summary and a list of maps and charts.

Looking at this briefing book, you can see it was a LOT of work.  However, given the importance of running this meeting smoothly, you can see how important it would be to give everyone the same background.

Back to making our lives easier:  When would we ever need this?

This much preparation is really only necessary for big meetings where you want to have all the facts at hand.  For job negotiations or contract discussions, for example, having an org chart of the other company, pics and bios of the leaders, a list of recent competitors and acquisitions, and salary surveys for your area would be pretty handy.  Having answers to common questions pre-planned and written down that are consistent with your message would be invaluable.

It’s all work that we know we should be doing, but a briefing book is a handy, time-honored way to put it together.  Using a structure like this can help you spot holes in your research, and once it’s put together it’s a concise record of the picture you had at the time.

Here are some other links:


How to make your life easier: Custom batch file

I constantly look for ways to make my work more productive.  One of the things I like to do is make batch files to string together commands that have to be done in order.

The Problem:

On one project, I have to do this 5-30 times a day:

Compile the code

Stop the server

Deploy the project to the server

Start the server

However, about once a week the temporary directory gets corrupted.  Sometimes that takes HOURS to debug.  Also, checking out a new branch sometimes points me to the wrong environment and eats up time, too.  To avoid it I just overwrite these files each time I deploy.  But now I do this 5-30 times a day:

Compile the code

Stop the server

Clean out the temp files

Copy the configuration files

Deploy the server

Start the server

How can we make this easier?

The Solution:

I have a directory that is on my PATH (I work in Windows, but Linux would be the similar) that holds all my batch files.  They are short and all follow the same format:

  1. Set up the environment
  2. Do the work
  3. Show that you are done

1.  Setup

Setting up the environment doesn’t seem like a big deal at first.  You know what version of Java you’re using, where tomcat is installed, and what ant version to use, so you can just hard code those paths.  However, it only takes a few extra minutes to set up a file that sets environment variable that you can use (and re-use) in other batch files.  I set tomcat install directories, useful code directories, and add directories to other useful tools.


set JAVA_HOME=C:\bea9\jdk150_04
set ANT_HOME=C:\apps\ant\apache-ant-1.6.5
set ANT_OPTS=”-Xmx512M”
set PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%PATH%
set PATH=C:\work\bin;%PATH%
set SVN_EDITOR=c:\windows\system32\notepad.exe
set TOMCAT_HOME=c:\apps\Tomcat7.0.27
set AP=\work\awesomeProject\version_3\repo

now if I run \work\apsetup.bat I can type

cd %ap%

instead of

cd \work\awesomeProject\version_3\repo

However, if I want to change %ap% to a different version, I can change the last line “set AP=…” to that directory.

2.  Do the work

Now that I have the environment set up, I can call %ap%\compile.bat ore %ap%\runTests.bat from the command line window.  Or add this like to skip %AP%\ each time:

set PATH=%AP%\bin;%PATH%

Do the work

Once your environment is set, it’s handy to use absolute paths to show which programs.


Where compileAP can

Kill the server

Compile cleanly (and remember all the options)

Remove temp files


Or %AP%\bin\bounce.bat can

Kill the server

Clean the temp files (but not the deployed ones)

Start the server

3.  Show you’re done

Sometimes it takes a while to complete all these steps.  If distractions occur it make be a while before I get back to my tasks.  It’s frustrating to lose track of where you are and have to start over.

To solve this, I try to do two things:  Give a status update with a timestamp, and give an audible cue when I’m done.

For timestamps I like to use the tools at http://unxutils.sourceforge.net/ , which give you unix-style commands from the windows command line.  Most of the useful commands are there, and I use them all day. It’s easy to put a “date” command at the end of a long process, so I know when it got done.  Also, using the tee command (split output to the stdout and a file) is super handy if we need to see what happened when.

The other timesaver is to send a beep command to the standard out.  For long running commands this reminds me to stop writing email and get back to work.  In windows this can be tricky, but the easiest way I’ve found is to type this in a directory on your path

copy con beep.bat

Then type control-G control-Z.   This gives you two beeps, no muss, no fuss.


Fun with Arduino and AtTiny!

Lately I’ve been playing with the Arduino microcontroller and I have to say I really like it.  You can find it at Radio Shack for less than $40, and it comes with the board and a USB cable.  There is a free IDE that makes it fast and easy to get started blinking LEDs, no soldering required.

My first (interesting) project was to create laser tag guns.  We went to a laser tag arena about two weeks ago, and I thought this would be an interesting project.  There are several examples of arduino laser tag, from a commercial site to and IBM project walkthrough, but I decided to go cheap and build it myself.

And when I say cheap, I mean CHEAP! I found some paired-down chips that can be programmed with the arduino at the AniBit.com site for a total of 2 bucks each.  Radio Shack has emitter/receiver pairs for $4, and my kids made lego gun cases for free (and they let me help).

I found some small breadboards on Ebay for $1.25 including shipping, and I had some resistors and LEDs laying around for misc. parts.

I’m still learning about programming the Attinys but I’ve got the process down and the parts, so I think I just need some time to put it together.

One of the interesting problems I found is that the Arduino can communicate back and forth to the IDE via the Serial Monitor.  Values on the chip can be sent to the screen, so you can tell what’s going on.

With the AtTiny is that it doesn’t have a connection to the PC, except through the Arduino, so it’s hard to debug what’s going on.  I used a couple of work around to get the serial interface to go from the Tiny to the Arduino to the computer.

1.  Connect the arduino.  Disconnect the capacitor to the reset (if connected).

2.  Upload ArduinoISP

3.  Connect the capacitor to reset, and pins 10-13.

4.  Load the code you want to test on the tiny.  I cobbled together this
#include <SoftwareSerial.h>

SoftwareSerial mySerial(1,0); // RX, TX
const int led = 4;

void setup()
pinMode(led, OUTPUT);

void loop()
for (int i = 0; i <= 5; i++)
mySerial.println (i); //Send i to Rx Arduino
digitalWrite(led, HIGH);
digitalWrite(led, LOW);

5.  Disconnect the capacitor and pins 10-13.

6.  Change the board to the Arduino Uno

7.  Upload the following code.

Software serial multple serial test

Receives from the hardware serial, sends to software serial.
Receives from software serial, sends to hardware serial.

The circuit:
* RX is digital pin 10 (connect to TX of other device)
* TX is digital pin 11 (connect to RX of other device)

Not all pins on the Mega and Mega 2560 support change interrupts,
so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

Not all pins on the Leonardo support change interrupts,
so only the following can be used for RX:
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

created back in the mists of time
modified 25 May 2012
by Tom Igoe
based on Mikal Hart’s example

This example code is in the public domain.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 12); // RX, TX
int led = 13;

void setup()
// Open serial communications and wait for port to open:
digitalWrite(led, HIGH);
digitalWrite(led, LOW);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only

Serial.println(“Goodnight moon!”);

// set the data rate for the SoftwareSerial port
//mySerial.println(“Hello, world?”);

void loop() // run over and over
if (mySerial.available())
if (Serial.available())


8.  Open the serial window (ctrl-shift-M) and watch the communication work!


AutoHotKey – My go-to automation tool

I spent a lot of time programming, and sometimes that means retyping the same thing.  For instance, when I’m in the database, I type ‘select * from ‘ dozens of times a day.  Instead, I can type s*f and autohotkey erases that and puts in ‘select * from’.

SendInput select * from

This works in any window, not just my sql editor.  I have about a dozen auto replace commands that I use all the time, and some of them type in 20+ lines of sql for me.  This 6 character command


Generates this sql

–Report how long queries take
select operation_name,(percentile_cont(0.90) within group (order by duration))/1000 Percetile_90,
(percentile_cont(0.99) within group (order by duration))/1000 Percetile_99,
(max(duration))/1000 max_duration,
(min(duration))/1000 min_duration,
from audit_service aud
where source_application = ‘SLDB’
and aud.CORRELATION_ID in (
select aud.CORRELATION_ID from audit_service aud
and aud.OPERATION_NAME in (‘validateServiceAvailability’)
and aud.AUDIT_TIMESTAMP > sysdate – 10/1440 )
group by operation_name
order by max_duration desc

That’s a pretty good return on investment!

You can also set hot keys to perform actions, just like on fancy multimedia keyboards.  If you’re not using F8 through F12, use those for pause, play, fast-forward, and rewind.  Or Open Chrome, Open IE, Open Firefox, Open Gvim, if you’d rather.

There is even a language for setting up GUIs and programming your own applications, which I haven’t gotten into.  In my next post, I’ll show you how to navigate your web application so you don’t have to keep clicking the same things over and over.

So, if you’re interested in being more productive, making fewer mistakes, and generally being a happier developer, check out AutoHotKey.


Tools, Jigs, and Devices

One of the things that drives me crazy is that a lot of software developers don’t write software to make their jobs easier.  Whether it’s testing code, monitoring environments, or researching bugs, there are lots of ways to automate your way out of a boring job and look like a genius.  It’s work, but it makes it easier in the long run.

In other jobs this happens all the time.  Carpenters know that creating a simple tool (called a jig) can save a time and increase quality.  Even street sweepers have a stick with a nail in the end.  But for a Java developer, when they need to do something that takes 7 separate steps, you’re lucky if they’ll write them all down, much less make a tool to do it for them.

The first time I tried this, I automated the build for a software project.  It was a classic situation where there was only one person that could build the project, and it took lots of specialized knowledge, and it only got done about once a week.  If you didn’t get something into that build, you’d have to wait another week until the next one.

Fortunately, I had just read Jared Richardson’s Ship It, which talked about repeatable builds.  I automated the download and build out of the SCM, and made it so anybody would be able to build.  My boss said that was the best process improvement he’d seen in his career.  Of course, he was the one that spent a half-day each week putting together the build, so he was the happiest person of all.

Shortly thereafter, I increased the number of tests we were doing for an upgrade from 12 (two tests per person, six developers, all manual) to over 8,000.  We found a ton of bugs that traced back to the same cause, and a lot of little bugs that were special cases.  None of those were covered in the original 12 test cases.  In the end, the upgrade went smoothly and page generation time went from 3 minutes to 15 seconds.

One great book about automation is, The Productive Programmer by Neil Ford.  I save myself 3 hours a week by taking some of those ideas and putting them into everyday life.  Especially:

  • Know your IDE
  • Create your own launchpad
  • Automate repetitive tasks

It’s 5 years old, but the techniques are more about how to be productive, so they are still relevant.  If you were only going to read one book to make you a better programmer this year, I’d make it The Productive Programmer.

And there are other tools you can use to make things easier.  I’ve started using Maven for builds, because creating new boilerplate apps is fast and easy.  Launchy is a little software device that lets you type in what program to run, and even corrects your spelling.  Using documentation to document things you really need is a tenant of Agile development, but you’d never know it from how most people do Agile.  Saving those documents forever means I usually never use them, except for about twice a year, when I need something I thought I was done with.

Think about some things that you do that you can automate.  You might be surprised how much you can get done when you don’t have to do it yourself.