Added “getrows” Feature for additionalbands

I added a new feature, getrows, for use with additionalbands. Just declare a band like this:

1
2
3
Band([
    # ... elements ...
], getrows = rowfunction)

where rowfunction (or whatever you’ve decided to call it) is defined like this:

1
2
3
4
def rowfunction(row):
    return [
        # ... row objects, i.e. dicts or lists ...
    ]

If getrows is supplied, it will be called each time the Band is generated, receiving the current data source row as its only parameter.  The row function must return a sequence of row-like objects, i.e. dicts or lists; the Band will then be generated once for each of these rows, instead of being generated with the parent data source row.  This allows a kind of light-weight subreporting.  Because these are additionalbands, they are not attached to the parent band and can flow from page to page automatically.

Pythonic Windows Printing

Way back when, circa 2006 or so, I was writing an application for a customer in Python.  It needed to be able to print, as many applications do, and so I thought “how hard could it be?”

Well, it took a lot of head-scratching and code-diving before I understood how to do it right.  It was such a pain that I decided to write an article about how to print from Python on Windows; eventually I added my own module, MSWinPrint.py, to make it easier.

Time has moved on and the site where I originally shared this is kinda creaky and may be about to be canned.  So here is the original article, with basically no changes.

The module MSWinPrint.py can be downloaded from my Github page, or you can get it via PyPI.

So without further ado, here’s the original article:

Note: The following instructions are supplied without warranty. If you use them, you are accepting responsiblity for anything that might go wrong. Also note that the instructions below have been tested on Python 2.4 on Windows XP only (usingpywin32 build 205 and later).

So you want to produce some output? On the surface it sounds pretty simple:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# create a dc (Device Context) object (actually a PyCDC)
dc = win32ui.CreateDC()

# convert the dc into a "printer dc"

# leave out the printername to get the default printer
# automatically
dc.CreatePrinterDC(printername)

# you need to set the map mode mainly so you know how
# to scale your output.  I do everything in points, so
# setting the map mode as "twips" works for me.
dc.SetMapMode(win32con.MM_TWIPS) # 1440 per inch

# here's that scaling I mentioned:
scale_factor = 20 # i.e. 20 twips to the point

# start the document.  the description variable is a string
# which will appear in the print queue to identify the job.
dc.StartDoc(description)

# to draw anything (other than text) you need a pen.
# the variables are pen style, pen width and pen color.
pen = win32ui.CreatePen(0, int(scale_factor), 0L)

# SelectObject is used to apply a pen or font to a dc.
dc.SelectObject(pen)

# how about a font?  Lucida Console 10 point.
# I'm unsure how to tell if this failed.
font = win32ui.CreateFont({
    "name": "Lucida Console",
    "height": int(scale_factor * 10),
    "weight": 400,
})

# again with the SelectObject call.
dc.SelectObject(font)

# okay, now let's print something.
# TextOut takes x, y, and text values.
# the map mode determines whether y increases in an
# upward or downward direction; in MM_TWIPS mode, it
# advances up, so negative numbers are required to
# go down the page.  If anyone knows why this is a
# "good idea" please email me; as far as I'm concerned
# it's garbage.
dc.TextOut(scale_factor * 72,
    -1 * scale_factor * 72,
    "Testing...")

# for completeness, I'll draw a line.
# from x = 1", y = 1"
dc.MoveTo((scale_factor * 72, scale_factor * -72))
# to x = 6", y = 3"
dc.LineTo((scale_factor * 6 * 72, scale_factor * 3 * -72))

# must not forget to tell Windows we're done.
dc.EndDoc()

So far, so good. Doing it this way gives you decent output, but you can’t change the paper size or orientation (or a bunch of other things).

It turns out that both win32ui and win32gui have a CreateDC function, but they are NOT equivalent. win32ui.CreateDC gives you a PyCDC object (wrapping an hDC and various methods for manipulating it), but win32gui.CreateDC gives you an integer hDC value. BUT… win32ui.CreateDC doesn’t allow you full access to configure the hDC (or if it does, I couldn’t figure out how to use it). So you can’t make those changes you’d like to make if you get the DC the way I did above.

SO… here’s another version. This is just the beginning of the text above; the whole procedure involves opening the printer, configuring it, getting an integer hDC for the configured printer, and making a PyCDC out of it:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# if you just want to use the default printer, you need
# to retrieve its name.
printer = win32print.GetDefaultPrinter()

# open the printer.
hprinter = win32print.OpenPrinter(printer)

# retrieve default settings.  this code does not work on
# win95/98, as GetPrinter does not accept two
devmode = win32print.GetPrinter(hprinter, 2)["pDevMode"]

# change paper size and orientation
# constants are available here:
# http://msdn.microsoft.com/library/default.asp?
#      url=/library/en-us/intl/nls_Paper_Sizes.asp
# number 10 envelope is 20
devmode.PaperSize = 20
# 1 = portrait, 2 = landscape
devmode.Orientation = 2

# create dc using new settings.
# first get the integer hDC value.
# note that we need the name.
hdc = win32gui.CreateDC("WINSPOOL", printer, devmode)
# next create a PyCDC from the hDC.
dc = win32ui.CreateDCFromHandle(hdc)

# now you can set the map mode, etc. and actually print.

Hopefully this helps someone else.

Windows Update “Awaiting Restart” Fix

So say you have a Windows Update that isn’t finishing.  In the Windows Update Settings screen, beneath the update it says “Status: Awaiting Restart,” but you restart, and when you look it still says that.  Here’s the fix, collected from several different answers I found online:

First, you need an elevated command prompt.  Click start and type CMD in the search, but don’t press Enter; instead, right-click on the Command Prompt item that search should have found and choose Run as Administrator.  Say Yes to the prompt about making changes to your system… that’s exactly what we’re doing here.

Now you have a command window.  Enter the following commands one after another:

SC config wuauserv start= auto
SC config bits start= auto
SC config cryptsvc start= auto
SC config trustedinstaller start= auto

Now, restart your computer.  During the restart you should see the update actually running.

 

Dystechia

I read an article (several, actually) some time back which indicated that, in effect, some people can learn to program and others really can’t.  That article has since been retracted, with indications by the original author that the research was flawed; but the odd thing is, it did mirror my personal experiences in the field.

For the record, the original article is a PDF entitled “The Camel has Two Humps” and you can find a copy here.  There is an article covering the retraction here.

I worked for a while in a programming shop with two other competent programmers and one who had somehow fooled both the school where he got his degree and the boss who hired him.  He just did not really understand how a computer program worked… I tried, I really did, to get through to him, but without much in the way of luck.  I wonder now if the things the test described in the original article is testing for (understanding program flow, for instance) are things I should have been trying to teach him… things that seemed so obvious to me that I doubt I ever talked about them.

But that’s not what I’m discussing today.  I want to talk a little bit about a different level of understanding.  I’ve been selling and servicing computers (with a little programming tossed in) since 1993, and I’ve noticed something.

If I hand a customer a flash drive and tell them the name of a folder on the drive which contains a file, many (something more than half, but I don’t have a more accurate count than that) will just look at me blankly.  These people, many of whom are otherwise quite smart (doctors, for instance, and lawyers, and other professionals) just do not understand file systems.  I’m a member of a camera club, and at our meetings we all bring pictures on flash drive to share; new members often say, “I’d love to bring in pictures, but I don’t know how to get them off of my memory cards” (or sometimes, “I’ve got pictures on my computer but I can’t get them onto a flash drive to bring”).

I frequently have to write down detailed instructions, a recipe of sorts, for how to move files around or to locate files or whatever when dealing with this population of users.  Often, my instructions, written at what I consider the most basic level, are still over their heads; I will find myself explaining steps that, in my mind, are very basic operations.  It’s like telling someone to open a door, only to find that they don’t know they have to turn the doorknob… and then discovering that the next time they encounter a door, they don’t remember how to do it.

Again, these are smart people, for the most part.  People you would never think would have a problem, until you try to help them do things with a computer.

Then there’s the other population, to whom I can give that flash drive and have them smile and say “No problem.”

Here’s the thing… I’ve never, and I mean ever, seen any of the people in the first group master file systems.  They write down their recipes and tape them to their monitors, or stick them in their center desk drawers, or under their keyboards, and that’s how they get by.  They just never really understand.  But the people in the second group, when I tell them what I’ve observed, frown and say, “What’s so hard about it?”  Those who understand file systems seem to have never had a problem with it.

So you have a group that never masters it, and a second group that never had a problem with it, and to be honest I’ve never met a person who straddled that line in any way.  Oh, the “got it” group members don’t necessarily know everything, but when I find a “got it” I know I can teach that person the bits he or she does not know (for instance, navigating network drives).  When I find a “don’t got it” I often despair of helping them at all.

Now take a trip with me, back in time a few thousand years.  Some smart cookie has invented writing, probably to keep track of business transactions if the modern world is any indication.  The first scribes learn to read and write, and to them it’s the best thing ever; but few have the need and opportunity to learn this new skill.

If you had dyslexia, but were not destined to be a scribe, how would you know?  Answer: you wouldn’t.  Dyslexia as a disorder could not exist without writing… it took the invention of writing for the disorder to “appear.”  When most people don’t read or write, dyslexia isn’t a thing.  But time and civilization moves on, and a few hundred years ago things began to change.  More people needed to read and write (and do mathematics, but without writing the business effects of math are somewhat limited), and with more need for literacy, those with a problem learning the skill would suddenly stand out.  It took us a few years to give a name to the problem, but it’s been with us for a long time I’m sure.

Now we have a new field of endeavor, a new technology which is important (some might say critical) to business and to our modern civilization.  This “disorder” of not being able (for whatever reason) to understand file systems could not have existed without computers.  I titled this post “dystechia,” constructing the word in a similar fashion to dyslexia, but I have to say I don’t care for the word.  Does not roll nicely off of the tongue.  But whatever it’s called, I believe this is the next such “disorder” to be identified.

It appears to me that it’s a issue with abstraction.  The “don’t got it’s” seem unable to form a mental model of how the file system works.  They can’t see a file in their mind as a thing, nor imagine folders within folders containing those objects.  But this is speculation… don’t take this as fact.  All I can say for sure is what I’ve seen… people, smart, educated people, struggling to comprehend something that was obvious to me the very first time I read it.  People I depend on in some cases (my own family doctor, now retired, was in this group).

Dystechia:  It’s the disorder of a new generation.

RemixOS: Honeymoon is over, Annulment granted

I tried, I really did, but I just can’t live with RemixOS.

At first, I was swayed by the beauty of it.  It’s so clean and neat and functional, and access to the Play Store means so many apps are available already.

But.  Try to set up printing.  Or certain other services.

Even when they work, you either (a) pay for them, or (b) look at ads.  Whereas, as a user of Ubuntu (or any other Linux distro, really) you get the same things for free with no ads.

The honeymoon is over, it seems.

The only thing I’ve found that it’s good for is a set-top box; the streaming apps for various video/TV services are really pretty nice, and having RemixOS on a computer connected to a TV set can be a good way to enjoy them.  But that’s it, the only use case that makes sense to me.

RemixOS Survival Guide, Part 1

RemixOS is a beautiful thing.  Android on a PC, simple and fast and pretty, and all those apps!

But while it’s a nice place to visit, it still takes a bit of work to live there.  So I’m going to document, here on my blog, the things I’ve done to make my “toy” computer someplace I could actually do business.

I’m going to start this in the middle, with something I learned later that it pays to know in the beginning.  Install the 32 bit version!  Even if you have a 64-bit-capable computer, your life will be easier (at least right now) in 32 bit land.  Apps that provide native Intel libraries often do not supply 64 bit versions… apps like PrintHand or Print Hammermill.

Let’s start with installing RemixOS on your computer.  If you, like me, want RemixOS to be the only OS on the computer, then start by either making a bootable USB flash drive containing your preferred edition (i.e. 32 bit, as I explained above) or burning the image to a DVD.  I had a problem with the computer I’m using for testing being unable to boot USB… turned out it won’t boot any USB flash drive.  So I did the burning option.

Rather than explain all of this myself, I’m going to chicken out and let someone else do it.  If you want to create a bootable USB drive on Windows, you want to start following the directions at this link.  When you get to step 5 and the menu appears (the GRUB boot menu, to be exact), press TAB to pause the boot and pick up the directions below.

If you are using a modern Linux distribution, install UNetbootin from your package manager and then run it.  Tell it you are putting an ISO on your flash drive, then point it at the one you downloaded.  Again, boot from it, and at the blue GRUB menu press TAB.

Okay, so, now you should be looking at the GRUB menu with a long string of garbage at the bottom.  That long string of garbage is the boot command string which tells Linux (the underlying kernel for Android) how to boot.  Without changing anything that is already there, add a space and then type in

INSTALL=1

at the end.  Press ENTER, and the RemixOS installation system will start up.

I’m assuming you want to use the entire hard drive for RemixOS.  If not, stop.  The instructions I’m about to give you will DESTROY the contents of your hard drive… if you have anything important on there, you need to back it up first.  No, I’m not going to explain how… Google for it.

If you are sure you are ready to erase that hard drive, well, here’s how you do it.  RemixOS will ask where you want to install it, and it will show you a list of the available partitions on all your hard drives.  You probably should start by choosing the option to change partitions, then choose your /dev/sda (the first hard drive).  When it asks if you want to use GPT, say no.  The next screen that comes up will be cfdisk, which will allow you to delete your partitions and create new ones.

After erasing your partitions, create a single partition for the entire hard drive, make it bootable, and then choose the Write option to save it.  Finally, choose Quit to move on.

RemixOS will ask about formatting the drive.  Choose ext3 or ext4 as the partition type (I’m not sure that it makes much difference which one you choose; ext4 is a bit better, technically).  You’ll be warned that you are going to erase the hard drive, but don’t kid yourself, you already did that in the last step.

The operating system will now install.  Walk away and let it work.

More later… look for Part 2, coming soon!

 

 

Installing SuperSU on Remix OS 2.0

I’ve been playing with Remix OS on a six-year-old Intel-based computer lately.  It has 2 GB of RAM (right now, but I do intend to put a bit more in it) and a 320 GB hard drive, and I have to say I haven’t been this excited about an operating system in a long time.  It is limited, certainly, but it is beautiful.

So I wanted to tinker with the power management, but for that I needed root access.  I installed Remix OS in “writable /system” mode, and so with a quick Ctrl-Alt-F1 I’m looking at a root prompt… but apps can’t access root that way.  For that you need something like SuperSU, which I run on my rooted tablet.

I’ll admit right now, if there is a way to boot into recovery mode on Remix OS, I haven’t found it yet.  But it turns out that, by hacking on some procedures for rooting other Android devices, you can still make this work.

First, download the current stable SuperSU zip file from here:

http://download.chainfire.eu/supersu-stable

Unzip it on your Remix OS device.  I just switched to the shell on the first VT and did it, but you can do it however you like.

From that first VT prompt, you’ll need to put the new su binary in place.  Assuming you unpacked the SuperSU file into a folder named SuperSU in the Downloads folder, you need to do this:

cd /system/xbin
mv su su.orig
cp /sdcard/Downloads/SuperSU/x64/su .
chmod 4751 su

NOTE that these instructions are for a 64 bit system.  For 32 bit, you need to substitute x86 for the x64 above see the EDIT section below.

Now switch back to the GUI (Ctrl-Alt-F7) and reboot the system.

Once the system has rebooted, open up your file manager and find the SuperSU folder (under Downloads, if you did it like I did).  Inside that folder you’ll find a folder named common, and inside that a file named Superuser.apk.  Double-click it to install.

After installing, start SuperSU.  It will tell you it needs to update; do that, and (with any luck) it will tell you it was successful, and that you should reboot again.  Do that, and again with any luck,  you are done!

Disclaimer:  This worked for me.  Your mileage may vary.

EDIT 6/9/2016 — I had trouble with apps that didn’t like the 64 bit RemixOS, so I scrubbed the system and installed the 32 bit version.  When I did, the instructions above did not work… the su binary doesn’t seem to be right for the system, but the su.pie file in the same x86 folder does.  So here are the updated commands to install on a 32 bit system:

cd /system/xbin
mv su su.orig
cp /sdcard/Downloads/SuperSU/x64/su.pie su
chmod 4751 su

Technical Support Scams

Lately I’m hearing from a lot of my customers about technical support scams.  These scams prey upon average users with limited technical knowledge, and can become pricey for the victims.

There are three different ways these scams may start:

The first way is by means of hijacking your web browser.  (Actually, it’s a remote website that is hijacked, but stay with me here.)  Say one day you are surfing around, looking for information about remote controlled cars or nursing homes or movies (or anything, really), and suddenly you have a scary message on your screen…  Windows Virus Warning! or 149 Viruses Detected or something like that.  The message warns that you should not shut down or restart the computer, and in large print there is a phone number that you are told to call for help.  So you pick up the phone and dial…

OR perhaps you are already having a problem with your computer.  Let’s say you have a Dell computer, and it’s not working right, so you do a search on the Internet for “Dell support.”  Right there at the top of the page of search results is one that says Dell Support followed by a phone number.  If you look carefully, it says “AD” next to the listing, but maybe you don’t notice, or the fact that it’s an advertisement doesn’t bother you (it should).  So once again, you pick up the phone and start dialing…

OR MAYBE you aren’t even at your computer, but your phone rings.  The guy (it’s usually a man) on the phone tells you he’s with Microsoft, or Norton, or some other famous technology company, and that they have determined that your computer is infected with something nasty…

All of the above situations end up the same way… you’re on the phone with someone who says he is a tech support specialist who wants to help you with your problem.  As you are reading this, you’ve probably figured out by now that he’s lying, but sadly in real life too many people are taken in this way.

From this point, the script is much the same, regardless of how you got here.  The tech tells you he needs you to give him access to your computer.  He guides you to his website, where he helps you download and run the remote control software.  Now he has control of your computer, and he begins a classic confidence game.  He shows you legitimate files in your computer’s file system or messages in the event viewer or other technical things that you don’t know how to interpret, and tells you that they are signs of a terrible infection (or less commonly, other technical problems with impressive-sounding names).  Fortunately, the tech can help you with this awful situation… you just have to pay him first.

Yes, of course, it’s about money.

If you have gotten caught by this kind of scam, the first thing you need to do is to have your computer looked at by a real technician.  Someone you trust.  Remember, you let the bad guy have control of your computer.  You ran software you got from his website.  He could have done anything to your computer… installed spyware, for instance.  In my experience, I haven’t seen this happen very often; most of these guys are just in it for the cash payoff, and if they can’t get money out of you, they move on to the next victim.  But it does happen, and if you do anything more with your computer than watch Youtube, you really should have it looked at.

More importantly, if you have any of the experiences I’ve described above, be careful!  Never call a phone number just because it pops up on the screen!  If you get a phone call where the caller says your computer is infected, I recommend you say “Thanks!  I’ll get my computer looked at right away!” and then hang up the phone before he can say another word.  If you’re looking for technical support with your computer, be really sure that you have a good phone number before you call.  Better yet, call someone local for support, even if you have a big name brand computer.

The scammers are out there, and they’re always looking for someone to take advantage of.  Don’t be their next victim.

Hello World, Sort of, Part II: Talk Nerdy

In my previous post I talked about my time working on software for Knox and Shelby Counties in Missouri.  That was all historical, and probably not very interesting to anyone besides me.  In this installment I’m going to reminisce about the actual computers.

Knox County bought their computer first, and got a Radio Shack Model 16b running TRS-XENIX.  Shelby County followed, purchasing a Tandy Model 6000 computer, which was nothing more than a rebranded Radio Shack 16b (after all, Tandy owned Radio Shack).  I suspect the rebranding was intended to indicate that the 6000 was a more “upscale” computer, separating it from the TRS-DOS-based Radio Shack computers that were then popular in businesses (at least in my area).

The 16b/6000 was an oddball machine.  It resembled the other Radio Shack computers of the era, with 8″ floppy disc drives and large external hard drive boxes.  Here’s a copy of an original ad for the 16b:

radio-shack-16b

The dual processor architecture mentioned in the advertisement was one of the weird features.  The main processor was a Motorola 68000 running at 8 MHz, with a second Zilog Z80 processor that normally served to manage I/O devices.  I don’t know exactly what that means… that is, what I/O was directly managed by the Z80.  Was it all of it?  Or just some devices?  What I do know is that the 16b could boot TRS-DOS on the Z80, leaving the 68000 offline, or it could boot TRS-XENIX on the 68000 with the Z80 in that subordinate role.

TRS-XENIX was an interesting case.  Both computers I worked with came with the early version, based on AT&T Unix Version 7, and I (rather painfully) upgraded both to the later XENIX 3.0, which was based on AT&T Unix System III.  I don’t even recall what the changes were, but I remember liking the upgrade.

For those not “in the know,” let me boil it down.  AT&T/Bell could not sell software at that time (because of their monopoly status), so the Unix OS could only be bought from someone else who licensed it from AT&T.  No, that doesn’t make sense to me either.  They couldn’t sell it to you or me, but they could sell it to some company for resale.  Anyway, Microsoft licensed Unix from them, but because they couldn’t use the name “Unix” (why?), they called it XENIX.  Microsoft then licensed XENIX to Tandy, which rebranded it TRS-XENIX.  Wikipedia says that Tandy was at that time the largest (in terms of count of units sold) reseller of Unix.  I can believe it.

By the time XENIX 3.0 came out, the copyright headers in a lot of the scripts now included a new player:  SCO, the Santa Cruz Operation.  I see on Wikipedia that SCO and Microsoft worked together to create a XENIX for the Apple Lisa in 1984, and I assume that work fed back into the upgraded Tandy XENIX.

The two computers I worked on each had two remote serial terminals, DT-1 Data Terminals that appear to have been stripped-down early-model TRS-80 computers; they still had bays for floppy drives, for example.  I think Knox County’s computer had a pair of the 15 MB hard drives, while Shelby’s later model had a single 35 MB hard drive; my memory may be a bit faulty on the exact details, but I do know Knox had dual drives.  Both counties had LMP-2150 printers, which were rebranded Printronix printers which had astounding lifespans.  The buttons on the cover (which cover was apparently made for or by Tandy) were membranes, and they tended to break down over time, but the printer engine was bulletproof.  Also very loud.

Possibly the most amazing thing to me now was what these things all cost.  Here are the prices I’ve been able to find for the bits and pieces I remember being installed at Knox (the actual price they paid probably varied).  I’ve added adjusted 2015 prices (the latest year I can find inflation info for).

Item Original Qty 2015 Total
TRS-80 Model 16b $4,999.00 1 $11,995.00
15 MB Hard Drive, each $2,495.00 2 $11,975.00
DT1 Data Terminal, each $699.00 2 $3,355.00
LMP-2150 Printer $3,995.00 1 $9,585.00
2015 Grand Total
$36,910.00

WOW.  And they let 18-year-old ME touch it.  What WERE they thinking?

The 16b probably had half a meg of RAM, and yet it managed to run a fully functional Unix system as well as application software.  (Oh, yeah, I didn’t add in the software price above… no idea how much that would have been.)

Man, that was a long time ago.

Hello World, Sort Of

My first paying job working with computers was with the Knox County, Missouri Assessor’s Office.  It so happened that, in 1983 when I was starting college, my next door neighbor was the county assessor.  He was someone I had always known, a local businessman before he ran for the office; his job, on the other hand, I knew nothing whatsoever about.

He called me up one night and asked me if I could “help out” with their computer.  This was during the reassessment (in fact, let’s capitalize that as “The Reassessment”).  I don’t really remember the whole history, but I can tell you that all the counties in Missouri were performing fresh assessments on all their real property.  It was a huge job, and the State Tax Commission was providing money to assist with computerization of the data.  It had never been done in most counties before that, so it was kind of a “Wild West” situation, with lots of people who knew a little about computers jumping in and trying to get something done.

I knew a little about computers.  It was my freshman year in college, and I had experience with Apple II computers running DOS 3.3.  That was about it, actually.  But I said sure, I’ll do what I can.  I spent a bunch of evenings in the office learning about their computer on my own before I ever talked about getting paid.  Still, they were probably nuts to let me do it.

But it seems the salesman who sold them the computer had done all the programming.  Is that alarming to you?  It should be… little as I knew, I still knew more than he did.

I had barely started working for Knox County when I was called by the assessor of Shelby County, who had the same computer, bought from the same guy, with almost but not quite the same software setup.  So I started working for Shelby County at almost the same time I did for Knox.

I spent 1984 just getting familiar with the programs the salesman had written (actually, the whole assessing-collecting system was put together on top of Profile 16+, the Tandy database software they had purchased with the computer) and writing or revising reports, screens, etc.  It took me until the end of that year to really understand what he had done wrong, and that all came back not to technology but to understanding (or not understanding) the offices.  I pitched a rewrite to both counties, and got the go-ahead to do it; it took me most of 1985 to get that done, working part-time while going to college.

I should mention that I was working for the Collector of Revenue in both counties as well as the Assessor.  Part of the issues with the software system the salesman wrote was that it didn’t adequately separate the two offices (in each county) so that each office could work with the data only half a year, and the Collector couldn’t keep unpaid (delinquent) taxes on the computer from year to year.  This was one of the first major changes I made.

The software remained in use in Knox County until 2012, thus getting about 27 years out of the rewritten system.  Seriously.  Shelby County bailed earlier, around 2008 if I recall correctly.  When the old computers got too old, they switched to a network of DOS PCs running filePro+, and I transplanted all the data from old to new.  When those computers got old, they got Windows XP computers and ran the program in DOS windows.  It was the advent of Windows 7 that finally spelled the end for the old program… though you can make DOS programs run on Windows 7, it’s not easy, and it really sucks trying to network them.  By that time the Shelby Co. Assessor had finally moved away from the old program, and the Knox Co. Assessor only used the personal property parts (having long before switched to a full appraisal system from another vendor) but the Collectors in both counties still used that old program.  I’m happy to say I wrote the replacement programs for both counties (though perhaps not surprisingly they aren’t quite the same program…)  It’s my hope that the new software will have the same “legs” as the old, giving decades of service before needing replacement again.

Wow, that’s a lot of writing.  I had planned to “talk nerdy” here, but I think that will wait for another post, in a few days perhaps.