Saturday, July 26, 2008

iPhone cut, copy, paste - more on patent problems

I speculated that iPhone cut, copy, paste was missing due to patent problems. A commenter added:
A buddy of mine used to work for MS Mobile division and when I started using the Blackjack he kindly gave me I complained about there being no cut copy paste in smartphone addition of windowdose mobile. His simple reply was 'patent issue'.
Well, it does make sense.

So are patents also the problem with tasks on the iPhone?

Microsoft shows Apple how to do integrated work home calendars

Bravo evil empire!

It's good to have Microsoft in the game.
Microsoft Makes Calendar Sync Work - ReadWriteWeb

... For someone who uses an Outlook calendar at work, keeps a personal calendar in Hotmail, and perhaps has a shared family calendar in Live Calendar, this new sync tool will be incredibly useful. Whether you're online or offline, all your calendars are available from one place: Outlook....
Are you listening Apple?

The Windows Live Beta calendar will subscribe to ICS feeds (ex. Google Calendar). It can be shared as a web page and it will provide ICS and XML feeds.

Hmm.

I've been so annoyed by Apple's crappy support for iPhone calendaring, tasks and notes, and the corresponding MobileMe flop (which, even if it worked, would not suffice), that I've even thought of returning my iPhone. I won't, I'll give it a few months.

But maybe I won't spend those months trying to make Apple's feeble iCal work. If Apple does fix the currently broken iPhone Outlook sync (I think they will), then I could just sync my iPhone to Outlook 2007 at home and start using Live Calendar.

I could even start by synchronizing Outlook with Windows Live, then subscribing to the Windows Live calendar from our Google Apps family calendar.

Then if Apple continues to bury the iPhone, I might see what works with Windows Live...

Maybe I should buy shares in Microsoft. They're starting to look warm and fuzzy.

Update: gCal is published with the https:// protocol. To view in iCal or Windows Live Calendar (beta) change https to http. I also see it takes a very long time to get all the events to cross the feed.

Google Calendar - bad iPhone news

I started out with a LOT of options for my calendar migration, but they're dropping like flies.

So while I'm optimistic about BusySync for gCal to iCal sync, I was dismayed by gCal mobile:
Google Mobile - Calendar:

... On the go? Stay on track with Google Calendar on your mobile.

* Keep track of your schedule, without having to sync your phone with your computer.
* Share events and calendars with friends, family, or colleagues.
* Set up mobile phone notifications."
Ok, now reread that marketing drivel. What's not mentioned?

Oh, like, no ability to edit or remove calendar items? So you better make sure your "Quick Add" works, because you won't get a second shot.

Ok, rule that one out. At least, rule it out as a direct option.

Update: Oh, in case you were thinking of injecting the MobileMe calendar into the mix ... there's no support for feeds, or subscriptions in MobileMe calendar. Indeed, the ability to sync iCal calendars was lost in the MobileMe transition.

ePocrates on the iPhone

Epocrates Rx iPhone appears to work. Initial impressions are that it's a large improvement over ePocrates on the Pearl, and in terms of utility it's probably comparable to ePocrates Palm.

The med images are particularly impressive.

The only downside is I think it's getting more obnoxious about insisting I glance at the marketing material that pays for the service. I hope they're not running into funding problems -- that's usually what makes ad-funded vendors push the marketing.

My iPhone 2.0 impressions so far is that synchronization with Outlook or MobileMe is a disaster, Outlook sync is a regression from iPhone 1.0, and basic PIM (calendar, etc) functionality scores a D-. Everything else is pretty good.

Friday, July 25, 2008

Missing sync: the only vendor that uses the iPhone sync conduit

How does Markspace do this?

I haven't seen any other vendor able to get at iPhone data via the conduit:
The Missing Sync for iPhone - Mac Version - Notes

... Transfer notes from your iPhone into Bare Bones Yojimbo, Microsoft Entourage or the included Mark/Space Notebook to search or copy and paste content easily...
If they can get across the conduit, could they sync an iPhone task application with iCal tasks?

Spanning Sync vs BusySync for iCal gCal sync - with a clear winner

I dread the thought of dealing with Apple's MobileMess. Apple has amply demonstrated they can't do reliable cloud services; dotMac was an intermittent disaster for years. They had one chance to show they could do this, and they blew it.

Apple should have delayed the transition. Big mistake.

So I'm even more committed to a Google solution. I'd take a look at Yahoo!, but they're in a corporate death spiral. Heck, I'd take a look at Microsoft, but I'm pretty committed to OS X and they're not.

You can directly subscribe from iCal to a gCal calendar -- I'm going to see if I can fit that into my iPhone workflow. It's not a sync solution however.

Google has a tool to allow Outlook to gCal sync, but they haven't done one for iCal. Given how bad their Outlook sync launch has been (synchronization is hard, but Google has issues too), that's no great loss.

There are two commercial alternatives: Spanning Sync and BusySync. Missing Sync, which we licensed for Emily's Palm, and licensed again for her Blackberry, deals with device to machine sync, so they're not a contender. Too bad, they do pretty well.

BusySync is sold as a product, Spanning Sync is a service with a per user license. So for a shared machine BusySync may be less expensive, though that's probably not the licensed use.

Here's what made my trial decision easy however:
  1. Spanning Sync offers a 15 day free trial. The main page doesn't tell me what it costs.
  2. BusySync has a 30 day free trial. The main page tells me it costs $25
I distrust any vendor that hides their costs.

BusySync wins. I'll download their trial. If they fail, then I'll take another look at Spanning Sync.

Update: I gave BusySync an acid test -- and it failed. I reset a Google Calendar, then checked to see if BusySync would remove all the iCal appointments. It failed, instead I saw many ghosts. I'll give it another chance, but if they fail again I'll try Spanning Sync.

Update: Ok, BusySync failed completely. On to Spanning Sync.No - it was Google Calendar Sync that failed that time. So BusySync only failed the removal test. So it's not out of consideration.

The NULL comparison trap: Escape with NVL (Oracle) and Nz (Access)

This is disgusting. I’m sure I once knew better; maybe writing this up will help. A quick Google search tells me I’m not alone in my stupidity, so maybe this will help others who aren’t truly DBAs, but have to play with data.

I got caught be the NULL trap. I think this might be why some databases are designed to never allow NULL values, but to use, for example, an empty string.

The NULL trap is impeccably logical, but infuriating.

Say you compare the values of two fields, one of which is Non-Null and one is Null. Are they different?

I think so when I look at them, but I think the “proper” answer is “NULL”. Meaning – “I don’t know”.

That’s because NULL doesn’t mean “nothing”, it means “could be anything”.

Consider this Microsoft Access 2003 query:
SELECT pub_CC_qry.CG_CC_ID, pub_CC_prior_qry.[Abbreviation prior], pub_CC_qry.Abbreviation
FROM pub_CC_qry INNER JOIN pub_CC_prior_qry ON pub_CC_qry.CG_CC_ID = pub_CC_prior_qry.CG_CC_ID
WHERE (((pub_CC_prior_qry.[Abbreviation prior])<>[abbreviation]));
It returns 62 rows. It doesn’t return 28 rows where one of the two columns contains a null value.
This qeury returns 90 rows, but it’s a mess:
SELECT pub_CC_qry.CG_CC_ID, pub_CC_prior_qry.[Abbreviation prior], pub_CC_qry.Abbreviation
FROM pub_CC_qry INNER JOIN pub_CC_prior_qry ON pub_CC_qry.CG_CC_ID = pub_CC_prior_qry.CG_CC_ID
WHERE (((pub_CC_prior_qry.[Abbreviation prior]) Is Null) AND ((pub_CC_qry.Abbreviation) Is Not Null)) OR (((pub_CC_prior_qry.[Abbreviation prior]) Is Not Null) AND ((pub_CC_qry.Abbreviation) Is Null));
The secret is the Nz function. Wrap any column that might contain a NULL in Nz, and LOT of things, including iff comparison functions and SQL comparisons work a lot nicer:
SELECT pub_CC_qry.CG_CC_ID, Nz([Abbreviation prior]) AS Abbreviation_Prior, pub_CC_qry.Abbreviation
FROM pub_CC_qry INNER JOIN pub_CC_prior_qry ON pub_CC_qry.CG_CC_ID = pub_CC_prior_qry.CG_CC_ID
WHERE (((Nz([Abbreviation prior]))<>Nz([abbreviation])));
Arrgggh.

So what about Oracle?

I’m not precisely sure how Oracle is handling this situation in comparisons. I’m still researching Oracle’s behavior. It does, however, have a function similar to the Access Nz function; it’s the nvl function:
How to use the nvl function in Oracle
The NVL function is used to replace NULL values by another value.
The syntax for the NVL function is:
NVL( value_in, replace_with )
value_in if the function to test on null values. The value_in field can have a datatype char, varchar2, date or number datatype.
replace_with is the value that is returned if value_in has a null value. The NVL statement works like this pl/sql code:
if (value_in is NULL) thenreturn replace_with;elsereturn value_in;end if;Sample code: select nvl(salary, 0)from employees;select nvl(ref_code,'Unknown')from users;
Here’s an example, and a response from a friendly DBA:
Select * from A, B where A.ID = B.ID and A.name != B.nom

Imagine

A.ID = B.ID = 7
A.name is NULL
B.nom is not Null

How do you get Oracle to return the row in B where B.ID=7?
Answer (I think for our purposes this would work if we just used NVL([column_name],’’) for our string comparisons)
I think what you're after is the NVL function, which converts a NULL to a substitute value for comparison's sake.

So in your query, we would replace a null A.NAME with an outlandish value like 'A1B2C3', and replace a null B.NOM with same.

SELECT * FROM A, B WHERE A.ID = B.ID AND NVL(A.NAME, 'A1B2C3') != NVL(B.NOM, 'A1B2C3');

The above query will *not* return rows where A.ID = B.ID and A.NAME and B.NOM are *both* null. If you also want those rows, then you need to tag on that condition to the end of the query like this:

SELECT * FROM A, B WHERE A.ID = B.ID AND ((NVL(A.NAME, 'A1B2C3') != NVL(B.NOM, 'A1B2C3')) OR ((A.NAME IS NULL) AND (B.NOM IS NULL)));