What I’ve Been Up To…

Well, it has certainly been a long time since my last update. I’ve been busy, but I keep forgetting to tell my fan(s) about my adventures. In March, I received my M3D 3D printer but didn’t get it in time for Pi day, where I went with my wife to a Raspberry Pi Jam in Columbia, Mo. She was nice enough to snap a picture of me on 3/14/15 9:26:53 holding my Raspberry Pi Projects for the Evil Genius book. I am the new geek overlord.

BPA on Pi Day

By April I had managed to unpack and get to printing and was ready to present at the April 2015 Web Professional and Adobe User Group meeting.

Handsome Fellow - WPaAUG April Meeting

I brought the printer with my laptop and printed a jig for my Raspberry Pi. My jigs look like the white “X-mark” attached to the bottom of the Pi shown below:

Combined Shot

After printing the Jigs for the 3 Pis, the Switch and the Power Board, I have a completed prototype. I’ll get a picture out a little bit later. That leads us up through April, and I don’t want to start talking about the major things in May yet, so I’ll leave you for now. Thanks for tuning in.


IT Professionals, Meet Admiral Stockdale

Admiral James Stockdale

Admiral James Stockdale

This is a repost of an article I wrote and published on LinkedIn.

We’ve all used the terms train wreck, doom, tailspin, and death march to describe runaway software projects. While those involved might feel that a world of responsibility is crushing them, I think that might be a little melodramatic. Let’s face it: as IT professionals, we wouldn’t last a half hour on a real death march.

In a recent post Dennis K. Berman added quite a bit of furor to the debate over whether IT departments should control access to technology. As a participant on both sides of that debate throughout my career, I’d like to weigh in with my thoughts on how this debate should end.

That is why I invoke Admiral James Stockdale. Admiral Stockdale was one of the highest ranking POWs in the Vietnam era. When asked by Jim Collins, author of Good to Great, what differentiated the POWs that made it through from the ones who did not, Admiral Stockdale replied the ones who made it faced the brutal facts of their existence, but had an unwavering confidence in the end game.

This life lesson, called the Stockdale Paradox, has an application in this debate that rages between IT professionals and people who feel frustrated by IT. Here’s how I break it down.

Face the Brutal Facts

The first order of business is the brutal fact of the matter. Information technology will find a way into your perimeter.

Whether it is your factory worker bringing a tablet in to help calculate heat treat durations, or the marketing guy who knows some outside people that can help him develop a killer sales app, we can take lessons from the whole BYOD phenomenon. There is a constant onslaught from outside your organization, and there is a constant pull from inside.

I’ve seen this movie before. Disruptive technology and the drive to use it gets the girl. So, let’s face that brutal fact. While we may resist by putting up fences and writing memoranda, inevitably we are faced with integrating that pesky new technology into our system landscape. We are frustrated because we are reacting to it. Once we are forced to adopt it and take it under our wing, we have to take our valuable, limited time to learn the particular new risks and disadvantages.

Have Unwavering Confidence in the End Game

There is a common goal between IT professionals and their adversaries in this matter. Everyone wants to see the customer win.

We stand on the verge of societal transformation more significant than the invention of the mechanisms that transport us and labor for us. Information technology is augmenting our senses and our cognitive abilities. Computational power enables us to extend our reach to places mere engines cannot go. It is a most exciting time, and as IT professionals, we are in the most exciting profession.

It is not biologists that are sequencing the human genome. They cannot do that on their own. They need computers. Many very fast computers. It is not astrophysicists that are discovering life outside Earth’s atmosphere and outside our solar system. They cannot do that on their own. They need programmers. Many sharp programmers.

Possibly more mundane than the technological heroes listed above, your customers have their own windmills and it is your duty to help them tilt away. Whether it is building social media applications or helping a company do more with less, it is our role to bring technology to bear on society’s difficult problems and advance the cause of our employers.

You and that irritating guy from the sales department who keeps trying to post his spreadsheet on the internet are both working for the same cause. The end game is that you will help him achieve his goals by helping him use the right technology. People who try to thwart IT professionals are not doing it to be mean or spiteful. They have a job to do and they see technology as an enabler. As IT professionals we need to shift focus from always saying “No” to saying “Okay, but….”

We need to help the layman understand the risks involved and help them navigate an admittedly complex task. We cannot continue to stymie, stupefy and stifle. New technology will find a way to help our customers. It will be best if we are there to assist the transformation.

Status Update

Just a quick note to let everyone (both of you?) know that I am once again working out of my home office. The David street location was more space than I needed at this time and the anticipated growth of my company was premature.

Also, I am beginning to revamp my website in earnest now and you will be seeing many more changes in the coming weeks.

Status Update

The Kickstarter campaign is going so strongly that I think I’m changing its name to the Bramble Box project. I failed to raise the requisite funding in Kickstarter, but I have invested enough money and time into the creation of the equipment that it doesn’t make sense to stop when all that remains is the creation of a repeatable process to create and sell the kits.

Notionovus has moved into office space at:


Street Address of New Office

The address is spoofed because I don’t want web crawlers picking it up and sending me catalogs for “realistic” designer handbags, business print mail marketing brochures, or whatever else passes for spam in the snail mail universe.

I have found a new favorite toy. SketchUp is 3-D modeling software for people on a budget (like yours truly). I think I’ll be using it to quickly generate graphics for blog posts, so you may see some of my artwork adorning the notionovus weblog.

Less than 60 Seconds using  SketchUp.

Less than 60 Seconds using SketchUp.

I believe in communication. You might say that I’m down right religious about it. Which doesn’t mean I’m good at it. What I mean to say is that I treat communication like a religion. I have the ultimate faith that it is the most important thing in the world, I think about it regularly, and I talk about it to anyone who will listen. However, I just don’t practice it as often and well as I should.

Take this web log for instance. I am dusting off the cobwebs here to make room for new content, but it has been neglected for over four months. I am ashamed. I need to do a much better job. I know better than to let my content get away from me like that. Now, please excuse me while I atone for my transgressions.

Until next time, thanks for tuning in.

Starting My Ce’web’rity Status

On Wednesday, March 5th, I presented my business model before a crowd of about 30 people at the 1 Million Cups gathering in Peoria. It’s a weekly gathering that happens every Wednesday morning at 9:00am at Sugar in Peoria’s warehouse district. I spilled my guts on my plans to conquer the world. Overall, people were mostly receptive.

You can watch the presentation on YouTube. I was worried that I might have done my usual grasping for high-brow jargon and techno-babble, but I think I kept it interesting and easy to follow along, at least until the questions started.

Until next time, thanks for tuning in.

Notionovus’ Logo Official

logo5Notionovus has just recently been granted the logo mark you see above and at the top of the page by the U.S. Patent and Trademark Office. The logo above is a 3D stylized version of the registered logo, but keeps in the theme of two arrowheads forming the shape of the capital letter ‘N’. This means that beyond copyright, use of the logo is restricted to Notionovus’ software and weblogs.

Something Secret Going On…

I apologize to anyone finding this site neglected. I have been working on a project that I will be discussing at length. I just can’t talk about it right now. I can give you a hint. It has to do with my real passion. If someone is surprised that barcodes isn’t it, well, I’ll quote that old sage Bugs Bunny, “He don’t know me very well, do he?” My goal is to be back up and running by the end of February (2014, for all you people out there that know how software people think) at the latest.

Code 39 – Barcode Biscuits

Teething BiscuitsCode 39 takes me way back to sinking my teeth into my first real barcode programming experience. Code 39 is a very simple and straightforward code set consisting of 43 unique representable characters and one start and stop character: the asterisk “*”. If you’ve never done any work with barcodes before, this is a no-brainer selection for an introductory symbology. As such, we can make this lesson a very simple one. I will explain how you can, using the code from the September 19th, 2013 post, generate real, scannable codes in minutes.

There are two setup arrays, and only one line of the four lines of JavaScript code is non-trivial. Here we go…

The Code 39 Setup

// Symbology-specific arrays
var arrayCode39Bin = new Array (
'1010001110111010', '1110100010101110', '1011100010101110', '1110111000101010', // 0, 1, 2, 3
'1010001110101110', '1110100011101010', '1011100011101010', '1010001011101110', // 4, 5, 6, 7
'1110100010111010', '1011100010111010', '1110101000101110', '1011101000101110', // 8, 9, A, B
'1110111010001010', '1010111000101110', '1110101110001010', '1011101110001010', // C, D, E, F
'1010100011101110', '1110101000111010', '1011101000111010', '1010111000111010', // G, H, I, J
'1110101010001110', '1011101010001110', '1110111010100010', '1010111010001110', // K, L, M, N
'1110101110100010', '1011101110100010', '1010101110001110', '1110101011100010', // O, P, Q, R
'1011101011100010', '1010111011100010', '1110001010101110', '1000111010101110', // S, T, U, V
'1110001110101010', '1000101110101110', '1110001011101010', '1000111011101010', // W, X, Y, Z
'1000101011101110', '1110001010111010', '1000111010111010', '1000100010001010', // -, ., (space), $
'1000100010100010', '1000101000100010', '1010001000100010', '1000101110111010'); // /, +, %, *

var strCode39 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";

Take these lines of code and add them to the bottom of the Setup portion of the file given out in the September 19th article.

The first array (arrayCode39Bin) is the set of raw sequences of ones and zeroes that will direct our rendering engine to generate the proper sequence of bars, lines and spaces corresponding to each of the 44 characters that the Code 39 symbology can represent. The second array (strCode39) is really that string of 44 characters in the numerical order which ties them to the previous array.

The JavaScript

<div id="result"></div>
<script type="text/javascript">
 var strText = "*123TEST890*";
 var strRaw = "";
 for (var i = 0; i < strText.length; i++)
  strRaw += arrayCode39Bin[strCode39.indexOf(strText.charAt(i))];
 document.getElementById("result").innerHTML = genBarcode(strRaw,6,40);

The JavaScript for actually rendering the Code 39 bars consists of the initialization of the two string variables (strText, strRaw) and a single step for loop that starts at the beginning of the string given and loops until the end of it, placing in the raw string the ones and zeroes from the Code 39 binary array. Finally, genBarcode() is called and the resulting HTML <img> entities are placed into the <div> we’ve identified as the result.

Replace the <body> element in the sample code from the previous article with the element provided in this article.

Here is the essence of what gets output to the browser document:

Blog Bar for Barcode Biscuits

This generates a scannable barcode in the browser. If you print this page and scan it, the scanner will dump 123TEST890 as output. The code string has an asterisk embedded before and after the data, but those are required and necessary for scanning a Code 39 code. The asterisk (“*”) is not a valid data character.

We will run some more complex symbologies in future installments, including Code 128, Interleaved 2 of 5 and ultimately QR Code before we finally reach the application area and we get to shipping label and shop floor routing software. Until next time, thanks for tuning in.

Code Review or Root Canal? Hmmm…

I don’t particularly care for line-by-line code reviews. I don’t think they convey much meaning, even to people who think like computers. But you have to understand the inner workings of the software published earlier before I turn you loose on society. Thankfully, there are only about ten lines of code in the software and three major areas, so covering them should be a breeze for both you and me. So, copy the source code from the last article into your favorite text editor and follow along. Trust me, this won’t hurt a bit.

The three major sections are the setup data, the chunkifier and the rendering engine.

The Setup
The setup data consists of the necessary string literals to enable the rendering engine to draw the images using base-64 converted PNG files. This front matter takes up almost 1800 bytes and consists of the declaration for the JavaScript arrays array5bit_A, array5bit_B, stringStart, stringMid and stringEnd. Once these arrays are defined any barcode symbology can use them. So they are pretty important and well worth the space they take up.

The Chunkifier
Sounds like a subtitle for a good slasher movie, eh? The chunkifier is the four lines of code starting with the initialization of the intRawmod variable and ending with the for loop that populates the arraySeq array. In short, what the chunkifier does is break down a long string of ones and zeroes into a sequence of 5-bit integers.

The Rendering Engine
The rendering engine takes the sequence of 5-bit integers created by the chunkifier and builds the <img> elements necessary to render the array. This is a very simple loop and uses the integers found in the sequence to look up the unique text found in array5bit_A and array5bit_B and patch it together with the start, middle and end string constants so we have an <img> element that parses and scales to display a series of bars and spaces.

The Output
What you would see, if you used the rendering engine to output to a text file from the demonstration at the end of the last article is:


There are no line feeds or carriage returns embedded in the output text for a very good reason covered earlier. The text consists only of HTML entities. So, it takes six HTML images to render that very simple pseudo-barcode we saw last time (near the anti-climactic “ta-da!”). Next time we are going to demonstrate doing something non-trivial with the rendering engine by hooking it up to some code that actually generates valid barcodes. Until next time, thanks for tuning in.

… Comes Great Responsibility.

In order to make this whole client-side barcode thing work, it is necessary to first develop the engine of rendering. I don’t know whether it was Hulk Hogan or Benjamin Parker who first coined the phrase: “With great power comes great responsibility.”. Regardless, there be great power here, and I’m counting on everyone to be good stewards and not use this power for evil.

With the following couple dozen lines of code and configuration data, you too can make barcodes as realistic as the big boys. All you need to do is wrap the code in ‘<SCRIPT>’ tags as I am about to do and supply the necessary inputs. These are a fairly long string of ‘1’s and ‘0’s (that’s ones and zeroes, boys and girls, not lowercase ‘L’s and capital ‘o’s), a width and a height.

 <title>Notionovus Barcode Prototype</title>
<script type="text/javascript">

// The MIT License (MIT)

// Copyright (c) 2013, Notionovus, LLC.

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.


// Generic arrays for drawing 5-bit graphics. Building blocks for all barcode symbologies
// Painstakingly derived gobblety-goop, but essentially the two middle sections of image data unique to each graphic
var array5bit_B = new Array ( 'US0CAuSD38g', 'UUYCA7QBErs', 'ajEDAm49ReY', 'UUoCA+juogg', 'bjEDAjQrOn0', 'bkoDA3iPVH4',
 'ajUDAt82atY', 'UU4CA1nljTg', 'cjEDAghkmFU', 'ckoDA0TA9lY', 'izUEAhrxcbg', 'ck4DAxY8F10', 'bjUDAlvFFR8', 'bk4DAxdhexw',
 'ajkDAr7LFAw', 'UVICAyQ+UJI', 'TTECAq7UnEM', 'TUoCA+Jw8kA', 'ZjUDAmZGozo', 'TU4CA7CME0s', 'ajUDAvnk9E4', 'ak4DA7VAmk0',
 'ZjkDAtle3bI', 'TVICAxOyzrM', 'STUCAqHeHtM', 'SU4CA+16cNA', 'h6QEAZKdo54', 'SVICA62zYxM', 'RTkCAqx1lb4', 'RVICA/z3WM0',
 'QT0CAkdoxRU', 'KFYBA46vJCA');

// Painstakingly derived gobblety-goop, but essentially the front, back and mid-matter common to all barcode images...
var stringStart = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAACCAQAAADLaIVbAAAANUlEQVQIHQEqANX/A';
var stringEnd = 'AAAAASUVORK5CYII=" width="';

// Insert Symbology-specific arrays here
function genBarcode(inputString,intWidth,intHeight) { // Input is a long string of 1's and 0's, output is the HTML <img> stack

// Pads to the last character to ensure length is divisible by 5
   var intRawmod = inputString.length % 5; // Modulo 5 remainder
   if (intRawmod > 0) for (var i = 0; i < 5 - intRawmod; i++) inputString += "0"; // If not evenly divisible, pad with zeroes
   var arraySeq = new Array (intChunks = inputString.length / 5); // Create array for as many chunks as are now in input string

   for (var i = 0; i < intChunks; i++) arraySeq[i] = parseInt(inputString.substr(i * 5, 5), 2); // Converts string of 1's and 0's to integer array

// Takes integer array and converts to "<img ...>" graphics for display
   var resultString = "";
   for (var i = 0; i < arraySeq.length; i++) {
   	resultString += stringStart + array5bit_A[arraySeq[i]] + stringMid + array5bit_B[arraySeq[i]] + stringEnd + intWidth + '" height="' + intHeight + '">';
   return resultString;
	document.write(' ta-da! ');

As presented, this code is not particularly useful. The barcode symbol does not actually represent any readable value that I am aware of. The input is just a string of ‘1’s and ‘0’s used to illustrate the working software. Here’s what it looks like in a browser:

ta-daIn our next installment, we will walk through the rendering engine and see how it works. In the mean time, please feel free to copy the enclosed HTML / JavaScript into a local HTML file and go nuts with the three parameters. Until next time, thank you for tuning in.