Main

January 03, 2011

The E46 (penultimate) BMW M3 just might be the perfect car for you, too.

I have always loved driving fast cars. I drove a blue '71 Mustang Mach 1 through most of college and a pretty red '93 Ford Escort wagon got me to and from teaching gigs and concerts. I have motor oil in my blood. I needed two cars to satisfy the "carry my stuff around without breaking the bank... or the car" and the "get me someplace fast and in style" requirements.


Fast forward (ahem... cough... already?) years and I've lately had the pleasure of driving a Silver 2003 BMW M3. This is a machine that laps the Nüburgring in 8:22, gets from "naught to sixty" in 4.6 seconds. You wouldn't expect it, but the back seat is actually usable for two non-American-sized people and they both fold down to reveal almost station-wagon-like cargo space, passing through to the trunk. No kidding. I brought a 6' wire shelf home the other night. In real - world driving, it gets just barely less than 30 miles / gallon on the highway, which is waaay better than the latest M3, which, while it has 414 HP and obviously flies, gets about 20 MPG on the highway. That's worse than my E46 city numbers of 23 MPG or so, even though I drive with occasional (ahem) spirit. The engine redlines at 8000 RPM and the peak horsepower and torque both live very near that (around 7000), which means you have to grow accustomed to keeping the car above about 3000 RPM if you want any kind of torque. Oddly, that's a good thing. When you want to drive conservatively, it's easy to do so as the car has relatively little low-end power. If you want to throw it around a bit, keep the revs up. Simple. Very girlfriend friendly driving down low, grins up high.


(Over the break for pics and more)

Continue reading "The E46 (penultimate) BMW M3 just might be the perfect car for you, too." »

November 16, 2010

#protip: In app purchase requires ability to sell apps

If you're new to the iPhone scene or working on In App Purchase code using a client's iTunes Connect setup, be aware that you must have all of your banking and financial information set up such that you *could* sell something on the app store, even if your app is not yet released, in order to test In App Purchase.

I have a client who hasn't yet released any applications. (SOON! Right, Randy?) We ran into this problem together and spent a couple of hours pulling our hair out over this one. I suggested that he go ahead and add his banking information before escalating the problem to our friends at Apple and everything started working one he got himself setup for payments. Unless I'm missing something obvious in the docs, and since there is no error message that comes back from the Store Kit callback indicating why an item is invalid, there is really no way that one would know that other than to have stumbled upon it like we did.

(facepalm)

September 26, 2010

My 2 cents in (hopefully) 5 minutes

saggau_speakerbadge.png

I'm performing a 5 minute "lightning" talk at the iPad/iPhone DevCon tomorrow and I'm not planning to use slides. I don't want to burn half of the 5 minutes getting keynote working, but hopefully attendees would like to have some of the links and code I'll reference. So! Here are my notes, links, and other such fodder. There is a lot more than 5 minutes worth of material here as I've been making notes about my habits for the last week or so; this is all of them. I plan to talk until I run out of air or out of time...

Tiny Little Habits for the iOS Dev to Avoid Premature Baldness

A foolish consistency is the hobgoblin of little minds, adored by little statesmen and philosophers and divines.
-- R.W. Emerson (Essays. First Series. Self-Reliance.)

Here are some consistencies that I think are not foolish. These little habits have saved me a lot of stupid, often difficult to debug, mistakes.

When you alloc and init or otherwise instantiate an object that you now own, write the balancing release or autorelease immediately; this includes any IBOutlets and properties. If it's an IBOutlet, also write the [self setSomeIBOutletProperty:nil] in -viewDidUnload when you write the [someIBOutlet release] in -dealloc.

Similarly

When something that is a delegate of something else, in the dealloc I'll tend to perform [somethingElse setDelegate:nil], whether I expect somethingElse to live for a while longer or not, then [somethingElse release]; on the next line. When you write [somethingElse setDelegate:something], write this code right away just like the alloc+init discipline above. This is one of the reasons I don't like to set delegates in xib files. It's too easy to mess this up. Also, I refactor as I work...

Speaking of delegates and protocols

When you write a delegate protocol, make absolutely every method optional so you get into the habit of testing if the delegate responds to the selector you're about to call as a matter of course. You're a lot less likely to mess up the delegate protocol that way. When you conform to a protocol, copy all (required and optional) methods into your class and comment them out. Uncomment them as you need to use them. That way, you don't have to go back and forth to the other class's header file to see if there is a delegate method for some behavior you need to know about. You have it all at hand.

Do as little setup work as possible in xibs, they work best for simply putting together UI geometry

  • Avoid xib file dependencies (See this BNR blog post) Avoid making view controllers in MainWindow.xib
    • It's easy enough to make 'em in code. It's easier to know where things come from when you make them in code.
  • Avoid setting delegates in xib files. Do it in code.
I'm not saying not to use xibs, they're useful and they often save time; I am saying to keep the interface builder voodoo to a minimum.

Lines of code are (mostly) free

Self-documenting code is better than heavily commented code and Objc is verbose by tradition; I think this is a good thing. Debugging code that isn't too nested is much easier.
[self setFloozle:[floozaWhat whatWithString:[NSString stringWithFormat:@"jeeminy %@ Christmas, %@", frickin, virginiaName]];
Where you gonna put a breakpoint in that crap?

When you think you can draw something in code instead of using a static image, try to find the time to implement drawing it in code. Also, Buy Opacity.app.
  • When apple comes out with yet another screen size, you'll be (somewhat more) ready for it.
  • When you want to change the size of something for some other reason, you don't have to generate a new image.
  • You get to figure out how on the green Earth you designer does the crazy things they do in photoshop... only in Quartz.

Speed

If the profiler doesn't say it's slow, it's not slow. If the profiler says it's slow, it's slow. Use the profiler.
Note: Shark (sniffle) is dead. Long live Shark! They killt it good in iOS 4.0 (no longer runs on the device).

Others' little code bits that are very useful:
  • Red Sweater NSData thing that prints the hex for you
  • IsEmpty from Wil Shipley with a small addition
    static inline BOOL IsEmpty(id thing) {
        return thing == nil
        || ([thing isEqual:[NSNull null]]) //My addition for things like coredata
        || ([thing respondsToSelector:@selector(length)]
            && [(NSData *)thing length] == 0)
        || ([thing respondsToSelector:@selector(count)]
            && [(NSArray *)thing count] == 0);
    }
    
  • LogMethod() from Aaron Hillegass
    //Modified from Aaron hillegass's code
    #define LogMethod() NSLog(@"-[%@ %s]", self, _cmd)
    
  • CPU and Memory tools I use to see what's really going on that I know I stole from a skojillian places, but can't remember who to thank.
  • GTMHTTPFetcher to download stuff (and Google Toolbox for Mac in general)
  • Nathan Eror's Core Animation Toys.

Subclassin' -- You stay classy, San Diego

Subclass less, compose more. In subclasses, always call super's implementation of a method, even when you just *know* it does nothing. (I'm thinking of UIViewControllers here). That way, if you ever do decide to put in an intermediary class between your class and the former superclass, you don't get stuck wondering what happened when those methods no longer get called.

Minimize direct access to the internals of your objects

Yeah, yeah, message send blah blah. It's not that slow unless you abuse it.
  • Write or synthesize accessors for ivars you want to share. Also, buy Accessorizer.app
  • Remember, you can use readonly in a property when appropriate (and it is more often appropriate than you might think).
  • Mark ivars you don't want messed with as @private. For srsly.
  • Make good use of class continuations:
    • to document the internal workings of your objects (If the header is the public documentation, the continuation is the private, implementation documentation)
    • to suppress "may not respond to" compiler warnings
    • to expand readonly properties to readwrite status internally
    • to make a protected methods header file if you want subclasses, but not other users of a class, to use certain of its internal methods.
      • Import that file in subclasses to suppress compiler warnings.
      • Makes it easy to delineate private vs. protected vs. public methods

Know what you're really doing when you use dot syntax

I have a weird dot syntax habit, ymmv. There be message sends in them thar hills.

I rarely return nil from something that is expected to return a string, dictionary, an array, or a set

Instead, I return an empty object of the expected type like so:
    return @"";
    return [NSArray array];
    return [NSDictionary dictionary];
I often use Shipley's IsEmpty() to find out if some object is empty, rather than comparing its pointer to nil. That way, nil messaging returning nil doesn't bite you in the ass when you're expecting something that is not an NSObject and you don't get that ugly (null) string in your UI. I hate that.

Make a logging method you can turn off and one you really can't; both call through to NSLog

Also, see the expansion of LogMethod from Aaron Hillegass
#define LogMethod() SBLog(@"-[%@ %s]", self, _cmd)
#define WarnMethod() SBWarn(@"-[%@ %s]", self, _cmd)
#define SBWarn NSLog

#ifdef DEBUG
#define SBLog NSLog
#else
#define SBLog    
#endif

Run the static analyzer, but not all the time

I usually run it:
  • before a commit to source control
  • after I make a new class
  • any time I am alloc'ing a lot of stuff
However, I don't find it particularly useful to set the preference that will run it for every compile; For me, the time spent on that adds up quickly. I have a lot of fairly big projects,though. YMMV.

If your code won't work unless some particular condition is satisfied, NSAssert that condition!

(Hi Joe P.) You can turn off asserts in shipping code, if you're a panzy. I leave 'em on. I would rather get a crashing bug I can reproduce than one I can't and it's probably gonna crash soon enough...

NO WARNINGS (and turn on the warning set you can find on the blog the Rentzsch linked to that one time)

On External, third party, projects

  • READ THE CODE
  • UNDERSTAND THE CODE
  • DON'T USE IT UNTIL YOU KNOW HOW IT WORKS (make a little test project to learn it and drop lots of breakpoints)
  • If it's hard to read, it's probably broken.
  • I'm on the three20 mailing list; you wouldn't believe some of the questions asked there...
  • Add external files project relative outside of your project (makes updating the external project easier)
  • Freeze external projects at a given revision number; update early on between releases:
    • in svn this is done with gtmOauth -r 19 http://gtm-oauth.googlecode.com/svn/trunk in an svn:external
  • Avoid editing external projects directly (makes it hard to merge), instead subclass or make categories to change behavior
  • When possible, avoid static libraries
    • Too many places where compiler flags are set.
    • Instead, compile in only those parts you need and their dependencies
    • I usually add just the top level source file I need and pull in dependencies as the compiler pukes, rinse and repeat until no errors or warnings.

Make tiny little test projects for new features

  • As your codebase grows, new features can present a difficult integration, so split it into two steps
    • 1. New Feature
    • 2. Integrate new feature into codebase
    • 3. goto 1

If there is any chance that you've got a delayed perform of a selector scheduled, don't forget to cancel those when appropriate

+[NSObject cancelPreviousPerformRequestsWithTarget:]
+[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]
Incolsolata, because menlo makes left square brackets look indented.

If you have to pick just one: Read Mike Ash's blog.

August 04, 2010

Another iPhone dev looks at the Android

About a year ago, I used a G1 dev phone as my primary phone for a few weeks. It was okay, had a lot of potential, but didn't do it for me like the iPhone did at the time. I remain curious how the other half lives, so I will soon receive a Nexus One from a good friend of mine via UPS today. Thanks, dude! You know who you are.

I have to mention that I'm apprehensive. Playing with my neighbor's new Sprint Evo briefly was rather disappointing; Sprint bloatware aside, from a usability and UI standpoint the version of Android on the Evo (2.1, I believe) needs serious detail work to pull even with iOS 2.0.

I find myself flummoxed as to how anyone manages to use email on the thing. One can't forward just selected parts of an email (no kidding, all or nothing) and responding to an email inline is not supported. In both of the two (!) email apps that come on the phone (one for Gmail and one for, um, other email), once received, email text is not malleable. I love to read the comparisons of Android and iPhone, am glad that Apple has a solid competitor, and am excited to use Android again (and possibly develop software for it) on fast hardware with their latest OS, but right now I'm thinking "make email work, then we'll talk" or, as my neighbor puts it, "This is 2010, right? Doesn't Google know how to do email?"

Stay tuned for more Android / iOS comparisons in the coming weeks. I'm excited to dig in.

November 14, 2008

Reverse DNS on the iPhone

Reverse DNS via the usual OS X means doesn't seem to work on the iPhone. It looks like this is a known bug/limitation. The new apple developer forums (login required) have a thread that's dedicated to the problem. (rdar://problem/5929766 is mentioned there). Apple seems to have used the eraser on some other of their DNS code on the iPhone. Saurik has an interesting hack to work - around a perhaps related change in DNS behavior.

You can actually get reverse DNS lookup on the iPhone to work using res_query (which is in libresolv, so make sure you link against libresolv.dylib) to query DNS and dns_parse_packet, which you'll find in dns_utils.h, to do the work of parsing out the DNS server reply works rather well. I could not get the recommended tools in dns.h to work, but I did discover that res_query returns the same raw reply from the DNS Server that dns_parse_packet expects from the utilities in dns.h. The code:

Continue reading "Reverse DNS on the iPhone" »

October 01, 2008

iPhone NDA -- some thoughts

When the news came out today that Apple has chosen to lift the iPhone NDA, I (like many developers) breathed a sigh of relief. I would like to take a moment to thank my peers for being so outspoken and to thank Apple for finally deciding to make my life as an iPhone developer excedingly easier by allowing the members of the development community to do as they so often and so unselfishly do to help one another with various recurring difficulties that crop up in our craft. The Mac OS X software community that I've had the pleasure of getting to know over the last couple of years continues to astound me. I'm proud to count myself among them. They are, to a person, a wonderful, well-meaning, honest, and interesting group of people who, as evidenced by the recent brouhaha over the aforementioned NDA, are very vocal about their beliefs and try to treat others as they expect to be treated. I've decided to take a page from that book and voice a belief of mine: A contract is a contract.

Having had the pleasure of arguing over contracts (including several of my own), intellectual property, personal liberty, and many similar topics with more than a few software developers, attorneys, students, musicians, my astonishingly intelligent parents, and various other people I have admired over the years, I've come to a few conclusions. One of the fundamental principals I try to follow in my own dealings with others is, I'm told, a basic brocard of civil law -- Pacta sunt servanda ("agreements must be kept").

Continue reading "iPhone NDA -- some thoughts" »

November 26, 2007

Likely in store. Likely? WTF?

So I went to Borders on Wall street today, thinking "hey, let's have a look at Fake Steve's book." I go to their little search engine kiosk, punch in the title and see "Humor" under section and "Likely in store" under availability. Hmmm. Ok. So the kiosk isn't hooked into their inventory. Fair enough, as a friend of mine likes to say. I go to the little help desk and ask "where's humor?" (they didn't get the joke...It was a dumb joke). I head in the direction of the pointing and grunting. I seek. I do not find. I approach another help desk, this one nearer to the section in question. I follow the nice Borders "associate" (when did we stop using "employee" and "clerk," by the way?) over to the section I was just examining, where she proceeds to look for Fake Steve's book on the same shelf I was. Apparently, alphabetical order is still alphabetical order. Glad I'm not crazy. "Let me go ask if anybody has seen it," she says. "Um. Okay," I reply. Now I don't think that I'm expecting miracles. I just want to know if they have a certain book. After about five minutes the (ahem) "associate" comes back with a "I don't think we have it, but we can order it for you." ...to which I reply (admittedly snidely) "If I had wanted to order it, I would have done so from the comfort of my own home from Amazon. Thanks for looking."

I have questions. Why do the Borders associates clearly have no access to inventory numbers? Why could she not tell me "we have two copies." I can understand having difficulty finding a specific volume, what with the abundance of end caps and special tables in the book stores these days. How hard is it to track inventory? Isn't that what those neat shiny computer doodads they have scattered all over the store are supposed to be good at? Grrrrr.

Shipley! Make a distributed version of Delicious Library or something. These people need help.

November 24, 2007

No more Finder, no more Dock

I don't use the either anymore.
I find the Terminal sufficient for most large-scale file movings (especially with the help of tree). Path Finder is where I live to browse my filesystem. Launching applications (also searching the web and making coffee) belongs to Quicksilver, which was recently open-sourced!
FYI: tree compiles on OSX Leopard if you make the following very small changes to tree.c:
--- ./tree-1.5.1.1/tree.c
+++ ./tree-1.5.1.1JS/tree.c
@@ -17,7 +17,7 @@
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

-#include 
+//#include 
#include 
#include 
#include 
@@ -182,7 +182,7 @@
#ifdef CYGWIN
extern int MB_CUR_MAX;
#else
-extern size_t MB_CUR_MAX;
+extern int __mb_cur_max;
#endif

int main(int argc, char **argv)

November 11, 2007

More Leopard calDAV fun. Migration!

As you know from my last post, I have lots and lots of calendars. It used to be much much worse. Sharing calendars between my three Macs before Leopard server was a pain in the ass. Sure, you could put a calendar on a regular DAV server and subscribe to that calendar on your other machines, but you could not write to that calendar from any machine other than that which created it initially. All subscribed machines were read-only. What does this mean to me? You know about my 14 calendars, right? Triple it. That's right. I used to have 42 calendars on each of my 3 machines. 14 calendars to which I could write and 28 to which I was subscribed so I could read any appointments from my other two machines. What a mess.

Leopard calendar server has brought me back to a debatably sane 14 calendars. But how does one migrate all of those calendars spread across multiple machines onto the shiny new calDAV server? Like so:

1. Subscribe to your shiny new calDAV server (under the Accounts tab) in iCal preferences.
2. Create a new calendar on your calDAV server through iCal (File Menu -> new Calendar -> your server) for each of your 14 calendars.
3. Create a *.ics file from your old calendar by:
a. Selecting the calendars you want to export by using the export functionality in iCal (File Menu -> Export) on each of your machines or...
b. Mounting your DAV server and downloading all of 'em at once (assuming you're keeping your calendars on a DAV server now, which I was, this method is a lot easier for obvious reasons)...
4. Select the calendar from the source list (one residing on your new calDAV server) and import the *.ics files you wish to store in the new calendar (File Menu -> import).

Your appointments are now on your calDAV server and will show up on all of your subscribed machines fully editable from all.

More Leopard calDAV fun. Moving appointments between calendars from different sources.

I'm scheduled to within an inch of my life, so there is no surprise that I have 14 calendars in iCal right now. I have calendars for billable hours vs. non-billable hours. I have calendars on my calDAV server that I share with clients, some under a different username than others, and some that I use to synchronize personal calendars across multiple machines, and yet another that I share with my assistant. (Hi Christina!) I have calendars coming out my ears from various sources.

Very often, I'll place an appointment in one calendar and later wish to move it to another. Perhaps I'll have a tentative appointment with a client, so I'll put that in my non-billable calendar. When that appointment happens, perhaps I'll put that into my billable calendar. Unfortunately, my billable calender is under a different username on my calDAV server than my billable calendar (one of them I share, the other I do not). Normally, when I want to move an appointment from one calendar to another I right/ctrl-click the appointment and select the calendar I want to move it to. Unfortunately, the only calendars listed in that contextual menu are those under the same user account as the appointment I'm trying to move. Bummer.

The workaround:

1. Select the appointment you would like to move.
2. Use your favorite method of getting it to the clipboard (I use command-X to cut)
3. Select the calendar from the source list to which you would like to move the appointment
4. Paste (command - v for me)

All appointment data when cut or copied is retained when pasted into the other calendar.

Wouldn't it be nice to have ALL of your calendars in the contextual menu? Radar: 5593635

October 26, 2007

Yeah, it breathes

Wow. Alex.SpeechVoice is creepy. Apple's latest "read your email to you" speech synthesizer breathes (!) before it (he?) starts speaking. It's also, by far, the largest file in my installation of Leopard.

See?

LepprSpace.jpg

Update:

The software generating the view above is called GrandPerspective and I love it. Thanks to DeRay for emailing me about this.

August 26, 2007

iPhone theft is teh suck

Poof. Phone gone. 'twas a real pro. I carry my iphone in a case with a very difficult to remove clip attached to the inside of the front strap of my computer bag, which I always hang diagonally across my chest to make it more difficult for someone to run off with my stuff. Doing this places the iphone in its case between my chest and a somewhat tensioned strap. During the afternoon on Thursday, I vaguely registered that I was bumped into a couple of times while walking through the WTC "Viewing Area." I'm accustomed to this as navigating through there without screaming at slow-moving Midwesterners (of which I was once one, so I try to be nice) sometimes proves difficult. I don't think I'll be taking my subway shortcut any more.

If you're wondering what's the absolute worst part about getting an iPhone stolen, it's not that creepy feeling of violation that comes from having one's personal property lifted, it's transferring service to a new iPhone through AT&T. I had originally opted to avoid the two-year AT&T suck customer service lock-in with a "Go Phone" plan, gambling that somebody would come out with a hack that would allow me to use (say) T-Mobile with my iPhone. Until that happens, though I would just love to be able to use the device in the same way I have been. When I got my new iPhone, I thought perhaps the option to transfer my current AT&T number to a new phone would be the logical one to choose. Nope. Apparently, AT&T/Apple never thought that anyone would want to transfer service from one iPhone to another (at least not on the "Go Phone" plan). Long story short: as of right now I'm out the 78(ish) dollar balance I had in my "Go Phone" prepaid account as well as a new activation fee. Why? The only way I could get an activation (according to AT&T customer service) is to go through the "I want a new contract" activation process (without the "all nines" hack). Since my credit doesn't suck, I have a two - year AT&T contract to try to get out of now. That is a pickpocketing I'm going to fight.

For those waiting for iPong, I was expecting to have it ready for public consumption by tonight, but have just jailbroken my new phone. The network error handling and preference code was coming together nicely before my little adventure. I should be able to release something fairly stable during the week.

The way-too-adventurous among us can find the code as it stands now on google. I moved the repository there a few nights ago in anticipation of the release.

July 01, 2007

My other iphone is a rental.

This post may be short, given that I'm learning to type with this thing. I do have to make a little confession. This is my backup iPhone. That's right. Thinking a client (who, I've learned, got his before me) would want one, and realizing I could return a sealed product, I grabbed two when I went to the Apple store. With the number transfer and activation problems, I made an impulsive decision to pay the restocking fee on this one and unboxed iPhone number 2. Now I think ATT got suspicious of me trying to activate two phones on two plans... Well, let's just say that the prepaid plans are no great deal. (yes, they accepted my credit the first time around). Oh well. My other iPhone is a rental.

October 17, 2006

Oh windows

This is why we use OS X and Linux as much as possible...

ohWindows.jpg

October 06, 2006

Thank goodness for parallels

Let's just say this is the LAST day I spend trying to get nerd hardware working with OS X. My old USB to RS-232 converter won't work, no matter which .kext I download, modify plist, install... It went so far as to register /dev/tty.usbserial for me, but the "device is busy" message was all I could get when trying to connect to it. Usb networking? Hah! There is one USB networking kext out there for using the Sharp Zaurus device. It looks hackable (if I want to spend a couple of days deciphering a thousand - line c++ file) to make usb networking happen with the gumstix. ... or I could just run ubuntu in parallels and allow it to take over the USB devices. A couple of modprobes with a bone stock ubuntu kernel setup and I was talking to the gumstix over usb networking AND serial. :) Yup. Nerdy things will be happening in linux. AND! I can still use my sexy mac to do it. Maybe I should clear out a partition to do Linux on this thing directly...

July 14, 2006

MOTU, my friend

MOTU Symphonic Instrument appears to be working on my case-sensitive file system now. Let's just say that there's a symlink in /Library/ pointing application\ Support to Application\ Support.

No. I. am. NOT. kidding.

Erg. Seems this only works on the PPC version. Back to the Intel drawing board.

July 05, 2006

Oh, we're just going to take your internet away

Here's what the ISP for one of my clients did today:
1. They called a non-technical contact at the client indicating that there had been some kind of phishing fraud related to ebay originating at one of their IP addresses. (Not bloody likely as users at that location have no access to servers there and the servers have very few ports facing "the world.")
a. Left a phone number to the "network investigations unit."
b. Left a ticket number
c. TOOK BOTH THE PRIMARY AND BACKUP INTERNET (T1) CONNECTIONS DOWN at the client's main office!
2. I called the number they left.
a. Line's busy
b. Line rings forever
c. Answering machine....
d. Line rings forever
3. I called the usual tech support number
a. Support rep. indicates that the "network investigations unit" has put an "administrative hold on the lines"
b. Support rep. indicates that the "network investigations unit" can't be contacted internally, rather the support rep. has the same phone number I've been given.
c. Support rep. indicates that the "network investigations unit" is small and can best be contacted by leaving a message or an email. (I did both)
d. Support rep. indicates candidly that the "network investigations unit" has the tendency to take customers' connections down and then make it impossible for the customer to contact them.
4. I moved the main database server for the client to another location a few blocks away (this takes a couple of hours).
a. I assume that the "network investigations unit" decided that it was best to screw only the main part of the business... to the tune of roughly $ 20,000.00 per day of lost revenue (hence the backup internet connection).
5. As of yet, I have still heard nothing from the "network investigations unit."

Question:
What would you do if your ISP took your main and redundant Internet connections down on (apparently) a report from a third party and refused to be contacted?

July 04, 2006

Parallels' problem isn't case-sensitivity.

With the help of Drew Thaler's instructions on how to grab disk access by running an app in gdb, it looks like the bug in Parallels Workstation was even weirder than the case-sensitivity problem. Parallels uses QT, a cross-platform GUI toolkit to handle user interface presentation, rather than the much-more-common-on-OSX-but-not-cross-platform toolkit called cocoa. Unfortunately, it follows my library search path to get to QT. My installation of QT is broken. (I've known this for a while and haven't had the time to rebuild it from source). Why doesn't Parallels force inclusion of QT from the app bundle? I don't know. Bug report filed.

See the extended entry for Drew's instructions (thanks Drew!)

Continue reading "Parallels' problem isn't case-sensitivity." »

June 20, 2006

Case-sensitive file systems and me

Grumble grumble grumble...

The background:
I come from Linux. Let's get that out there in the open right away. (I feel better already). I make money (among other sort of more businessman-like things) playing sysadmin to several Windows (no fun), Linux (fun), and OS X (friendly) machines.

Comfort finds me in the command-line and, while I'm no bash genius (Juan is, I think), I get around. One old carryover that I bring with me from the Linux world is a penchant for case-sensitive file-systems. I like 'em. Feels like home, ok? I guess that makes sense.

The hate:
Two pieces of software that I find very impressive just puke on case-sensitive file systems.
Parallels workstation (which I love) might allow me to use windows right along with my primary install of OS X. If only it didn't puke all over the place when trying to run on case-sensitive hfs+. I find myself dual-booting off of an external firewire (handily defeating the purpose of owning parallels in the first place) installation of OS X to run this otherwise fantastic software.
MOTU Symphonic Instrument, which is a really fantastic sample-based orchestral synthesizer, has the following behavior:
1. On PPC, there is a bus error
2. On Intel (it's UB), the whole machine hangs. That's right, folks. My machine is HOSED
Once again, if I boot into a case-insensitive file system, it runs (and it's really really cool).

The response:
Parallels:
NONE! I have submitted bug reports through the beta of parallels. I have submitted bug reports now that the software is out of beta. I believe in this software. I have paid for this software to support it's development despite the problems I am having.

MOTU Symphonic Instrument:
NONE! I have submitted bug reports and tried to call their (ALWAYS busy) support number. I have, again, happily paid for this software (there is no demo available; I just bought it based on the reputation of their hardware and software).

Question:
Am I *that much* of an outlier? Seriously. Am I the only somewhat old-school Linux geek who prefers a case-sensitive system on OS X?

Solution:
Ug. I guess I'll just buy a huge external drive, make a very careful extra backup (in addition to my usual backup) of both of my machines and go case-insensitive. Pain. In. The. Butt.