Hermes Update

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.

The Long Overdue Update

I haven't updated this thing in a while, though much has changed. Here's my attempt at a rundown:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Jumping Ship From Facebook

I've been a casual Facebook user for three years or so now. Joining on a whim, I wanted to see what this whole ecosystem of apps and connections was all about. Even so, I never actively used the site extensively aside from letting Twitter cross-post to it and replying to comments.

Facebook is a huge accessibility nightmare. Many of its links aren't reported as such to assistive technologies–or at least, they aren't to Orca–and sometimes it's impossible to trigger some of its functionality via the keyboard. Until recently, there was a lite interface that gave increased accessibility at the cost of functionality, but this was abandoned and I'm now back to casual use.

Furthermore, Facebook's privacy policies are slowly eroding. For clear proof of this, see this timeline demonstrating the changes. Facebook hooked a huge demographic by offering tight privacy controls, then is gradually letting those slip away over time.

So why do I care? After all, don't I myself claim that I'm just a casual user? Yes, but the information associated with me on Facebook isn't always determined by me. Sure, I probably have control over that aspect of my profile as well, but if so then it's hidden behind some inaccessible privacy setting control made difficult to locate. Also, even if I have access to such things today, nothing says I will tomorrow.

Let me illustrate with a concrete example. I personally have never uploaded photos to Facebook. Being blind, I generally don't associate pics with my profile unless there's some tangible benefit–for dating sites and such. Despite this, there are five photos associated with me in which I've been “tagged.” I didn't upload these. I have no idea what they are, if they're pics I want anyone and everyone associating with me. Sure, I could probably delete my tags on these, but the photos could just as easily be flattering and I'd not mind the association. But Facebook never asked me to confirm this. It just unilaterally decided that “hey, someone says you're in this picture, so here it goes on your profile.”

In the past, the way to control your privacy online was to only disclose what you're comfortable sharing. If you don't want someone to know that you're eating a biscuit or going to the bathroom then don't tweet about it. If you don't want people knowing where you are then don't use services like Foursquare which share such details. But what Facebook does takes this out of my hands. Those things which are associated with me are not under my control, and while I haven't been bitten by that yet (at least, I don't think that I have) I don't know that waiting until that happens is a wise choice either. If you know that a stove burner is heating up, is touching it until your hand sizzles a good way to test how hot it is?

So where am I now if not on Facebook? There's my infrequently updated blog which is seeing more steady updates of late. I'm also on Identi.ca and Twitter. These sources are either under my control, or their scope is more narrowly defined to only those things I choose to share.

I like the Facebook model, just not what it stands for. To that end, I'm keeping tabs on the efforts of groups like Onesocialweb which will offer Facebook-like functionality over decentralized, federated networks.

So where to from here? I'll leave this note up for a few days so that anyone wishing to keep in touch can do so, but after that I'm deactivating my account. I think that Facebook requires a two-week delay between account deactivation and deletion, but I'm just not attached enough to this account to want to keep it in light of my concerns, and the two-week delay is in my mind another effort to retain someone's information for marketing reasons should they forget to delete. I'm not doing this out of any great anger or affront at how Facebook treats its users. As far as I'm concerned, it can do what it wishes. But, in every instance, Facebook continues to do what it does ultimately due to the actions of two parties–Facebook themselves and each user who quietly decides that it's OK. In my case, I've decided that it isn't, and it now falls to me to terminate my consent.

Introducing Hermes

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.

Announcing Spiel

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. :)

Rererelaunching the Blog

The bad news is that I'm launching yet again. I suppose this makes the millionth or so incarnation of a blog in some form on this domain. The good news, however, is three-fold.

First, I've put a decent amount of effort into migrating the four or so posts over from the old site, so the content and URLs should still be mostly preserved. Aside from possible aggregator spam and a new look, most of the content I deemed important is here. That said, I did skip posts that were no longer relevant, so some didn't make the cut.

Also, I'm blogging old school now. Part of why I've stopped maintaining the older blogs is that I grew tired of the maintenance. First I had to keep the platform itself updated due to security vulnerabilities. Even with an up-to-date platform there were the plethora of plugins I invariably installed, and no system of which I am aware makes upgrading many of those anything less than painful. Now I'm using Ikiwiki I can edit via the web should I wish, but the whole blog is stored in a Git repository, all the files are text, and a simple commit and push is all that is necessary to update the site. It's so incredibly easy, and I'll be updating much more because of it.

How do I know these aren't just empty words? Because I have three uncommitted drafts ready to post as soon as I've either found the necessary links or have done the things I've claimed in them. :) Of course, that isn't counting the posts I have planned but haven't yet drafted.

So what's upcoming? I haven't yet written about my work on Spiel here, nor have I written my thoughts on and efforts toward Android accessibility. Stay tuned!

Of course, another blogging frustration is that I have no idea whether the site itself looks decent or hideous. It's mostly stock with a few tweaks to integrate Disqus, and while I'm not exactly trying to win any “best looking site evar!” awards, not looking horrific is also important. :) Feedback welcome, and while I can't promise to know how to fix it to make it look better, I'll at least try.

Disability Discrimination, More Subtle Than You May Think

First, because text has no obvious tone, I'll set one. I write this not from a place of frothing rage, but rather from one of passionate anger concerning a behavior which is wrong. That it's one I encounter again and again indicates that it needs public airing, and I'm no longer willing to tiptoe around it while soothing fragile egos.

Second, while this is inspired by a recent happening, it is not a response to same. This is not a forum for drama, but rather a discussion of an issue endemic to many of my own relationships and those of others, as well as an attempt to make sense out of certain things I've witnessed over the years. I will delete and disregard any communication attempting to make this personal.

As background for any who don't know, I'm totally blind. I'll omit the discussion of specifics because they are, for all intents and purposes, irrelevant. Yes, it's a major factor in my life. Yes, it shapes my wants and needs. Other than that, though, it matters less to me than most might think, and does so more because it shapes my interactions with others. If you still struggle with this concept, substitute race, gender or religion in place of disability. Is every woman, every black person, every Christian obligated to make these aspects central to their lives just because we decide that they must be? Must we really force our own assessments of importance onto others?

What I want to write about today, though, is discrimination, of which I now believe there to be two broad types. The first is incredibly obvious. I'm blind, therefore I can't do X or am automatically better at Y (where X is usually crossing streets or tying my shoelaces and Y is usually massage therapy or playing the guitar.) We're all familiar with this. Asians are smarter, black people are better basketball players, we can be here all day repeating tired stereotypes about any minority. I think we can all agree that these beliefs are condescending and inaccurate at best or humiliating and unempowering at worst. I think, though, that there is a second and more insidious type of discrimination, one that I feel is endemic in relationships of many kinds involving folks with disabilities. It may exist in more abstract forms affecting other groups, but disability is where I'm most familiar with it.

I as a blind person need more support, regardless of how independent I may be. This support can come in many forms, from good and reliable public transit to someone who unhealthily attends to my every need. I strive for the former more empowering support, but sometimes it's just not up to snuff and I turn to friends and family for help. This is not unnatural, as it is human (one may even argue primate) to seek supportive community, and new age woowoo self-help talk aside, we all need others regardless of ability.

Naturally, this has the potential for abuse, as it's easy to use a support network as a crutch. This is a fact of which I am quite conscious. As such, I make it incredibly clear to anyone in my life that they can say no if I ask for support. There's no guilt in saying no or in establishing boundaries. Rather, I whole-heartedly encourage that we all get better at it. If I don't get the support I need, I reserve the right to stress about it. I reserve the right to vent my frustrations. The need does not go away because someone says no, and I refuse to pretend that it doesn't exist. But meeting it or not doing so then becomes my issue. I do not reserve the right to make anyone feel guilty or anything else negative for setting a boundary.

And yet, people listen to this speech from me again and again and still feel guilty for not being supportive. People still refuse to listen to my honest words and believe them. People repaint history portraying me as some grand manipulator who wove them into a trap and, ultimately, they either strike out at me or arrive at unwarranted and inaccurate conclusions.

And, let's be absolutely honest and not mince words. It's easy to see me as the poor, pitiful blind person when someone can't give the support I request. It's also easy to imagine or see any number of racist or sexist stereotypes, often without looking for very long. There's a huge amount of societal conditioning steering us away from the latter, yet we ignorantly accept the former without a thought.

In short, this discrimination denies my ability to honestly relate. Instead, it relegates me to a sort of infantile status, selfishly taking with no regard to others. It is deeply and powerfully offensive.

I'm tired of this being acceptable. If someone genuinely feels guilty for telling me no, that's their issue and not mine. If someone persists in the inability to own up to that issue, and ultimately attacks me or perpetuates it, then I place them in the same category as someone perpetuating racial, LGBT or other stereotypes. Just because it's easy to imagine is no excuse. Similarly, because someone may have experienced it from others is likewise not an excuse, just as a member of a racial minority's upholding of a stereotype inherent to that group does not make it acceptable to generalize that behavior. It's time to publicly declare that the problem isn't me. The problem is a twisted survivor guilt combined with an inability to set boundaries and an astounding lack of honesty, both within and without. Strong words, yes, but this form of discrimination is as real as any other. It's worst aspect is that it hides well, masquerading as justification for purging a bad influence or as good cause for ending a bad relationship. The relationship may be bad, yes, but not because of the reasons given.

Honest communication and setting healthy boundaries are key to good relationships of any type. This discrimination is insidious in that it involves painting someone as a gross violator of such healthy behaviors when, in fact, the fault lies with the painter rather than the paintee. It's hard being a person with a disability trying to pursue healthy relationships when the ones responsible for such discrimination would rather not admit to themselves that they've found an instance where they are incapable of maintaining healthy relationship dynamics. It's also hard to admit to discriminating when one considers one's self open-minded. It's much easier to play the victim, use the very language of healthy relationships and tell tales of woe, if only to themselves, or easy to claim that this is all transferrence on my part. This latter fiction is something I've told myself for years, and I'm done with that as well.

So is it like this everywhere? Maybe. In my experience, disabled people tend to congregate to churches. I'm certain that, in most instances, this reflects the individual's true beliefs, and I commend anyone for following their path as long as it doesn't negatively interfere with that of others. Yet, when I think about this form of discrimination, I wonder if this environment lessens it somewhat. If those around you put aside earthly pursuits to promote a higher good, they'd seem more inclined to give support in lieu of establishing boundaries. It makes sense to me that someone adopting this mindset isn't likely to burn out and lash out because they gave too much of themselves, but would instead consider that a virtue.

I also see many people with disabilities gravitating toward each other. Whereas the church environment may address this form of discrimination by turning it to a virtue, those of us with disabilities might be familiar enough with it that it's just not as much of an issue. If I know the problem is there, whether consciously or more fundamentally, I'm not likely to get annoyed at someone else should their struggles seem like an inconvenience to me. I'd also not feel as guilty for saying no, as I'd truly empathize with both sides of the issue.

Am I criticizing anyone for choosing either of the above paths? Absolutely not. Live the life that makes you happy and satisfies your beliefs, not the one that others say you should, but live it honestly. Know others, and know yourself. Set and maintain healthy boundaries, holding honest dialogue about them. Most importantly, look within and question everything. Turn over every stone and ask yourself what lies beneath and why.

The worst aspect of this is that there's no real way to succeed in some instances. Either I deny my path and my beliefs, pursuing a contrived life just to lessen it, or I'm faced with the choice between long-lasting friendships or finding the support I need. And, unlike many issues, honesty and openness isn't the solution, as this discrimination's very basis is an inability to believe in my sincerity and, ultimately, others' declaration that I'm false. The only “solution,” as it were, is to simply never ask for help. We should be stable and support ourselves, sure, but anyone who considers this a valid response should honestly ask themselves where they'd be without a healthy support network. The resulting picture would likely be a desolate one.

I want to show compassion for those who perpetuate this form of discrimination. It can be difficult to realize and acknowledge that it is being done, especially for those who consider themselves open-minded. There's no shame in making amends for a wrong done, only in continuing to do it. I want to show compassion, yet I also want to establish a boundary of my own.

I refuse to accept that I manipulate others by being honest. I refuse to accept any negative feelings for the guilt or other emotions that result from said honesty. I also refuse to show any sympathy to those who continue to insist that they are being manipulated or otherwise mistreated while being dishonest with others and themselves. Whatever negative emotions these words may have inspired, my acceptance of any blame as a result has been much worse by far. Today I let go of that, and hope that anyone perpetuating these beliefs will likewise let go of their own burdens. It's time to vocally acknowledge that this exists, and to end the notion that it is either OK or subtly my fault.

Utterance Addendum

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. :)

Announcing Utterance

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.