Archive for the ‘Web Technology’ Category

No, I have not signed up again for that damned Vonage plan. However, after 49 comments in the last two years (pretty much unheard of for my little blog) with the last one coming as recently as today, it seems like many of you still have issues canceling Vonage.

A quick Google search for “cancel vonage” shows that my blog post is one of hundreds, if not thousands, of blog posts, forum posts, email list posts, and all other forms of web communication which detail the drudgery that is attempting to cancel Vonage.

Why would a company go to so much trouble to try to keep customers who clearly do not want their service? Is their cash flow so bad, that they simply must have the revenue? I was amazed about a year and a half ago when I read the news that Vonage couldn’t sign up new customers. Even more amazing was the fact that not a day goes by that their damned commercial is on my TV or a week goes by that I don’t get some form of direct mail piece advertising their product. Apparently, somehow the news never made it to Vonage’s offices. Not one aspect of their business model or customer service strategy seems to have changed since it became clear that they were fleecing customers.

The money must be great, because they still are around and seemingly thriving. With the ubiquitous nature of the cell phone and with cell plans getting cheaper every day, what does Vonage offer that’s not available via a service like GrandCentral? How can we more effectively spread that word that Vonage is a Faustian bargain?


I’d like to write more about SQLAlchemy and Django, and I will, but for now, just this little note. (As a teaser, we use Django and SQLAlchemy [along with Elixir] on a daily basis, and it’s a great combination.)

As far as open-source support goes, we all know that projects vary greatly in how well they support the folks using their code. The incentive for them to do so is almost entirely altruistic, unless one considers having a popular open-source product as a certain kind of fame.

Anyway, in that environment, Michael Bayer, who wrote most of, maintains, and supports SQLAlchemy, single-handedly answers nearly every question on the mailing list. His answers inform, but also point the question asker to places where he or she can learn even more past the answer to the initial question.

I use SQLAlchemy and I really like it, but past that, it’s great to see Michael be such a great resource to the community surrounding the product.

A long time ago, longer than I’d like to admit, I started on a freelance project. I can’t say too much about what it does, but I would like share a bit about the development process I went through.

When I started the project, I was beginning to get back into web development after a couple of years away from the work during which I was teaching. So, I had some catching up to do and rusty skills needed to be dusted off and honed.

The project is somewhat ambitious with lots of GIS work and a little bit of social networking thrown in. It is a big project and means a lot to me, both financially and as a way to learn and really sharpen up my skills. It’s been a pleasure to work on as it is finally coming around to fruition.

All that said, I jumped in with both feet and starting coding in PHP, with some bad habits such as HTML all over my PHP. I know enough CSS to be trouble, so there was lots of that, too. I was building with some eye toward a previous incarnation of the app, so there were some design decisions made then that we have long since abandoned.

Many months late, I produced a passable version. It didn’t look like much, but it worked. When the fellow I was doing the work for asked me how scalable and maintainable it was, I had to do a lot of soul searching. I had become friends with this client and I knew deep inside that what I had built would work up to a point, but that it wasn’t that extensible and I was unsure how some of the GIS bits would scale.

I owned up to some of what I saw as problems with what I had built. I was building something to be a an alpha/proof-of-concept when what the client wanted was a solid beta product. I had misunderstood and probably gotten in over my head.

It was then that my client and I had a heart-to-heart and decided we would start from scratch with a platform that was extensible, maintainable, and offered some niceties that no homegrown PHP app could easily do. That platform was Python/Django/PostgreSQL.

With PostgreSQL, we got the PostGIS libraries which overjoy me day in and day out. With Python, we got clean, maintainable code. With Django, we got a robust framework that makes it easy to add new features without massive rewrites. Django also gave us fantastic code/design separation and it was just plain fun to learn.

These great visions in mind, I set about to not only learn the Django framework, but to also learn Python. Luckily, my new full-time job was giving me plenty of PostgreSQL experience, though no PostGIS (yet!), as well as, giving me the ability to work with Django and Python on the new features we are building at work. So, I wasn’t totally in over my head.

Every piece of the app that I write now is a pleasure to code. When I’m “done,” I can hand over these neat, clean HTML templates to a designer to spruce up with little fear of confusion. The database access stuff, especially with GeoDjango in tow, has become a breeze. Everything I used to hate about web development has been made a tiny little bit of the work. The vast majority of my time is spent thinking about scalability and how the feature actually works rather than building another script to handle form post input. It has simply been a joy all the way around.

We are nearing the end of the application work on the new Django version of the app. There’s lots more to do and lots of ideas for the next version. The difference between this Django version of the app and the PHP version is night and day. It might look similar from a UI perspective, but it is vastly fewer lines of code (not including Django itself), another developer could easily pick it up and improve on it or add to it, bugs are much, much easier to track down, and it was actually fun.

When all is said and done, I will, of course, point you to the app and will maybe do some more detailed comparisons between the two with some code. One thing to keep in mind is that the difference is not just between a PHP and Django app, but between the developer I was and the developer I am becoming. Sure, I’m no rock star, but I’m getting better at this every day.

I’d like to give a big thanks to my client for his faith and reassurance as I tackled this daunting task. A great client and an open, honest relationship go a long way. I’ve so far past any deadline we ever set on this project, but my client sees the vision and understands why we’re doing what we’re doing.

Job Search

Once again, I find myself looking for work. I guess that’s the problem when you love new challenges. Sometimes, they don’t work out. If anyone knows of web development work in Nashville, TN, let me know.

My resume is here.

Damn Dirty Bombs!

InnerTee is a site that lets you create your own “remixed” t-shirts using art provided by other users. Those artists get a few coins everytime someone uses an element on a t-shirt that is then purchased. It’s an interesting idea, though the t-shirt mixing tool is pretty basic right now and the choice of available art is small. The site just launched, so both issues should disappear relatively quickly.

This has the potential to be very cool as you could mix your own art with that of others and create truly one-of-a-kind designs. The tshirt market online certainly has room for something like this. One concern is that the “remix” idea could be rather easily adopted by someone like Threadless or Zazzle. Another concern is price of a shirt with more than one suer-created image. The shirt below is almost $25 plus shipping. That’s starting to get out of the realm that most folks will pay for a tshirt.

Click this badge to see my first mix:

This little embedder should really show the shirt I made, not just link to it. I hope they fix that as well. It also gets jacked up by WordPress’s code filters. Simplifying it some might help.

Digg has yet to release an official API for working with their data. They have hinted at one for a long time and some folks have worked out a few details. Even better are the web services that Digg seems to be exposing. A few rudimentary and completely unsupported and unofficial documentary efforts have occurred.

There is one piece missing from all of these efforts thus far. It is frustrating me to no end. As far as I can tell, it is difficult, at best, to determine whether a given link has been submitted to Digg already. So, if you are programming some system and want to provide links to submit items or Digg items, you are incapable of determining which tool to provide the user.

Digg’s official policy at this point is to push all the users to the same place and let the submit form on their site sort things out. That’s what their Tools site has to say about it. For most developers, I imagine this is less than desirable. It is much better to be able to show the Digg button for those items already in the Digg system and let your users update that Digg without leaving your site.

The Holy Grail of the Digg API at this early stage then is letting developers dynamically determine the state of any given URL in the Digg system and present their users with a way to easily add a Digg to that URL or to submit that URL to the Digg system with a minimum of fuss.

One WordPress plugin developer seems to have done just that. I do not run a WordPress install and cannot test his work. I have spent the better part of the day trying to adapt it to work outside of WordPress with little luck. His curl and scrape method seems fragile and is certainly prone to slowness.

Does anyone have any thoughts or ideas about how this can be implemented in PHP? I have some code, but it’s based on the plugin above and I am not comfortable with the HTML scrape.

Technorati Tags: , , ,

powered by performancing firefox

I have been trying to adapt Andrej Okonetschnikow’s ModalBox for use on our site at We were having some issues with the many Flash objects on our site displaying above the modalbox or flickering through the overlay. This is pretty typical and is something that many of the modal solutions faced with HTML select boxes in IE.

The common solution for this was to set the “wmode” for the Flash objects to “transparent.” This would make the Flash objects obey the z-order for all the objects on the page and consequently ModalBox would work correctly. There’s a problem here though. On Mac, when one uses “wmode = transparent” for Flash objects, some serious bugginess appears in the Flash player.

We experienced weird mouse behaviors and odd movie flickering and resolution issues with symbols within the movies. All of these problems only appeared on the Mac in Safari, Camino, and Firefox with versions 8 and 9 of the Flash player and disappeared when we got rid of the “wmode = transparent” parameter for the movies.

So, here’s the solution I came up with that provided us an acceptable result. It does not “solve” the problem, but was an acceptable compromise for us.

First, we detected whether the user was on Mac or Windows.

If they are on Windows, I dynamically write “wmode=transparent” for the Flash
objects in the page and ModalBox displays above them as expected.

If they are on Mac, the wmode is NOT set to transparent. I wrote a small function in modalbox.js to hide or show the Flash object which looks like this (adapted from Lightbox Gone Wild):

// For Mac browsers -- hiding all FLASH elements
        _hideFlash: function(visibility) {
             if (navigator.appVersion.indexOf("Mac") > 0)
                flashes = document.getElementsByTagName("object");
                    for(i = 0; i < flashes.length; i++) {
                            flashes[i].style.visibility = visibility;
                flashes2 = document.getElementsByTagName("embed");
                    for(i = 0; i < flashes2.length; i++) {
                            flashes2[i].style.visibility = visibility;

It’s a hack and can be done better, but it works and I just wanted to prove that it was possible. This function would be called in the “show” and “_deinit” function of modalbox.js:


All of this results in the ModalBox working fine in Firefox and IE on Windows and Firefox and Safari on Mac. The Flash movie will disappear on Mac and will start playing from the beginning each time the box is displayed in Firefox, but these are things we can live with. Your concerns will be different.

I know this is not the clearest write-up, but it seemed that a lot of folks are struggling with this so I wanted to post it quickly. Comment or email with questions and I will try to help.

I had a hard enough time trying to cancel their service. Today, I get an email saying that I can still get some free months if I refer friends to them. This is incredible. I used to recommend them all the time, but never again.

Not only are they trying to win me back in a most grating way, but they want me to sucker my buddies in on the trap as well. It’s just ridiculous how far they have gone to turn a happy customer who just needs to cancel for a while into a person who is now actively blogging negatively against their company.

Technorati Tags: , ,

My Resume

Just setup my resume using a new service called Emurse. I already had it written so it was very easy to transfer it over. They also offer the option to just upload the one you’ve already created. Here’s the widget they give you to link to your resume:

Resume Links:

Host Your Resume Online at!

I have yet to face this in my development experience, but it’s certain to be on the horizon. Bob Aman had this to say about Asian-language websites

Most Chinese/Japanese/Korean websites I’ve seen lately tend to have unusually “busy” designs…I usually react with something more along the lines of, “Yuck, how do you guys read the text on a site like that?!” There’s obviously a lot of sites out there that people typically point to as examples of good web design, but the vast majority of such examples seem to use the latin alphabet.

Sporkmonger >> CJK Web Design

His repulsion at the design of many asian-language sites might be the sheer fact that the language itself is seen by his brain as a visual element.

That is, you don’t see it as text, because you can’t interpret it. Even though you might not speak Spanish or French (if you do, just play along) you still know the letters, while the characters of many Asian languages are completely outside your linguistic perception.

Therefore, you perceive them as visual elements, then you deconstruct the page into having a ton of visual elements. This leads to your conclusion of it being “busy” or “cluttered.” I would suggest that you might find the same issue on Arabic language sites as well.

For examples, you might try any of the large consumer sites in their Japanese or Korean incarnations like Sony Korea or Sony Japan or Nike Japan or Nike Korea. Not that these are great designs, but it drives home the point.

What’s even more bewildering is how we might build these ideas into the web software which can change its interface language and presentation language “on the fly.” The challenges there are truly mind-boggling and by examining what the large companies have done, you’ll see that they purpose-build for every region and language. There’s wisdom in that, if not technical ease.

Technorati Tags: , , ,