May 10

We are surrounded by opportunities to break our gear; if the gear is smart enough, it simply lasts longer.

When I worked at Motorola, as any development and innovative company has, we had a number of tricks and workarounds. One of these was a modified cable used to load firmware like they do to handsets in the factory — a Factory Cable, or FC. In this case, it drew power from the host system.

This cable would toast USB ports, therefore I caused it to get the official name “EFC” or “Evil Factory Cable”

I just realized the hard way that some domestic PCs protect themselves — as they should to as many actions as could possibly damage the system yet remain undetectable to a support guy. In this case, mine just protected itself:

USB Self-Defense

How cool is that? Sure, a Dell is “just as good but cheaper”; often you get what you pay for. Paying a dollar to protect my system from a mistake that I can make, as a technology genius (Genius, I tell you!), that’s a simple choice to make. If only more people would consider their gear over the long-term.

May 10

Compatibility only helps the user, and in sourcecode, the re-user.

I’ve noted before that making up a new format for anything poses a low chance of being compatible with anything, and that compatibility is accidental at best. Choosing any other format to be compatible with, to form some agreement, means that you already have compatibility with one other existing entity, meaning:

  • you can learn from the comments and notes about what that project’s architect discovered and learned
  • whatever is compatible with that entity maybe accidentally compatible with your product
  • generic upstream tools require much less work to adapt to your tool
  • compatibility with anything means you have designed with compatibility in mind, so you’re not so wedged into a colloquial hole as the next guy

The counter-point, by choosing your own way, no matter how much better you may think it is, you’re now responsible for evolving and supporting all the tools that are in your users’ toolbox. This means that if decide, for example, that Julian dates shall be used, you generate a gap between your project and all the tools that don’t yet support Julian dates. Even if you have no competition in the world, your users have these little obstacles that build up. Faced with a knock-off of your fantastic tool that poses no such obstacles, you’ll soon be replaced.

I like to get things done. Finish, and go home, or hack on something else.

There is the feeling of “I hate having to fix my tools before I can use them to get stuff done” that actually pushes me away from Microsoft — even before they “evolved” the Office suite to use a random new UI. Indeed, rather than Julian dates, that “Ribbon Menu” now makes OpenOffice more compatible with our learned skill at Microsoft Office than Microsoft is.

This “Ribbon Menu” breaks residual knowledge; in forcing users to accept this impact to productivity, what benefit is the Ribbon Menu giving to users? If you’re going to break with the pack, have a good reason other than “we’re going back to how it was done before 16-bit CPUs were invented”.

By changing your users to a better interaction that is used by some other app, you support that app, you consolidate the UI that should have been described from the start, and you gain compatibility. You might accidentally gain compatibility with a few tools that work on that other project or tool.

For these reasons, I would ask:

On a new project: what are you compatible with?

If the answer is “nothing” or “an old 8-bit format” or “the dead language of spoken latin”, rethink your decision, if you ever considered the possibility of compatibility, to marching to the common drummer of the blizzard of possible standards.

On an existing project: are you going to turn down anything that consolidates user experience or formats?

Keep in mind, the next question could be “what will you do next year, when your competition appears, and has compatibility?”

May 10

I travel a great deal — 82 of 130 days so far — and I like to share that info.

OK, maybe I don’t like to keep telling people where I am :) I understand it’s interesting to some, and I appreciate the attention and concern people have for me, but it’s easier if I can embed a bunch of rich links, and people can take a look for themselves. I am significantly affected by interruptions, and I also foster independence where I can.

The web has built up in a number of competing paths, like how NYC Subway was as many as four different companies in competition before they merged, leaving more inactive stations than active ones, and a lot of unused tunnels where squatters live.

Some people don’t read travel sites, some use dopplr, some use tripit. I want to offer this information to both so that the person can use whatever they have used thus far. Tripit has a wider understanding of existing travel formats — itineraries and notices and such — but dopplr has some users, so it makes sense to feed dopplr from tripit to leverage tripit’s higher intelligence. Dopplr added ical subscription in 2008 which James Senior nailed, and Jon Udell shared thusly:

Then I realized that Tripit publishes an iCalendar feed, and that Dopplr can subscribe to iCalendar feeds. So I made that connection, and now my Tripit events are showing up in Facebook.

Well, this isn’t working today — consistent 410 errors — but maybe this can be averted with some constructive UserAgent settings. Maybe Tripit became tired of people leveraging its smarter service to feed Dopplr. Need more time to figure this out after I do my Expenses. (ugh) Dopplr does allow a push of a calendar from iCal, which is nice but may require my iCal to start/stop regularly to do the push/update. Hmm. There has to be a way to script that… :)

Eventually, either Dopplr, Tripit, or something that these spawn will become the disused stations of the web, but in the meantime, if someone is using that and can hit their shared info rather than call me at 2am in a strange timezone, it gives me more sleep :)

Mar 13

Engineers and architects love detail and data to help make a decision — usually there are so many contrasting options that any is suitable for a given number of environments that the details are the devil, the thing you must address.

What about when there are no supporting details to make a choice? What happens when you have too many options affecting other decisions?

Make a choice. An arbitrary choice, and move on.

There are so many slowdowns during design phases that there are cases we simply need to define one parameter to allow the others to be defined — like a sticky Sudoku game. You need to make a decision.

I’ve been known to say things like “arbitrary: blue pill” — later documenting that options existed, no clear path was available, and a choice was made. My teammates of the Smallfoot project, and in the Motorola DB Team and Architecture teams heard me say often “Arbitrary: second option. Let’s move on”

This does not mean that the choice can not be revisited in the future if new details are discovered, it simply means that “I have no emotion attached to this, I’m just making a decision”. Later changes may need to change design in the first iteration, or may need to be addressed post-beta (where possible: please, let’s just deliver something functional first? If it doesn’t cause the sky to fall, let’s refactor on the second deliverable or in parallel)

Don’t be afraid to make a decision.

Tag it as such.

If you’re working in a different country, culture, or a second language, be sure to define what the word “arbitrary” means :)

Mar 09

The core details:

/Library/Application\ Support/VMware\ Fusion/boot.sh --start|stop

I think I missed somewhere how to populate and bring online a VMWare image without pointy-clicky actions. No worries.

I do notice that when my MacOSX-10.6.2 — a fairly modern OS — changes networking setup (VPN connects, disconnect Wifi, renew DHCP, etc) there is a huge shuffle of activity and some log messages about the Mac doing “the right thing”: backups, sync, etc. Most of that seems lightweight, but if I don’t really need it, I like to deactivate it.

The VMWare stuff is not so necessary today, so I decided to offline it.

I found its config as a launchd system-wide Daemon: /Library/LaunchDaemons/com.vmware.launchd.vmware.plist — so taking that apart, I found it’s a one-shot fire-and-forget like the cheesy rcX.d that I don’t like about linux (as discussed, based on a hotly-contested decision to make daemon start/stop possible in packages added/removed from the system — USL did this, whereas ODT collects a /etc/inittab.d/ directory, which allows auto-restart)

So I took that apart.

cauldron:~ allanc$ sudo /Library/Application\ Support/VMware\ Fusion/boot.sh --start
VMware Fusion 196839: Starting VMware Fusion:
chown: /Library/Application Support/VMware Fusion/isoimages/antivirus.iso: No such file or directory
Internet Software Consortium DHCP Server 2.0
Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.
All rights reserved.

Please contribute if you find this software useful.
For info, please visit http://www.isc.org/dhcp-contrib.html

Configured subnet: 172.16.232.0
Setting vmnet-dhcp IP address: 172.16.232.254
Opened:
Recving on VNet/vmnet8/172.16.232.0
Sending on VNet/vmnet8/172.16.232.0
Internet Software Consortium DHCP Server 2.0
Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.
All rights reserved.

Please contribute if you find this software useful.
For info, please visit http://www.isc.org/dhcp-contrib.html

Configured subnet: 172.16.83.0
Setting vmnet-dhcp IP address: 172.16.83.254
Opened:
Recving on VNet/vmnet1/172.16.83.0
Sending on VNet/vmnet1/172.16.83.0
Verifying and re-installing files from /Library/Application Support/VMware Fusion/thnuclnt

This has a few gems to consider: what’s that yummy antivirus.iso, and how can I use that to auto-define a VM? Hmmm…

Anyhow, for when I forget this next time, this how to start/stop the VMs.

Feb 21

The link http://support.microsoft.com/kb/912265 shows how to make a microsoft product work with a microsoft product. In this case, it’s a Microsoft Exchange server sharing a calendar to a Microsoft Outlook or a Microsoft Entourage user. I thought these products should already work together, given that they are Mail Server and Mail Client.

It’s very difficult to maintain any sort of compatibility with another company, even when there is relatively tight communication.

It’s even difficult to maintain compatibility when there’s no sharing, communication, or agreement. It’s very much like hammering changes with set of tests, and looking for leakage.

It’s much more difficult when the two entities are competing providers.

When the compatibility issue is within the same company, within iterations of the same product, there’s no excuse.

Feb 15

I live in two countries; I travel into many: Canada, USA, Thailand, China, and UK. I carry one phone, and swap SIMs in when I enter a different country: 4 SIMs into one phone, but the UK one is “special”.

What’s the Apple ideal here? carry 5 separate phones?

Am I flirting with the risk of losing my Apple ID?

340x_iphonehack

I’m not some evil phone-cracker, and I pay for everything I have. Heck, I use bittorrent as a try-before-you-buy. I’ve purchased as many as 4 copies of software (hello, Starcraft) rather than cheat when I’m in the wrong country and need something.

Checking my system logs, Apple software itself has shaky behavior: warnings that it’s violated its own constraints, obsolete function-calls, etc. The cheap iPhone cable I picked up occasionally seems to disconnect (ie every time with the older phone, never with the newer)

Is it possible that my unlocked phone, plus one of Apple’s own errors, plus this cheesy cable, can brand me as a thief, cracker, all-around bad-guy?

Feb 12

Apple makes a Web Browser called “Safari”, and a fairly well-known software product called “iTunes”, through which a user gets to the “iTunes Music Store” to download free or commercial content.

Apple also make a product-suite called iWork, which competes with Microsoft Office. For example, Pages competes with Microsoft Word.

Suppose Apple offered these products on Microsoft Windows — a direct competitor to their OS product, and a product which directly competes with their product on their competing OS. Whether “Pages” works smoothly, or doesn’t, that probably reflects poorly on the “Pages” product, and by allusion, whether all of Apple software is generally of good or poor quality.

If “Pages” tends to run very very well on Apple OSX, but poorly on Microsoft Windows, it probably implies that Windows has performance problems, and OSX is obviously the better OS to run things like the “Pages” application. That means that making “Pages” run well or poorly on the competing OS reflects on the perceived quality of the competing OS.

In short, Apple could make Windows look bad, and influence buyers over to OSX.

Does that seem fair? Who is really to blame? Doesn’t Apple have the obligation to at least adapt to the environment to which it’s writing software, and make it work? Isn’t that target environment really the foundation to which Apple has to make their product work? At the end of the day, the OS came before the application, so errors should be resolved in the application side.

Application errors are the application’s fault, not the OS. To claim otherwise gives reason to question the objectiveness of the auditor.

Same issue, but Microsoft making Office run on Mac. It runs poorly, hogs resources, and generally runs for short times without crashing. Obviously, this is Microsoft’s issue to deal with; to think otherwise implies a certain bias away from Apple.

Dec 07

In Mac OSX to Finisar I wrote about a more modern-ish way to connect to a Finisar ProbeFCX or Xgig Chassis. By definition, this similar config should work on GCX4000s and Apcons, if you (dear reader) recognize where those are used.

I just made it easier.

Since I live out of a suitcase, this makes my life easier.

I’m using the same process as before (using the evil “screen” tool), the GUC232A, plus a few extra bits, totalling:

Notice how these things are easy to get to? I think a WinTel works in place of the Mac, but mine don’t stay running for long enough.

Anyone from JDSU may say “well, gee, this is fairly basic”, but rather than follow the rules like a mantra, I wanted to do this with easier-to-pack parts that can be replaced or cross-shipped if needed.

This is what works:GUC232A-NullModem-GenderChanger

The trick is that the GUC232A is only 45cm/18inches long, but I can put a standard USB extension on it, route it through a US-4A or bang it on an unused server port anywhere.

Nov 19

Jonathan Washington determined how to Read a Barcode without a reader, and using his description it’s fairly easy.

The numbers have a bit of a delicious pattern; let me expand a bit from the Wired How-to Article, which presented this example:
Barcode_example1

The Digits themselves break down as follows:

digit code
* 0-0110
0 00-110
1 10-001
2 01-001
3 11-000
4 00-101
5 10-100
6 01-100
7 00-011
8 10-010
9 01-010

Simple, right? The barcode will also start and end in a 0-0110 sequence, which breaks the xx-xxx pattern. I cannot see Mr Washington’s article, the hosting has trashed it, so maybe this stuff is already discussed. The Wired Article is really hard to take apart from there — examples would have been nice — so I’ve expanded a bit on it.

Although we could look at the barcode digits as simple replacement cyphers — similar to the glyphs on the TV show “Fringe” — there is a key to the barcoding numbers themselves that would let a reader build a barcode cheat-sheet or lookup just before decoding a barcode to reduce the chances of error. Let’s remap the table above, add sample barcodes, move the zero after the 9, and add an asterisk markup so that we have an example of that as well:

digit code barcode
1 10-001 10-001
2 01-001 01-001
3 11-000 11-000
4 00-101 00-101
5 10-100 10-100
6 01-100 01-100
7 00-011 00-011
8 10-010 10-010
9 01-010 01-010
0 00-110 00-110
* 0-0110 0-0110

You can see how the progression of the 4 leftmost digits of each 5-bit sequence is actually a binary increment. The rule for that sequence seems to be “no more than two ones per digit”, and the 5th digit toggles one/zero to ensure that each sequence has two. Zero is pushed up to the “ten” spot, so it doesn’t have to suffer the indignity of no ones at all — for which the check bit would have to be 2. And what about 7? skipped. above, 7 is actually 8, 8 is actually 9, etc.

Asterisk is basically “zero” but with the spacer moved, perhaps to help key the scanner to the size and use the data itself as start/stop bits, the same way the 6-of-8 is done on an old floppy disk (leading bits are zero, after a spin there’s enough 0-0-1 and 0-0-0-etc to key the reader).

So now we have the magical logic to generate the bit patterns for the barcode digits, let’s markup the barcode and overlay some digits:

Barcode_example1-markedup

Now that looks a lot easier to digest.

Comments?