Miami-Dade Public Library System and Accessibility Nightmares [Updated]

[Update: I received a response from MDPLS earlier this week. The library system states that the faults I found with their particular system are endemic to library IT as a whole, and that my comments will be passed on to the vendor. I am glad that this is being addressed, but I still find it a bit shocking that the tech-savvy library and information sciences field does not have better solutions available.]

Hello, dear readers. I’d like to start with a message I just sent to the Miami-Dade Public Library System. MDPLS recently spent months integrating a new web-based catalog and backend circulation system, and the results are… well, just read my message:

For the past few weeks, I have been excited to see your new catalog system, but I must admit I am a bit appalled at the results. As the Polaris ILS website proudly proclaims, MDPLS is a “world-class library,” and yet your new website system is third-rate at best.

1. The catalog site uses a table-based layout. CSS layouts have been widely supported in all major browsers for at least six years. Table-based layouts use nearly twice as much “code” as CSS layouts to achieve the same result, making table-based layouts much more difficult for machines (including both Google and screen reader software for disabled users) to understand.

2. Worse, portions of your new site’s source code reference “Office 2007″. How is the software for a world-class library system built using a word processor? Likely as a result of this, parts of the website (such as the drop-down menu buttons on the lists of bestsellers) do not seem to work properly in any browser other than Internet Explorer. Users of Mac OS X computers cannot download Internet Explorer and are therefore out of luck. In today’s internet, it is extremely rare to find websites that only work in one browser, and the fact that your new site is tied to Internet Explorer is troubling.

3. The catalog is almost entirely unusable for disabled users! Most links on the page are images without ALT text, and the page includes large amounts of inline JavaScript, which are not only non-compliant with web standards but also unusable by screen reader software. Some areas of your site are only accessible by users who can visually see where the mouse pointer is on the screen. Even on a more subtle level, the “tab” headings of the catalog system use dark blue text against a slightly lighter blue background, a lack of color contrast which makes reading difficult for users without perfect vision. The overall lack of accessibility is blatant and in violation of Section 508 of the Rehabilitation Act of 1973. Section 508 has lead to large judgements against corporations who disregard accessibility; see e.g. the $6 million dollar settlement in National Federation of the Blind v. Target Corporation in 2006. I am amazed that a large municipal entity like MDPLS apparently did not even attempt to verify the usability of their website for disabled patrons.

How much did this new software installation, which is decidedly behind the times, cost? Many other library systems around the country have created stellar examples of usable, accessible, and fully-integrated websites. I realize that they are a much smaller system, but I urge you to evaluate the Ann Arbor, MI library website at http://www.aadl.org – a site created entirely with the open-source (and therefore free-of-cost) Drupal software, which also runs major corporate and organizational websites around the world. Drupal is obviously not the only way to create a highly functional and usable website, but AADL serves as a strong example of what library websites can do.

As a regular MDPLS patron, I am deeply disappointed with the new catalog system, and I look forward to your response to these problems.

MDPLS is the largest library system I have ever had the pleasure of using. They have an incredibly large collection and I haven’t had many problems with their services. However, their website has always been sub-par, and my hopes for improvement with their new system have been dashed. I hope that someone at MDPLS reads my message, and I urge you, dear readers, to write to them yourselves through their contact form.

Posted in Misc | Tagged , , , | Leave a comment

Steam for Mac – The Future of Mac Gaming?

Last week, the team at Steam released a Mac client for their popular gaming service. This is big news, and not just for Steam itself; Steam represents Mac OS X’s best chance of becoming a viable gaming platform.

For years, Mac gaming has been primarily focused on iPhone OS devices. A large percentage of App Store sales are for games, and the iPod Touch (and now iPad) is being pushed as a competitor to the Nintendo DS and Sony PSP. The Mac desktop, however, was largely neglected. Big PC releases would find their way to Mac months or years later, after an intermediary company had ported the Windows version. Often, these ports had their own quirks and bugs. The Mac was never a first-class gaming citizen.

Steam just might change that, however. For those unfamiliar with Steam, it’s essentially an iTunes for gaming. Users create a Steam account that, through the Steam client software, offers a store for downloadable games, tracks purchases, and installs and updates purchased games. Steam games can even be launched through the client, making it a one-stop solution for gaming.

What really makes Steam special, though, is the amount of support they’ve received from game publishers. Steam offers its own DRM, with periodic online verification. The entire system is tied to a Steam account and handled in a transparent manner – users never have to enter a serial number or install game-specific, system-altering DRM software. As a result, big-name releases are often available for download through Steam on the same day as their retail release.

Since Steam has been so well-received by Windows users, the release of a Mac Steam client could signal the beginning of a major shift in Mac gaming. Publishers finally have an incentive to release Mac versions of their games, since a proven distribution system is now in place for end users to buy them. Mac market share is steadily growing, and if Steam makes the Mac a viable target for game publishers, Windows will lose yet another competitive advantage.

Posted in Misc, News | Tagged , , | Leave a comment

The Browser Wars, Round 2

Last week I started using Opera 10.53 on my Macbook at a friend’s recommendation. It’s blazing fast, even faster than Chrome if you can believe that. It has great support for HTML5 and CSS3, and nice extras like Speed Dial and a tiny marker that lets you know when a tab has updated content or finished loading, so you don’t have to waste your time checking on a slow-loading (or repeatedly-reloading) website over and over. It even has solid developer tools (Opera Dragonfly), with a built-in zooming website color picker! It was almost everything I could want in a browser, and I was happy as could be.

Then I realized that Opera’s dev tools don’t include a screen ruler, a tool I use all the time through Chrome’s Pendule extension.  No problem, I thought – Opera has its own extensions, called “widgets.” Except, they don’t seem to work – I found a screen ruler widget in less than a minute, but it refused to properly install, and once it was done I still couldn’t actually run it.

Annoyed, I went on to find further annoyances. Amazon.com doesn’t allow Opera to use the “Look Inside” feature. Opera’s aggressive pop-up blocking led to sites that rely heavily on pop-ups becoming unusable, even when pop-up blocking was turned off. Some sites refuse to serve content to Opera at all, putting up a message that only Internet Explorer, Safari, and Firefox are supported. Opera does feature a handy user-agent switcher to trick these sites into thinking it’s Firefox, but that actually leads to further problems. Google, for example, actually does the right thing when it comes to Opera support, but GMail became a scrambled mess with my user-agent string set to Firefox.

So, while the original browser wars are well behind us, and while standards-based development has easily become the norm, we’re not out of the woods yet. The new battleground is the established trio of renderers – Trident, Gecko, and WebKit – vs. everyone else. While these three represent the vast majority of browsers in the world, things were not always this way, and site developers would do well to code to the standards and not to the popular rendering engines of the day. If your site really does have some advanced features, test for browser capabilities, not for the specific browser in use. That way, you’ll avoid what is surely the most embarrassing gaffe I’ve come across while using Opera – disney.com doesn’t recognize Opera, and so it assumes that you’re using an iPhone!

[If you're wondering what browser I actually use after all that ranting, the answer is Opera. I've really come to like it, and when an individual site doesn't work right, it's fast and easy to fire up Chrome, or even Firefox for those truly annoying sites. Don't even get me started on government sites that only open in Internet Explorer.]

Posted in Techniques, Technologies | Tagged , , , , , , , , | Leave a comment

Akihabara – Replacing Flash Games with JavaScript

I recently saw an impressive new JavaScript game engine called Akihabara. Take a look at it if you haven’t already – it’s really quite spectacular. The Akihabara site has demos of five complete games built using the engine, and while they’re somewhat rough, the experience is what’s truly impressive.

Why so impressive? Well, for starters, these games are built using nothing more than JavaScript and the HTML5 canvas element. While HTML5 alone does not make something an instant Flash killer (see the continuing saga of efforts to usurp Flash with the HTML5 video element), Akihabara is incredibly smooth. Each demo, while fairly rudimentary, controls flawlessly. There are no frame rate hiccups, no input lag, and no jerky animation. The demos are completely playable, easily on par with your average flash game, and decidedly better than some punch-the-monkey banner ad.

The fact that these demos were built with JavaScript adds another interesting benefit – the full source of each game is only a few clicks away! Because the Akihabara engine is doing most of the heavy lifting, the game code that remains is clean and very readable. Levels for 2d scrolling games are nothing more than an array of images, and enemy AI takes up just a few lines for each type of enemy. I don’t know the limitations of the engine yet, but it seems like most any 8-bit era game could probably be ported to JavaScript without too much of a hassle.

So, does this mean that the future of casual gaming is JavaScript? Unfortunately, probably not. While the performance of Akihabara is impressive, the fact that source code is easily available makes it unlikely that serious commercial projects will choose this route. However, the relative simplicity of making games with this JavaScript framework means that we can probably expect a lot of new games written by enthusiasts – like those who submit Flash games to sites like Newgrounds – to use JavaScript, for access to the iPhone / iPad market if nothing else.

Posted in Technologies | Tagged , , , | 4 Comments

Comprehensive Guide to Using Cufon Text with Raphael

[Note: I'm starting this post with a look at a specific problem and why I chose to use Raphaël in the first place. If you want to get straight to the point, scroll down to "Using Text in Raphaël".]

I recently had the opportunity to re-create a Flash component in JavaScript. The component in question was a horizontal accordion that opened slides based on mouse hover. It looked really cool, and it de-saturated the color slide backgrounds for non-active slides. Here is the actual component I was re-building.

So, my first step was to pull out jQuery. I quickly ran across a problem, though: each slide has a title that runs vertically up the slide. I couldn’t use text burned into the image, because the slide titles had to be editable by the client. I couldn’t use CSS3 rotation, because the site had to support Internet Explorer, which as of version 8, doesn’t know what to do with anything in CSS3. What to do?

The answer was more JavaScript. I decided to use Raphaël, a library that lets you easily make SVG canvases on a page and interact with them through standard JavaScript events. Best of all, Raphaël integrates nicely with Cufón, so you can make a Cufón font file, draw shapes from that font, and then work with them in a Raphaël canvas.

Rotation Differences

I set up a prototype that featured the vertical titles, which animated into a horizontal position at the top of the slide when that slide is active. This worked great, aside from my left-aligned text becoming center-aligned after rotation. I figured it was just a quirk of SVG, and I left it at that.

Until, that is, I switched my default text to Cufón text. Now, the .rotate(‘-90′) command that made my default text vertical had a very different effect – the text string stayed horizontal, but each character rotated -90 degrees within that horizontal text string! I spent hours reading everything I could find about text handling in Raphaël, SVG, and Microsoft’s VML, and noticed many other people having similar problems, particularly with text alignment after rotation. Here, then, is the collected wisdom of all that searching.

Using Text in Raphael

Ok, first set up your Cufón files. You may already be using Cufón on your site. Whether you are or not, you need Raphaël-specific Cufón files. To do this, go to the Cufón generator page and set it up like normal, but near the very bottom, look for the section titled “Customization (for 3rd party scripts only)”. See the two icons to the right of the text input? The first one is for Cufón; the second is for Raphaël. Click the second icon, and the text in the input box should change to “Raphael.registerfont()”. Generate the font file and save it with your other JavaScript files. I like to prefix Raphaël font files with “Raphael-” to keep them separate from my standard Cufón files. Make sure that your site is actually loading these new font files with <script> tags.

Next up, set up your Raphaël canvas. When you want to place text on the canvas, use .print() instead of .text() (check the Raphaël documentation page for syntax). You can use the same .attr() function to set attributes like fill, stroke, font-size, and more. There is one attribute that you will definitely want to use, and which the Raphaël documentation does not discuss – text-anchor. Set text-anchor to “start” to make your text left-aligned, since the default is centered. You can also set text-anchor to “end” to get right-aligned text.

Keep in mind that your custom text from .print() is not a single string – it’s a “set” of paths, one for each letter. That means that setting “x” or “y” through .attr() isn’t going to do anything, because .attr() on a set applies the attribute to every element of the set – the set itself doesn’t have “x” or “y”. Instead, use .translate() or .animate({translation: “dx,dy”}) if you want to animate the movement.

If you want to rotate text, you must include coordinates around which the text will be rotated. The rotation attribute (or the .rotate() function) assume that each object will be rotated about its center point. That’s why you get the spinning letters effect when you call .rotate() on Cufón text – each path is rotating around its own center. That’s also why my prototype with .text() lost left-alignment after rotation – it was rotating from the center of the text string. Specifying a rotation point moves each item being rotated the specified number of degrees around an imaginary circle, with the rotation point as its center and the distance between that point and the rotating item as the circle’s radius.

So how do you figure out what to use as the point of rotation? Thankfully, with text, it’s pretty simple – just use whatever you specified as the position for the .text() or .print() function. In my case, the text was positioned at 20,180, so I used that as the rotation point in my .rotate() call. When I translated the text to 60,20 on slide hover, I used those new coordinates as the rotation point to make the text vertical again before translating it back to 20,180.

Fun with Raphael

Making the horizontal accordion took a lot of trial and error, but now that I understand what’s going on behind the scenes it wasn’t all that complicated. I’m looking forward to creating some animated graphs and charts with Raphaël, and I’ll be sure to post any other insights I happen upon here.

Posted in Techniques, Technologies | Tagged , , , | 3 Comments

Are You Indispensable?

So I started reading Seth Godin’s “Linchpin” a few days ago, and I have to say I really like it. There’s plenty of talk about how the current educational system is really great for turning out factory drones, and how it beats out ideas like creativity or independent thought.

The thing that I found most interesting, though, is the way Godin criticizes “The E-Myth Revisited,” the first business book I ever read that really resonated with me. For those who don’t know, the central idea of “E-Myth” is that new businesses should be set up as if they were a McDonald’s: every single part of the business needs to be systematized and documented in manuals to the point that you could operate the whole thing as a franchise. When I read that book years ago, it gave me an entirely new outlook on how I do my work – as well as planting a lot of ideas in my head about escape plans and what to do when “owning a job” didn’t really interest me anymore.

So what is Godin’s criticism? Well, as he says, anyone who’s been through the US educational system can be taught to read instructions and follow orders. If your whole business can be summarized into rulebooks, anyone else can implement it without you. That’s not being indispensable, that’s just being stupid.

That one idea really got me thinking. How can you bring humanity – real, honest-to-goodness individuality – into a business, and yet still be able to take a vacation without everything falling apart? Maybe it’s impossible. For at least the next few weeks though, that’s going to be the question that keeps me up at night.

Posted in Business | Tagged , | Leave a comment