Thursday 29 July 2010

eBook Revolution

A few years ago when the first eBook readers starting hitting the shores of the UK I was mildly interested. I think the main model catching the attention of the media was the Sony PRS-505. It was fairly impressive from a gadget point of view, but when I tried opening a PDF of a book I was reading at that time (password protected) it failed to open. In one stroke that signalled the death of my interest in the device.

That was probably about three years ago, and since that time I've kept one eye half open on the eBook reader market, but the high price of books and limited availability has always meant that I've never really bothered considering getting a device again, it's more been a slight interest in the technology.

Today I read that a new model of the Kindle is being launched in the UK (i.e. from Amazon.co.uk) directly with a 3G and Wi-Fi only version available, which has resurrected my interest once again. There's a few books I need to buy, and even more I already have as PDFs, so do I take the plunge for situations where a laptop is less than ideal?

Two things remain that are putting me off:

1. eBooks are still too expensive. Amazon are discounting at the moment, but as with printed books the deals will slowly fade over time I imagine. Looks like the publishers learnt nothing from the mistakes made by the music industry.

2. I still don't know if all my PDF files will open in the reader.

That said, there is a wealth of free books out there, so that may help sway me. The other driving force is the fact that many of my text books weigh more than the laptop, so it's not nice carting them around.

Either way, it's not going to be on my pre-order list, so I have time to save and read some reviews.

Is now a good time to start bleating on about touch screens again.... yes I know you can get the kindle reader for the iPad, but another selling point for me is the e-ink screen. There's also the price.

Sunday 25 July 2010

When Did Everyone Turn Against Stored Procedures

I forget when I first started working with Stored Procedures in databases, but it was probably back in 1996 when working on the Teletext Commercial System.

Back in those days we developed against Microsoft SQL Server (as far as I can remember this was version 6) and much of the business logic and database integrity was coded in SQL. I remember we had prefixed the name of the stored procedures with 'sys_'. That wasn't my choice, and I quickly discovered that only the in-built system stored procedures should be named as such. Still it was a small point and since it wasn't my choice and had no detrimental effect it was, by that time, best to leave alone. Regardless, this was a client/server application, and the stored procedures suited us particularly well.

My next position was on a multi tier project (Delphi-Java-Sybase) where we used stored procedures primarily for database integrity and serving the middle tier objects for data retrieval and persistence (that's being a little unfair, it did more than that, but this was the primary role).

On this project 95% of the business logic was stored in the middle tier. By contrast the database used stored procedures, via metadata enabled objects, to quickly retrieve and persist data reliably, and safely. The system, whilst not perfect, was a lesson in good design and worked extremely well. Stored procedures were used in many other places where the data was manipulated (reports spring to mind), after all, if you are relying on retrieving masses data to perform a task, sometimes it's more efficient if (at least the preliminary) processing is done near the source of that data without relying on factors such as network bandwidth getting in the way. Also, the fewer bits you have clogging up the network, the better, especially to a distributed user base and infrastructure.

The stored procedures may have also helped with replication, I don't clearly remember as it was a long time ago, what I do know is that it seemed to work very well, and whilst there was always debate between some of the middle tier developers and the database lead as to who should be doing what, mostly it was harmony between all.

In my next role I initially worked on a system where virtually all the business logic was contained in stored procedures. It was hideous, but this was mainly down to (in my opinion) very poor stored procedure design, and the fact the stored procedures themselves were written in an awful mid-way language (not quite SQL, but not quite any other programming language you've seen before) which was then compiled into very poor SQL code (imagine a stored procedure where the first several hundred lines may be blank lines and you'll get the idea).

The stored procedures in this code could run to thousands of lines and certain members of the team relished the fact they were very nearly un-maintainable. With better organisation (we call it refactoring these days) this diabolical situation could have been eased a little, the bad code wasn't entirely the fault of it being implemented via stored procedures.

This is of course my perception of things, although I doubt many would claim it was good.

The next company I worked for almost had a fear of using databases. Initially this upset me, but after a while you go with what you're given and don't rock the boat (again I say "if it works well enough, leave it alone"). We're talking here a situation where we were storing XML in the database as raw text. Yes, you did read that correctly. I'm going to almost certainly be unfair here (by which I mean I *may* be giving a misleading impression) by saying that one of the primary reasons given to me was that changes could be made to the code, without routinely having to alter the database schema. That's just lame. If one relies on a change in the other then so what? Mind you, this is the same mentality that said procedures running to several pages were "self documenting" and that comments in code were bad as they quickly become out of date (so surely part of making a modification is making sure they are updated... oh, never mind, I've posted about that before).

Essentially (and to cut a long gripe short) the project had moved from Paradox, so the team lead, in my opinion was both unaware of what databases could do (and how well they could do them) and was just plain scared of databases.

In my current position I'm working with, what appears to be, a good codebase. It's Java running against an Oracle Database. One thing has struck me though (and bear in mind I'm new to Oracle) is that I can't find any stored procedures?

I know the code uses Hibernate, with which I'm largely unfamiliar, so this may be why, but as an uneducated outsider I'm a little surprised (although not entirely saddened). If the implementation doesn't need stored procedures then that's fine (but where are the triggers? I know a lot of thinking sees these as evil too).

Oh well, new code, new concepts. That's what it's all about. I look forward to finding out more. Perhaps I'll search the web in a moment for Hibernate introductions.

To close with an aside, many projects are reluctant to use stored procedures as it ties you down to a particular back end technology. That's fair enough for some projects, for example I've written plenty of applications that needed to function against whatever back end they were placed against. The amusing thing is however, in the case of the Teletext system I wouldn't be surprised if the stored procedures outlived the application itself, which was coded in Delphi. I imagine that was converted to C# or Java some time ago (if it's still around). Of course I may be wrong, I've not been back since late 2000.

Friday 23 July 2010

I wonder how this will pan out...

Well, I don't think Microsoft will be loosing much sleep over it, but it appears that two unrelated situations mean I'm going to start looking into developing Android applications rather than for Windows Phone, at least in the short term, allow me to explain:

The first culprits involve the decisions Microsoft are taking with the direction of Windows Phone 7. It started off with the removal (or is it actually more accurate to say omission?) of Cut and Paste functionality. From articles I've been reading recently this is down to a lack of time for getting it developed by release time, rather than not knowing how to implement it. As a friend from Nokia commented "What, were they worried they could do cut and not paste in the time available?".

The lack of C&P was originally sold to developers as a conscious decision ("A phone doesn't need C&P" - Really? Then why write Office Tools for it?), now we're told "it's coming later". Not the end of the world, but frustrating. Still, I agree it's better to get it right than put in something that's buggy or badly designed and then be stuck with it forever more.

The killer move, for me, is the apparent lack of any way of side-loading applications. As is the case with iOS, you get your applications from Windows Marketplace or not at all. That's essentially shut me out. It's all very well running anything I code in a desktop emulator, but then I may as well have just written a desktop application. If I can't actually get it onto a phone (and possibly those of my friends) what's the point? This is the number one reason why I've avoided Apple phones all this time.

Then there is the work related chain of events.

When I started out at my previous job the plan was to move into C# (as I believed the role required, it's certainly what was advertised and what I interviewed for). Previously I had been working in Java but I was happy to move to C#, it's a great langusge. Being a Java developer a large personal application I had been working on I was also written in Java. When I "moved" to C# I started porting my code over too. Doing such things works as a good aid in getting to grips with a new language or language features.

Now I'm going back the other way to Java as the primary language in my work role, so guess what else I'm now planning on doing? [Moving my application back to Java]

Here's the killer: Just as I was hoping the C# code would allow me to share core components of the application between Windows, Windows Mobile and Phone, and possibly web sites, it turns out that the primary development language for Android appears to be Java.

So now Java potentially gives me access to Android Phones, The Android OS (for Laptops, Slates, etc.), and with a little work (hopefully not too much) Windows, Linux, MacOS, possibly even MeeGo. Oh, and I believe web servers can also run something called servlets too. Oh, and just for fun, the Windows Mobile phone I currently have includes Java too... oh, and I know S60 used to run Java. Wow!

The killer which I'm brushing over is obviously that there will be an incredible amount of work to customise the user experience and display for each system, possibly this could be the lions share of the work, but I do at least take some comfort that at least some of the core business logic may be sharable between systems.

Looks like until my priorities change again this is the logical route for me to get back into Java in my spare time above the demands of work.

So now the new laptop has arrived one of the first things going onto it will be a shiny new install of Eclipse and the Android SDK. Oh, did I mention that's all free? That's possibly a little unfair a comparison, the Express versions of Visual Studio are excellent (that's one of the downsides to all this, I find the Visual Studio IDE an absolute joy to use. For Java development I prefer NetBeans, but since I'm on Eclipse at work, and most of the Android documentation references Eclipse I may as well use that).

Will you ever see any of these fruits of my labour? probably not (almost certainly not), but the point is the more I play, the more I learn, and as long as some of that is relevant I end up getting something out of it over and above the hobby side.

Now, of course, I'm reliant on Oracle not screwing things up with Java (well, no more than Sun managed at the very least).

Fingers crossed.

Thursday 15 July 2010

Testing Times

Looks like this is going to be one of those rare blog entries that will live in both my tech and personal blog since I don't know where to put it. I guess that's good. Anyway:

Well, it's week number four in my new job. i have a desk, a machine and I'm just about set up with my development environment. There's a few things I've not been briefed on or covered yet, some of them quite basic (like how about giving me a Jira account, that may be useful soon, or on what branch do these guys do all their development, surely not main_latest all the time?!!)

So what have I achieved so far?

Well, not a lot yet, and it's starting to bother me. I've so far been given a single 2 part task with the aim of speeding up the build tests:
  • Go through a bunch of JUnit tests and remove anything not testing actual business logic (so for exampe if its a persist or retrieve operation, take it out).
  • Investigate getting the JUnit tests to run in parallel.
That's not so bad for a first task on an unfamiliar system.

So I spent just under a day looking at a select bunch of JUnit test code trying to decipher what was and wasn't a business logic test. Sounds quite easy, but since a lot of methods are masking non-business logic, it's very easy to leave them in. Similarly, what looks like a persist operation may be an actual calculation of one variety of another. Then you have the methods that call both responsibilities, or rely on persisted data to pass. It's not as easy as it first looked, especially on an application with which you are not familiar.

The upshot of all this? I came to the conclusion that there probably wasn't any business logic being tested in the set of tests I was looking at. I was, as you might imagine, uneasy with this deduction, it felt wrong and I couldn't be 100% sure my findings were correct, however when I returned to my "mentor" for this task he didn't seem to surprised and commented "I've skimmed over this myself and I didn't see anything leap out either."

Oh thanks.

Actually one thing that did amuse me, I had flagged up one test as possibly being business logic, however as my mentor was looking into this I noticed a section of code that clearly suggested otherwise, so at least I beat him to that one.

With that task out of the way I started looking at making the JUnit tests run in parallel. A little research on the web revealed what was needed (including a version of Spring that's still in RC status). Undeterred I created a small project with a bunch tests to try this stuff out, and sure enough it worked as I expected (albiet without a hint of Spring in sight, unlike the real project). So how did it go once I started applying this new found knowledge to actual project... well I've been on it a week now and I'll be sure to let you know what I find when I finish (if you ask nicely).

I've been hit by numerous issues with my development environment, and on the odd occasion when things do work as expected, a run can take up to 26 minutes (usually closer to 19 for a full run - at least for what I'm covering). The worst thing is I'm only making changes to a handful of POM.xml files and so far the results show no avantage at all. At this rate my findinge will be: "Hey, I've spent over a week and can't get any speed increase". That hardly makes me fell very good and I don't actually feel I've achieved anything yet. Especially when for the most part my day consists of the following routine:

  1. Start machine. Spend 1 to 2 hours getting the build to work properly.
  2. Make a small, well trodden modification to all 4 instances of a command in 3 pom files. (5 mins max, probably closer to 2 mins)
  3. Fire off build and wait to complete (up to 19 minutes if it completes)
  4. Investigate any errors or note timings (2 to 10 mins).
  5. Repeat from step 2 until time to go to lunch or home.
I can't help feeling this should have been finished some time ago. I know deep-down proving something doesn't work is as important as proving it does, but this seems to be dragging now. it feels like my fault, but frankly i don't know how to make it better, it's just the nature of this particular beast.

I guess deep down I feel the need to prove myself as the new boy, and with this task I feel like I'm coming up short, rightly or wrongly. Oh well, I guess that could be me worrying too much. Sometimes, that's just the way it is.

Wednesday 14 July 2010

Evernote

Whilst at EvaluatePharma I was singing the praises of OneNote from the Microsoft Office suite of applications. This, especially on a Tablet PC, is a superb piece of note taking software recording audio along with text or handwritten scrawls if you have the hardware. OneNote can take an image and find text within it (so for example you could photograph a business card, add it to OneNote and later a text search that happens to contain any information on the card will bring it up as one of the results), and being part of the Microsoft Office suite, it links quite nicely with the other apps as you'd expect, and takes web clippings from Internet Explorer too.

Amongst the myriad of other features I also found the collaboration side of OneNote to be excellent, specifically I could open a OneNote notebook from a network drive on my PC, edit it, and it would automatically sync next time I opened it on my laptop. If I was working with a notebook whilst disconnected from my network, when I got home it would sync changes and these would replicate over to other devices. With the advent of Office Web Applications this can now be done over the internet too, and editing can take place within the browser with no need to install or even own a copy of the desktop application.

OneNote is frequently considered the hidden jewel of Office by those who have used it, indeed a while ago it featured as the only Microsoft product in a list of top 10 essential applications that was heavily dominated by open source and free software.

The major downside with OneNote is that the office suite used by many companies is out of date or does not include the app, and I suppose the fact it is not free.

Step-up Evernote (http://www.evernote.com). Evernote is one of the many alternatives to OneNote, and the one I use most regularly. Evernote comes in two flavours, free and paid for. Both use the same client software, both store to the Amazon hosted cloud, the main differences are the amount of traffic you are allowed per month, and the file types you may attach to your notes.

Evernote may be run from a web browser, or clients exist for several of platforms (Windows, MacOs X, iOS, Android, Blackberry, Windows Mobile, Palm Pre/Pixi). No matter what metods you choose, Evernote can sign into the central repository and synchronise your changes between the various clients. Evernote also implements several pieces of functionality found in OneNote, for example finding text in images (which is scanned on the server; paid users having priority in the queue, but this has never been an issue for me).

There's lots of stuff OneNote does that Evernote doesn't, and a few features in Evernote that I'm not aware of in OneNote (for example I tag notes extensively in Evernote). Best of all, because the clients are free I've installed them at work where I can, and use the web version when this is not possible. And because Evernote isn't well know like, for example SkyDrive where OneNote stores its web shared files, it's not blocked by as many corporate firewalls yet.

The free version has been ample for my needs (I've never used more than 3% of my monthly data allowance, despite using the tool extensively) so it's well worth a try even if you do have access to OneNote.

Of the two, OneNote remaind my favourite, however Evernote is currently used far more often. It's well worth looking at.

Monday 12 July 2010

It’s not me, I’m perfect!

I think I'm in a minority here, but the state of comments in some code is truly appalling, and the worst offenders are those who think their code is so clear or logical it doesn't need commenting.

I've worked with many such delusional characters over the years, and it always seems to be he ones who should know better, the "above average developers", and you can measure that however you feel.

The thing is, they are correct, or at least they would be if they were working on one-man projects. The code is clear to the author as it comes from their thought process. What's obvious to them is often far from obvious to everyone around them, and this state of affairs is made worse when using call-backs, events or making use of things such as multi-threading.

The argument is usually either "the code is self commenting" or "adding comments will confuse the code" and "comments become out of date quickly and therefore misleading". I'll briefly address these points now:

The code is self commenting.

Indeed, the code ideally should be, but how about a general overview of what happens? And is it really? The people who claim the code in such are often the authors of long, convoluted methods, with no clean responsibility, lots of inner classes or methods (depending on the language).

This code is difficult for others not familiar with it (often that equates to everyone other than the original author) to follow, but amusingly it is often tricky for the original author to understand when returning to code after some absence.

The times I've seen such developers struggle to understand what they were trying to achieve in a piece of code is frightening, but they normally get it fairly quickly as it comes from their imagination. If only everyone else was looking at it from the same perspective, then you may have a point.

Yes, the code can be self commenting, but to me this means well named methods with a clear responsibility, not a 40+ line method that covers all branches of execution.

Adding comments confuses or detracts from the code.

Well, it's often subjective, but I agree that adding too many comments does detract from the code and make it more difficult to understand. Having said that, a comment that briefly describes what a particular method is trying to achieve (something akin to JavaDoc or the .Net triple slashes if available) can be an immense aid to a tired developer trying to understand how something is supposed to work. This can occasionally even be a reference to the functional specification if you're lucky enough to have one. Such comments can be easily ignored if you find them offensive.

I'd also go so far at to say an occasional comment before a section of "non trivial" code can help both the initial development (I often use comments to help provide a skeleton and program into them) and future maintenance.

Comments become out of date quickly and therefore misleading

Then you're not treating them with the respect they deserve. Isn't that a bit like saying "it compiles so it will run?". Of course, tracing comments that need updating can be a chore, but if they are finely grained and focused on what is actually happening  in the particular concern they are attached to, code and comment modifications can be performed hand in hand. Anything else, go to the specification.

In my opinion you should target your comments at others not yourself (although having said that my memory is sufficiently poor that I will happily use my own comments as a reminder). Assume little and ensure you give a decent starting point for further investigation at the very least. And for the love of god comment any gotchas or what you did to avoid them. Often we add code that looks out of place or redundant just to get around such things (yes, I know there may be a design flaw, but we'll code with a view to make a refactor as soon as we can go more easily and actually get the product out of the door (and that's a whole other post).

I could go on with this post, but in a nutshell I'm just sick of trawling through thousands of lines of uncommented code that should make perfect sense, but are complex enough to only be apparent to the author, and even then the author often struggles.

Friday 9 July 2010

Willing to drift?

As if the love-in for Apple devices at BP isn't enough, I recently watched a guy on my train home using his iPad as an eBook reader. This got me thinking "I could be tempted by an Android slate" (see earlier posts for why iOS and Windows Phone devices are not on my radar).

The is remarkable for me as only a few months ago I would not have entertained this thought at all, in fact I was only interested in running Windows 7 on a tablet. I have to admit my ideal device would still be this, but the swish iPad equivalent hardware for PC devices is, I fear, still some time away.

I loved my tablet, but it was too bulky, too underpowered and the screen was too dim/fuzzy due to the touch functionality. However. technology moves on and now all of these issues have now been solved, but strangely not in one device.

Touchscreens are now much clearer and more vibrant. The mobile versions of the Core chips and similar offerings from AMD are very capable. Laptops, whilst not as light as an iPad also weigh much less now. And the deal maker or breaker for my next purchase will be battery life (I had too many occasions with my last tablet where it died half way through a journey home).

I had whittled my choice down to either an HP tm2 tablet, basically an updated version of my current (very sickly) tablet, or an Acer 5820 with an almost 7 hour battery life and Core i5. Out of the two the Acer is a more powerful machine, but lacks the touchscreen, if only they had included this I'd have had the credit card out last week instead of still plucking up the courage to part with my cash.

And that's my point; why is it so hard to put a touchscreen on a decently specified machine? I know it's going to add to the price, weight, and you have to design in the hinge, etc., but it's surely not that difficult is it? Who is going to be the first company to step up to the mark? It's a problem that's been commented on for an age, and now just seems to be accepted: "It you want a tablet or slate you must sacrifice power and other features". Why?

So it seems I'm going to be stumping up for a regular laptop this time, safe in the knowledge that my ideal tablet won't arrive at least until it's time to upgrade again, possibly after this (Did I hear Windows 8?).

So what about the Android slate? Well the reality is I have no neeed for a slate device so it's just a "perhaps one day" thought. An iPad may have appealed if it supported flash and wasn't locked into the app store.

What really strikes me, as I mentioned before, is how I am now even considering an Android device over Windows (be afraid Microsoft, you're starting to loose the faithful like me). But at the same time I take comfort in the fact that I am able to see beyond the brand, and it mirrors what's happening on my desktop too.

Sure I've experimented with Linux over the years from Red Hat to Ubuntu, but for all its sins Windows has suited me far better (yes, even Vista). Linux has always had an air of "not quite" about it, not for everyone, but for my "needs" and probably "wants".

18 months ago I went mental when somebody installed Chrome on my mums PC. I was running mostly Firefox and a little IE7 when required. When IE8 arrived I found it better for my liking than Firefox (which had started to show signs of copying the worst problems of IE) so switched back to mostly IE8. Now I find I'm increasingly using a combination of Chrome and IE8, especially after reading the results from a recent security conference where all the other main browsers were hacked in around 10 minutes, yet for the second year running chrome resisted attack.

On the Java IDE front I used to be a massive fan of JBuilder. This was eventually replaced by Eclipse in my toolbox, then Netbeans, and now, mostly from necessity, I find myself back to Eclipse again. It's just a case of the right tool, or the necessary tool for the job.

As I get older I'm having less of an emotional tie to software and devices, and more of a practical attachment, which is why I don't need to be locked in any more than is necessary. Of course, this is not possible as any software I do buy, unless it is free and available on multiple platforms, will inherently be tied to a platform(s).

That's one of the reasons why things like Adobe Flash, Java and to a (much) lesser extent Silverlight and .Net are important as they facilitate some level of platform drift. And that's the real reason why Apple doesn't want you to have them.

The rumor for Windows 8 is that it too will have an application marketplace. The way Microsoft seem to be mimicking Apple these days, I fear the day when you can only run approved applications in Windows may not be far off. When that happens perhaps it won't just be Google's Chrome that's on my desktop.

Wednesday 7 July 2010

Damn you HTC...?

I've always been quite keen on keeping the firmware of my phones up to date, so as soon as a new ROM image is made available I tend to install it at the earliest possible opportunity. This doesn't tend to happen very often, and is made worse when the phone is operator locked, however you can normally count on three or four updates during the first couple of years as long as the phone remains a current model.

My old Nokia N95 was locked to T-Mobile, so many updates never appeared, and those that did usually appeared several months after the generic roms had been released into the wild. This time around, my HTC Touch Pro2 is a geneneric unlocked device, so I'm at the top of the list when it comes to ROM updates.

The TP2 was supplied with Windows Mobile 6.1, and soon after the 6.5 upgrade was released I updated to this. Everything was working very well and the phone was very stable, 6.5 looked fairly impressive. A few months after this another new ROM image was released containing a some bug fixes from Microsoft and an update by HTC to a later Sense UI featuring closer integration to FaceBook and a built in Twitter client, so I duly updated to this - and that's when my troubles started.

I suspected the new Sense UI was ported from the version written for the HD2 or similar recent Windows phone, as the whole responsiveness has became considerably slower than the original WinMo 6.5 Sense UI. I can't help thinking it was therefore aimed at the newer, faster devices, and just slung onto older models with few, if any, modifications.

The first thing I noticed was updating contacts linked to FaceBook. At first I though this just crashed, in actual fact it's taking several hours (even over a Wi-Fi connection) to update the few contacts (sub 20) I have linked to their FaceBook profiles. That's not really acceptable

The bigger problem I've encountered is a couple of times when making a call. What happens is I'll select my contact from the list, and the phone will report it's calling them... until a different contact from my list answers. When you hang up the phone history list correctly states you called the wrong number.

This is simply not acceptable.

Along with this, the phone has become very unstable, locking for minutes at a time or crashing altogether on a frequent basis, I've even missed a couple of calls due to this (and been unable to terminate calls on several occasions ). I can also forget about using the speaker-phone (although that may be yet another hardware fault).

As mentioned I suspected this wasn't so much down to the underlying OS as much as Sense itself. To prove this I turned the Sense UI off and for the first time tried to use the new Windows Mobile 6.5 UI instead. It's not as good, but I figured that if it works it will be bearable until they hopefully release another ROM update.

I'm now a few days in and whilst there's several things about Sense I am missing, the actual 6.5 UI isn't too terrible. Interestingly, I'm not yet sure if things have been made any better on the reliability front. The phone does now boot several seconds faster (as it no longer needs to load Sense), but I have had at least a couple of occasions where it has frozen for several seconds, so if it is better now, it's not by much at the moment (Apple fans please don't tell me this wouldn't happen on an iPhone, I know several iPhone users who regularly curse the reliability of the device, one even has to reboot his phone every time he travels from London City to Docklands for some bizarre reason. This isn't just an issue with Windows Mobile).

I'll probably try a hard reset at some point but since these problems started soon after a bare update, I'm not hopeful. I'll be sure to let you know how I get on.

Of course, the downside of all of this is that I'm now a little wary of getting another HTC phone. I was thinking of a Nexus 2 if that's out by the time my contract comes up for renewal in December. We'll have to see now, mind you if it is down to the underlying OS, I'm unfairly giving HTC the blame. Mind you, I don't suppose Android is flawless...