Big changes coming

So I’ve decided to spend a few bucks to fix a few niggling little issues around the house, mostly in the computer department:

  • First off, I’m worried about some recent break-ins and vandalism in the neighborhood.
  • Secondly, and slightly related, when I’m working in my office at the back of the house, it would be nice to know when the FedEx guy is ninja-ing a non-delivery tag at the front door instead of ringing the doorbell and waiting. Or know when the dogs bark whether it’s somebody at the door or just a shadow across the road.
  • The wifi penetration in the house sucks – in some parts of the house, your device will show one bar but nothing will actually get through. And if the microwave is on, forget about getting any signal on the other side of it. I put in a wifi repeater but it’s dog slow, and it uses a different SSID so you have to switch between SSIDs as you move around the house.

So here is what I’m in the process of doing to fix all those things:

  • I bought a security camera – an Airsight PTZ Pro outdoor camera with pan/tilt/zoom. If I wanted to, I could hook up a microphone and speaker so I could yell at the FedEx delivery guy to wait for 5 seconds as I run down. I’ve been playing with it and it is pretty amazing, although I’ve found one big flaw (more on that later)
  • I am running network cable from my office down into the basement, and from the basement up into the far corner of the basement, the dining room, and out to the front porch. The cable is currently pulled, but it’s not terminated and tested yet.
  • I’ve got a 8 port Gigabit Ethernet switch tacked to the wall where the first network cable drop comes down.
  • In the far corner of the basement, I’ve got a second router ready to install. I’m going to put this on the same SSID as the main one upstairs, and the same password, but on a different channel, turn off DHCP, and run the outgoing cable from my main router into the “WLAN” port of this one. I believe this will make the switchover from one to the other transparent so you don’t have to remember to switch SSIDs as you walk around the house, and it should perform a lot better than using the repeater. As an added bonus, it also supports 5GHz.
  • In the dining room, where Vicki spends 90% of her time when she’s using her computer, especially when she’d doing Second Life for work, there will be a wired network drop. Wifi is all well and good, especially 5GHz, but nothing beats wired.
  • The camera allows power over ethernet (or PoE as they call it in the brochure). So since I had to run power out to it anyway, I figured I’d give it the advantages of a wired connection, and run it all through the same wire.
  • The camera has the option to upload pictures and recordings to an FTP server. I figured that’s not much good to you if the thieves break in and steal your computer as well, so I’ve ordered a tiny little Raspberry Pi (aka Rπ). I already have a hard disk taken from a laptop that’s not doing anything, so I figure I can set up a tiny little FTP server and hide it somewhere where thieves won’t find it even if they’re ransacking the house. A closet, an obscure corner of the basement, even hidden inside the walls somewhere. These things are amazingly tiny. And I’m considering also using the Rπ to run ZoneMinder as an alternative to the built-in functionality because of the already foreshadowed flaw in the camera.

Ok, so what is this big flaw you’ve been talking about, I hear you ask? Well, it’s simple. The camera has the option to, when it detects motion, email you 5 pictures and start recording video to an ftp server. It also has the ability to pan and tilt and zoom. Those are two awesome features, right there. So what’s the problem? Well, when you set it panning, it interprets *that* as actionable movement and starts sending you emails. Not a good thing if you want it to continuously pan back and forwards. There is another option in the camera that lets you set up a bunch of fixed locations and have it cycle between those locations at intervals. I haven’t yet tested it to see if it’s smart enough to ignore movement while it’s moving between locations.

Oh, in other techie stuff, I finally got around to upgrading my Gallery site to Gallery3. In spite of the promises, the “Gallery 2 Importer” isn’t able to properly translate the URLs that Gallery 2 used to Gallery 3, so links to the Gallery are probably all broken. I did put in a mod_rewrite rule to take care of some of them, but not direct links to image files. Also, I seem to have lost all my raw pictures and movies.

I’m also currently looking into installing “ownCloud” as a way to get more space than I have with Dropbox without paying for it. I want enough space that I can throw my entire Documents folder on it instead of having to think “do I need this on all my machines, or is it ok if it’s just here” for every file. Since one of the two people renting space on my colo box never pays his rent except when I send him an email asking him if he’s still using it, I think I know where I can lay my hands on 100Gb of disk space on a server in a rack really cheap.

Cautiously optimistic on the pain front

This morning, the intense pain I had in the left hip is almost completely gone. I can sort of feel it lurking at the edge, but it’s not actually causing me any pain. The other, more familiar pain in the right hip has been fading slowly over the last two days and I think it will be away (on vacation) quite soon.

In much, much better news, my shoulder is doing better. A little while ago I blogged about how hopeless I felt because when I did my physio exercises, I’d be in pain for 3 or 4 days afterwards, which meant I wasn’t doing them often enough. A day or two later I saw my doctor and he did something where he had me lying down on my back and he reached under me and pushed his fingers into the base of my trapezius muscle and pushed down on my shoulder. That very day, I did my physio exercises and wasn’t in pain the next day. So I erged a bit that day, and I wasn’t sore the next day. So I did my physio, etc. After my business trip (where I didn’t do my physio or my erging, although I did try to stretch), the pain was starting to come back a bit, so my physiotherapist suggested that I just lie down on the floor with a tennis ball under my back, and relax and let my shoulder come back down to the floor. I’ve been doing that (although with a dog toy rather than a tennis ball, because that’s what I have to hand), and it helps a lot, although not as completely as what my doctor did. It might be time to start seeing a massage therapist again. But meanwhile, I’m erging!

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.

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.

Design iteration

I have a web page that shows a bunch of data (trouble tickets) on different tabs.

In the first iteration, I was doing a ton of queries at load time, and building up the content of each tab using Perl Mason. Tabs that had no data on them were not even created on the page. There were three problems with this:

  1. It took a while to load the page
  2. Any time you did anything that would change the tickets that are on the page (like resolve or reassign one of them), I’d have to totally reload the page.
  3. You’d probably have to occasionally reload the page to see if anybody else had done anything that would cause more or fewer tickets to appear on one of your tabs.

In the second iteration, I changed it so each tab would only load itself when you clicked on it by making an AJAX call. This did wonders for the speed of the initial page load, you’d see the latest and greatest information on the tab when you clicked on it, and if you resolved or reassigned one, it would repopulate just that one tab. As an added bonus, I added paging and sorting to each tab. I was happy about the paging and sorting. The biggest problem is that I couldn’t hide the tabs with nothing in them, because I didn’t know there was nothing in them until you clicked on them. I didn’t like that.

In the third iteration, I added an argument to the AJAX call that would allow it to just return the count of tickets in the tab, instead of actually returning a page’s worth of tickets. This is fairly fast. So now when it goes to refresh tab “B”, it makes simultaneous ajax calls to get the count for tabs “A”, “C”, “D”, etc. This means that tabs that have no tickets are disabled, giving you a good visual indication of which tabs you need to look at. Also, any time you interact with the page, in the background it’s checking to see if any of the other tabs need to be enabled or disabled. I’ve checked in Firebug and it’s apparent that it does all these other tab count AJAX calls while the “repopulate the currently selected tab” AJAX call is processing, so it’s nice and fast. I’m pretty happy with this.

Next iteration would probably be to add some searching or filtering.

After that, maybe using a WebSocket or periodic polling to see if anything has changed instead of only refreshing when you interact with it.