While I've not been blogging of late, I have been working on other projects. Several months ago, I introduced Hermes, my open source accessible GPS.
While there's still not an official site, the project has seen lots of active development, inspired heavily by my commercial GPS deteriorating at a rapid rate and my inability to afford a replacement. In April, the web interface got a REST-based web service layer. June saw the beginnings of my work on an Android app to communicate with the web service, and in late August, I'm very close to having something that I might wish to use on a daily basis.
It is currently possible to move around and receive real-time feedback about your current street, nearest intersection and nearby points of interest. All of these announcements appear on the notification bar, making it possible to run the app in the background and do other things while receiving real-time feedback. I also recently implemented voice commands. It is currently possible to request accuracy, direction and speed of travel, your current road/path/stream and the nearest intersection via voice commands. As more functionality is added, I hope to make the entire app usable in this way, so you might still have access to location services even in situations where pressing buttons and using gestures is impractical or impossible.
The web service and underlying library have also undergone a variety of changes. Live use has revealed a number of bugs and design deficiencies which are being addressed at a rapid rate. Often I'll find a bug while out and about, swing back by the apartment to try implementing a quick fix only to head back out again a few minutes later.
Another development about which I'm excited is the ability to navigate any network of ways described in OpenStreetMap. The most obvious use for this of course is street navigation, but there's no reason that Hermes couldn't work just as well on a mapped trail or river, speaking the intersection of streams with each other, the boundaries of lakes and other larger bodies of water, etc. While I haven't used the mobile version in these scenarios, I've used the web service to explore some of Austin's creeks and lakes, and am hoping to hit a camping store sometime soon to investigate waterproof phone cases. There are currently issues when non-vehicular paths parallel roads--sometimes Hermes will assume that the bus I'm on is cruising down a bike trail which I assume is alongside the current street--but hopefully this should be an easy bug to fix once others have been resolved.
I'm still not certain when I'll have something to demo. Since this is all volunteer, with my time split up between numerous projects, there just aren't any guarantees.
I have, however, tentatively volunteered to participate in this SXSW panel, which in theory should steadily encourage me to blow people away with something cool in March.
If you'd like to help make that happen, vote for the panel so it's more likely to be chosen. Regardless, progress will continue. The ability to navigate unfamiliar environments without having to wrangle two separate devices in addition to my phone and anything else I may carry is such a huge benefit, and I look forward to the day when a fully capable smartphone is all I'll need.
I haven't updated this thing in a while, though much has changed. Here's my attempt at a rundown:
Of more immediate interest to blog readers (all two of you) I've broken "permalinks." This probably forced a recent article repost, which I regret. I had very good technical reasons for changing the permalink style, but having done so, I can't think of why I might ever have to do so again. Unfortunately, previous links to posts won't work (I know that this one was heavily linked) but the content is still there.
Several months ago, I moved from Houston to Austin, Even though not everything is going as I'd hope, I'm glad to be back in a city which I very much consider my home town.
Work on various projects still continues. Spiel is receiving more rapid development, and may even be at the core of a commercial product (more on that in a bit.) Hermes is also getting lots of love in the form of an Android app. More on that in another post.
I have a part-time job, writing apps and developing infrastructure for a joint project of the American Printing House for the Blind, the National Braille Press and various other agencies. More on that soon, when I have something to link, but it's basically an open source notetaker running Android and, most likely, Spiel.
Massage therapy hasn't been forgotten. In early June, I had a promising meeting about the business plan wherein I received some tangible pointers on areas to develop. For various reasons, work on the plan has slowed, but work on my website and practice management app has taken off. Massage, as with any other health care profession, is paperwork-intense, which is kind of a pain for me to manage. As such, I'm working on a web application that allows for entry of form templates and completion of forms based on them, archiving of prior versions, rendering of forms to PDF for printing, appointment booking, etc. My only corporate job involved something vaguely similar for a state agency, which nicely acquainted me with the issues of developing something with the characteristics of a traditional paper-based system in the online world. Anyhow, not only will having this already in place make it quicker to start out when I do eventually get loans, but I think that showing off a fairly solid piece of technology and saying that I hope to market it someday might make it easier to receive loans and to be taken seriously.
I recently acquired an Olympus DM 520 voice recorder. Thus far, I vastly prefer it to the older unit I owned, the Edirol R-09. The menus are accessible, battery life is 50 hours compared to only a few, it has 4 gigs of internal storage and charges via USB. No promises, but I'm once again pondering podcasting. I think that, at the very least, I'll want to record a few demos showing off Hermes at some point.
Anyhow, I think that's plenty, neatly encapsulating what has changed but still leaving lots of room for future posts. Whether or not I'll actually write those is another story entirely, but I'll try.
I've been an avid GPS user and enthusiast ever since purchasing my first accessible unit in 2006. Even so, I was somewhat disappointed in the state of the technology and made a variety of suggestions for improvements, some of which were met with scorn and hostility. The technology was sub-par, the community stifled innovation and something that should have been a source of fun and adventure was boring as hell. I felt that I could do better and, while it's taken years to do so, I think that I have. Hermes is my attempt at an open source, accessible, cross-platform GPS solution.
So why the name? Hermes is the deity for lots of cool travel-related concepts, as well as of borders and of crossing them. What could be more fitting for a project intended to free people from various confinements and limitations? I also wanted something to capture the notion that accessible GPS need not be boring, helping to realize everything from the mundane to the adventurous.
At the moment, Hermes has two components. The core library and engine is a Scala wrapper around LibOSM and, eventually, OSMNavigation. This means that it supports a number of geospatial data structures and queries, as well as data storage layers, in a GUI-agnostic manner. In layman's terms, the core functionality for plotting routes, describing maps in natural language, etc. can and hopefully will be used in a variety of front-ends ranging from self-contained devices similar to those currently marketed, to web-based geolocation services.
The second component is just such a thing. Hermes Mobile is a web-based interface to the core library, letting you explore maps from most modern web browsers. The interface is highly dynamic, uses AJAX and Comet heavily, and provides rich accessibility support by using Accessible Rich Internet Applications (ARIA). The results, pardon the pun, speak for themselves--at least, they do on my Linux box running Orca and Firefox 3.5.
If you're interested in playing with this tech, check out the demo instance. There are a few caveats, however:
- It's running on my desktop, since I don't have access to a server with the required RAM and disk space. I may pull the plug on it should people's testing interfere with my ability to watch movies or otherwise get work done. If this happens then I'll update this post.
- The server is only hosting maps for Texas at the moment. Loading maps for the entire world would require in excess of 200 gigs of disk space, not to mention an intense import process that would kill my desktop for days. Even so, you can still play with it if you don't live in TX.
- It may occasionally be down while I load newer versions with more features or upgrade the server.
- I've already had one request to load more maps and did so in that instance, but I probably won't do so again. I understand that people may want to explore specific areas, but this is just my desktop, and if I start loading maps left and right or arbitrarily deciding which to load then this stops being fun and starts becoming a drain on resources. It's a proof of concept for now.
To experiment with this, visit the above URL. If your browser doesn't support geolocation, you'll be prompted to either upgrade or to install Google Gears, though most features should work fine if you don't have a browser with geolocation support. You'll then be prompted to share your location. I don't do anything evil with this (or even persist it beyond your session.) When you click "OK," "Yes" or whatever, you are then located on the map more or less accurately (I have no control over this part of the process) and can begin browsing. If you don't live in TX or don't wish to share your location, type a "city, TX" query (I.e. "Houston, TX") or a Texas address into the search box and you'll be offered a list of search results which match your input. Simply select one then tab away and you'll be located at that point.
The browsing interface should be fairly simple. Basically, there's a list of nearby points of interest and intersections on the left, found within a range of 400 feet or so. Selecting one of these moves you to that location and updates the list again to feature nearby points relative to that. If you're on a street or at an intersection, a list of buttons for intersections reachable from your current position becomes available. In other words, you can browse by either selecting points from the list on the left, or by navigating the street network. Doing the former lets you move about an area more quickly and non-linearly, while the latter automatically sets your direction of travel and, as such, can list points and describe the area relative to the direction you're facing.
By default, distances are returned in metric units. If you can't handle this, it's fairly easy to change. Immediately below the search field are stats on your direction, altitude and speed, along with a popup reading "KPH." Switching this to "MPH" globally changes the units used for the duration of your session.
You can also place beacons, which are a bit like points of interest, but appear regardless of where you are on the map. I'm planning a move, don't know this city very well and needed a way to basically mark a bunch of points and see where they all are in reference to potential housing. So with Hermes I can create several named beacons, browse to potential addresses and see where my beacons are relative to wherever I am. Right now these persist only for the length of the session. When I add user accounts, these plus user POIs and other details will be saved between sessions.
So what's next? This is obviously an early version, but it's not intended as a throw-away prototype. The code is well-written, open source and being steadily improved. As its name implies, my ultimate intent is for this to be usable on data-capable mobile devices, but it's already a useful tool for exploring locations from the desktop. For mobile users, I plan on adding augmented reality features to, in essence, let you write notes on reality. Forget which buttons on the machines in the laundrymat do what, or which is the door into your favorite store or restaurant? No problem, just write a note on that location and have it and others displayed whenever you enter a configurable range.
I'm also planning social network integration. I've been in many situations where I've needed help finding an obscure or unmarked bus stop, or some other business, but there's just not a pedestrian around to ask. With Hermes Mobile, you'll be able to take a picture or video of your location and post it, along with Google and OpenStreetMap views of your location, to your Twitter and Facebook feeds. Instead of waiting for pedestrians, simply croudsource your question and receive answers directly in the app.
Also, since the Hermes core is GUI agnostic, there's no reason that someone else can't do cool things for disconnected devices as well. My ultimate goal is for Hermes to work just as well on forest trails as it does on city streets, so you can take a disconnected PDA of some sort, map out a path and use it for routing just as will eventually be possible over road networks. For the moment, though, my efforts are concentrated on the mobile interface.
I also need to get the open source infrastructure set up. I'm not sure when I'll get around to doing that, as that's a bit dull compared to the rest of this, though if there's developer interest then I might be convinced to do it sooner rather than later.
My ultimate plans are to monetize this as a small business. The requirements are a bit odd in that it will likely use a large and growing pool of disk space (I'm thinking half a TB to be safe) but likely not a whole lot of bandwidth, which makes it a bad fit for most VPS providers. It also needs Java-based hosting and uses MongoDB for its back-end storage, which rules out just about every other hosting provider out there. The only way forward will likely be buying or leasing a server or two to host this, meaning I can't just do it as a voluntary thing. I'm thinking of a monthly subscription-based model with a brief trial period. Admittedly, OSM data isn't the best available, but it will only improve over time. With a trial period and subscription-based model, you'll be able to see if it meets your needs, cancel if it ever doesn't, and OSM's map coverage may be sufficient enough for most use cases. In quite a few instances, a $15 or so per month subscription is probably far better than the $1500 investment I made when I purchased my Trekker in '06, and I'm already doing tasks in Hermes that the Trekker community told me weren't supported.
Anyhow, I look forward to feedback, as well as to developer contributions. This project has gone through various incarnations over the past few years, as well as many rewrites, so I'm thrilled to finally have something to show for my efforts.
Last but not least, I'd like to take a moment to express a bit of geek squee over what a joy working with Lift has been. It isn't the easiest framework to wrap your head around I'll admit, but once you do...wow. Had I done this in Rails, I'd have been bogged down with plumbing--setting up controllers, defining routes and a whole bunch more tedium that Rails was supposed to avoid. Over the last few weeks I've really been getting it, though, and have added a whole bunch of interactivity in just the last week or so. It's amazing. I get an idea in my head and within a few minutes there's new front-end javascript sending data back into my Lift app which is processing it and updating HTML like magic, often without my even having to write a single character of JS. I often forget that I'm even using HTML, or even that I'm designing a website, instead feeling as if I'm developing an application.
This is something I've not blogged about because, well, I've not been blogging much of late. I think, however, that it's time to introduce this project officially--at least, as officially as anything here truly is.
Android 1.6, released last September, included the beginnings of an accessibility API. Unbeknownst to me at that time, Google had already provided a basic screen reader taking advantage of this support and offering basic speech feedback for much of the phone's OS. Had I known that, I may not have begun work on Spiel. But, as it happened, I begun work on my own screen reader project and had a basic version up and running in a bit over a week.
Spiel began life partially out of my ignorance of TalkBack, Google's own screen reader, and partially out of my desire to learn the Scala programming language. Soon, however, it developed features that left TalkBack behind.
Chief among these is scripting. Accessibility is tricky for third party app developers to get right. In an ideal world we'd all know how to develop accessible applications, and would display the same dedication for accessibility as is commonly found with i18n. Realistically, however, controls aren't labeled, correct events aren't fired and the experience is less than optimal. For apps that aren't quite accessible, the ability for screen reader users and vendors to script the mechanisms by which the app is presented can prove invaluable.
Spiel currently exposes facilities for hooking into event presentation, as well as a simplified text-to-speech API. This makes it possible to present certain controls differently, or not at all. Currently this support is rather limited, and isn't yet exposed to the end user. It is, however, better than nothing, and I do plan to improve upon it as the accessibility API becomes richer.
Speaking of, the accessibility APIs Google provides are fairly limited for the moment. I've seen comments from engineers that this support is slated for improvement in upcoming Android versions, however. What I can accomplish today is somewhat less than I'd like, but I think that I've done quite a nice job with what I have, and hope to do more as soon as I can.
So why not improve TalkBack? First, because I really dislike Java and find Scala a far superior language. I'd also like the freedom to develop without the restrictions imposed upon me by having to work within Google's processes. Sure, I've no doubt that patches would be welcome, but I have my own vision for how Spiel will work, and would like to explore that with fewer constraints.
That said, I welcome patches and collaboration. See the website for ideas on how, and watch this space for more Spiel updates.
This post has been sitting in my drafts for quite some time now, but seeing as today marks the release of version 0.8.0, there's really no excuse for not mentioning it here. 
Just a brief update:
When I wrote yesterday's post on Utterance, one feature I hadn't gotten working yet was direct messaging. They could be sent, but not received, and it wasn't immediately obvious why this was. Last night I figured this out, and a few minutes later had two-way direct messaging working quite nicely.
So what does this mean? Twitter and Identi.ca have in essence become completely IM-like. Granted, it's a slow IM with a few minutes between messages and the 140 character limit, and I'd not recommend using it over any other form of IM if you have the chance, but with this feature I've finally succeeded in creating an IM-like interface to microblogging that works regardless of which XMPP client you're using.
I think I'll take a break from Utterance for the moment, both because I'm getting tired of hacking on it and because I need to work on other projects. Next, however, I plan to add a chatroom-style interface. Following/unfollowing users will be a matter of inviting or kicking them from the chatroom. You'll also be able to group users into custom rooms, separating some updates out from the larger stream. Finally, Utterance will detect based on several factors whether or not to use the classic or chatroom interface, thus keeping you connected on clients from the desktop to the phone.
But for now I shift gears and chase another shiny. 
No, this isn't the major post I promised--that's still being worked on--but I did want to announce a project I've been hacking on for the past few months now that is finally becoming usable.
Microblogging is a fun way to communicate en mass, though in actuality it is little more than web-based IM, deriving its origins from IM status messages. Twitter even had a simplistic IM interface earlier on, though this was axed soon after I began using it (I'm sure the two are unrelated.
Other microblogging services like Identi.ca still do provide these interfaces, though they're quite simplistic and offer an incredibly limited featureset.
A few months ago, I set out to write an XMPP-based interface of my own. The result is Utterance, and I rarely need to visit either the Twitter or Identi.ca websites these days. Here is what currently works:
- Messages are relayed via IM to and from multiple accounts on either Identi.ca or Twitter. It is also possible to post to only one account. All other IM interfaces of which I am aware are limited to a single account on just one service.
- Quick @ replies. Each message has a small identifier that can be used to not only prepend the @username, but also to direct the reply at the correct notice. Most existing IM interfaces assume that replies are intended for the last message received from any given user, which is often inaccurate.
- Viewing of previous messages in the client. If you've received a message recently enough that it is still archived, then sending the message identifier resends the message. Currently Utterance archives nearly 4000 messages per user, so you're likely to find just about any received message without hitting the web.
- Conversation fetching. A three-character command displays an entire conversation, so you need not leave your client to view context for a notice.
- Follower management via the buddy list. An optional feature lets you follow or unfollow users by adding or removing them as regular IM contacts. Also, new followers appear as if an IM contact has just subscribed.
There's more that's not mentioned, and even more planned. Feel free to try it out if such things interest you. Mind the alpha warning, and the occasional bug. The bit about wiping the database is no joke. I deleted and restarted it just last weekend due to needing to test a number of fixes in production, but in general I find it stable and reliable enough that I've used it almost exclusively for months.