Archive for January, 2006

My bad

Monday, January 30th, 2006

Had a nasty hard coded path problem in the RubyUniversal package I created. Most things will probably have worked for most people, but badly :-) It’s fixed now - I blame the fact it was 3:30am when I posted it.

Also, I’ve removed RubyCocoa Universal as the RubyCocoa project has released its own binary. I think they might have been ashamed of mine, because of aforementioned broken link! Can I blame that one on the early morning hours also?

A case of mistaken identity

Sunday, January 29th, 2006

Guy Kawasaki has a funny blog entry which mentions one case of mistaken identity.

A few years ago, I had organised a user group meeting at a local PC superstore and we’d gotten about 20 people milling around discussing computers. The PC superstore staff were happy because we all seemed to have our own teeth and hold credit cards. The users were happy because they got to hang with geeks on a Saturday afternoon. After a couple of hours, one of the attendees turned to me and said:

“When is this MJ guy going to show up?”

I wouldn’t have minded but I’d been running the UG for three years at that point. Was I a shy and retiring type or did they think that I looked like my picture on the web forum (a rather harried-looking Daffy Duck). It was a bizarre experience anyway. I don’t look like anyone famous except maybe this guy. You don’t think so?

YAML bug in Og 0.27.0

Sunday, January 29th, 2006

Dumping an Og::Collection using to_yaml or YAML::dump results in a hard to track error: TypeError: can't dump anonymous class Class. This is because Collection has an instance variable which contains a literal Class. This patch fixes the problem, by storing the member_class as a String, and converting as necessary in the code.

--- new_collection.rb      2006-01-30 10:06:47.000000000 +1100
+++ collection.rb       2006-01-30 10:06:53.000000000 +1100
@@ -55,7 +55,7 @@
       remove_proc = nil, find_proc = nil,
       count_proc = nil, find_options = {})
     @owner = owner
-    @member_class = member_class.to_s
+    @member_class = member_class
     @insert_proc = insert_proc
     @remove_proc = remove_proc
     @find_proc = find_proc
@@ -217,8 +217,7 @@
   # Allows to perform a scoped query.

   def find(options = {})
-    klass = const_get(@member_class.to_sym)
-    klass.with_scope(options) do
+    @member_class.with_scope(options) do
       return @owner.send(@find_proc, @find_options)
     end
   end
@@ -238,8 +237,7 @@

   def method_missing(symbol, *args, &block)
     load_members
-    klass = const_get(@member_class.to_sym)
-    if klass.instance_methods.include? symbol.to_s
+    if @member_class.instance_methods.include? symbol.to_s
       @members.inject([]) { |a, x| a << x.send(symbol) }.flatten
     else
       @members.send(symbol, *args, &block)

Missing key IM conversation

Saturday, January 28th, 2006

8:15 AM
aidan: hi
mj: hey
aidan: Fintan (my son) managed to pull the left apple key off my keyboard without me realising
aidan: busy trying to get it back in again
mj: ouch
aidan: I’ve forgotten the technique
mj: I just place it in the right place and press firmly
aidan: do you attach the white bit to the computer or the key?
mj: place the wee white splines into the keyboard
aidan: x ≈≈≈≈≈≈≈   m xxxxxxxx Ω≈≈≈≈≈≈xxx
aidan: the keys I pressed as I fixed it

On User Interfaces

Saturday, January 28th, 2006

You know, sometimes the user interface is the easy bit. The user interface of when you’re using a piece of software is easy. The user interface of GETTING TO the the bit where you can use it every day is a lot harder. It’s got to be REALLY simple, the instructions (if there are any) have to be incredibly well written and there has to be no room for error.

So it’s got me thinking. It’s the HOW rather than the WHY.

Going to load up Interface Builder and have a wee play.

Cowslayers…

Thursday, January 26th, 2006

Rumour has it that Toy Story 3, as made by Disney, has been cancelled. That’s entirely not surprising now that Lasseter and Catmull are now the big fromages at Disney Animation. Who knows what’s going to happen now?

The Pixar/Disney deal is so reminiscent of the NeXT/Apple deal. There’s an acquisition and suddenly the company heads are all belonging to the company that was acquired! Of course Steve is getting better at it. NeXT was acquired for $400 million ($350 million of cash and stock, $50 million in paid off debt). This Pixar deal has ballooned to over 7 BILLION. He’s learned a bit, that Jobs bloke.

Anyway - back to Toy Story 3. It’s not clear to me whether TS3 has been actually canned or just going to be remade by the Pixar team. If the former then I guess the decision is made to not create a sequel for the sake of it. If the latter then I guess they just want their baby back.

Dragging this topic to business and, separately, software.

The idea of ephemeral businesses, most often short lived microbusinesses, is intriguing. A business opportunity that opens for a short while and the founders get in quick, make their buck and then get out. The company doesn’t fail - it just lives it’s life and expires gracefully - it’s role fully fulfilled. It’s not the usual way that we view businesses, but then these days what exactly does tradition have to do with business? An example was the enterprising chap who would automatically track XBox 360 deliveries and provide you with the info for a fee. Sure, he can repeat the experiment with the PS3 and with other devices but as supply begins to meet demand, the need for the tracker business expires.

On the software front, are there software products (other than an automatic XBox 360 tracker) which have a finite lifespan? As movies start to emulate/repackage/are replaced by video games, will we see the same phenomenon with software? Will there be a time when software just completes it’s life cycle? Is this when the next big thing comes along? Or is this when the need for the software dies? Or is this when the software has become “perfect”? Again, Guy Kawasaki has a theory that when your first product ships (thus becoming your cash cow), then you should immediately get started in creating your cowslayer. Cash is not going to roll in ad infinitum from your first product. You need to have a new product that will become the new cash cow for the company. And in assuming it’s role, your older software will be allowed to retire gracefully.

I’ve rambled a bit this evening, but it’s just thoughts crystallising. My friend Simon seemed somewhat interested in some of the ideas I had for the software by Infurious, mostly because they served to address some of the itches he would like to scratch.

Goodnight.

Ruby and RubyCocoa Universal

Thursday, January 26th, 2006

There was a post to the RubyCocoa mailing list about two weeks ago, talking about how to compile RubyCocoa for Universal usage. I noticed that one of the committers on the project added a configuration switch to do this about two days ago, so here is a combined installer for the latest versions of both Ruby and RubyCocoa (1.8.4 and 0.4.2 (+ extras)) for running on both PowerPC and Intel based Macs.

Please let me know if you run into any trouble using this package.

Download

RubyUniversal 1.8.4

Thursday, January 26th, 2006

I’ve put together a Universal (i.e. runs on both ppc and i386 architectures) binary version of ruby, intended for developers of Ruby apps who want to ensure that their applications run on both old and new Macs.

It’s only really going to be useful to those people who write ruby code which relies on something binary underneath–any of the bundles (shared libraries) that come with ruby, for example. On the other hand, it also just happens to be a distribution of the latest version of ruby (1.8.4), pre-compiled and ready to go. The current Mac OS X version is 1.8.2.

http://www.infurious.com/downloads/RubyUniversal.dmg

Source code obfuscation

Wednesday, January 25th, 2006

I spent a lot of time reading through methods of source code obfuscation today, particular for Ruby. With Objective-C, there is immediately one layer of obfuscation, as the code gets compiled to a binary format which is generally not human readable. Ruby, however, is plain text. This means that any commercial application developer (soon to be us) leaves all their intellectual property exposed to anyone who buys a license to use the application.

There are no obfuscators currently in existence for Ruby, or at least none that I can find that seem to really do anything effective. Zenspider is working on one which turns your ruby code into C code, and then you can compile the C — however, this is not yet available and will be a commercial application (the former concerns me, the latter only concerns me if it’s expensive ;-)).

I’ve also done a lot of reading about encryption and obfuscation in general. I think that Zenspider is definitely going about things in the right way. While translating Ruby to C is not trivial, it’s also not impossible. However, right now the most important thing is getting the app to the point where it can be released–I can worry about protecting it later.

Windows is hard! Mac OS is hard!

Monday, January 23rd, 2006

Computers are simply way too hard.

I spent some time this evening helping a well educated adult get a driver for her printer. Nightmare. In the end I went to the website, downloaded the driver and sent it over instant messenger. Then was the fun of getting her to run it. Absolute nightmare.

Made me think “My god, Windows is crap.”

But really, Mac OS X is not different in this regard. Both operating systems include a slew of printer drivers but adding a printer driver is NOT as easy as it should be.

Mac OS 9 used to have a mechanism where, if you plugged a USB device in, it would ask you if you wanted to search on the Internet for drivers. Of course it never really worked, never found anything and that was probably due to poor communication between Apple and device manufacturers.

Isn’t it about time that a device included its drivers on a built-in Flash RAM chip? Or at least a mini-app that dialled home to download the appropriate drivers?

I’d bet that the privacy goons would be out in force bleating about how some printer manufacturer was using this to spy on them and whether they were using sanctioned cartridges. Woo woo!