Sunday, December 14, 2008

Three Must-Have Bookmarking Tools

I'm amazed at people who get by just using their browser to surf the web without any 3rd party tools for saving and sharing bookmarks. For anybody that visits a lot of web sites, and wants to share them with friends and co-workers, I find three web sites to be invaluable (full disclosure - I worked on 2 of the 3 products - but I genuinely love what they do for me).

  1. Social Bookmarking Site, Faves.com

    Faves.com - Faves is a Social Bookmarking web site. Which means, it allows me to save Bookmarks I find interesting in my own on-line database. I primarily use Faves for two reasons: a) I can save web sites for myself for easy recall in the future, and b) sharing interesting things I find with my friends and family (and by sharing - I mean this is a two-way street; I find cool stuff for them, and they expose me to cool stuff they find). Faves has a really good built-in search engine so I can quickly find any Fave I've saved in the past (over 6,000 of them so far!) - or even search across the bookmarks all my friends have saved.

    Faves is one of the first places I go to look for a recommendations for a resource on the web, or even product recommendations from my friends. Faves also sports a Facebook application, so my friends on Facebook get notified when I share something, as well as friends who are also using Faves directly.

  2. Link Shortening Service, Go2.me

    Go2.me - Go2.me is a link shortening service with a twist; it not only can convert any long URL into a very short one (just 16 characters long), it creates a landing page where you and your friends can exchange comments. If you share links with friends over Twitter or email, you don't really know how many people are actually visiting your link, or have a good way to have a conversation about that link. Go2.me adds a wrapper around your shared page that shows you the number of visitors, and allows them to leave comments for you.

  3. Bookmark Synchronization for Firefox- Foxmarks

    Foxmarks - Unlike the socially oriented tools, above, Foxmarks is a great utility for roaming your very frequently used bookmarks. Since I frequently use 4 different computers, Foxmarks can synchronize my Bookmarks toolbar across all of my machines. I have about 30 sites that I go back to over and over again in the course of my day - this way I can organize my Bookmark toolbar in one way, and Foxmarks will propogate my changes to each of my machines. You can also access your bookmarks directly from the web, if you are traveling and using a computer at a hotel, library, or Internet cafe.

    I'm a pretty new convert to Foxmarks; the setup was really simple, and it even did a decent job of merging the disparate collection of bookmarks I had on three separate machines.

All of these tools are free - hopefully they'll make your Internet usage a richer and more productive experience. Feel free to add recommendations for other Bookmark-related tools in the comments.

Wednesday, December 10, 2008

Bailout vs. Bankruptcy

It's been a while since my latest code update to Go2.me - I'd say that account system I wanted to put in place has turned into a trickier set of code than I thought. I've been checking code in each day as I progress, but there is still one more feature to add, and add some time for more testing before deploying.

In the meantime, the Go2.me code base has been plugging away and new people are finding the site each day - mostly through word of mouth on Twitter.

The Bailout.  Coming this January. A couple of people have been sharing links about the Congressional Bailouts that have been in the news - you can see the prioritized list of shared links on Go2.me by visiting http://go2.me/tag/bailout.

One thing that I wish the media would highlight is that "Bankruptcy" is not a death sentence for a company - it's a very orderly way which to recognize a major reorganization. In the case of the auto companies, it's pretty obvious that they need some major changes. They're building the wrong product mix, falling way behind foreign competitors, are inefficient all through their distribution chains, and have negotiated very poor labor contracts.

I think the only sane way to save the automakers is to let them slip into bankruptcy; it's the only way to force all the interested parties into making the hard concessions needed to transform these companies into something Americans can be proud of again. The shareholders are going to lose everything, and the current batch of executives should get the boot. But there is much that can be saved (these companies are still projected to sell over $100B worth of product next year).

We have a well established legal process for companies to achieve this kind of reorganization and re-birth - let's let it work and get the hands of these companies out of the taxpayers' pockets.

I've been involved in many smaller companies that have gone through very tough times. The strongest companies learn to adapt to succeed (or at least survive) - in many cases the shareholders and founders have had to swallow some tough pills in terms of reduced valuations and losses. But we don't expect the government to step in to save us.

If there is a lesson to be learned here - I would hope that we ensure a diversity of companies serving any market; and never again get to the point where markets are dominated by so few competitors that we have companies that are too big to fail.

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!