kai_mactane: (Default)

Before you comment or email me asking how I could have left out AdBlock Plus, FlashBlock, NoScript, Firebug, or Chris Pederick’s Web Developer Toolbar: Please re-read the last five words of this post’s title. If it’s a well-known extension, it’s off-limits for this post. This is about extensions that very few people have heard of, but that more people should have heard of, because they’re so useful.

I’ve tested and made sure that all of these extensions work with Firefox 4.

NextPlease!
Go to the next page in a multi-page or multi-part sequence, with a single keystroke (Ctrl-Shift-right arrow). Includes the ability to use any phrase or image found in the page to determine the next/previous URL. This one is pretty handy for dealing with the kinds of sites that break their articles into multiple pages, but it becomes super-useful when you’re trying to catch up on a webcomic. You no longer have to find the “next” link or button on every page; just keep pressing Ctrl-Shift-right arrow and reading new comics.
Uppity
This makes a good complement to NextPlease!. Instead of trying to find links within the page to forward or backward, this one look at the page’s URL itself, and makes it easy to move up the directory tree. Press Alt-up arrow to move to the parent directory (or from subhost.domain.tld to www.domain.tld and then to just plain domain.tld), or press Alt-down arrow to see a drop-down list of available shortened levels. This one comes in handy when you follow a dead link and want to try to truncate the URL until you find something useful.
keyconfig
Lets you remap what keystrokes are bound to what actions. Since quite a few extensions try to bind to keystrokes, collisions are bound to occur if you have as many extensions as I do. Keyconfig allows me to resolve those collisions. Additionally, just hitting Ctrl-Shift-F12 will give you a dialog box that shows what all your currently active keystrokes are, with the collisions highlighted. Even if you don’t need to change any of them, just knowing what they all are can be seriously useful.
FoxInput
Fixes those silly pages that don’t automatically put the focus on the first text field in the form you need to fill out. Hit a configurable keystroke (Ctrl-I by default) to advance forward through all text fields and textarea elements in the page. Very useful on SquirrelMail’s “compose” window, where moving from the Subject field to the Body field would otherwise take 8 repetitions of the Tab key.
Echofon
A wonderful in-browser Twitter client. It’s particularly useful if you have more than one Twitter account, because you can have your browser be logged into one account, and have Echofon logged into a different account. It’s also available as a native Mac application and a native app for iPhone and iPad.
Browser View Plus
For web developers who occasionally need to check out pages in other browsers, this one is way better than (the rather well-known) IETab. It lets you configure up to 5 other browsers to open things in, then lets you access any of them on your right-click menu.
JSView
Another one that’s useful for web developers. Puts a little icon in your status bar that provides a pop-up menu of all JavaScript and CSS files linked to by the current page. Hovering over any filename gives a tooltip with the full URL; clicking on the item opens the file as if you’d done “View Source”, and right-clicking gives you options such as “Copy file URL”, “Open in new tab” (either focused or in the background), or even “Open in external editor”.

The extreme power of some of Firefox’s extensions is a large part of why I haven’t become a Chrome convert yet. With the level of customization that all these extensions allow, Firefox feels like my browser. It obeys my desires much more smoothly than Chrome does. Sure, I have to restart it on occasion… but since Firefox (like Chrome) is a modern, sane application that makes restarts easy, that’s not much of a drawback.

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

The more stuff you have open (or habitually leave open) in an application, the more it becomes part of your consciousness, an extension of your mind. For many of us, the question “What are you doing right now?” could best be answered by, “Here’s a list of the tabs I have open in my web browser.”

Hackers* use the word “state” to describe “information being maintained in non-permanent memory”, whether that memory is in a human skull or a computer’s RAM chips. In fact, that ambiguity over exactly where the state is being maintained is one of the word’s strengths — as the browser-tabs example shows, there’s getting to be less of a distinction between the two. The stuff in my browser’s tabs is a reflection of what’s in my own brain, and a nearly-seamless extension of it.

Like every other web developer, I recently got a message from Firefox saying it needed to upgrade. (Because security researchers found yet another hole in Adobe Reader.) Despite the fact that I had over a dozen tabs open, I knew I wouldn’t have to worry about performing the upgrade, because Firefox would remember all my tabs and reopen them after restart. It’s basically a momentary hiccup in my workflow; I can start the upgrade and then use that 30-second break to refill my teacup or go to the bathroom. Come back, sit down, close the spare “You’ve just successfully upgraded Firefox” tab, and just keep working.

Compare that with Windows Update.

Read the rest of this entry »

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

When should you ask a user “Are you sure you want to do that?” Bear in mind that asking this question when you don’t have to has more than one bad effect:

  1. Obviously, it wastes the user’s time and may even annoy them.
  2. It also contributes to the general problem of “too damned many dialog boxes in computing”. This is subtly but importantly different from the previous point: It trains the user to unthinkingly click the default option in any dialog box, just to keep it from wasting their time.
  3. Finally, it may actually hinder the user’s ability to leave your program. Look at this page by Joel Spolsky, and search for “exit Juno”. A user thought the “Are you sure you want to exit?” dialog meant that the computer was advising her that there were ill effects from doing so.

Okay, that last one seems like sort of an edge case, right? But even the first two items are enough reason to pay attention to when you should — and shouldn’t — ask the user to confirm something.

My proposal: Only ask a user for confirmation when the action was initiated by a single click or keystroke, and it has some kind of bad effects. Yes, this means that any time you ask someone to confirm whether they want to exit your program, and they have already saved all their work, you just wasted their time. This one’s particularly prevalent in the gaming world, I’ve noticed: Even if you’re in between games, and your scores are all saved — meaning the worst possible consequence of exiting the game is that you’ll have to start the application again — most games will show you a “Do you really want to exit Game Name?” dialog anyway.

MS Word gets this exactly right. If your document hasn’t been changed since the last time you saved it, then exiting the program has no ill effects. If you click the little X, or press Alt+F4, MS Word won’t even bother to ask you “Are you sure?”; it’ll just exit with no muss and no fuss. It’s only if you have some unsaved work that you’ll see the “Do you want to save your changes?” dialog. And if your document already has a filename, Word doesn’t bother to prompt you for a new one; you only get the “Save As…” dialog if the document doesn’t yet have a filename.

The program only bothers the user if it has to; if it can figure things out on its own, it does. Just the way it should be.

If you’re writing another application — I don’t care whether it’s whether it’s a web application, Rich Internet Application, desktop application, or smartphone application — please take a hint from the way MS Word handles confirmation questions. Don’t make your app be the software equivalent of “that guy”.

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

I’ve released a new version of Hummingbird. This is a bug-fix release, resolving some issues in automatic hyperlinking and in recognition of multiple hashtags in a single tweet. (Yes, this is why I did a couple of tweets hashtagged “#testing” a couple of days ago.)

Downloads are available from the Hummingbird project page, or using these links:

hummingbird-0.67.tar.gz
hummingbird-0.67.zip

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

This is largely a bug-fix release. Tom Clift, of PaperCut print management software, kindly informed me of a few installation issues that my own tests didn’t find. The profusion of configuration options in PHP can make testing everything on a single server quite difficult.

This would be a good time for me to mention that I have the utmost respect for QA people. They deal with all sorts of minutiae that I am really glad not to have to handle, and I’m really glad they’re around. That said, I am not a QA person… and so I occasionally miss the sorts of stuff they’d catch.

  1. It turns out Hummingbird depends on the CLI version of PHP, and the CGI version will not suffice. This requirement is now listed in the appropriate section of the Hummingbird page.
  2. Not all PHP installations have output buffering turned on by default. The latest version of Hummingbird takes account for this.
  3. Various problems that can occur with the data cache file are also now reported more gracefully.

Again, my thanks to Tom Clift for some very useful patches!

You can get the latest version of Hummingbird from the Hummingbird page on my site.

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

I see that I never bothered announcing the v0.61 release. That was a minor bug-fix, resolving an issue where Hummingbird would fail if the XML cache file was empty.

The latest release is one that allows multiple versions of Hummingbird to run on the same machine without conflict, as long as they’re using different Twitter usernames.

In addition, I’ve changed the destination of auto-hashtag links. Since the hashtags.org service is often a bit flaky, or simply returns useless null results, I’ve switched to using Twitter’s own internal search service.

Downloads are available from the Hummingbird project page, or using these links:

hummingbird-0.65.tar.gz
hummingbird-0.65.zip

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

If you haven’t been getting as much email as usual this past week, the culprit may be SpamAssassin. It turns out that SpamAssassin 3.2.5 (the current version, released in June of 2008) has a Year 2010 Bug.

The problem lies in the core configuration file 72_active.cf, which contains a wide variety of “currently active” rules. On line 543, it says:

header FH_DATE_PAST_20XX Date =~ /20[1-9][0-9]/ [if-unset: 2006]

For those who don’t read regular expressions, this rule will match any Date: header that contains a string like 201x, 202x, 203x, etc., where “x” could be replaced by any digit. So, back in 2008, this rule would catch email that claimed to hail from the year 2010 or later. (Well, up to 2099.)

Starting on the morning of last Friday, this rule started triggering on pretty much all mail that hadn’t been delayed, thus adding 3.384 points to every piece of incoming email. Naturally, this could easily push mail over the threshold from “not spam” into “spam” when it doesn’t belong there.

If you’ve been expecting some mail that hasn’t arrived, and your mail host uses SpamAssassin, you might want to check your spam folder.

According to a note on the SpamAssassin project’s main page, you can easily correct this problem in either of two ways:

  1. If your system is configured to use sa-update, run it now.
  2. Remove the FH_DATE_PAST_20XX rule altogether by putting “score FH_DATE_PAST_20XX 0″ at the end of your local.cf file.

Alternatively, if you’re the mail administrator, and you don’t mind setting up a Year 2020 Bug for yourself, you could always change the part that says Date =~ /20[1-9][0-9]/ so that it says Date =~ /20[2-9][0-9]/ instead. After all, stuff that claims to be from years in the future (or past) is likely to be something you don’t feel like reading. But if you do this, I strongly urge you to find some way to send yourself an alert around December of 2019, warning yourself that you need to fix that problem. (And that may be easier said than done.)

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

For backward-compatibility testing, I’ve just installed a few versions of WordPress ranging back to version 2.0. It’s kind of fascinating to see a sort of fast-rewind retrospective of the software. Even just looking at the installation experience, it’s like watching HAL 9000 descend into childish incoherence as Dave Bowman yanks his memory chips.

By the time you get back to WordPress 2.0 and try hitting the blog installation directory in your web browser, all you get is a plain, unstyled page that says:

It doesn’t look like you’ve installed WP yet. Try running install.php.

The funny thing is, that page works just fine. You click the link, it takes you to install.php, and… that’s really just a splash page, which talks about what you’re going to do, and requires that you click on a big link that says “First Step” in order to proceed. So, while it does “work”, it does so at the expense of making the user click the mouse twice, unnecessarily.

In the past 4 years, the WordPress team has made the install process look sleeker and more styled. But I think the real improvement in user experience isn’t the visuals — it’s the removal of those two unnecesary, time-wasting mouse clicks.

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

The more I play with OpenOffice.org’s Writer, the more confused I am by some of the odd UI/UX warts in it. Here are the ones that are on my mind this morning:

  • When I press F11 to bring up the Style Picker list, why does typing letters not navigate me through that list? Why do I have to use the down-arrow to navigate to “Heading 1″, rather than just typing “he” and then Enter?
  • Once I do hit Enter to apply the style I’ve chosen, why does the picker window remain open even though my cursor focus has returned to the document? This is the worst of both worlds: part of the document I’m working with is obscured by the picker window, and now I have to hit F11 twice in order to apply another style. If the window went away, I could just hit F11 once to bring it up the next time I wanted to apply a style.

    Read the rest of this entry »

    Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

I’ve always questioned the wisdom of building a startup company based around someone else’s platform, like Facebook games or Gmail inbox add-ons. You’re totally at the mercy of the other company. (Many people have found out how silly it was to go up against Microsoft or Apple in just the same way.)

And yet, here I am with Hummingbird, which is totally dependent on Twitter’s bandwidth. (In my own defense, I can only point out that: a) I wrote it because I needed the functionality; and b) I’m not building a money-making company around Hummingbird. I’m just giving it away.)

In the past couple of weeks, I’ve noticed that Twitter can sometimes take an astonishingly long time to provide an update. Hummingbird works by requesting URLs like http://twitter.com/statuses/user_timeline/kmactane.xml?count=25, and (up until now) it worked on the assumption that Twitter couldn’t possibly take longer than 10 or 15 seconds to respond to such a request.

That turns out not to be the case.

In fact, my recent tests have shown that Twitter can sometimes take over 5 full minutes to finish responding to such a request. This is a problem, because the default installation of Hummingbird tries to update its cached data once every 5 minutes. And since I assumed the request would be fulfilled in, at most, 10% of that time, I didn’t bother building in any concurrency checking.

I’ve just completely reorganized most of Hummingbird’s architecture. The interface that a blog owner sees (in the sense of the configuration variables in hummingbird.php, and the calling syntax for blog pages and cron jobs) is still the same. However, all of the code for retrieving data from Twitter has been spun off into a new hummingbird-cache.php file, which can be launched into the background by the rest of Hummingbird, so that it can patiently take as long as it needs to in order to update the blog’s tweets cache.

The Major Change This Causes

In Hummingbird’s previous incarnations, it would freshen an out-of-date cache before displaying it. The assumption was that every once in a while, someone might have to wait a few more seconds before seeing your blog page. However, everyone would always see an up-to-date record of your tweets. (Where “up-to-date” means “no more than 5 minutes old, absolute tops”. If you tweet so relentlessly that that’s a problem, you probably don’t have enough time to keep up your blog…)

Now that we know that Twitter can take over 5 minutes to give you the data needed to freshen your tweets cache, that design is not acceptable. Instead, Hummingbird is now committed to showing the contents of your tweets cache as quickly as possible, and only then does it fork the cache-update process into the background.

This means that, if you’re not using cron or some other automatic job-scheduling facility to run Hummingbird every 5 minutes, visitors who arrive at your blog after a period of inactivity will see an out-of-date, stale listing of your tweets.

If you have a cron job set to keep Hummingbird fresh, you’ll be fine. (A page view will also trigger an update, so if you get so much traffic that there’s never a 5-minute period during which your page doesn’t get hit, you’ll also be fine.)

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

Last week, I wrote that I’d been working on a script to easily install homebrew apps on the Palm Prē. It now looks like there are much better ways to handle such things — I’ve become quite a fan of fileCoaster, myself, and of course webOSQuickInstall is a wonderful piece of work, as well. But just in case anyone might find this shell script useful, I’ll release it for general use.

Assumptions

  1. You have a web-accessible server where you put your development .ipk files.
  2. You can ssh into your Prē.

Download

You can download the script at http://kai.mactane.org/software/libraries/download/homebrew.sh.

Installation

Just drop the shell script into your home directory and make it executable. If you want to be able to use the “my” argument, you’ll also need to edit the three configuration variables at the beginning: MY_HOSTNAME, STDPATH, and STDVERSION.

Usage

For most purposes, you’ll just want to install your own package that you’ve been working on. Assuming you’ve set the config variables correctly, you can just type ./homebrew.sh my appname, where the appname is the base name of your package.

If you’re installing multiple .ipks and you don’t need to restart the GUI manager for each one, you can use the “skip” command on all but the last:

./homebrew.sh skip my foo

./homebrew.sh skip my bar

./homebrew.sh skip my baz

./homebrew.sh my quux

You can also supply a complete URL: ./homebrew.sh http://forums.precentral.net/spe_attachment/download-23971-com.palm.net.precoder.fcoaster_1.0.2_all.ipk will download and install fileCoaster, so you won’t have to mess with my script any more.

What It Does

It automates the process of installing homebrew apps with a rooted Prē, as described on the webOS Internals wiki. Basically, it remounts the root partition in read-write mode, wgets your .ipk file, installs it, does the “Good Housekeeping” backup, remounts the root partition in read-only mode again, and then restarts the GUI manager.

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

I’ve just upgraded Hummingbird from version 0.5 to its new version: 0.51. Since I recently starting using the #PalmPrē hashtag in my tweets, I suddenly noticed that Hummingbird didn’t make hashtags clickable.

Well, now it does.

The change is pretty minimal, but it also incurred some overhead in my web site: the Hummingbird web page needed to be updated to match the new feature. And since that feature meant adding a new CSS class, I had to update the “CSS Styling” section as well as the “Features” section… and add a new “Version History” section…

All in all, it was harder to update the documentary web page than to update the software itself. In a way, that implies that my code was pretty clean. If you want, you can download the new version here.

See, I’m not neglecting everything to work on Palm Prē programming! (I’m also doing some contracting, which is taking up even more time.)

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

My latest software project is now available… where “latest” means “the latest thing I’ve launched, even if I actually wrote it over a year ago.”

The story is simple: I was tired of seeing “failed password” messages from sshd cluttering up my logs. I was also annoyed at the constant flow of dictionary attacks, even if I knew they’d never get in. So I whipped up a quick Perl script that acted as some glue between Swatch and iptables, and which would also give me some amount of reporting and history on who and what it was blocking.

Then I posted about it in my online journal, and a friend said it sounded useful. So I started getting it ready for release as a package that anyone could use…

And promptly realized that doing a decent, professional job of it would take more time than I had available. Fast-forward to now, when I’m unemployed and can only spend so many hours per day job-hunting — the result is that the world gets more software!

Originally published at Coyote Tracks. You can comment here or there.

kai_mactane: (Default)

Just updated my software page to bring it a little more up-to-date with what I’ve been doing in the past few years. It’s funny to see how my coding style has evolved and grown continually over that time. There were some things I used to be showing off that were almost totally procedural; even some of the things I’m still linking to (but which I wrote two or three years ago) make very little use of functional programming or anonymous functions in JavaScript.

It’s really tempting to completely refactor some of that stuff, but I haven’t got the time. I actually have at least one more software project that I should really package up and publish — a thing that might be helpful for system administrators who are being annoyed by SSH dictionary attacks.

Writing something that works on your own machine is one thing. Making a full release? That’s quite different! It needs documentation, and that documentation needs to explain all the things that you “just know”. It needs some kind of install mechanism, or else it needs to explain how to install the stuff manually — and you need to make absolutely sure that you haven’t forgotten any of the things you wrote, changed, or tweaked while you were making it work!

Originally published at Coyote Tracks. You can comment here or there.

Profile

kai_mactane: (Default)
kai_mactane

July 2011

S M T W T F S
     12
3456789
101112 13141516
17181920212223
24252627282930
31      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 20th, 2017 09:39 pm
Powered by Dreamwidth Studios