Thursday, November 20, 2008

Mystery Fix?

Go2.me was crashing today. It seems to be more stable now, but unfortunately, I haven't been able to determine the cause. A review of the server logs on Google App Engine show that the error is deep inside Google's code, not mine.

I updated Go2.me today, with what I think is an unrelated bug fix (and a new feature). It seems to be up for now, so I'm not sure if I resolved the problem or not.

In case any developers who read this blog might have seen a similar problem, here are a couple of backtraces from my error logs that seems to be related to the problem:


<class 'django.core.exceptions.ImproperlyConfigured'>: Error importing middleware util: "cannot import name signals" Traceback (most recent call last): File "/base/data/home/apps/g02me/7.329407303040602751/main.py", line 39, in main() File "/base/data/home/apps/g02me/7.329407303040602751/main.py", line 36, in main util.run_wsgi_app(application) File "/base/python_lib/versions/1/google/appengine/ext/webapp/util.py", line 76, in run_wsgi_app result = application(env, _start_response) File "/base/python_lib/versions/1/django/core/handlers/wsgi.py", line 184, in __call__ self.load_middleware() File "/base/python_lib/versions/1/django/core/handlers/base.py", line 31, in load_middleware raise exceptions.ImproperlyConfigured, 'Error importing middleware %s: "%s"' % (mw_module, e)
<class 'google.appengine.runtime.DeadlineExceededError'>: Traceback (most recent call last): File "/base/data/home/apps/g02me/7.329407303040602751/main.py", line 39, in main() File "/base/data/home/apps/g02me/7.329407303040602751/main.py", line 36, in main util.run_wsgi_app(application) File "/base/python_lib/versions/1/google/appengine/ext/webapp/util.py", line 76, in run_wsgi_app result = application(env, _start_response) File "/base/python_lib/versions/1/django/core/handlers/wsgi.py", line 184, in __call__ self.load_middleware() File "/base/python_lib/versions/1/django/core/handlers/base.py", line 29, in load_middleware mod = __import__(mw_module, {}, {}, ['']) File "/base/data/home/apps/g02me/7.329407303040602751/util.py", line 6, in from django.shortcuts import render_to_response File "/base/python_lib/versions/1/django/shortcuts/__init__.py", line 7, in from django.db.models.manager import Manager File "/base/python_lib/versions/1/django/db/models/__init__.py", line 8, in from django.db.models.base import Model, AdminOptions File "/base/python_lib/versions/1/django/db/models/base.py", line 1, in import django.db.models.manipulators

Housekeeping

One of the fun things about a project like Go2.me - which is largely the creative work of a single person - is the speed and flexibility with which I can work. When I'm working on new features, or bug fixes, App Engine makes it easy to deploy new versions, which I can do multiple times per day.

As I've been working, I've been keeping a personal task list as I think of things I want to do, or bugs I have to fix. Since I'm working alone, this is easiest to just keep as a text file, todo.txt (which I have under source control and viewable by anyone). My son, Chris, has also been helping me with testing - he's been entering bugs in a the more structured Issues List provided by the Google Hosted Projects service.

But even my quick-and-dirty text file has gotten cluttered with out-of-date tasks, and was difficult to scan as I was not careful about organizing it. So I spent this morning cleaning up the list, and thinking about the broad categories to help be organize it. Even with my pruned-down list, I still have over 300 outstanding tasks on this single-person "weekend project"! The categories I came up with could apply to any web development project:

  • FEATURES AND DESIGN IMPROVEMENTS
  • PLATFORMS, SYNDICATION, IMPORT/EXPORT
  • SECURITY AND PRIVACY
  • PERFORMANCE
  • MONETIZATION
  • SITE ADMINISTRATION, MONITORING AND ANALYTICS
  • MARKETING AND PR
  • CODE REFACTORING AND ARCHITECTURE
  • BUGS

When I was development manager for the 50-person team that created Microsoft Outlook, I spent much of my time using Microsoft's internal issue tracking system, "Raid". With a list of tasks and bugs many orders of magnitude larger than Go2.me's, there is no less desire to understand how much work is ahead of us and how we're doing on reaching our goals on time. Even Raid didn't have all the reporting features I needed to understand what was going on in the team. So, we also used some custom Excel spreadsheets for project scheduling, and Excel's pivot table reports to analyze the massive bug list changes over time.

I've been experimenting with some new hosted services that are directed at this same problem - managing a schedule/task list for a team. A new one that I think shows promise is by Seattle startup Liquid Planner. While it's not as fast as a text file for data entry, it does have some really good reporting capability and shines in the project scheduling phase.

I don't know of any tool that combines the best of all worlds - very efficient for single user data entry, yet powerful enough to have all the team reporting features needed to understand and help manage the work of a whole team. Comment here if you have any suggestions for how you do tasks list/issue tracking/bug tracking/scheduling/team management.

Wednesday, November 12, 2008

Tweet Your Goat

I've been trying to get people to use Go2.me when they use twitter. Why should they? Because they can get more feedback from their "readers" when they do. And it's not hard, just grab the prominent bookmarklet from the Go2.me home page and you're one-click away from creating a useful shortened URL.

One of the challenges for introducing a new behavior is how you talk about it. Faves.com (the other internet startup I'm working on) is a great name because it is a natural noun and a verb. So people can say:

Have you seen my Fave about the iPhone?

That sounds like a great site, can you Fave it for me?

Go2.me, on the other hand, is just the name of a site. As we talk about it in the office, we naturally want to turn the action of creating a shortened URL using Go2.me into a verb. What do you say? "Go 2" that for me? Have you seen my "Go 2"?

Even though is sounds a little gross, my current way of pronouncing "Go2 it" is "Goat it". So, if you run in to me, don't think I'm being rude if I ask you to Goat that web site for me!

Tuesday, November 11, 2008

New Domain Name - Go2.me

When I started this project, I didn't know how much time I would invest in it - so the domain G02.ME ("G-Zero-Two") was cheap and visually looked like "go to me". But, it was nagging me that the zero was a bit quirky, and hard to remember to type the right thing.

Just this week, I was able to complete my purchase of the go2.me domain (with the letter "O" instead of the number "0"). So now, both domains go to the Go2.me site.

While not very noticeable, I've introduced some AJAX Java Script code under the covers. This lets me provide better UI on the client - for example, now allowing you to claim a nickname from the home page. Check it out:

Go2.me

Saturday, November 1, 2008

Cross-browser compatability - ugh!

You'll notice a streamlined Info-Header frame above G02.ME pages starting today. It was pointed out to me that no one was really reading the helpful text placed below each comment box:

Comment format: nickname: text of your comment [tag1, tag2, ...]:

There's a lot more functionality in that little text box than most people would expect. Just by typing in the correct format you can:

  1. Create and "log in" to your user account.
  2. Save the shortened link on your personal user page (http://g02.me/user/USERNAME)
  3. Leave a comment
  4. Annotate your comment with tags, adding it to the list of popular pages for each tag (http://g02.me/tag/TAGNAME)

Today's update makes it much more obvious that you can create a user account (nickname), by providing it's own text box for you to fill out. It's still optional, but my hope is that many more people will notice it, and start to see the benefit of seeing the saved list of shortened links they've created. For example:

Anyway, what seemed like a trivial change, brought me into the dark realm of liquid layout, floating DIV's, and cross-browser TABLE incompatibilities. After literally several hours of hacking and starting over twice, I think I've found a good compromise layout that looks decent in the 3 browsers I've tested (Firefox, IE, and Chrome). Getting this to work is nothing short of a black art. Some measures need to be changed from 100% to 97% and margins have to be tweaked up and down by 1 or 2 pixels. It's not very fun, and I'm sure when I return to this code, I will have no idea where the landmines are - since this was largely developed by trial and error.

Some day, we'll have ONE standard we can understand and behaves rationally. That will be a happy time!