A review of “site tour” Javascript libraries

I recently had a need to display a “site tour” to point out important features to our users. I was happy to discover that there are some very easy-to-use libraries out there for this purpose. However, I found that each library was ultimately lacking at least one vital feature. I wish these authors would put their heads together and build the ultimate site tour.

Until they do, I present my review of a few of the leading candidates

Continue reading “A review of “site tour” Javascript libraries”

XBMC: hardware selection

I recently put together an XBMC system to replace an aging Apple TV (first gen). It was my interest in the Raspberry Pi that brought me to the idea of using XBMC, although ultimately, I did not end up going with a Raspberry Pi based system (I use one for other things around the house, but not the home theater).

I thought I’d share some of the decisions I made so others could benefit.

Continue reading “XBMC: hardware selection”

Saving and restoring qooxdoo table column sizes, visibility, and order

I was working on a music library management application built on qooxdoo, and I’ve always liked the way iTunes manages columns in its tables. You can hide and show columns, rearrange them, and resize them, and iTunes will remember your settings when you launch it next.

With a little work, you can do the same with a qooxdoo table. You just need to gather the column state, serialize it, and write it to a cookie whenever the user changes column state.

Then you need to load the state when the table appears:

You run this code at specific events in the table lifecycle:

Try it in the playground, or see a basic class implementation below:

Removing the Reveton Trojan from Windows

Recently, a friend of mine asked me for some help with her Windows PC. Her son got bitten by a nasty bit of ransomware. A giant screen came up saying “YOUR COMPUTER HAS BEEN LOCKED”, claiming that the NSA’s PRISM program had detected illegal content on the machine. Only by paying $300 to the “NSA” could the computer be unlocked. The screen is insidiuos; there’s no way to get around this splash screen. You can launch other apps, but they’re instantly covered up by the screen.

I don’t do a lot with Windows these days (and this incident reminded me why I don’t have a Windows machine at home for my kids to use), but I figured I could help out. I thought it would be much like other malware I’d encountered in the past.

Apparently, this ransomware has been around in one form or another for a few years. The message changes (kudos to the bastards who write this for changing the graphics to take advantage of all the recent PRISM publicity), but the app is the same. Much of the advice I found online was from web sites that are 100% focused on malware — for some reason, I am quite skeptical of these sites. I don’t know what their motivation is — are they just copying content from elsewhere on the web, are they just trying to sell their own software/services, or are they just publishing wrong information. I had hoped to find some individual guy’s blog article on the topic. Since I didn’t find much like this, I figured I would write an article to share my experience.

The malware in question is known as “W32/Reveton”. Here are a few links:

There was a lot of advice online about booting into safe mode. This doesn’t seem to help. The app still launches as soon as you log into your machine in safe mode. It blocks any attempt to interact with other software, so you can’t run any sort of anti spyware software.

Some sites advised botting from UBCD4Win. I didn’t pursue this, because I needed a windows machine to build a minimal windows image on the CD. This seemed like too much of a hassle.

Finally, I stumbled across Windows Defender Offline. You have to use another Windows machine to run the executable which builds the ISO, but it seems less complicated than building a UBCD image. I was able to build this ISO on a virtual machine on my Mac. Booting from this CD was exactly what I needed to do. The application found W32/Reveton right away and cleaned up the infection.

I hope this helps somebody out there!

BrightContext and Titanium Mobile: Simple real-time messaging

If you’re looking for a way to easily enable your client software to send and receive
low latency messages with a server or other clients, BrightContext‘s service may be just
the thing you’re looking for.

BrightContext provides you a shared message queue to which clients can submit messages
and subscribe to receive all messages sent to the queue.

As of version 1.6.0, the BrightContext Javascript API supports Titanium Mobile out of
the box, making it very easy to integrate into your application. All you need is the
bcc library and the Ti websocket client library.

Continue reading “BrightContext and Titanium Mobile: Simple real-time messaging”

Titanium Mobile – Dynamic TabGroups on android

A question that is frequently posed on the Titanium Q&A forum is how to manipulate
TabGroups on android. On iOS, Titanium allows you to add new tabs to your TabGroup.
You can even have multiple TabGroups (so for example, your app could branch off into
multiple windows, each with its own TabGroup.

But on android, you can only have one TabGroup active at a time, and you can’t alter
the tabs in the group once it’s created. In theory, you can create a new one and close
the previous one to effectively change the tabs in a TabGroup.

But executing this is easier said than done.

Continue reading “Titanium Mobile – Dynamic TabGroups on android”

Building a Ti Mobile App: GrillTime, part 3

You’ll notice that it has been over 6 weeks since my last installment. There’s a reason
for that. Trying to build a seemingly simple app like a countdown timer has proven to
be insidiously difficult.

Imagine building a countdown timer as a desktop app or in a web page. It would be
extremely simple to do. You periodically update the time displayed on screen, and you
check to see if the timer has hit zero. When it hits zero, you play back a sound. Easy, right?

In a mobile app, however, the rules are very different. Your app may not be in the foreground
when the timer hits zero. Your app may not even be running when the timer hits
zero. The device may not even be powered on when the timer hits zero. You have to
deal with all these scenarios. And to make matters worse, if you’re building a cross-platform
Titanium Mobile app, you have to deal with the nuances of background processing, notifications,
and alarms on both iOS and Android.

Continue reading “Building a Ti Mobile App: GrillTime, part 3”