How not to drum up business

There is a business here in Rochester that needs a lesson how to do business. I’m not going to give them the exposure (or Google rank) of putting their name here, but their name sounds a little like “Cock fire”. The business they are in is something that is actually of interest to me, something I currently use, and something that I recently solicited quotes from numerous companies in the business by going to a site that collects your requirements and sends them to registered providers. It’s also a business that members of a Linux Users Group, such as our own Linux Users Group of Rochester (LUGOR) might be more likely than the general public to want to do business with.

But “Cock fire”, instead of waiting for requests for quotes, or introducing themselves to the LUGOR group as a peer or contributor, instead decided to somehow mine our mailing list for email addresses, and then individually spammed the members of the list. When I got mine, I actually thought it was somehow related to my earlier request for quotes, until I realized that they’d sent it to both of the email addresses I’ve subscribed to the mailing list, not just the one I’d used in the RFQ. And then somebody else on the list mentioned that they’d gotten this spam to an address that they *only* use for the LUGOR list, and several other members piped up that they’d also gotten spammed, so we figured out what they’d done.

So well done, “Cock fire”. In spite of the fact that your product is actually $10 a month cheaper than what I currently pay your competitor, I’m not going to switch my existing use over, and neither am I going to recommend you to my current employer. Reap what you sow, assholes.

Update: I got a response from the email I sent them.

On behalf of [Cock fire] I would like to formally apologize for the e-mail marketing to your group. I was given 2 lists of e-mails from a Rochester Linux guru that said their group would be interested in Rochester based services. From the number of negative responses I have gotten back this was a mistake.

We have deleted all LUGOR e-mails and will not be in future communication. Please convey our apology to the group.

So it wasn’t his fault that they decided to spam, it was the fault of somebody who tempted him into it by giving him a list of email addresses. Oh, then that makes it all ok then? I don’t think so.

Do me a favour?

Update: Steve Robbins has modified his widget to use JSON, and I’ve gone back to using it because it works right at any text size.

The Stack Overflow team is sending me emails saying that my use of the Robbins Stack Overflow widget on my blog is putting an “unacceptable” load on their huge 48 Gb RAM, 8 processor box. So I’ve switched over to their preferred solution, which is an iframe containing their own “flair” page. The problem with the iframe option is that it requires me to tell my system exactly how many pixels high and wide it is – and when I change my text size, it starts putting scroll bars on it, and it looks like ass.

Can you please look at my Stack Overflow badge on the right side of my blog, and leave me a comment telling me yes or no if it has scroll bars for you? If you know, tell me what OS/browser and font size you’re using.

This is sad

I don’t know if this is a comment on the sad state of Java, or the sad state of the way my mind works.

I’ve been a Java developer since 1998. I think it’s a great language and I love working in it. But when I’m starting a personal project, I look for excuses not to use it. I don’t know why. I can code up beautiful and powerful GUIs in it, but I usually choose not to. It’s so ridiculous that I’m going to a meeting to discuss a possible freelance project very shortly, and I think I’m going to end up deciding to learn Python and wxPython and coding the GUI in that rather than do it in Java. And I don’t really know why.

A good morning, but not a great night

This morning, I went over to Frank’s to see if he could help me with my rudder pedal assembly. I had an idea of how to jury rig the pedal, but I wasn’t sure how to implement it. Fortunately, Frank is a lot smarter than me when it comes to fixing things, and he has the advantage that he installed this rudder assembly originally. It took us a couple of hours of reaching around into the depths of the kayak with screwdrivers and ratchets, but it worked.

It seems to be holding, but I’m looking forward to getting the replacement parts next week – the company that made the rudder system redesigned the tracks a few years ago to make them out of aluminum instead of plastic, and they tell me I can just swap out the tracks without changing any other parts – but of course first I’ll have to undo all the great jury rigging that Frank and I did. Tim of PaddlersSupply.com and Tom of TopKayaker.net got me hooked up and they are sending me the new parts, so I should have them in time for the Rochester Open Water Challenge.

The Time Trail kind of sucked tonight. First problem was that I forgot my GPS and heart rate monitor. Dan loaned me his GPS but I still didn’t have the heart rate chest band, and he took it home afterwards so I didn’t get to download the info. It was raining, but not too cold. The wind was blowing from the south, meaning that you started into the bay with enough tail wind to make waves, but not enough to really help you go fast. I think I was making around 6.2 or 6.3 mph. Turning in the waves was the usual adventure, especially when I wasn’t too sure about the rudder, and then coming back into the wind was slow, probably around 5.8 or 5.9. My split was around 9.9 minutes, compared to 9.53 last week. Going up the creek was a little better in spite of the headwind and the increasing rain, but it was a struggle to keep the speed up over 6.1. I did the turn the “normal” (counter clockwise) way – last week Jim Mallory convinced us that doing it the other (clockwise) way is probably faster because of the geometry of the final turn before the buoy, but I wanted to avoid full right rudder tonight. The way back was faster, of course, with a good tail wind and the current, so I was seeing speeds between 6.4 and 6.8. My final time was around 19.6 (compared to 19.20 last week), so my second half was faster than the first half. Paul D was a tiny bit faster than me tonight – I think Ken said he beat me by 7/100s of a minute. Oh well, when you’re only a few hundreds of a minute faster than a guy one week, you’ve got to expect that he’s only got to make a tiny improvement or you a tiny mistake to change the order the next. I’ll get him back next week.

Today’s Discovery

If you have a Core Data data model with one Entity, say “AircraftCategory” that has a “to-many” Relationship to another, say “AircraftClass”, you can access the AircraftClass objects for an AircraftCategory using an NSMutableSet. But if you Fetch an NSMutableArray of AircraftCategory, and are doing a “fast enumeration” through the AircraftCategory objects, and you happen to remove one of the AircraftClass items from the current AircraftCategory object using one of the generated accessors, the fast enumeration will see that as a modification of the NSMutableArray of AircraftCategory and throw an exception. This is in contrast to Java where you would only get an exception if you were to add or remove things from the actual Collection that you were iterating, and not from calling setter methods on the objects in the Collection.

So instead of removing the AircraftClass from the AircraftCategory, I discovered that what I have to do is remove it from Core Data directly, using
[managedObjectContext deleteObject:aircraftClass];

I haven’t tried it yet, but I wonder if this wouldn’t happen if I assigned the fetch results to an NSArray instead of an NSMutableArray?