17 November 2008

Reading Real World Haskell

I've sort of let this blog lie fallow while my attention was distracted by having a new baby, playing shiny guitars, twittering, making podcasts and YouTube videos, and other distracting things.

I am excited to see that Real World Haskell has gone to press, and so I am reading the electronic edition while waiting for the print edition to arrive. I had read some of the draft chapters, but it has changed considerably!

For those interested, I recorded audio during the birth of my newest child, Joshua Gregory Potts, born just under three weeks ago. I am turning this into a series of podcasts along with the tweets I sent out during the birth. I won't spam you with a lot of links, but here is a link to The Potts House General Purpose Podcast. Over on Geek Like Me Too you can find baby pictures, some serious and some silly.

I am learning to live with sleep deprivation again! So, these days, Twitter seems like a more appropriate medium for the short attention span which is pretty much all I'm capable of at the moment. If you are so inclined, you can find me on twitter as "paulrpotts."

02 September 2008

Summer's Over

My son Isaac started high school today, so it must be true.

Here is my first YouTube video: the Potts family vacation in Grand Marais, Michigan and other points north this past week, set to Jonathan Coulton's Creative Commons-licensed song "Summer's Over."

22 July 2008

Cross-Blog Information and Introductions

In order to try to avoid boring people with material they aren't interested in, I have divided my writing up into five separate blogs. The downside to this is that I have a tendency to wander from one area of interest to another over the course of a typical year, so it may look like I've dropped off the face of the earth. In case anyone is interested in following what is going on in one of my other blogs, I thought it might be useful to post this road map once in a while.

Geek Like Me Too is my general-purpose personal blog. The most recent postings are about a recent Jonathan Coulton concert in Pontiac that I attended and recorded. I have provided recordings of the show as a set of MP3 files, of interest to geeks who like music.

Geek Like Me is its predecessor, done in Blosxom, now still up only for archival purposes.

Geek Versus Guitar is about guitar playing. Recently I've recorded a few Jonathan Coulton songs myself. It will also be about learning to produce songs with my home studio.

Praise, Curse, and Recurse is about programming topics, mostly Haskell, Python, and Scheme. My free time has been devoted to other things but I will no doubt be back around to programming before too long.

The Marcella Armstrong Memorial Collection is about my family history, and the big task of scanning, restoring, preserving, and archiving family photos and documents. Of interest to any family members, but also of possible interest to people doing their own similar projects.

Tales from the Potts House: William Hope Hodgson contains information about the "Hodgecast" podcast available on iTunes, in which I record classic William Hope Hodgson novels and stories. I have more podcasts planned in both this series and possibly others in the near future.

Anyway, there it is... please join me on any of these blogs that might catch your interest. I always have far too many projects going at once!

03 April 2008

Snakes on the Wing

So far, Wing IDE gets the nod as the best Python editor I've tried. I had a very productive day with Wing IDE on Windows, and it worked great, with no crashes, and very nice debugging functions.

WIng IDE for MacOS X is an XWindows app. This makes it very slightly un-Mac-like, but it makes up for it by having some nice GUI themes. I haven't yet exercised the Mac version very hard, but it seems quite nice so far.

I'm grateful for all the recommendations!

Beware the IDEs of April

My post on Python IDEs got a huge number of comments, including recommendations for Eclipse with plug-ins, Visual Studio with plug-ins, and Emacs.

One of the two highest-recommended options was Komodo IDE. I've had some success with a trial of Komodo IDE on Windows, with only one major crash, which I was unable to reproduce. However, the same code brought over to run under the same version of Komodo for MacOS X produces a strange syntax error. I've filed this as bug 76114. It seems quite strange, especially given that the same code runs fine using the command-line Python under MacOS X. Despite this issue it seems overall to be a pretty usable environment.

I've also had several recommendations for WingIDE, which I will check out as well. Thanks to everyone who responded!

The program mostly reads an XML file, does a little validating and destructuring of the nodes into dictionaries, and then generates some C++ using a template. About as "real-world" a program as they come. Even as boiled-down as I can make it, it still seems awfully wordy and full of functions whose behavior is extremely dependent on my intermediate data representation. In Common Lisp, I'd be trying to use s-expressions instead of XML for the starting data, and using destructuring macros to turn the input data into data structures. With NewtonScript, I might try to find a way to do it by writing accessors that used path expressions. Is there a better way in Python? How about Haskell? I'll have to give it some thought.

01 April 2008

The Abysmal State of Python IDEs

In the past few weeks I've sampled numerous Python IDEs for Mac OS X. Without exception, every one of them has major problems.

Without exception, they have crude GUIs, with drawing problems.

Without exception, every one of them has had either lacked completely, or had broken, the kind of source-level debugging that has been commonplace since the mid-1980s, such as visually setting breakpoints.

Most of them have the look of personal hobby projects, where the developer put in a little effort, and then abandoned the project. Menu items do nothing, help commands say "no help available." Documentation? Don't make me laugh, it hurts too much.

Even the allegedly polished products work really erratically. On Windows, I have to restart the ActiveState environment every time I want to re-run my program after making a change and saving the program, because it doesn't seem to ever realize that the file has been updated. Except sometimes it starts detecting changes for a while. It won't save my window layout. Except once in a while it does. However, breakpoints do work for me, and I'm able to do some debugging. But ActiveState for Mac seems to install completely different tools than ActiveState for Windows: no IDE whatsoever. Huh?

I'm having to do most of my debugging with print statements. I'm horrified. There is some kind of primitive debugger, but it requires modifying my source code, and that just seems stupid. The program I'm trying to debug is not unusual nor particularly complex; it just works over some XML and transforms some files.

My download log for tonight reads like a litany of failure: drpython, SPE, ScrIDE, and ActivePython.

DrPython: no interactive debugging. SPE: allegedly some kind of debugger, but it doesn't seem to work. ScrIDE: weird issue handling basic import statements that work on the other IDEs and with the command-line python without any trouble; other users are reporting this on the message board. ActivePython: claims to have some kind of IDE, but the Mac OS X package doesn't have it.

Is there one that would be as useful as, oh, Lightspeed Pascal circa 1985, if I were willing to pay for it?

As the song goes, is this all there is?

16 March 2008

Smug Newton Weenie

This past week I've been wallowing in nostalgia as I re-familiarize myself with the Newton's development environment and take a fresh look at code I wrote for the platform a dozen years ago. It's got me thinking more about the joys of small languages, and the clever hacks that enabled such an advanced GUI and applications to run on such a lightweight platform. Also, at the runtime implementation for dynamic language like this, compiled as byte codes.

I'm happy to say that I I have wireless e-mail working via my home wireless network on two MessagePad 2100s, using Simon Bell's excellent Mail V, an IMAP/POP client that integrates nicely with the Newton's built-in Inbox/Outbox program, and a couple of Lucent WaveLan cards running Hiroshi Noguchi's driver. I can even send myself big JPEG files. This is my extremely geeky equivalent of carrying around family photos in my wallet, although the 2100 only displays a few gray levels:

Interestingly, after ten days of experimentation the 4 AA batteries powering my 2100 unit still have juice left, although they are starting to fade. The 2000/2100 were a very interesting advance, because they were far faster than their predecessors the 110/120/130, yet lasted longer on the same batteries.

I hope you find this at least marginally interesting. Not everyone around me is as interested as I am in the joys of old technology, as this doodle illustrates...

12 March 2008

Looking for a NewtonScript Book

I know it is available in PDF form, but for nostalgia purposes I am looking for a paper copy of the book "The NewtonScript Programming Language." There were a couple of versions of this book; it was not sold separately but included in packaged versions of the Newton Toolkit sold to developers. And thus, most of them have probably been discarded.

The older version of the book can be seen in bottom row, just left of center in this picture from the Newton Museum. The later version, if I recall correctly, was white with yellow typography and a picture of a toolbox on the cover. I will pay (some reasonable amount, plus shipping cost) for either or both books reasonable condition.

06 March 2008

All that is Solid Melts into Air

I've been moody this week. It's been just about ten years since Apple's Newton project was canceled, the products discontinued, and the staff of the project began their exodus. I hope readers will forgive me if I wax a little autobiographical.

In 1993 I attended, along with a couple of friends, the launch of the original Apple Newton. I nearly melted my credit cards into slag by buying an original MessagePad and a copy of the Newton Toolkit. Both products were over-hyped (see this impressive and slightly utopian video), and promised far more than they could deliver on that hardware, but to me the technical innovation and potential were far more interesting than the actual practicality; I was excited about some kind of platonic ideal Newton device, not the actual stubby greenish device that crashed and locked up and wouldn't boot in cold weather and ate batteries like candy and turned my handwriting into word salad. Developing with beta-this and 1.0-that was a struggle, but within a few weeks I had sent my first Newton freeware application out into the world, an ugly, misshapen little utility called Strainer, best forgotten. But it was a start -- and a doorway into a whole world of dynamic typing, closures, garbage collection, prototype-based programming, byte codes, garbage collection, and even "eval" and "apply."

My co-worker Mike and I dove into it. He created the Usenet newsgroups for Newton. I developed and maintained the early FAQ list. I did so much testing and analysis of the behavior of the built-in applications that I wound up getting calls from developers within Apple to discuss the bugs I was finding. I got to know the Newton developer tech support engineers. I wanted to be one of them. I published articles, most of them likely best forgotten, but overflowing with my enthusiasm for the new architecture. I exchanged e-mail messages with Walter Smith, the very smart guy behind NewtonScript, talking about the implementation of NewtonScript itself; he explained closures. Which got me into Dylan. Which got me into Scheme. Which (ultimately) got me into Haskell. And so forth.

The Newton was a big part of my career, on and off, for the next six years or so. I got paid to write Newton applications -- not consistently, and not just Newton applications, and not end-user, shrink-wrapped applications, but a lot of NewtonScript nonetheless. I developed a kind of DSL, in NewtonScript, built into the package by executing NewtonScript code at build time. That package acted as a kind of script itself that ran on a NewtonScript engine capable of presenting a variety of nicely-formatted question types. The survey engine had a kind of transactional semantics, even across branching, so that the data it was recording always remained consistent. It could do all kinds of post-processing and analysis on the fly, with little embedded function objects, and basically ran as a big state machine to administer surveys. It was code-as-data; it was higher-order programming. NewtonScript was, at least for me at the time, an Acceptable Lisp. For several research projects, that's how the Health Media Research Lab at the University of Michigan collected data from study participants. There were several other parts to the process -- built around AppleScript, Quark XPress, WebObjects (Java), C++, and even Visual BASIC and Perl and Scheme and Macromedia Director, and I was involved to some extent in most of them, but the Newton survey engine was my particular baby.

Apple released Newton hardware in two more form factors, ultimately culminating in the MessagePad 2000 and 2100, which pretty much _were_ that platonic ideal of a Newton device, a local maximum as far as design, usability, and features per watt, and that product hasn't had a serious contender in user-interface design prior to the arrival of the iPhone. And it came crashing down, rather abruptly, just a few months after the release of the MessagePad 2100. There was no one left to fix bugs. Because of one particular bug in the 2100, we had to scramble to stockpile the earlier MessagePad 2000, so that we would have enough units on hand to complete our research study.

A couple of years ago I discarded my original MessagePad, with its original case and "Getting Started" card and cute little power adapter and a press kit from the Newton launch -- just tossed it in the dumpster. I shouldn't have done that. Original MessagePads -- not upgraded -- are scarce on the ground, and though they are not terribly usable, the design remains interesting. A few years ago I picked up a 2100, and just recently bought 3 more Newtons on eBay, one of each form factor, but I miss the neat leather-journal feel of the rubberized original MessagePad and its snug-fitting, book-like case.

Interestingly, the Newton architecture has proved to be flexible past the point of Apple's involvement. In the box of scuffed-up Newton MessagePads was a wireless modem card. Some enterprising hackers actually got support for these devices working; I have not yet gotten it working, but I'm told that it's possible to get it working on a modern WiFi network, albeit with a somewhat minimalist web browser. I wonder if I can get the Webmail interface working via a web browser on the Newton?

I gave my wife a short demo, and she wants one, so she's going to be a rather late beta tester herself. That's good; I'd rather see them get used, than just sit on the shelf and corrode. Me, I'm going to fire up the development tools and see what it looks like to me now with ten year's more perspective.

But more broadly, the history of this technology is causing me to think seriously about what just what exactly it is that I've been doing since I got my first computer in 1977, at the age of ten.

One of the famed Alan Perlis Epigrams in Programming reads:

Is it possible that software is not like anything else, that it is meant to be discarded: that the whole point is to see it as a soap bubble?

01 March 2008

The Vanishing Hard Drive

8 inches, 5.25 inches, 3.5 inches, 2.5 inches, 1.8 inches, and 1 inch.

I predict that hard disk drives will be entirely invisible to the naked eye by 2019.

18 February 2008

Is Python an Acceptable Haskell?

So I struggled with some Python this weekend. I'm taking over a piece of code that is written in Python, but the original is very imperative, with a lot of for loops. It was giving me a headache. It just looked way too long and tedious. I'm too old to spend my life debugging off-by-one errors in for loops.

After staying up half the night struggling with a malfunctioning IDLE on MacOS X, I finally discovered the cure for the headache was -- more Python!

# This gives us a "curry" equivalent
from functools import partial

# Reduce a list of strings to a single string by concatenation
reduce_stringlist = partial( reduce, str.__add__ )

# Given a list of XML elements, return a list of only the data from only the text nodes
# (ignores any non-text nodes)
def get_text_data( nodelist ):
    return map( lambda node: node.data,
           filter( lambda node: node.nodeType == node.TEXT_NODE, nodelist ) )

# Now, combined: reduce a list of nodes to the concatenated text extracted out of only
# the text node data
def extract_text( nodelist ):
    return reduce_stringlist( get_text_data( nodelist ) )

# Given a portion of the parsed XML tree and a name, extract a single string. Expect
# only one element.
def get_one_text_element( node, name ):
    elt_list = node.getElementsByTagName( name )
    assert elt_list.length == 1
    return extract_text( elt_list[0].childNodes )

# Given a starting node and a list of tag names, retrieve one text string each and
# put them in a newly created dictionary using the tag name as a key
def make_text_element_dict( node, namelist ):
    return dict
        zip( namelist,
             map ( partial( get_one_text_element, node ),
                   namelist ) ) )

Ahhh, I feel much better! All that excess hairy boilerplate seems to be just melting away!

The only thing I did not like is that there did not seem to be a nice way to specify keyword arguments to "reduce" so that I could create a partial (curried) application that supplied the first and optional third parameter, leaving the second as the one to be supplied at runtime.

I experimented with writing the above with Python's list comprehension idiom, generators, and various permutations on join(). The above just seems to make more sense to me. Haskell has apparently ruined me for other languages.

Apparently Guido would like to ban reduce() from Python. I say -- prefer the standard idiom to the offbeat, and avoid the Not Invented Here syndrome. Python's comprehensions and generators are nice, but apparently I've been ruined by seeking more and more expressive languages, seeking truth and beauty on my wandering but inexorable path from Dylan to NewtonScript to Scheme to Haskell. Lambda, map, curry, reduce, and zip now seem to me to be fundamental primitives that any reasonable dynamic language ought to provide, and it seems to me that they ought to be preferred to an obscure language-specific trick. As long as I have to use Python, Guido will have to pry the curried functions from my cold, dead hands!

14 February 2008

A Pet Peeve -- Proprietary Fasteners

As if it wasn't hard enough to keep tools on hand for the following screws:

- Flat blade

- Hex (in metric and fractional inch sizes)

- Philips

- Torx

- Tamper-resistant Torx (with a post in the middle)

- Torx Plus (with wider holes)

- Tamper-resistant Torx Plus (hard to come by -- with wider holes, a post in the middle, and five points instead of six)

- TTAP (a six-point variation with a deep hole in the middle, also hard to come by)

- Tamper-resistant TTAP (which I've never seen)

- Several other unusual fastener heads, such as square, two-pin, etc.

I've found that certain hard drive screws use a five-pointed variant of the six-pointed Torx star shape, which corresponds to "none of the above" and which doesn't seem to be available, anywhere. I found this out the hard way after buying a very nice set of Torx bits. The screws in question are so small it is very hard for my 40-year-old eyes to distinguish the five-pointed star from the six. They are roughly the size of a Torx T3 or T4.

The only reason I can imagine that manufacturers would use a fastener like this is sheer perversity. It isn't to make the devices tamper-proof -- the screws can be turned with a flat-head screwdriver of just the right width, although this is not ideal for either fastener or tool. Or, I could always just drill them out, as I've done on more than one occasion with a very stripped or damaged screw.

To the best of my knowledge the correct tool is not available for purchase _anywhere_ for a nobody like me, although I think you can sometimes find tools for larger versions of the bits for sale on eBay.

Several of these fasteners are apparently actually patented, and several apparently can't be legally sold except to properly licensed OEMs or other authorized personnel. Wiha sells, but will not sell to me, tamper-resistant Torx Plus tools, for example. And even if they would, they don't seem to have any this small.

As far as I'm concerned, such restrictions should be illegal. I'm sure there is an analogy here to be made to software APIs. I'm reminded of a talk I saw by Stallman, in which he drew puzzle pieces representing APIs, and talked about the evils of proprietary APIs. I bought it, I ought to have the right to take it apart!

By the way, the device in question is an iPod hard drive, made for Apple by Toshiba. But I'm sure there are many other variants of the same thing going on.

13 February 2008

Trying Programming Environments for Children

I am home sick today, feeling terrible and feverish, and should be sleeping, but can't sleep, so I thought I would try out some of the programming environments for kids. A while back I set up my son with the Haskell tools used for The Haskell School of Expression and Thompson's Craft of Functional Programming book, hoping my son would work his way into one of the texts a bit. He didn't get that far, so I thought I'd try out some other options for him.

I started learning when personal computers came with BASIC interpreters built-in, so I am looking for something equally as easy to start with, although I think teaching my son BASIC might be considered child abuse.

I thought I'd try to set him up with Hackety Hack, a Ruby environment found here. On Ubuntu Gutsy, I found that it segfaults immediately upon launch. According to the forum this issue has been reported for close to a year, with no patch.

OK, the next one on my list to try is Greenfoot. Greenfoot is Java-based, and requires a JDK. I haven't been a Java hacker since the dot-com crash, but at one point knew it pretty well, so how hard could it be for a feverish software engineer? My install of Gutsy tells me its java is "java version "1.7.0, IcedTea Runtime Environment (build 1.7.0-b21), IcedTea Client VM (build 1.7.0-b21, mixed mode, sharing)." So I'll try installing the IcedTea JDK. That looks promising, although the notes indicating it is a "temporary fork" make me a little nervous; Ubuntu lives up to its ease-of-use repuation, the JDK installs, and the Greenfoot installer now seems to be able to figure out for itself where the JDK is. The Greenfoot executable launches, and looks at least moderately interesting, so I'll call that a qualified success for now, and see if he can get his head around it.

I had it on my list to check out Nodebox, but that's for MacOS X only, and today I'm on the Linux box, so we'll save that for another sick day.

Finally, I wanted to take a shot at setting up Sugar, the Python-based environment that was designed for the One Laptop Per Child system. I'm not hugely keen on Python; having used Python and Ruby, I harbor a slight preference for Ruby, and I've got a laundry list of things I don't like about both of them. However, I'm being asked to use and get comfortable with extending several tools in my workplace that are based on Python, so for better or worse I'm getting myself re-familiarized with Python. It's quite a mature language with lots of libraries. My son could do worse, so let's see what Sugar has to offer.

There are various ways to get Sugar going on Ubuntu. See the Wiki pages here. To begin, I'm going to try the emulated route, where my Linux PC will literally emulate an OLPC laptop. The other options look considerably more complicated and error-prone; in particular, there is an absolute rat's nest of required packages. So let's see how painful setting up emulation is. First, we download a bzip'ed image file. While it is downloading, I install QEMU, which is not difficult. For now I'm not going to attempt to install the kernel support for accelerating QEMU; we'll see if it is really painfully slow. This machine is "only" a Pentium 4 2.8 GHz system that I built from parts a few years ago; pretty obsolete, but usually plenty fast.

So, image is done downloading, unzip it, and try running QEMU on it -- it works! Although it does indeed take a very long time to launch. I still find it quite surreal to watch Linux boot on top of Linux!

That's all for now -- I am still home sick, after all -- it's time to have some hot lemon tea and try to get a nap!

Followup: installing the kqemu acceleration tools does make the OLPC image run _significantly_ faster -- it is quite tolerable now, although I have no idea how it compares to how the image runs on the target hardware itself.

16 January 2008

I Voted. I Think. Probably. Maybe.

So, I don't know if you have been following news of Michigan's primaries, but they seem to be an utter farce this year. There is some kind of a dispute between the national Democratic party and the state party. The side effects are:

- Several of the biggest-name Dem candidates (Edwards and Obama among them) are not listed on the primary ballot.

- There's a write-in option, but if you write in one of these missing candidates, your vote will not be counted for that candidate(!)

- One of the candidates (Dodd) was listed, but he actually dropped out of the race earlier. (According to the results he still received 1% of the vote).

The recommendation was that if you wanted to vote for someone else, you should vote uncommitted. According to the results on Wikipedia, a whopping 40% followed this recommendation.

My precinct uses paper ballots with optical scanners. These are generally considered to be pretty reliable, and there is a paper trail in event of a recount. But this year, when I approached the scan machine, its counter read 466. After scanning my ballot, it still read 466. I asked the staff member about this -- she told me that it should read 466 and that if the machine took in the ballot and didn't spit it out, my vote was counted. Me, I'm not so sure. But the kids were in the car and my wife was late for a class so I didn't have time to stand there and try to determine exactly what was happening. But I left feeling somewhat uncertain that I had actually cast my vote. This just does not seem like democracy as it should be practiced!

14 January 2008

A Bank Tries to Help Out

I got a call from Midwest Financial Credit Union -- it seems that someone in management read my blog post. We had a long and interesting conversation and I ended the conversation a much happier customer. For now, we are going to keep our accounts, and I am happy that they are doing some things to try to keep our business.

Among the details:

The hold on deposits was part of their anti-fraud measures in place automatically for the first 30 days of a new account. Apparently this is when they get hit with the most fraudulent deposits. A warning at the time we deposited the check would have helped us out.

The $100 limit of check card transactions applies only when using the card like a credit card, as opposed to a debit card. So I can still use it as a debit and make reasonable-sized purchases. The staff member I spoke to agreed that the $100 limit is unreasonable for any real-world use and is going to try to get it raised. It would have been really helpful to be warned at the time the cards were issued, or better, beforehand, that this limit was going to be in force.

So, why such a low limit?

The conversation was illuminating. In recent years I have put in some effort and a lot of money to try to clean up my credit report. This included starting payment on some debts that were dormant for many years.

The largest of these was a medical bill for a single night in the hospital. I was fully insured at the time, or so I believed; the hospital I presented my cards to told me that they accepted my insurance; but yet I would up owing somewhere north of $5,000 because my insurer did not want to pay what the hospital wanted to bill. The hospital was not one of the insurer's "preferred" providers.

Ultimately my insurance provider paid almost nothing, but also revealed to me the collusion that goes on between hospitals and insurers -- the individual line item fees the hospital charges to their supported insurers are in some cases as low as 10% of the same item as it is billed to someone with no health insurance. But that is a rant for another day.

I ignored this bill for many years more out of disgust and anger at the insurer and hospital than out of the inability to pay, but last year contacted the credit agency that owned the debt and started paying it down. It's now about 3/4 gone.

I also had the interesting experienced of getting sued for an ancient phone bill. The bill was real, but I had become so disgusted at AT&T's refusal to accept any payment plan other than immediate payment in full, and their dogpile of additional fees and charges, that I vowed they would not get a penny from me.

Well, they did, but not willingly. The debt was sold, and sold again. I wound up paying an attorney to come up with a settlement for me, and paid the settlement. It was again highly illuminating to find out that the agency in question completely ignored several written settlement offers that I tendered, but as soon as an attorney's letterhead was involved, settled for less than I had offered. I have a piece of paper in my file that says the bill is paid.

They say that no good deed goes unpunished, and it appears that settling one debt and nearly paying off another has damaged my credit rating, because both debts are now listed as currently "in dispute" instead of just hanging on as old debts. So, it is time to write some letters. There are procedures to go through to get items on a credit report corrected. But I refuse (again, on those damned principles of mine) to pay to receive my credit scores, so instead I will have to rely on the free annual reports I'm entitled to. Paying the rating agency for my scores seems too much like extortion, as if I had to pay eBay to improve my seller rating.

So, on balance, I'm much happier with the Credit Union, but much less happy with the creditors who are screwing with my life. And I have more crap to deal with. But I guess that's what you need to do in order to play the banking game.

07 January 2008

Banks that Suck

Sorry, still no Haskell content. Please don't delete my blog! I'm working on it.

So, we were in the process of migrating our finances to a new bank, after our old bank, Republic, was pwned by Citizen's Bank and stopped doing all the things we liked about it, and started doing all the things we don't like (killing off our overdraft protection arrangement, stopping our various automatic repayment arrangements, removing access to our overdraft account from their online site, charging ludicrous fees, taking 3 days to clear electronic transactions, back-dating checks to try to hit is with more overdraft fees).

Based our on readings of their various rates and policies, we chose Midwest Financial Credit Union, here in Ann Arbor.

Less than a month later, we're now planning to close the accounts we just set up and continue our hunt for a decent bank that doesn't treat our accounts like an opportunity to slam us with fees at every opportunity -- just like Republic Bank didn't. I had my Republic account for about fifteen years and they helped me through many difficult times. Does such a place exist?

Midwest Financial got on our bad side immediately by taking ten calendar days to process a deposited $3,000 check -- while we were out of town. They finally managed to clear it (I think they took it to the originating bank in Erie, Pennsylvania by riding a mule along the old Erie Canal). It's in the fine print that they're allowed to do such things, apparently. (It's in the fine print that they can do just about anything they want, apparently).

Yesterday I tried to make a fairly large purchase (about $600) using a check card on the account -- it has a VISA logo). We have similar cards for our Citizen's Bank account and they function as either debit cards (with a PIN) or credit cards; they work fine, and we've never had an issue like this.

Anyway, the transaction was denied. Today I got word in my e-mail that a much smaller purchase (about $125) that I made online was also denied. Which is odd, because according to our most recent statement we had just shy of $3,000 in that account.

My wife went to the bank to talk to them and apparently someone's credit rating (possibly hers, since she opened the account) is rather low (we already knew that, thanks; that's old news, mostly from her days, now seven years gone, as an under-emplyed single mother), and therefore there is a $100 limit on transactions. Even though there is $3,000 in that account. Now, for a family of 5, $100 is not even a largish grocery store run. Some of these transactions could go through as debits, I guess, although there is probably some relatively low limit on the debit transactions as well. And we have a card with a VISA logo because not everyone is setup to handle PIN-based debit transactions.

They told her she can apply for a 48-hour waiver to make a large purchase, or in four months we can apply to have our "credit" limit raised.

This is all too much. We're going to do neither; we're going to fire this goddamn bank and get our money back. I'm giving serious thought to turning our money into gold, silver, and platinum bars and burying them in undisclosed locations! Maybe we'll just keep our old accounts; we're starting to get used to the exact ways they screw us, as opposed to all these new ways! We are very fortunate in that here in 2008 we are finally getting ourselves to the point where we have a little bit of a safety margin in our accounts, which kept us from getting stranded while we were out-of-state on vacation. But if we didn't have that margin -- if we were still living close to the edge -- we'd have been absolutely screwed. And having been that indebted slob for most of my life, I'm only going to do business with institutions whose policies are designed to be fair to that person, not to make their problems far worse.

04 January 2008

The Potts Vacation 2007

So, we are back and the holiday trauma is over. We took the family to visit my cousins in the Washington, DC area and saw various friends along the way. I have just a touch of ranting I have to get off my chest before I can write anything else!

The trip, on Amtrak, went well for the most part. It is not easy, though, getting a disobedient pre-schooler, an infant, a teenager, two car seats, and a lot of unchecked luggage around.

The train from Toledo to Rockville, MD was only late getting into Toledo by about an hour. I was rather surprised!

We stayed in Gaithersburg with my cousin. We had planned to stay there each night, but things became more complicated. My cousin has just been diagnosed with a thyroid illness called Graves disease. This was making her unable to sleep and prone to a racing heart and anxiety attacks. This isn't good for a hostess who has to cope with two babies, so I really sympathized. We spent a couple of days staying out of her hair as much as we could, going to some of the Smithsonian Institution museums.

To top it off, our hostess was scheduled to take a dose of radioactive iodine. We had to find another place to stay for the last couple of nights because our hostess was literally about to become radioactive, and her instructions advised her to avoid people, and especially children, as much as possible! So we had to scramble a bit.

Another complication -- I deposited a check, which was going to cover some of the expenses for the latter part of our vacation, the Friday before we left, thinking that it would clear in a few days. A week later, though, acting on a hunch, I asked Grace to call the bank, and she found out that the check had not cleared, and in fact the funds would not be available until the tenth calendar day after making the deposit.

We had just set up these new accounts because we were unhappy with our old bank, which was acquired, unilaterally cancelled our overdraft protection arrangement, instituted ridiculously punitive fees, and put in place various floats and back-dating of checks apparently designed specifically to absolutely maximize said fees.

Granted, the ten calendar days, during the holidays, was only five banking business days, but in the world of Check 21 and electronic check clearing it seems just insane to me that an institution would hold a deposit that long. We were able to convince them to make enough of the funds available to cover several check card transactions we had just made, but our old bank -- the one I'm planning to leave -- clears all deposits overnight. It seems that this was technically legal under the Expedited Funds Availability Act, but I am distinctly unhappy with this, and contemplating whether or not I want to close these new accounts immediately and find another bank. (Do any of them not suck?)

Fortunately, I had set aside a little bit of extra money in a savings account at our old bank. Using my other cousin's iPhone, was able to log in to the bank and move that money into checking. Did I mention the iPhone is very cool?

We were able to stay with family friends for the last couple of days in Richmond, Virginia. Along the way I got to make Christmas better for two of their three sons. They had both gotten iPod Shuffles for Christmas. (I wonder how many people got iPod Shuffles for Christmas? It must be in the millions!) iTunes would not run correctly on their Windows XP box. They had taken it to a local Staples and the guru there had spent a whole afternoon trying to get it to work, and failed. The symptoms were this: iTunes apparently installed successfully, but would crash immediately after launching, with the usual "tell Microsoft about the problem" message. QuickTime player would also crash upon launch, with one of several error messages, including a security warning about stack overflow in a Visual C++ library. The uninstall process for iTunes and QuickTime always failed.

Despite a distinct lack of expertise with Windows system administration, I decided to take a crack at it. I had to putz around for a long time. I Googled myself into a frenzy looking for notes from people with similar problems. I downloaded and ran several virus and trojan detectors. I installed every recommended Windows XP update I could find, and cleaned out a bunch of unused software. Nothing seemed to help. Finally, I forcibly uninstalled iTunes and QuickTime (removing everything Apple-related from the registry, and deleting the program directories). I then downloaded a whole series of earlier versions of iTunes, starting with 6.10. This one installed and ran without a hitch, so I started going version-by-version. At some point, I found an installer which said that it could not run properly because the VBScript service was not enabled. This led me to an Apple support article on enabling VBScript, which had probably been turned off by a security product. After that all the installers seemed to work and I was able to get the latest iTunes installed.

The problems seems to be that one of the more recent iTunes installers silently fails if VBScript is not enabled. It runs and seems to believe that it has succeeded, but leaves behind an unusable QuickTime configuration. iTunes needs QuickTime and thus crashes on startup. Somewhere along the way Apple's installers lost the ability to verify that the necessary VBScript service is available.

After finally getting iTunes working, I thought it was all going to come to nothing, because the iPod Shuffle itself was not working. iTunes could see it, and fill it up with music, but when it came time to turn it on and push play, it would just flash a series of alternating green and orange lights and do nothing. A complete reinstall of the Shuffle's firmware didn't help. Running Apple's separately available iPod Shuffle utility designed to fix this problem didn't fix it. I thought we might have to just send the iPod back. But then apparently just toggling the little switch between continuous play and shuffle made it suddenly work. This does not fill me with confidence about the device's firmware, but it was working.

Anyway, I spent a ridiculous five or six hours messing with this, but got a number of hugs in return when it finally worked. I can attribute my success only to being tenacious. Age and tenacity beats the 18-year-old Staples employee FTW!

We also got the opportunity to meet up with my friend Antonio, and had a great chat with him.

Although we gave ourselves what I thought was a sufficient safety margin, planning to arrive at the train station an hour and 45 minutes prior to scheduled departure, we had a couple of delays. We got slightly lost getting back to the train station, and so arrived only 20 minutes before the train was scheduled to arrive. While we were waiting at the light to turn into the station parking lot, it arrived. Then, under two minutes later, before we could even get inside the building, it left. Without us.

So we had another night in Gaithersburg, at a Holiday Inn. That wasn't so bad. It meant I got to watch Iron Chef and soak in the tub. We had to get a hotel shuttle to the nearest metro station, then carry the car seats on the metro, while a friend of my cousin drove our luggage to the train station. He was a huge help.

We spent New Years' Eve on the train. No one got much sleep, and we got back to Toledo on time (about 5 in the morning on the 1st). Then we had a drive back up to Ann Arbor. The drive turned into blizzard conditions. We had to crawl along moving at times just 25 mph, nervously looking at quite a few cars that had slid of the road. But we all made it back safely.

Oh, we did nearly lose one of the babies. At the end of of our train, at the last door, where you could stand and watch the tracks retreating, Grace and I had come back and stood there and looked out the window. "I wonder if that door would open if I pushed the button?" she asked. "No way," I said. "I'm sure there is a security interlock of some kind so if it isn't connected to another car, it won't open. That would be a huge liability issue if there wasn't."

Well, Veronica proved me wrong. We were walking up and down the train and she pushed the button to open the door. Fortunately, I was holding her hand. There is a kind of cage to prevent someone falling out, but it was really just a couple of metal bars and they were spaced far too widely to keep a child from pitching right out the door onto the tracks, from the upper level of a speeding train.

Grace mentioned to the conductor that the rear door was unlocked. She saw, as she described it to me, "a black man turn white." Yes, it was supposed to be locked. He ran back to lock it.

So, that was our Christmas vacation. No casualties but my sanity. Now I just need a vacation from my vacation!

03 January 2008

Brussels Sprouts with Toasted Cashews

I made up this recipe after being inspired by an episode of Iron Chef I happened to see on vacation. That was a venison battle, but one of the dishes involved brussels sprouts. My family tells me it is one of the tastiest dishes I've ever concocted. I served it on New Year's Day. It seemed like a very new-year-ish dish.

If you don't like brussels sprouts, it could be because if you cook them by steaming or boiling, they tend to turn into nasty, bitter, sulfurous little cabbages. Cooking them in a dry method with high heat caramelizes them and releases wonderful complex nutty flavors and aromas.

A warning: if you are not used to eating a lot of cruciferous vegetables, this dish may be a bit challenging to digest. You may need to sleep with the windows open!

Serves 8, or me and three other people : )

I served this with mixed greens (collards, kale, and mustard greens) cooked with sage-flavored bulk pork sausage and a loaf of challah with unsweetened butter. We had a Shiraz with it, but that was all wrong; it would have gone much better with a very cold Charonnay or Riesling.

For the spices, before you wind up buying something, see if you've got something useful on hand. I actually used a leftover pumpkin pie spice mix that my wife made for Thanksgiving. I tend to cook by sniffing and tasting the spices and the raw food and deciding what seems like it would go well together. Trust your instincts!

You will need:

  • 3 or 4 lbs. fresh brussels sprouts
  • 1 cup raw cashews
  • Hard cheese (parmesan reggiano, aged gouda, etc) -- enough to yield 1/2 cup grated
  • 3 Tbs grapeseed oil
  • 2 tsp allspice or pumpkin pie spice mix (allspice, nutmeg, cinammon, cloves)
  • 1 tsp red pepper flakes (optional)
  • Salt to taste
  • A heatproof bowl
  • A large frying pan

Grate the cheese. The sprouts should be dry, so if you washed them, dry them completely with paper towels. Cut off the stem ends and make them into 1/4" slices. (Don't worry if some of them fall apart and you have loose bits -- the goal is to give the vegetables a lot of surface area).

Heat half the oil to medium heat and throw in the cashews. Fry until nicely browned, turning constantly to avoid burning (perhaps 3 minutes). Scoop the cashews out into the heatproof bowl (make sure you get all the pieces of nut, or they will burn in the pan and ruin the flavor). Leave some of the nut-flavored oil in the pan. Add the cheese to the hot cashews and stir quickly. Set the nut mixture aside.

Add the remaining oil to the pan and increase the heat to high. Before the oil starts to burn, toss in the brussels sprouts. You want to cook them quickly, turning several times to lightly brown the cut surfaces, until they are softened slightly and a bit brightened in color. They should release a nutty aroma. You don't want them to start cooking down and releasing a lot of liquid. On my stove this took 3 minutes or so, but your stove may vary. Add the allspice and red pepper flakes about halfway through cooking. Add the cashew/cheese mixture and mix. Add salt to taste (I threw in only a small amount, perhaps a quarter-teaspoon). Serve immediately.

If you try this recipe, I'd be interested to know what you think!

Security Warnings with Ubuntu 7.10 (Gutsy) Updates

The most recent updates to Ubuntu suddenly started generating warning messages saying that the patches could not be authenticated.

This is apparently a known bug in package bookkeeping. The procedure for fixing it seemed to be:

1. sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup

2. sudo touch /etc/apt/sources.list

3. Run the package manager and check for updates. You should see none; quit the package manager.

4. sudo rm /etc/apt/sources.list

5. sudo mv /etc/apt/sources.list.backup /etc/apt/sources.list

6. Run the package manager again; this time you should be able to install the updates without warnings.

Weird!