Use Fixtures Effectively in PyTest

Fixtures are a great feature of PyTest but using them can be tricky. I found them to be very useful when all important environment logic resides in them and tests use a consistent interface without regard to how the environment is actually set up.

Read more …

Install Latest Python on CentOS 7

There are many options to install newer Python on CentOS, including building from source, installing from EPEL, installing from Software Collections (SCL), installing third party rpm package, etc. These all work to some degree of success. I had a different use case and could not find a pre-built rpm package to fit it.

My use case had these restraints:

  • Install newer Python alongside the default system version
  • Install multiple Python versions simultaneously
  • Install the latest release from upstream Python project not just the latest release from a repository (repo)
  • Do not build from source unless absolutely necessary

Read more …

Requiring Encryption in Apache Qpid

I configured requiring encryption in Apache Qpid (C++ broker) by adding the following line to /etc/qpid/qpidd.conf file and restarting the broker

require-encryption=yes

Later when I used qpid-stat I got an error message

$ qpid-stat -q -b user@password/localhost:5672
Failed: AuthenticationFailure - Error in sasl_client_start (-4) SASL(-4): no mechanism available

After following a mailing list post to a JIRA to a Review Board entry I found that when broker requires a secure TLS connection then the connection string must use amqps protocol instead of amqp like so

$ qpid-stat -q -b amqps://user@password/localhost:5672

I was using version 0.34 of both broker and client.

RaspBSD on Raspberry Pi 2 Model B

I bought a Raspberry Pi 2 Model B from CanaKit to install and learn FreeBSD. Fortunately for me (and you) RaspBSD is available.

I found at one point that using an 8GB Micro SD card caused me headaches as I ran out of disk space at some points. I would recommend buying a bigger card.

This guide was created using OS X 10.10 (Yosemite) as the "client". All instructions assume:

  • Correct software installed on OS X
  • You know how to use Disk Utility and CLI
  • You have already assembled the Raspberry Pi (RPi) hardware (case, etc.)
  • WiFi USB adapter is not connected initially (it's configured later)
  • Ethernet, HDMI, keyboard, mouse are connected to Raspberry Pi
  • USB to TTL serial cable is available for use (I bought this one: http://www.amazon.com/gp/product/B00QT7LQ88)
  • Drivers from http://prolificusa.com/pl-2303hx-drivers/

WARNING: This is a "living document" and will be updated as I learn from my mistakes. There may be a lot of errors in this doc so all the standard disclaimers apply.

Read more …

Configure Atom as git Editor

In Atom open the command palette (Shift-Command-p) and enter command Install Shell Commands.

Configure Atom as git's editor.

git config --global core.editor "atom --new-window --wait"

Now when you do git commit it should open a new Atom window for you to enter your commit message.

What is a Tight Loop?

One often hears about tight loops in the context of programming. I never really got what it meant. Until today.

A tight loop may be described as a loop that does very little work itself but has an impact on the performance of the larger program. For example, in an O(n) loop the faster it can execute each iteration the tighter it is.

Read more …

Python readline Bug

Problem

In the Python interpreter whenever I hit enter it would show a blank line without a prompt and I'd have to press enter again to see the prompt. When I exited the interpreter the terminal would not show anything I typed. Pressing the return key would show my shell prompt on the same line. Up arrow or down arrow keys did not make any difference. reset was a last resort.

For example,

Python 3.4.3 (default, Aug 26 2015, 18:29:14)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> abs(1-0)
>>> 1

>>> ^D>>>
~ $ ~ $ ~ $ reset

Read more …