-
/etc/rc.local on Mac OS X
I’ve been wanting to run a couple of trivial commands during my system startup, which would’ve been perfect if Mac OS X had an /etc/rc.local file. Of course, since Mac OS X uses the (kick-ass) launchd and the nice StartupItems infrastructure, I didn’t quite expect it to have an rc.local file — Google wasn’t much help with this either.
Of course, after I actually looked at the /etc/rc file (which launchd invokes), lo and behold, I find this near the end of the file:
if [ -f /etc/rc.local ]; then sh /etc/rc.local fi
So, Mac OS X does indeed have an rc.local, contrary to what I first expected. Hopefully this saves at least one other UNIX geek a couple of minutes of Googling around on the Web…
-
Subclassing a non-existent Objective-C class
Let’s say you’re a Mac OS X developer, and you have the following scenario:
- You have an application that’s required to start up without a particular Mac OS X class, framework or function definition, because it may not be installed yet on the user’s system, or they’re running an older version of Mac OS X that doesn’t have the relevant library installed. (Note that this requirement may only be there so that you can check for the presence of a particular framework, and throwing up a simple error message to the user when your application starts that tells the user to install the framework, rather than simply terminate with some obscure output to stderr.)
- On the other hand, your application also uses some features of the potentially missing class/framework/function on Mac OS X. This is normally pretty easy to do by using weak linking and checking for undefined functional calls (or using Objective-C’s
-respondsToSelector
method), except when… - You need to subclass one of the Cocoa classes that may not be present on the user’s system.
The problem here is that if you subclass an existing class that may not be present on the user’s system, the Objective-C runtime terminates your application as it starts up, because it tries to look up the superclass of your subclass when your application launches, and then proceeds to panic when it can’t find the superclass. The poor user has no idea what has happened: all they see is your application’s icon bouncing in the dock for the short time before it quits.
Here’s some examples where I’ve needed to do this in real-life applications:
- You use Apple’s QTKit framework, and you’re subclassing one of the QTKit classes such as QTMovie or QTMovieView. QTKit is installed only if the user has QuickTime 7 or later installed, and you’d like to tell the user to install QuickTime 7 when the application starts up, rather than dying a usability-unfriendly death.
- You need to use all-mighty
+poseAsClass:
in a+load
method to override the behaviour of existing class, but the class you’re posing as only exists on some versions of Mac OS X.
There are several potential solutions to this (skip past this paragraph if you just want a solution that works): the first one I thought of was to use a class handler callback, which gets called when the Objective-C runtime tries to lookup a class and can’t find it. The class handler callback should then be able to create a dummy superclass so that your subclass will successfully be loaded: as long as you don’t use the dummy superclass, your application should still work OK. Unfortunately this approach encountered SIGSEGVs and SIGBUSs, and I ended up giving up on it after half an hour of trying to figure out what was going on. Another method is to actually make your subclass a subclass of NSObject, and then try to detect whether the superclass exists at runtime and then swizzle your class object’s superclass pointer to the real superclass if it does. This causes major headaches though, since you can’t access your class’s instance variables easily (since the compiler thinks you’re inheriting from NSObject rather than the real superclass)… and it doesn’t work anyway, also evoking SIGSEGVs and SIGBUSs. One other possibility is to simply create a fake superclass with the same name as the real Objective-C class, and pray that the runtime choses the real superclass rather than your fake class if your application’s run on a system that does have the class.
The solution that I eventually settled on is far less fragile than all of the above suggestions, and is actually quite elegant: what you do is compile your subclass into a loadable bundle rather than the main application, detect for the presence of the superclass at runtime via NSClassFromString or objc_getClass, load up your bundle if it’s present, and finally call your class’s initialisers.
Practically, this means that you have to:
- add a new target to your project that’s a Cocoa loadable bundle,
- compile the relevant subclass’s source code files into the bundle rather than the main application,
- ensure that the bundle is copied to your application’s main bundle, and
- detect for the presence of the superclass at runtime, and if it’s present, load your bundle, and then initialise the classes in the bundle via the
+initialize
method.
Here’s some example code to load the bundle assuming it’s simply in the Resources/ directory of your application’s main bundle:
NSString* pathToBundle = [[NSBundle mainBundle] pathForResource:@"MyExtraClasses" ofType:@"bundle"]; NSBundle* bundle = [NSBundle bundleWithPath:pathToBundle]; Class myClass = [bundle classNamed:@"MyClass"]; NSAssert(myClass != nil, @"Couldn't load MyClass"); [myClass initialize];
You will also have to end up specifying using the
-weak*
parameters to the linker (such as-weak_framework
or-weak-l
) for your main application if you’re still using normal methods from that class. That’s about it though, and conceptually this technique is quite robust.Credit goes to Josh Ferguson for suggesting this method, by the way, not me. I’m merely evangelising it…
-
Apple Mail and Self-Signed SSL Certificates
For those of you getting sick of Apple Mail pestering you about your beautiful self-signed SSL certificates running on your home-brew Gentoo 386SX/16 imaps/pop3s server, check out Apple’s knowledge base article 25593 to fix the problem once and for all.
After that:
- double-click on your newly-imported certificate in the Keychain Access utility,
- scroll down to the bottom of the window and click on the “Trust Settings” disclosure triangle,
- and finally, set the “When using this certificate” selector to “Always Trust”.
Huzzah, no more SSL shenanigans.
-
Mashup Maps Australia
Alastair Tse finally got fed up with Google Maps — despite having a Sydney development branch — not having Google Maps in Australia. As such, he’s put an incredible amount of work into fixing this anomaly, and announced his little Mashup Maps project yesterday. Nice work liquidx: that’ll be going on my browser toolbar indeed!
-
Controlled Chaos: Linux in the Visual Effects Industry
“Controlled Chaos: Linux in the Visual Effects Industry” was a talk I presented at the Linux.conf.au 2006 Digital Arts miniconf, with Anthony Menasse of Rising Sun Pictures. We discuss using Linux in the VFX industry, of course, but also talk about problems encountered in VFX in general (e.g. mammoth data storage requirements), and how we manage the day-to-day technical issues that crop up. The slides are now available online, for those interested!
Download: Adobe Acrobat PDF
-
MacBook Pro First Impressions
It’s been about a week since I got my shiny new MacBook Pro. Since then, I’ve used it for both work and play, so I think it’s about time I put more crap on the Internet and blogged about my very important personal feelings on this issue.
First, this thing screams. It’s fast as hell. Mac OS X zips along even more smoothly than the Dual 2.3GHz Power Mac G5 I have at work, and the interface generally feels snappier than a G5, which is already reasonably teh snappy. To my amazement, some stuff on the MacBook Pro is way faster than on the G5. As an example, here’s how long it took to compile a debug version of cineSync, our little project at work:
- Dual 2.3GHz Power Mac G5: 5m10s
- MacBook Pro: 1m40s
That’s a 3x speed improvement — versus a 2.3GHz G5, which is a pretty blazing fast machine already. (I didn’t believe the performance difference that I ran the test three times!) I really don’t understand the performance discrepancy here: the G5 is at least the equal of the fastest x86 chips in raw processing power, so where’s this 3x difference coming from? Even fork(2)/exec(2) speed in Darwin is an order of magnitude quicker on the MacBook Pro than on the G5, so running those one terabyte
./configure
scripts finally doesn’t look so paltry compared to Linux. My only thought is that x86 code generator for gcc is an order of magnitude better than the code generator for the PPC. I guess this is a feasible possibility, but it does seem somewhat unlikely. Can a compiler that generates better code really be responsible for that much of a speed difference? Maybe indeed (quiet you Gentoo fanboys down the back)… thoughts on this issue would be welcome!Rosetta, the JIT PPC-to-x86 code translator, also works amazingly well. While the technology in Rosetta is already an extremely remarkable achievement, its greatest achievement is that you don’t have to worry about it: I downloaded some Mac OS X binaries of Subversion a while ago, and only realised later that they were PPC binaries. So Rosetta works completely transparently, even for UNIX command-line programs. I suspect that part of the reason Apple haven’t open-sourced the Intel xnu kernel for Mac OS X/Darwin is because Rosetta may be tightly integrated with the kernel, and it’s technology that they don’t want to (or perhaps cannot legally) give away.
The whole Windows-on-Mac thing also works rather well. Windows XP running via Boot Camp is, well, the same as Windows XP running on a vanilla PC, except that it’s running on a very pretty silver box (with very pretty ambient keyboard lighting). It does have some slightly annoying issues (such as Fn-Delete on the internal keyboard not functioning as a proper Del key), but those issues will be solved with time. (Unfortunately, Counter-Strike isn’t all that playable with a trackpad :).
Parallels Workstation is equally impressive: hardware-assisted virtualisation really does fly. It’s remarkable to see Windows XP running in a window inside Mac OS X, and have it run at more-or-less native CPU speed. Setting breakpoints in Visual C++ Express also works fine, so Parallels appears to be virtualising hardware breakpoints correctly too. There’s still a lot of work to be done in virtualising drivers, however: it would be mighty cool to see a virtualised PC game running at nearly native speeds, since that requires virtualised accelerated video and sound support.
The upshot of the successful Windows-on-Mac stories are that I’ll never be buying a generic PC yum-cha box ever again. On the road, I finally have a machine that can actually run Mac OS X, Windows and Linux all side-by-side, both virtualised and “for real”. For my family, that means that I can actually buy them an iMac even though they need to run Windows. (The iMac really is a beautiful machine: there’s no single-box-with-built-in-display solution like an iMac at all in the PC world. Yeah, I’m sure there’s some cheapass Taiwanese knockoff of an iMac, but that certainly doesn’t count.)
One nice touch to end of this story is that my local AppleCentre offered me no less than A$1000 to trade-in my faithful old 1GHz Titanium Powerbook, which I intend to follow-up on. (I’d have done it already if I didn’t have to head out-of-town so soon.) If you’re thinking about upgrading an old Mac to a new ICBM model, see whether your AppleCentre will accept trade-ins. I was very pleasantly surprised that I could get a four-digit figure from a trade-in of a three-and-a-bit year old laptop.
So, overall first impressions of a MacBook Pro? I’m a pretty happy boy indeed. The only regret I have is that I already used the name shodan for another computer that’s much less deserving of the name. Seriously, I called a Dell box shodan? What the hell crack was I on?
-
MacBook Pro Fun
I suspect that if you don’t know that Apple released their Boot Camp tool to enable normal PC operating systems to be installed on their shiny new ICBMs, you’re probably not a geek, and this article doesn’t really concern you…
Since there have been plenty of other articles written about Boot Camp and its implications for the future of the Macintosh, I won’t say any more about it here. I just wanted to say the following:
- Tuesday, April 4: Pick up shiny new MacBook Pro from my local AppleCentre.
- Wednesday, April 5, ~8pm Australian CST: Apple announces Boot Camp.
- Thursday, April 5, ~2am Australian CST: Windows XP SP2 installs on my Mac.
- Thursday, April 5, ~3am Australian CST: Visual C++ Express 2005 and Counter-Strike are installed (the latter running at a rather nice 72.7fps in Valve’s Video Stress Test).
- Thursday, April 5, sometime later: Parallels announces a beta of their Workstation product, enabling Macs to virtualise running guest operating systems. Hooray for x86 hardware virtualisation technology.
Not bad for the first three days of owning a MacBook Pro, really. Bring on the tech!
-
For the functional programmers
-
Ultrasone HFI-550 Headphones
After quite a bit of hunting around, I found one absolutely kickass pair of headphones for work: the Ultrasone HFI-550. They’re great for a work environment because they’re sealed headphones, which means that if you’re like me and play stuff loud, you won’t disturb your workmates because sealed headphones keep the sound in. The sound quality from them is superb: they’re up there with my beloved Beyerdynamic DT531s for serious listening. They’re also comfortable: I’ve worn them for hours on-end with no problem or fatigue at all.
For Australians, the best thing about them is that thanks to AusPCMarket, you can actually get them in Australia for a reasonable price: they’re USD$189 at Headroom, but you can get them at AusPCMarket for A$231—including shipping. Considering that equivalent competing headphones (such as the AKG-K271) are around the same price range in the USA but are quite hard to find in stores in Australia for anything less than about A$330, A$231 for these things is a bargain.
And, of course, the day I got these nice pair of cans is the same day that I managed to code my way out of a coding slump, and get back into deep hack mode. Coincidence? I don’t think so…
-
An Optical Mouse of a Mouse
The optical LED for Apple’s Mighty Mouse emits a cute little picture of a mouse if you look hard enough, and apparently this has always been the case for all of Apple’s optical mouses. Kudos to them for the little design touches! Now if I could only find another Logitech MX-300, which is the best weighted and most comfortable mouse I’ve ever used.
(Man, you know you’re a total nerd when you start talking about the weight of your frigging mouse.)
-
In-ear Headphones Adventures
I’ve been on a bit of a headphones splurge lately: anyone who knows me will know that I like my music, and I love my gadgets. I like in-ear headphones for travelling since they’re small, unobtrusive, yet can still give excellent sound quality. While nothing beats a nice pair of full-head cans for comfortable listening, they’re a little bit awkward to tote around. Interestingly, I’ve found that my experiences with in-ear headphones have been quite different from most of the reviews that I’ve read on the ‘net about them, so I thought I’d post my experiences here to bore everyone. The executive summary: make sure that whatever in-ear phones you buy, wherever you buy them, be prepared to bear the cost if you don’t like them, or make sure you can return them.
Note: For comparative purposes, my preferred non-in-ear headphones are the Sennheiser PX-100s (USD$60), IMHO one of the best open earphones in its price range. I don’t consider myself to be an audiophile at all: I think I know sound reasonably well, but I’m not fussy as long as the general reproduction is good. A general guideline is that if I state that something lacks bass compared to something else, you’ll be able to hear the difference unless you’re totally deaf, but I’m not fussy about whether the bass is ‘soft and warm’ and all that other audiophile crap. For serious listening/monitoring, I currently use Beyerdynamic DT 531s, and previously used AKG-141s. The Sennheiser PX-100 nor any of the headphones below are any real comparison to these beasts: the 531s and 141s are meant for professional monitoring with serious comfort; it’s a whole different target market.
So, here are some in-ear headphones that I’ve tried over the years:
Apple iPod earbuds: Mediocre sound quality, trendy white, comes with iPod. Stays in the ear reasonably well. Not enough bass for my liking, but that’s no surprise considering they come for free. That said, they’re a hell of a lot better than the earbuds that come with most MP3/CD players; the Sony PSP also came with trendy-white headphones, and they sucked a lot more than the iPod earbuds.
Griffin Earjams (USD$15): Designed as an attachment to the iPod earbuds. This doobie significantly changes the output of the earbuds so that you now get a good amount of bass, with very little treble. Not good enough: I like bass in my doof-doof music, but I don’t want to hear just the doof-doof-doof, you know? If you’re tempted to get these, I’d suggest trying Koss’s The Plug or Spark Plug in-ear phones instead, which are just as cheap, have just as much (if not more bass) reproduction, and don’t suffer so badly on the treble end.
Apple in-ear Headphones (USD$40): I really liked these. About the only thing I don’t like about them is that they don’t fit in my ear well enough: they’re fine for a couple of minutes, but after about 10 minutes I realise that they’re falling out a bit and I have to wiggle them in again. I don’t find this too much of an annoyance, but no doubt other people will. If you plan to do exercise with your in-ear phones, you will definitely want to give these a very good break in and find out whether they come loose during your gymming/running/skiing/breakdancing/whatnot.
I’m fairly sure the loose fitting is due to a different design they use: the actual earpiece/driver seems to be much bigger than the other in-ear headphones I’ve tried here, and I guess they’re designed to be used further away from the ear rather than being stuck deep into your ear canal, as with the Sony and Shures I tried (and no doubt like the Etymotics in-ear phones too). The nice thing about this design is that you don’t have to stick them really, really deep, which is the main reason I like them. I find the Sony and the Shures want to be too deep for my comfort level; see below.
Sony MDR-EX71SL (USD$49): Available in white or black. After much internal debate and agony, I got the white model. (Trendy or street-wise? Trendy or street-wise? Trendy it is!) This was the first model I bought after the Apple in-ear headphones, expecting to have seriously better sound. After all, everyone knows that for audio, more expensive always means better—especially those gold-plated, deoxygenated, shiny-looking, made-from-unobtanium Monster Cables. Anyway, I was fairly disappointed with their sound quality: less bass than the Apple’s iPod earbuds. Well, OK, let’s be honest: I’m sure they do sound really good if not far better, but I’ll never find out, because I really don’t want to shove them in my ear that far. Unlike the Koss Plug series, these Sonys don’t come with foam earpieces that can be inserted at a comfortable distance, so I think you have to put the earpiece far deeper into your ear than I did. In the very unlikely scenario that I did insert them as far as they were meant to go, they sounded pretty crap indeed.
Koss Spark Plug (USD$20): The sequel to Koss’s suspiciously cheap older model, which was simply named “The Plug”. The Spark Plug’s just as cheap as The Plug, but supposedly better (or at least different). For $20, I don’t think you can complain a whole lot: they give you a pretty good amount of bass (comparable to the Griffin Earjams), but they’re definitely lacking at the high end, though not as much as the Earjams are. I find the foam earpieces that come with these fit my ear pretty well, don’t have to be put in that deep to deliver that doof-doof bass I’m looking for, and they’re also reasonably comfortable. They’re not quite as comfortable as Apple’s in-ear headphones, but still, better than I’d expect for a piece of foam stuck into my ear. If your sound-playing device has an equaliser, you can likely correct for the Spark Plug’s lack of treble response by putting it on an Eq setting that boosts the treble a bit: I found the Spark Plug to be sound pretty good on iPod’s Treble Boost or Electronic Eqs. A good, safe (and pretty cheap) buy.
Shure E3c/E4c (USD$179 and USD$299): So, I found the Apple Store stocking one of the most acclaimed in-ear phones I’ve ever read about, which would be the Shure E3c. (Note: the ‘c’ in E3c stands for consumer, and basically translates to “trendy iPod white”. The Shure E3 is exactly the same, but is black, and therefore faster.) Additionally, they also had the Shure E4c in stock, which are far more pricey than the E3c (and therefore better). Unfortunately, I put both of these headphones into the same category as the Sony MDR-EX71SLs: I’m sure they’re as absolutely awesome as all the glowing reviews say, but I’m just a wimp and refuse to shove those damn things that far into my brain. Oh yeah, on a not-very-relevant note, Shure changed the packaging between the E3c and the E4c. The E3c had a (gasp) easy-to-open plastic pack, but apparently Shure have since been attending the American School of Plastic Packaging, and used them evil blister packs instead.
Griffin EarThumps (USD$20): Released at the start of 2006, I managed to find a pair of EarThumps calling me at my local AppleCentre, and I like them alot. They’re pretty cheap (they’re sure as hell not in the Shure E3c/E4c price range), and they sound great. The bass production is nearly as good as Koss’s Plug series, and they actually manage to produce pretty decent treble too, so you won’t have to play around with your graphic equaliser too much to make these sound decent. Additionally, they appear to have the larger drivers that Apple used for their in-ear headphones: this means that you don’t have to shove them so far in your ear. In fact, these were even easier to get into your ear than Apple’s in-ear headphones, and were much less annoying to put in than the Koss ‘phones. They’re also reasonably comfortable and stay in your ear quite well, and come in both black and white models if colour-matching your iPod is an important thing to you.
For on-the-road listening, my current preferred earphones are the Griffin EarThumps: small enough to fit next to an iPod nano in one of those evilly cute iPod socks, with good enough sound and a good comfort level. I was previously using Koss’s Spark Plug, and before that, Apple’s in-ear headphones. The EarThumps are a set of earphones that I can heartily recommend to friends, since they’re reasonably cheap, and more importantly, I know that they won’t have to shove some piece of equipment halfway inside their brain to get any decent sound out of it.
-
The Circles of Mutable State
Scott Johnson has an excellent comment on the Lambda the Ultimate forums titled “Different levels of mutable state badness”:
The vestuble: Non-mutable state. Just so we have a frame of reference. (Some may argue that this is Heaven rather than the outermost circle of Hell, but in Heaven all the problems are already solved. :) )
1st circle: Mutable state which is not externally observable (given the programming model). Such things as variables cached in registers and other optimizations performed by the machine.
2nd circle: “Monotonic” mutable state. Discussed a bit in CTM, these correspond to variables which can be bound separately from their definition (but once bound cannot be re-bound), lazy evaluation, etc. In general, preserve referential transparency, and are well-behaved.
3rd circle: Linear mutable state. Mutable variables which are accessed from only one place; and generally aren’t subject to aliasing. Examples include local variables in functions (ignoring the issues of lexical closures which might alias such variables, and call-by-reference), “private” variables within objects, etc.
4th circle: Managed mutable state. State in a database or some other system which provides transaction semantics and other means of arbitrating access to the shared variables.
5th circle (getting hotter): Aliased mutable state. Mutable variables/objects which are “used” in numerous different contexts (and therefore aliased)—and thus frequently used as a backdoor communications channel (often unintentionally). Often described as a “feature” of certain OO languages (much the same way pointer arithmetic is trumpted as a feature of C).
6th circle (even hotter): Global (unmanaged) mutable state. As bad as the previous, but as the state is globally exported, you don’t know WHO might be messing with it, or where.
7th and 8th circles: Currently unoccupied, though I await suggestions. :) Feel free to interpose suggestsions above too, and we can demote intervening circles to fill in the gap.
9th circle: Concurrent mutable state. The obnoxious practice of mutating shared state from multiple threads of control, leading into a predictable cycle of race conditions, deadlocks, and other assorted misbehavior from which there is no return. And if a correct solution (for synchronization) is found for a given program, chances are any substantial change to the program will make it incorrect again. But you won’t find it, instead your customer will. Despite that, reams of code (and TONS of middleware) has been written to try and make this tractable. And don’t get me started on a certain programming language which starts with “J” that saw fit to make EVERY object have its very own monitor….
-
GLTerminal
Aww jeah, this little program wins some seriously awexome geek points:
That, folks, is GLTerminal. It emulates the curvature of ye olde green and amber CRT tubes; what you can’t see in the screenshot is that it can also emulate particular baud rates (all the way from 110 to 19200), complete with the ghosting effect of the slow phosphor updates that the old terminals had. I leave you with one of its Preferences windows:
-
Reliable DNS Server Queues on the Cheap
The traditional solution to providing a high-availibility Internet service is to throw a bunch of (preferably geographically diverse) servers together and set up a round-robin DNS record that will somewhat balance the load between them. However, if your Internet service supports real-time collaboration between users, as in the case of a bunch of clustered worldwide Jabber servers, a round-robin DNS solution doesn’t work very well, because it dramatically increases your server-to-server traffic as users will end up logging into different servers.
Assuming that scalability isn’t too much of a problem and that your main goal is high availability, what you really want is a failover queue of servers for a single DNS record: first, try server1; if that fails, try server2; if server2 fails, try server3, and so on…
The traditional solution for this is either (a) run your own DNS server and use BIND 9’s obscure
rrset-order
option to define a round-robin order, or, if you’re uncomfortable with doing that, outsource your DNS to a managed DNS hosting service that supports failover monitoring, such as ZoneEdit or PowerDNS, which can be expensive.However, Horms suggested a brilliant little solution: use one of the many freely available dynamic dns services. Write a simple script to poll your servers in order, and update the dynamic DNS entry’s IP address to point to whatever the first server you’ve detected as online. You can still point users to the normal hostname in your domain, by adding a
CNAME
record that points to the hostname provided by the dynamic DNS service.We’ve used this technique in practice for several weeks and it’s worked extremely well: so well, in fact, that we cancelled the outsourced DNS failover service that we had before, because it didn’t update as quickly or work as reliably as it does now. Writing the monitoring script is the hardest part of this solution, and that’s pretty easy: if you’re really curious, email me and I’ll be happy to lend the monitor script that we use.
-
Pang's Law
When you buy a bunch of CD jewel cases, at least one in every ten will be broken or cracked.
(While I’m at it, don’t buy the crystal-clear jewel cases. They look cool, but they’re a right beeyotch to open up so you can slide in the inlay…)
-
Google Talk and Jabber vs the Rest
I have a lot of friends on the MSN Messenger chat network that I quite enjoy talking to, but unfortunately my favourite instant messaging program — iChat on Mac OS X — can’t talk to MSN. (Linux people, keep reading, I promise this post will get more relevant to you despite my reference to iChat.) iChat, can, however, talk to Jabber servers. I’ve known for a while that many Jabber servers have the capability to bridge networks, so that you can talk to people on all the other chatting networks (ICQ, Yahoo!, AIM, MSN, and Google Talk) by simply logging into a single Jabber server. However, I never bothered configuring iChat to do this until today.
I’m very happy to say that one of the first guides I found on Google about how to set up iChat to talk to MSN was on the Jabber Australia site, which is also one of the most professional Web sites I’ve seen for a free, open service. The process was quite painless and nearly completely Web-based: the Jabber Australia site imports all your current MSN contacts into your new Jabber contacts list, so you don’t have to re-type them all in. The Jabber<->MSN bridge even sends across all your buddies’ icons, so I can see iChat proudly displaying pictures of all my mates. Very schmick.
Step the second: I also have friends on Google Talk, and since Google opened up their servers to Jabber federation in January 2006, that means I also get to chat with all my friends who have Gmail accounts and never bother logging into the IM networks. (Muahaha, and they thought they could avoid me!) Now I’m finally gotten into the 2000 era and have one chat client that can talk to any of MSN, ICQ, Yahoo!, Google Talk, and AIM; woohoo, clever me.
However, the story’s much bigger than just simple chat network interoperability. Google’s move into the IM market by unleashing Google Talk might have seemed rather underwhelming when it was first announced: after all, it was just like Skype… but Google voice chat was Windows-only when Skype is Windows/Mac/Linux, and oh yeah, it also had, like, none of Skype’s user base. However, Google Talk has one massive weapon behind it: open standards. In the past few months, Google has done two very significant things:
- They’ve opened up their servers so that they can interoperate with other Jabber servers.
- Published their voice-call protocol as an open standard, and even provided third-party developers with a library (libjingle) that can be integrated into any IM client.
The second point is huge: in one move, Google has brought voice capability to the entire Jabber federation chat network. (And, if you haven’t used Google Talk, the voice quality is damn good: better than Skype, and possibly on par or better than iChat AV.) The implication of this is that there’s going to be a big split in the short-term between the official ICQ/Yahoo!/AIM/MSN clients and everyone else (i.e. Trillian, Gaim, AdiumX, etc). The official clients will, of course, only work with their own network since they want to lock you in, but every other IM client that doesn’t currently support voice chatting — which means everybody except for Skype and iChat AV — is very, very likely to be putting Google’s voice protocols into their own chat clients. Look a couple of years ahead, and I think you’ll find that every IM chat client is going to have voice support, and that they’ll be divided into two camps: the ones that support Google’s voice protocol because it’s an open standard, and everybody else.
The thing is, right now, that “everybody else” is really only one other group: Skype. There’s also iChat AV, but that’s small fry compared to Skype, and since Apple piggybacks off the AIM network right now, they don’t have a large interest in locking customers into one particular network. (It’d be relatively easy for Apple to migrate all their .Mac accounts over to a Jabber-federated network just by throwing a couple of Jabber servers up for their .Mac users and publishing a new version of iChat that talked to that.) This means that it’s more-or-less going to be Skype vs Google Talk in the next coming years, and while Skype has absolutely huge mindshare right now, I don’t think they have a hope of holding out, because they’re the only damn network right now that absolutely requires you to use their own client. The one killer advantage that Skype has compared to Google Talk is that you can use Skype call-out and call-in to do phone calls, but once Google gets SIP support into Jingle, Google Talk will have that capability as well. Unless Skype do something radical, they’re going to be extinct in a few years as developers start pushing Jingle support into every single IM client.
Heh, not a bad situation at all: in one move, Google’s not only guaranteed some measure of success for themselves in the IM market, but they’ve also made the world a slightly better place by giving users client choice and software choice thanks to open standards. One voice protocol to rule them all, and in the darkness bind them…
-
Mike Evangelist on HD's AACS
Mike Evangelist (yes, I do believe that’s his real name…) is calling for a boycott of HD video products, due to restrictive digital rights management schemes that the industry is intending to push on to consumers.
There are plenty of folks out there speaking out against DRM, of course. One thing that distinguishes Mike’s opinion from the rest of them is that he’s a former executive at Apple. What’s also interesting is his opinion on CSS (the encryption mechanism used for consumer DVDs) and FairPlay, which he wrote in his blog comments:
CSS never bothered me that much because everyone in the industry knew it was just a placebo to satisfy the movie studios. Nobody expected it to actually do anything. AACS on the other hand is being designed to work, by some very smart and very serious people.
I view the DMCA as a criminal conspiracy that should be prosecuted under RICO statutes, but of course it wonít be, as the conspirators are in charge.
But the big difference with AACS is that they can change the rules after the fact. If you buy an high definition DVD, youíll have no certainty what rights you will be granted in the future. Itís insane.
PS I find FairPlay to be a reasonable compromise, but it doesnít work for me because I want to play my music from my server using devices that donít support it. Hence, I buy my music elsewhere.
It appears that both Blu-Ray and HD-DVD will be adopting AACS as part of their rights management schemes, unfortunately.
-
Fixing console/terminal output in Xcode
If you’re having problems with Xcode not intercepting console/terminal output from your program (with ⌘-R, Build and Run or ⌘-Y, Build and Debug), try this:
- Go to your Xcode project and select the executable in the project list.
- Bring up the inspector for the executable (⌘-I, or just double-click on it).
- Change “Use Pseudo terminal for standard input/output” to “Use Pipe for standard input/output” on the General tab of the inspector.
- Do not use a Pipe for standard input/output on the Debugging tab of the inspector, unless you don’t want to be able to debug your executable.
That fixed it up for me.
-
Nettwerk Records vs RIAA
Canadia’s largest independent record label is litigating against the RIAA on behalf of consumers: schweet. (I personally like Nettwerk since they’re the home of some of my favourite artists: Sarah McLachlan, Dido, and the Barenaked Ladies.)
-
Linux.conf.au, Day 6 (Saturday)
Ah, the last day of LCA: it’s been a killer week, and definitely one of the best technical conferences I’ve ever been to. Personally, I think this ties with Linux.conf.au in Adelaide and Brisbane as the best LCA yet: I didn’t find the talks as invigorating this year, but the social side of things have been the best ever, with action typically going well past midnight every night. It’s finally started to take its toll on me, though: I left early tonight to both do some private hacking, and to catch up on that “sleep” thing that I’ve been missing out on for the past week.
Thankfully, the last day of the conference wasn’t too hectic: a late start, a keynote, one talk, followed by some best-of talks, a panel and the conference wrap-up. Of course, even though there was a late start, I still got up early since I wanted to get a ton of personal work out of the way, and I’m glad to say that I had enough time to do both that and have the usual leet-bix breakfast at Pia and Jeff’s again. Mark Shuttleworth’s keynote — which I thought would be rather controversial or about Ubuntu vs Debian — turned out to be completely not about Ubuntu vs Debian, and was excellent. Mark was pushing the whole notion of distributed revision control systems as the future of the entire open source movement, and possibly even computing in general. I do agree with Mark: distributed revision control is an incredibly powerful tool, and it has enough potential to change the whole underlying way that entire operating systems are constructed.
The only thing that soured Mark’s keynote was a barrage of incredibly irritating comments in question time, initiated by people in the audience who seemed to want a microphone for themselves. You always get these kind of morons at conferences: those folks that can ramble on at length about some completely unrelated topic in an attempt to show their supposed intellectual superiority, and who think that anything they can think of is important and worth nothing. Of course, in Alanic fashion, they just end up looking like idiots rather than looking intelligent, and unfortunately also waste everyone else’s time. These are the same dropkicks who consistently interrupt the speaker in a talk to offer “helpful hints” and “advice”; I had one such mongrel in the svk talk yesterday which nearly prompted me to show my skillz of an artist and exclaim “Let the speaker get on with his talk you stupid f***!”. There’s nothing quite like a super-enthusiastic babbling dumbass. Anyway.
The rest of the day wasn’t such a headspin as the past few days: we had a shaving session held at the same time as the lunch BBQ. Explanation: at last night’s auction, numerous silly people, such as Jeff Waugh, Greg ‘Groggy’ Lehey, Dave Miller and Rusty Russell, volunteered to have various bits of hair shaved off them if the bidding reached a certain price. Of course, with the UNSW cartel reaching a bid of $10000, we hit that price, and so it was decided that the shaving would be done in public, today, at lunchtime. I tell you: Rusty without a moustache is just weird. He’s, like, totally not the same guy. Jeff, Greg, and Dave all look the same, but Rusty… he could even, like, pick up chicks and stuff now. Brr!
The rest of the day was spent socialising with the other geeks and attending the panel, prizes and conference close. That was all a pretty standard affair, apart from the very sad fact that I lost my favourite silver long-sleeve Banana Republic jumper some time that afternoon. (Weeps with the moon.) Oh well, I guess that’s an excuse to do a little more shopping the next time I hit the USA…
MySQL were holding drinks that night at the Captain Cook tavern, but unfortunately I didn’t attend them since I was sadly looking around for my jumper. (Weeps with the moon yet again, this time with violin music in the background.) So, I joined Erik, Matt, Shane, Jaq, Ashley and a few other folks at none-other-than The Terrace for dinner again. I tell you: a mixed grill of lamb, chicken, pork and beef on hot rocks doesn’t get boring, and neither does a Barmaid full of beer. By this time, the five hours of sleep that I’d been getting per day really hit me, so I retired at about 9 o’clock to head back home and sleep.
So it’s been an excellent wind-down to one of the most awesome conferences I’ve been to. Next year’s Linux.conf.au organisers will have to work hard to top this one, but from (very) early indications, that prospect looks promising already. Thanks to all the organisers who made it such a educational, inspiring event to attend, and all my friends there who made it a serious boatload of fun!
P.S. For those of you that know of Andrew Tridgell, he was quoted in the Otago Daily Times (that most excellent of newspapers) as being a Jim Carrey lookalike. Truly awesome.