Well, that could have gone better

I volunteered to give a presentation to Linux Users Group of Rochester (LUGOR) about LVM, the Logical Volume Manager. I knew I had half an hour, and so I made a presentation, rehearsed it several times, and knew I could go through it in half an hour. I did it on my laptop, using VirtualBox to stand in for a computer that I could virtually add and remove drives from. I was told the room we were presenting had a projector that took HDMI input, and my laptop has an HDMI output, so I figured I was set.

First hitch was arriving to find out that we had been bumped from our room because some musicians were warming up for a concert they were giving elsewhere in the building, and the new room had a projector that only took VGA or DVI. Oh, and also I’d evidently gotten my signals crossed and I was really supposed to present next month. But no mind, the guy who was supposed to give the second talk today wanted to go first because he was sick and wanted to bail early, and the guy who was supposed to give the first talk wanted an hour not half an hour and would rather postpone. So the guy who wanted to go first talked first, and got me all intrigued about “ownCloud”. I may be setting that up one of these days.

Then the first room became available again, and we trooped back to it. And then I plugged in my laptop, got the two screens non-mirrored all set up so I could do the Powerpoint presentation part of the show, and then the projector screen started randomly flashing between what it was supposed to be showing and a green screen with something about HDCP displayed on it. I didn’t know it at the time, but that means that the copy protection stuff on my laptop isn’t compatible with the copy protection stuff on the projector. We spent some time trying to wiggle wires, change settings on both the laptop and the projector, etc, and finally I gave up.

Another guy gave a good quick little presentation on the Raspberry Pi. Amazing power in such a small cheap package. I’ve got one on order for another project, but it might be many weeks before I see it.

While he was talking, one of the other members handed over his laptop. It was an Acer that isn’t as high end as my MacBook Air, but it had two things going for it:

  1. It had already proven it could display to the projector, and
  2. It had VirtualBox installed on it.

I copied my VirtualBox disk files and my PowerPoint over to his laptop, and when the Raspberry Pi presentation was over, I started my presentation. And that’s when the next problem reared its ugly head. Every time I booted my VirtualBox instance on my laptop, it takes about 10 seconds or so. Every time I booted it on his computer, it took literally 10 minutes or more. Since I had to reboot several times in the presentation (because I was simulating adding and removing disks), this caused the presentation to drag out drastically. Fortunately there were lots of things to talk about during those long pauses. Charles, the organizer, used one of the pauses to explain in great detail what exactly I was doing with the VirtualBox and which parts of what I was showing belonged to it and which belonged to the guest OS and which belonged to LVM, something which I fear I hadn’t even though to explain in my presentation. With all the long pauses and delays, my “30 minute talk” ended up being somewhere between an hour and an hour and a half. And worse still, on the very last boot of my talk, I discovered that if I increased the number of virtual CPUs from 1 to 4 the boot went much, much faster. I’d only ever used 1 virtual CPU on my own laptop and hadn’t noticed any problem – I don’t know if that’s a difference between my i7 processor and the loaner laptop’s i5, or because mine is hosted on OSX and his is hosted on Linux. I wish I’d discovered this earlier in the talk, though.

If you care, slides are available at https://www.dropbox.com/sh/y4822v4k6am0s9s/IFhrMz-HEW/lvm.pptx but probably not for too long.

Well, that wasn’t as easy as I’d hoped…

In my job, I often have to make accommodations for the security desires of my clients. That can be a massive pain in the ass, but it’s better than working in an office.

So when I started this new job, I worked on my Linux box and my Mac laptop, with a massive preference to my Linux box because it’s got two nice big monitors, a really nice clicky keyboard, and I have all the ergonomics dialed in. I had Postgres running on both systems already for other purposes, and it wasn’t hard to install the software we were using as the base system on both. I kept the software in sync between both of them and the client’s dev server using git. Everything was beautiful. For accessing things like time sheets and corporate email, as well as connecting to their dev server, I had to use Citrix, which was a minor pain, but fortunately I didn’t have to do it very often.

But then the client said “oh, that test database we gave you has real employee ids and the like, and so we need you to take some security precautions with it. Specifically, you need to turn on full disk encryption on your laptop, and purge the copy of the database on your desktop.” It took a bit of work, but I managed to get it so that my software would still run on the Linux box and connect with PostgreSQL on the laptop over an SSH tunnel, and so I’m in compliance with their wishes – I do have to remember to shut down the test server on my Linux box and the SSH tunnel before removing my laptop from the LAN, but that’s ok. That’s what you’ve got to do in this brave new work of computer security.

But now we’re entering a new phase of the project, where my code has to talk to a web service that a different group at the client site provides. And that web service is only available inside their firewall. That gives me a few choices for development:

  1. Do my local development without benefit of the web service calls, “comment them out” or the equivalent, and only test them when I “git pull” the code down to their dev server. Not a great option, because the code I’m testing locally is even further away from their code.
  2. Write a dummy web service on the Linux box or my laptop or both, and use that for testing. Probably feasible, but more trouble than I’d like to go through.
  3. Get a VM on their site where I can do development and testing both.

The last option is probably the easiest. It also means I can get rid of my copy of their database, and therefore get rid of full disk encryption on my laptop (which means no more typing my password every time the display blanks). The downside is that the VM will probably be Windows, which is nowhere near as nice to do development on as Linux or Mac, especially if you don’t have admin privs and so you can’t install the stuff you like. (I’m guessing I can’t install Sublime Text, not sure even if I can install gvim.) The real clincher is whether I’m going to be able to install a version of the base software or not, because if I can’t do that, I can’t work. If I can install it, then I probably can work that way – it’s a simple as that.

But if I’m going to do that, I’m going to want to log in from Linux because of the ergonomics I mentioned earlier. I’ve been using my MacBook Pro (or even this shitty Dell laptop I have for testing purposes) to log into Citrix because I didn’t want to install the Citrix client program on Linux. But needs must, etc. I looked on the Citrix web site and they have a .deb “for 64 bit Linux”. I downloaded it and clicked on it, and it said that it needs to install 246 other packages to satisfy dependencies, including 32 bit versions of nearly every major library out there. Sorry, Citrix, that’s not my definition of a version “for 64 bit Linux”. Ok, I thought, I know a way around this! I’ll install a 32 bit version of Linux in a VirtualBox VM, install the Citrix client in that, and use that to log into the work site.

Well, that turned out to be an adventure in itself. Mostly because I’m using Kubuntu (which is Ubuntu with KDE instead of the god-awful Unity Desktop), which is a little too resource hungry to run in a VM. So I was installing vanilla Ubuntu, Unity Desktop and all. But there was something weird about Ubuntu – I would install it and it was fine, but then it would download the required security updates, and suddenly the “VirtualBox Guest Extensions” stopped working and they refused to re-install. And what that means is that I could share any directories between the host OS and the guest, and more importantly, I couldn’t get the guest to expand to use the entirety of my beautiful 2560×1440 IPS monitor. And that’s a deal-breaker. I tried installing from scratch, and I tried using a pre-built Ubuntu image, and both times if failed after installing upgrades. But I tried a Debian pre-built image, and that worked fine, even after installing upgrades. The only drawback of Debian is that they don’t have proper Firefox, they have their weird-ass IceWeasel browser, which lags way behind the current version of Firefox. So I had to install real Firefox from a tar file, which is like a throwback to the bad old days of Slackware. But that worked fine, and the Citrix 32 bit client installed without any drama, I was able to log into Outlook and Putty on the client side, and so I’m ready for when they get the VM set up for me.

Get it together, guys

If there is one thing that iOS and Android developers seriously need to come together on it’s a common standard for showing “my app is currently waiting for something to arrive from the internet”. I mean, half the time in Android all you can see is a tiny barely visible exclamation mark or something on the wifi signal strength meter. The spinner on the titlebar that seems to be the “normal” iOS one is at least slightly more visible, although I think we need something more visible when your app is actually blocking (as opposed to just filling stuff you can’t see yet). Some apps have taken it upon themselves to replace the “default” spinner (or lame exclamation point) with a much more visible one in the main screen – in the Facebook app on iOS it’s both, and they aren’t 100% in sync – but there is a lot of different spinners and throbbers in different apps, and it’s inconsistent and confusing. Then you get the god-awful flashing color bars in the G+ app on iOS. Please stop trying to be clever. Maybe if Android’s wait notification wasn’t so lame people would actually use it, and then at least we’d have some consistency. (It doesn’t help my case that Chrome on my iPad currently has the spinner up on the title bar spinning even though nothing is loading.)

UX fail

Last week, in an effort to broaden my horizons, I joined a bunch of groups on Meetup, including one for “UX” (User Experience). There was a meeting scheduled for today (Wednesday) at 6:00pm, and I clicked the button to indicate that I’m planning to go.

Almost immediately, they announced that they were moving all future communications from Meetup to another similar service which appears to be mostly oriented towards start-ups, something which I’m not at all interested in. (Been there, done that, lost my t-shirt and 17 SAN.)

Then they announced that they were changing the location, but they weren’t sure where they were changing it to.

Then they announced it was at the “Center for Student Innovation” at RIT, but with no further details of where in this building.

I got there at about 5:40. There were no signs indicating where it was. I went on-line and discovered that they’d announced a room number at around noon today. The room was in use, and it looked like a class or a seminar going on. I sat down to wait for 6:00. 6:00pm came and went, and whatever was going on in the room never broke up, nobody entered, one person left, but the door remained closed. Nobody else appeared to come up to the door to try it or ask where the meeting was. I decided that either the group I was attempting to meet was in that room, but nobody had told them that an open door is more welcoming than a closed one, or the regulars saw the closed door and decided to go somewhere else without bothering to put up a sign or troll the lounge area looking to see if anybody was waiting to join the meeting. Either way, I felt unwelcome so I left.

So the User Experience experts managed to give me a lousy User Experience and wasted my evening. Thanks guys.

First thoughts on the Nexus 7

I got a Nexus 7 for Christmas. This was something I’ve been thinking about for a while – I wanted to see what the state of the art of Android was, and maybe start developing some apps for it. I haven’t done any benchmarking or measurements, this is just my subjective experiences and some comparisons with my iPad 3.

First off, appearance.

It doesn’t feel as well made as the iPad, and the plastic back makes it seem cheaper. I haven’t checked the specs, but it also feels thicker. I’m told it’s half the weight, but if you asked me I’d say it was nearly as heavy – maybe it’s just denser or something. However, the device is a very nice size. You can hold it in the palm of your hand with your fingers on both sides of the screen, as opposed to the iPad which you hold from one edge. It feels like a very good size for portability. It fits in your hand nicely, and it even fits in the back pocket of your jeans (just make sure you don’t sit on it). The screen isn’t as beautiful as the retina display on the iPad, but it seems good enough for watching movies and web browsing. Both devices have adequate battery life, and I don’t have to slavishly remember to plug them in every night like I had to with older generation cell phones, which is all I really care about. Which one has 9 hours of battery life and which one has 10 hasn’t really made an impact on my life yet.

Secondly, user experience.

If you just care about getting stuff done, I can see the appeal. I turned it on, put in my Google credentials, and just about everything set itself up. I didn’t have to set up or re-log in to Gmail, YouTube, Google Plus, Calendar, Google Play, etc. It all just worked. That was pretty cool. I’ve had no need or desire to connect it to another computer.

On the other hand, the default widget set, which are used by lot of the apps including Google’s own apps, are ugly as sin – flat, boxy, unshaded, untextured, visually unappealing. I’d say whoever designed them has spent way too much time using the Xt X Toolkits Intrinsics widgets on Unix, and that’s probably showing my age. There is also a lot of inconsistency – for instance, it was sometimes a bit of a hunt to figure out how to refresh a screen in different apps – sometimes it was the “getting more common all the time” pull the screen down and release it, sometimes it was a circle icon in the middle of a bunch of other icons near the top, and sometimes it was something completely different. Unlike iOS, where if you’ve got a small popup on top of a bigger display, tapping outside the popup will dismiss it, in Android apps you often have to use the “Back” button on the bottom of the screen.

On the other hand, the fact that the “Back” button works across different apps is the most awesome thing ever. I wish iOS has something similar. In iOS, if you’re in one app and you tap something that opens a web page in Safari, it’s a pain in the ass to get back to the original app – I think that’s why so many apps open web pages in their own UIWebViews. In Android, you just click the “Back” softkey and you’re back in the original app – and it even takes care of closing the tab in Chrome that it opened. Very cool. And it appears to chain across multiple apps as well. To me, that’s a good reflection of the Unix philosophy – if you make it easy to get stuff from one app to another, you don’t have to make one app do everything.

Another indication of the Unix design philosophy is that appears that there is less sandboxing between the apps, and so, for instance, Dropbox can see all the files on the device. If you click “Upload Here” you can see the equivalent of a $HOME directory and all the files below it. And your ebook reader app can read books directly out of your Dropbox. I can see the advantages of this, but I can also see the drawbacks of it. I think it was Dennis Ritchie who said that “Unix doesn’t prevent you from doing something stupid, because that would also prevent me from doing something amazing”. I wonder what Android does to prevent these apps that have access to each other’s data from modifying each other’s data, or from stealing information they shouldn’t be seeing. I guess that’s a question I’ll have to answer when I start doing some Android app programming.

Update: I forgot to mention this when I first posted this, but there are a couple more things I really like about Android. The first of these is the menu that comes up when you swipe down from the top right corner. It puts a couple of things that I need to access far too frequently, like wifi settings and airplane mode, way more handy and accessible than they are on iOS. The notifications (accessible from the top left corner) are also, I believe, somewhat better than iOS. As a matter of fact, they’re almost as good as the notifications on WebOS, which I think are still the best I’ve ever seen. I also like the way the keyboard has that built-in “Swype-style” thing, although I suspect that’s more of a gimmick than a really useful feature. I also like the way it shows a couple of autocorrect choices. Too bad it (the keyboard, I mean) looks so damn ugly.

Houston, We Have A Problem

In the two weeks that I’ve had this device, I’ve had one minor freeze-up (where everything stopped working, including the off button and the volume buttons) for 30 seconds or a minute and then it started working again, and one major freeze-up (where everything stopped working, including the off button and the volume buttons) for several minutes until I could walk up stairs to another computer and Google how to do a hard power off. Both times it happened, I was using the Facebook app. To me that’s a major red flag – an application should not be able to make the OS unresponsive, no matter how badly written. (And my experience with the Facebook iOS app and the Facebook web page is that Facebook stuff is *very* badly written.) I’ve had a few app freeze-ups with iOS, and I can recall using the hard power off a time or two, although as far as I can recall it was when I was moving from one wifi network to another (a constant problem in this old plaster and lath house), which iOS has had problems with in the past. I wasn’t doing anything of the sort when Android froze up – just sitting still putzing around on an app.

Where am I going with this?

Well, my overall impression is that for things where functionality is more important than a beautiful user experience (like a phone), I could easily transition to Android and I’ll certainly look at both Android and iPhone when my next contract renewal comes along. I’ve often wished my iPhone had a bigger screen like a Galaxy Note II. On the other hand, for day to day tablet use, I think I prefer the user experience and beauty of the iPad.

As a long time Java developer, I’d like to try my hand at Android development. I worry about the lack of compatibility between different Android platforms and I’ve heard that professional Android development shops will have dozens if not hundreds of Android devices to test against. On the other hand, I have a feeling that the future of app development is exactly where Steve Jobs said it was when the iPhone first came out – HTML5 and Javascript, with whatever you want on the server side.

I’ve seen people using a Nexus 7 as a navigator in their cars. I’d love to replace the piece of shit navigation system that’s built into my car, but to use a Nexus 7 I’d either need to tether my phone or get a Nexus 7 with 3G. Either is probably more money than I need to spend. I think I’ll stick to the Garmin app on my iPhone.