Showing posts with label social-networking. Show all posts
Showing posts with label social-networking. Show all posts

Friday, August 26, 2011

Checking In On Checking In

It's been a few months since I did my write-up on location-based check-in services.  I've been checking in pretty consistently, and the three main services that I covered have each recently announced changes.

First, my experience:  I chose Gowalla as my check-in app of choice, mostly because I like the colorful and attractive graphics that each category (and often individual spot) has.  Gowalla also has the added benefit of being able to check in to Facebook and Foursquare, and show my friends' check-ins from those services.

Gowalla Items
At each check-in, especially since I auto-post them to Twitter and Facebook, I try to make the post interesting by taking a picture if appropriate, and always adding some sort of comment to give it context and personality.  This works pretty well, but the pictures uploaded to Gowalla are tiny.  I would prefer to be able to take and upload higher-resolution shots.  I would also like to be able to post pictures not taken from the Gowalla app at the time of check-in.  Often it takes a while to find the correct spot, and by that time, the moment I want to capture may have passed.  It would be nice to be able to whip out the phone, take a picture, and then use that with my check-in.  I know you can do this with Foursquare, but Gowalla likes to provide more assurances that you are actually at the place where you check in (though anything can be faked).  I've considered creating a fake camera app that would simply allow you to choose an image to "take" from the existing Gallery images.

Another thing I've gotten into has been Item collecting.  Occasionally when you check in, Gowalla awards you a virtual item, which can be "donated" to a spot that doesn't have too many items, or traded for an item at a spot, after you check in.  This aspect of checking in appeals to the collector in me.  What I ended up doing was keeping those items that had had the greatest number of owners, and trading the others, in hopes of accumulating items with long and interesting histories.  I was doing OK plodding along, but the items don't come too quickly, which is frustrating, and they aren't a very intuitive feature, which means that most of Gowalla's already small user base doesn't do any trading with their items.

Social Apps
Gowalla just announced via their blog that they are going to do away with the item feature entirely in the coming months.  This makes me sad, but I'm hoping that this means they have a clear and innovative vision that would clash with the item system.  The post seems to imply that they have something big to offer in place of item swapping that they are not yet prepared to announce, so I'm hopeful, but I don't know whether anything they do will drastically increase their user base.  Perhaps they have something in mind that will increase existing user engagement; something to do when checking in that they would prefer we do over item swapping.

Perhaps Gowalla could pick up some users from Facebook Places, which is apparently becoming less of a check-in service, and more of a way to tack your location on to an existing post.  I actually think this is a good idea, since most Facebook check-ins are simply a person-place-time data point, and have no user-generated content to make them interesting.

Speaking of making check-ins more interesting, Foursquare recently announced that they are adding events to places, and they aren't relying on users to generate and update the schedules: they're turning to the pros.  This is good news.  Whereas before a typical foursquare user would check in at a movie theater or a concert hall without comment or commenting simply to mention the event, now the app presents them with a list of movies or acts that are currently showing where they are checking in, and they have the option to pick one.  Hopefully this will encourage users to add details other than what they're there for, like what they think of it, or who they're with.

I actually use Foursquare through Gowalla, but this feature isn't available to me, since Gowalla only maps its spots to Foursquare's venues, not the new events.  If Gowalla fails to deliver on their new vision, I might find myself simply using the Foursquare app to check in.  Foursquare allows you to post any picture with your checkin, including one you already took, and the Foursquare user base is much larger than Gowalla, so I have many more friends who use it.  Switching would be very simple for me to do, but I would definitely miss Gowalla's colorful and cartoony icons.

Friday, July 08, 2011

Google+: Impressions So Far

I was able to get an invitation to join Google's new social network, Google+, a few days ago, and I thought I would give my initial impressions.

First of all, it's a social network, which means that you can post content which others you specify can see, and you can see others' content that they have allowed you to see.  In that way it is much like Facebook.  I think you all get the idea, so I'm going to focus on what's different and new.

Google+ Android app
The first thing you'll notice when you sign up is that instead of simply "Friends", Google wants you to categorize your contacts into "Circles", which are sets of contacts.  The purpose of this is so that you can easily share different things with "Family" than "Work"; "Acquaintances" than "Friends" (your real friends), and of course you can create as many custom circles as you wish.

Of course, Facebook has Friends Lists which lets you do the exact same thing, but not many people use them, and almost no one picks and chooses which Friends Lists to share things with on Facebook, whereas the idea is that with Google+, that will be the norm.

I think the most compelling features of Google+ are as follows:
  • Hangouts - You can flip on your webcam and start a Hangout, which you can invite your circles to or post to your profile.  Others who see you're hanging out can join you, and what results is a very easy multi-way video chat.  When someone starts talking, the big video switches to them. 
  • Automatic mobile photo/video upload - People like to take pictures and videos on their phone, and it can be quite a hassle to get those photos and videos off.  You can either plug your phone in to your computer, or you can manually select pictures and videos for upload using an app.  Google+ offers set-it-and-forget-it convenience:  with the Google+ app, you have the option to have everything automatically uploaded to your own private space, from which you can easily share selected photos and videos.  You can select whether to upload over the network, only over WiFi, or only over WiFi while charging, so it doesn't eat up your data plan or drain your battery if you don't want it to.  The online backup feature alone is worth installing the app, even if you never share anything, but once it's already online, why not use it?
  • It's Google - and therefore very conveniently integrated with all of your Google sites, like Gmail, Google Reader, Picasa, and Google Calendar.  Those of us who use these services will see a notification counter and "share" button in the top right hand corner of the page.  It will just be "there" for us to use.
I find it interesting that, at least as yet, there is no way to publicly post a message to another person.  On Facebook, this would be like posting to someone's wall.  On Twitter, it would be @ mentions and replies.  This makes it significantly less social in my opinion:  basically everyone is simply publishing things and sharing and commenting on things that others publish.  You can publish all you want, but no one interacts with your posts unless they follow you.  Even when you mention someone else, only that person gets a notification, not their friends.  The only serendipity is in comments.

I predict that this will make Google+ much less of a content generation space than Facebook.  People will tend more to import their existing streams of content to Google+, rather than using Google+ to initiate the conversation.

I could be wrong.  I hope so.  Then again, I personally almost never post on other people's Facebook walls.  All of my content on Facebook originates on other services, such as Twitter, Gowalla, Posterous, and Blogger.  This makes it easy for me to check a box on those services and send the content to Google+ as well as Facebook, and thus Facebook is not the exclusive holder of my content (this is by design).  But I wonder what the designers of Google+ are intending to do by not implementing such a seemingly basic feature.

They may not have been able to come up with a way to make it work with circles.  After all, if all of your content gets published only to the circles that you pick each time, how can you trust your contacts to pick the appropriate circles with which to share their posts to your profile?  (On the other hand, anyone who can see a post can republish it to anyone else, unless sharing is disabled.)

I don't think Google+ will die or be as obscure as Orkut (or as hated as Buzz), but I also don't think it will become as popular a place to spend time and interact with all of your friends as Facebook.  Google+ is a great personal publishing platform, and it has some useful tools for connecting with friends and colleagues, but it is definitely not a Facebook clone, nor, I fear, a Facebook killer.

Monday, May 23, 2011

Foursquare, Gowalla, etc.: Location-Based Checkin Networks

This post is the second in my series of Android app comparison posts.  Last time I compared two Twitter clients, this time I'm looking at location-based checkin services.

Social apps
There is one thing to be careful of in sharing your location, and that is privacy.  Particularly when I post pictures of my small children, I don't want to make it too obvious to creeps and stalkers exactly where I live.  I also personally don't want my full name publicly associated with my posts.  You'll notice I don't post it on my blog, or on Twitter.  Of course, once these things get imported into Facebook, they become associated with my name, but I have configured my privacy settings so that the association is only visible to friends (and sometimes not all of them), or in some cases, friends of friends.


I'm the kind of person who likes to post things from my phone to share with my friends and the world.  I particularly like to post pictures, but location is another very social aspect of sharing.  Checkin services allow you to post about places such as restaurants, shops, parks, landmarks, transportation, or just about anything else.  It's social because a places are concrete things that other people can experience too.  They might enjoy the same restaurant, or be looking for one.  They might see you check in at a series of airports (or ferries), and get a sense of your travel experience. 

Facebook Places
The most popular checkin service is actually Facebook Places.  I think this is because almost everyone already uses Facebook, so they don't need to sign up for anything new, or connect with a new list of friends to share: they can just share.

I haven't done much with Facebook Places.  It's also the least interesting, at least among my friends, in that most checkins have no comments or pictures.  When I post that I'm somewhere, I usually like to say what I'm doing there:  what I ordered, who's with me, what I'm looking for.  I also like to include a picture.  You can do all of these things with Facebook Places, it seems that no one does, though.

Foursquare
The most popular of the dedicated checkin networks is Foursquare.  Foursquare is where you will be able to connect with the most people who go out of their way to check in.  Foursquare also makes checking in interesting in a number of ways:
Foursquare deal
  • Points: Each checkin is scored, and you can see how well you're doing in the last 7 days against each of your friends on the leaderboard.
  • Badges:  Checking in earns you different badges based on the number and type of checkins you do.  You can see which badges you have and which your friends have, and which you don't.
  • Mayorships:  If you're the one who checks in the most days at a particular venue in the last 60 days, you become the "mayor" of that place.  
  • Deals: Some stores offer special discounts to the mayor, or to anyone who checks in frequently enough.
  • Categories: Foursquare venues are categorized, and each category has a different icon in the interface and can earn you different bonuses.
Gowalla
Gowalla is in many ways very similar to Foursquare, however, they have their own unique twist to checking in at a spot.  (You'll notice they each call it something different: place, venue, spot, location).
  • Stamps:Whereas Foursquare is more of a competition against others, Gowalla promotes itself as a "game" and tends to be more individual.  There is no score, but every place you check in gives you a unique Stamp to collect on your "passport".
  • Pins: Similar to Badges, pins are awarded for checking in, sometimes for a number of times at a number of unique types of spots, sometimes for places (like states or countries), and sometimes for events or special days.
  • Categories: Gowalla has its own category system, similar to Foursquare, but whereas Foursquare's icons (including Badges) are drab monochrome black and white, Gowalla's icons are colorful and bright, drawn in a cartoony style resembling stickers that is very aesthetically attractive.
  • Items:  Sometimes when you check in, you will find a bonus Item.  There are over 100 different kinds of items, and each item has a unique ID number and a history of who has handled it and where.  You can add items to your collection, or you can swap them for items left by others at different spots.
  • Trips: Gowalla has trips generated by users, which are a collection of spots to check in.  Once you have completed the tour by checking in at each of those spots, you earn the pin for that Trip.
Gowalla also has some nice features on their website:  if you check in at a series of airports within certain time parameters, it will combine them into a single trip, showing each airport along the way and the distance between them.

Google Latitude
Another checkin service that I have not used much is Google Latitude.  Latitude is based on Google Maps, and will track your location (and give you stats for your own reference), and share it with your friends who also use Latitude.  You can check in to locations, either manually, or automatically for locations you choose, or you can have Latitude give you a notification when it thinks you might want to check in.

The great thing about all of these checkin services is that you don't need to choose anymore.  Foursquare will update Twitter and/or Facebook, and Gowalla will not only post your checkins to Twitter, Foursquare, and Facebook, but it will also retrieve your friends' checkin information from Facebook and Foursquare and display it alongside your Gowalla friends' checkins.  (All of these are optional.) 

The one thing that doesn't get transferred between Gowalla and Foursquare is photos.  Photos on Gowalla are posted to Facebook, but not Foursquare, and Gowalla does not retrieve pictures from other services.

Gowalla tries to match its database of spots to Foursquare's database of venues.  It's not perfect, though.  When there isn't a matching spot, or Gowalla doesn't have it matched, it will still update your foursquare friends, but the checkin won't count for points or towards a mayorship.  

Footfeed
Footfeed is an app that allows you to manually manage which spots match with which (on Foursquare, Gowalla, Facebook, Latitude), and then check in to all of them in one fell swoop.  The app is a full featured replacement for any of the other services, with the exception of pictures.

You can report unmatched or mismatched spot/venues to Gowalla and they will add them to their database.  Both Gowalla and Foursquare allow you to submit updated/corrected information, and to manually add missing spots.

Personally, I use Gowalla, but I have the Foursquare app installed, and most of my friends who check in do so on Foursquare or Facebook.  Occasionally when I know that Gowalla doesn't match up the spots correctly (and I'm not posting a picture), I will use Footfeed to check in.

Wednesday, December 08, 2010

Twitpic-to-Posterous Script: Another Update

A while ago I wrote a script to import my Twitpic photo posts to Posterous and posted it on this blog.

Even though Posterous now supplies their own working transfer tool, it has its limitations.  One person who tried that tool was unsatisfied, and tried my script.  He really liked the results, but he noticed some drawbacks to my script as well.  Here's what's new in my script v1.3.1:
  • New feature by request - #hashtags and @username mentions are now linked to the appropriate Twitter page in the body of the Posterous post.
  • Fix - issue where Twitpic now truncates the tweet text in the HTML title.  Switched to using the image alt text from the full page.  
  • Fix - Twitpic started escaping single and double quotes in the tweet text, which were showing up uninterpreted in the Posterous titles.  The script now handles them correctly.
  • Other changes
    • Only download the Full images by default (Scaled and thumbnails can be enabled by setting flags.)
    • Print an error message and pause for 5 seconds if a download fails (Twitpic was being unreliable during my testing.)
    • Other miscellaneous fixes and tweaks
Special thanks to @RyanMeray!
  • Update (v1.3.2): better regular expressions for @username and #hashtag formats. 
  • Update (v1.3.4): now optionally adds hashtags as post tags.
You can get the latest version here.

    Friday, July 16, 2010

    TwitPic to Posterous Export Script: Update

    In the time since I wrote my script which downloads all of a user's TwitPic posts (text included) and uploads them as Posterous posts, Posterous has come out with their own import tool.

    However, as noted in their blog post, TwitPic is currently blocking Posterous' servers, so someone came along and tried to use my script.  It turned out that the TwitPic site had been updated, and my script no longer worked.

    Well, I updated the script so that it works again.  The script can be found here.

    Wednesday, March 17, 2010

    TwitPic to Posterous Export Script

    Note: This post (and the script it contains) has been updated as of December 14, 2010.  (v1.4.0) The script can also be downloaded from my server here.
    Also, Posterous has done a lot of work on solving this problem since I wrote my script.   You can see their latest solutions here.

    Recently, I switched from TwitPic to Posterous as my method of posting phone pictures (and now video) to the Internet.  But since I switched, I didn't want to have my data history split in two, so I decided to write a script to download each of my TwitPic images with their associated text and date, and upload them to Posterous with the same information.

    Initially, I wanted to make one long post with all of the images, and their text below.  However, with the Posterous API, it isn't possible to refer to a specific image in your body text, so individual posts is the way I went.

    Along the way, I became familiar with yet another Linux command: curl.

    I love that Posterous has an API that (once you figure out curl) is pretty easy to use.  TwitPic, on the other hand, has absolutely zero support for exporting anything.  The fact that they're so non-user-centric and out-dated was a driving force in my switching.  The only reason I hadn't switched to img.ly already was because img.ly has a bug that prevents images sent from my phone from being posted, since my phone sends them without a file extension.  I worked with their tech support for a while, but they didn't fix it.  I got a new phone, but it was also a Samsung, and it did the same thing with images.  Oh, well.  Posterous is better.

    Anyway, here is the script:

    First run it with just the first two arguments, and it will download all of your TwitPic data, including thumbnail images.  Once you're satisfied, supply your Posterous User ID, Password, and Site ID.  (If you don't know your Site ID, run the script with your Posterous User ID, Password, and no Site ID, and it will query your Posterous site info as long as your Posterous credentials are valid.)

    Note: if you want to run this from Windows, you should install Cygwin (with, at a mimum, curl and sed) and run it from there.

    ./twitpic-to-posterous.sh [twitpic-id] [working-dir] [postrous-id] [posterous-password] [posterous-site-id] [skip-number]
    #!/bin/sh
    
    # Copyright 2010 Tim "burndive" of http://burndive.blogspot.com/ and http://tuxbox.blogspot.com/
    # This software is licensed under the Creative Commons GNU GPL version 2.0 or later.
    # License informattion: http://creativecommons.org/licenses/GPL/2.0/
    
    # This script was obtained from here:
    # http://tuxbox.blogspot.com/2010/03/twitpic-to-posterous-export-script.html
    
    RUN_DATE=`date +%F--%H-%m-%S`
    SCRIPT_VERSION_STRING="v1.4.0"
    
    TP_NAME=$1
    WORKING_DIR=$2
    P_ID=$3
    P_PW=$4
    P_SITE_ID=$5
    UPLOAD_SKIP=$6
    
    # Comma separated list of tags to apply to your posts
    P_TAGS="twitpic"
    # Whether or not to auto-post from Posterous
    P_AUTOPOST=0
    # Whether or not the Posterous posts are marked private
    P_PRIVATE=0
    
    # This is the default limit of the number of posts that can be uploaded per day
    P_API_LIMIT=50
    
    DOWNLOAD_FULL=1
    DOWNLOAD_SCALED=0
    DOWNLOAD_THUMB=0
    PREFIX=twitpic-$TP_NAME
    HTML_OUT=$PREFIX-all-$RUN_DATE.html
    UPLOAD_OUT=posterous-upload-$P_SITE_ID-$RUN_DATE.xml
    
    if [ -z "$TP_NAME" ]; then
      echo "You must supply a TP_NAME."
      exit
    fi
    if [ ! -d "$WORKING_DIR" ]; then
      echo "You must supply a WORKING_DIR."
      exit
    fi
    if [ -z "$UPLOAD_SKIP" ]; then
      UPLOAD_SKIP=0
    fi
    UPLOAD_SKIP_DIGITS=`echo $UPLOAD_SKIP | sed -e 's/[^0-9]//g'`
    if [ "$UPLOAD_SKIP" != "$UPLOAD_SKIP_DIGITS" ]; then
      echo "Invalid UPLOAD_SKIP: $UPLOAD_SKIP"
      exit
    fi
    
    cd $WORKING_DIR
    
    if [ -f "$HTML_OUT" ]; then
      rm -v $HTML_OUT
    fi
    
    # If Posterous username and password were supplied, but not site ID, query the server and exit.
    P_SITE_INFO_FILE=posterous-$P_SITE_ID.out
    if [ ! -z "$P_ID" ] && [ ! -z "$P_PW" ] && [ -z "$P_SITE_ID" ]; then
      echo "Getting Posterous account info..."
      curl -u "$P_ID:$P_PW" "http://posterous.com/api/getsites" -o $P_SITE_INFO_FILE
      SITE_ID_RET=`grep "<id>$P_SITE_ID</id>" $P_SITE_INFO_FILE`
      if [ -z "$SITE_ID_RET" ]; then
        echo "Please supply your Posterous Site ID as the fifth argument."
        echo "Here is the response from the Posterous server.  If you entered correct credentials, you should see your Site ID(s):"
        cat $P_SITE_INFO_FILE | tee -a $UPLOAD_OUT
        exit
      fi
    fi
    
    # Confirm that we have a valid Posterous Site ID
    if [ ! -z "$P_SITE_ID" ]; then
      echo "Getting Posterous account info..."
      curl -u "$P_ID:$P_PW" "http://posterous.com/api/getsites" -o $P_SITE_INFO_FILE
      SITE_ID_RET=`grep "<id>$P_SITE_ID</id>" $P_SITE_INFO_FILE`
      if [ -z "$SITE_ID_RET" ]; then
        echo "Make sure that you have supplied a valid Posterous Site ID as the fifth parameter.  If you don't know your Site ID, leave it out, and this script will query the server."
        echo "Here is the response from the Posterous server.  If you entered correct credentials, you should see your site ID(s):"
        cat $P_SITE_INFO_FILE | tee -a $UPLOAD_OUT
        exit
      fi
    fi
    
    MORE=1
    PAGE=1
    while [ $MORE -ne 0 ]; do
      echo PAGE: $PAGE
      FILENAME=$PREFIX-page-$PAGE.html
      if [ ! -s $FILENAME ]; then
        wget http://twitpic.com/photos/${TP_NAME}?page=$PAGE -O $FILENAME
        if [ ! -s "$FILENAME" ]; then
          echo "ERROR: could not get $FILENAME" | tee -a $LOG_FILE
          sleep 5
        fi
      fi
      if [ -z "`grep "More photos &gt;" $FILENAME`" ]; then
        MORE=0
      else
        PAGE=`expr $PAGE + 1`
      fi
    done
    
    ALL_IDS=`cat $PREFIX-page-* | grep -Eo "<a href=\"/[a-zA-Z0-9]+\">" | grep -Eo "/[a-zA-Z0-9]+" | grep -Eo "[a-zA-Z0-9]+" | sort -r | xargs`
    
    # For Testing
    #ALL_IDS="1kdjc"
    
    COUNT=0
    LOG_FILE=$PREFIX-log-$RUN_DATE.txt
    
    echo $ALL_IDS | tee -a $LOG_FILE
    
    for ID in $ALL_IDS; do
      COUNT=`expr $COUNT + 1`
      echo $ID: $COUNT | tee -a $LOG_FILE
    
      echo "Processing $ID..."
      FULL_HTML=$PREFIX-$ID-full.html
      if [ ! -s "$FULL_HTML" ]; then
        wget http://twitpic.com/$ID/full -O $FULL_HTML
        if [ ! -s "$FULL_HTML" ]; then
          echo "ERROR: could not get FULL_HTML for $ID" | tee -a $LOG_FILE
          sleep 5
        fi
      fi
      TEXT=`grep "<img src=" $FULL_HTML | tail -n1 | grep -oE "alt=\"[^\"]*\"" | sed \
            -e 's/^alt="//'\
            -e 's/"$//'\
            -e "s/&#039;/'/g"\
            -e 's/&quot;/"/g'\
            `
      if [ "$TEXT" = "" ]; then
        TEXT="Untitled"
      fi
      echo "TEXT: $TEXT" | tee -a $LOG_FILE
      # Recognize hashtags and username references in the tweet
      TEXT_RICH=`echo "$TEXT" | sed \
            -e 's/\B\@\([0-9A-Za-z_]\+\)/\@<a href="http:\/\/twitter.com\/\1">\1<\/a>/g' \
            -e 's/\#\([0-9A-Za-z_-]*[A-Za-z_-]\+[0-9A-Za-z_-]*\)/<a href="http:\/\/twitter.com\/search\?q\=%23\1">\#\1<\/a>/g' \
            `
      echo "TEXT_RICH: $TEXT_RICH" | tee -a $LOG_FILE
    
      # Convert hashtags into post tags
      P_TAGS_POST=$P_TAGS`echo "$TEXT" | sed \
            -e 's/\#\([^A-Za-z_-]\)*\B//g' \
            -e 's/^[^\#]*$//g' \
            -e 's/[^\#]*\(\#\([0-9A-Za-z_-]*[A-Za-z_-]\+[0-9A-Za-z_-]*\)\)[^\#]*\(\#[0-9]*\B\)*/,\2/g' \
            `
      # Uncomment if you don't want hashtags converted into post tags
      #P_TAGS_POST=$P_TAGS
    
      # Add custom tags from a file (optional).  The file is formatted like this:
      # ,tag1,tag2,tag3
      TAGS_FILE=$PREFIX-$ID-tags-extra.txt
      if [ -s "$TAGS_FILE" ]; then
        P_TAGS_POST=$P_TAGS_POST`cat $TAGS_FILE`
      fi
      echo "P_TAGS_POST: $P_TAGS_POST" | tee -a $LOG_FILE
    
      TEXT_FILE=$PREFIX-$ID-text.txt
      if [ ! -s $TEXT_FILE ]; then
        echo "$TEXT" > $TEXT_FILE
      fi
      FULL_URL=`grep "<img src=" $FULL_HTML | grep -Eo "src=\"[^\"]*\"" | grep -Eo "http://[^\"]*"`
      echo "FULL_URL: $FULL_URL" | tee -a $LOG_FILE
    
      SCALED_HTML=$PREFIX-$ID-scaled.html
      if [ ! -s "$SCALED_HTML" ]; then
        wget http://twitpic.com/$ID -O $SCALED_HTML
        if [ ! -s "$SCALED_HTML" ]; then
          echo "ERROR: could not get SCALED_HTML for $ID" | tee -a $LOG_FILE
          sleep 5
        fi
      fi
      SCALED_URL=`grep "id=\"photo-display\"" $SCALED_HTML | grep -Eo "http://[^\"]*" | head -n1`
      echo "SCALED_URL: $SCALED_URL" | tee -a $LOG_FILE
      POST_DATE=`grep -Eo "Posted on [a-zA-Z0-9 ,]*" $SCALED_HTML | sed -e 's/Posted on //'`
      echo "POST_DATE: $POST_DATE" | tee -a $LOG_FILE
    
      THUMB_URL=`cat $PREFIX-page-* | grep -E "<a href=\"/$ID\">" | grep -Eo "src=\"[^\"]*\"" | head -n1 | sed -e 's/src=\"//' -e 's/\"$//'`
      echo "THUMB_URL: $THUMB_URL" | tee -a $LOG_FILE
    
      EXT=`echo "$FULL_URL" | grep -Eo "[a-zA-Z0-9]+\.[a-zA-Z0-9]+\?" | head -n1 | grep -Eo "\.[a-zA-Z0-9]+"`
      if [ -z "$EXT" ]; then
        EXT=`echo "$FULL_URL" | grep -Eo "\.[a-zA-Z0-9]+$"`
      fi
      echo "EXT: $EXT"
      if [ "$DOWNLOAD_FULL" -eq 1 ]; then
        FULL_FILE="$PREFIX-$ID-full$EXT"
        if [ ! -s $FULL_FILE ]; then
          wget "$FULL_URL" -O $FULL_FILE
          if [ ! -s "$FULL_FILE" ]; then
            echo "ERROR: could not get FULL_URL for $ID: $FULL_URL" | tee -a $LOG_FILE
            sleep 5
          fi
        fi
      fi
      if [ "$DOWNLOAD_SCALED" -eq 1 ]; then
        SCALED_FILE=$PREFIX-$ID-scaled$EXT
        if [ ! -s $SCALED_FILE ]; then
          wget "$SCALED_URL" -O $SCALED_FILE
          if [ ! -s "$SCALED_FILE" ]; then
            echo "ERROR: could not get SCALED_URL for $ID: $SCALED_URL" | tee -a $LOG_FILE
            sleep 5
          fi
        fi
      fi
      if [ "$DOWNLOAD_THUMB" -eq 1 ]; then
        THUMB_FILE=$PREFIX-$ID-thumb$EXT
        if [ ! -s $THUMB_FILE ]; then
          wget "$THUMB_URL" -O $THUMB_FILE
          if [ ! -s "$THUMB_FILE" ]; then
            echo "ERROR: could not get THUMB_URL for $ID: $THUMB_URL" | tee -a $LOG_FILE
            sleep 5
          fi
        fi
      fi
    
      BODY_TEXT="$TEXT_RICH <p>[<a href=http://twitpic.com/$ID>Twitpic</a>]</p>"
    
      # Format the post date correctly
      YEAR=`echo "$POST_DATE" | sed -e 's/[A-Z][a-z]* [0-9]*, //'`
      DAY=`echo "$POST_DATE" | sed -e 's/[A-Z][a-z]* //' -e 's/, [0-9]*//'`
      MONTH=`echo "$POST_DATE" | sed -e 's/ [0-9]*, [0-9]*//' | sed \
        -e 's/January/01/' \
        -e 's/February/02/' \
        -e 's/March/03/' \
        -e 's/April/04/' \
        -e 's/May/05/' \
        -e 's/June/06/' \
        -e 's/July/07/' \
        -e 's/August/08/' \
        -e 's/September/09/' \
        -e 's/October/10/' \
        -e 's/November/11/' \
        -e 's/December/12/' \
        `
      # Adjust the time to local midnight when west of GMT
      HOURS_LOC=`date | grep -Eo " [0-9]{2}:" | sed -e 's/://' -e 's/ //'`
      HOURS_UTC=`date -u | grep -Eo " [0-9]{2}:" | sed -e 's/://' -e 's/ //'`
      HOURS_OFF=`expr $HOURS_UTC - $HOURS_LOC + 7`
      echo "HOURS_LOC: $HOURS_LOC"
      echo "HOURS_UTC: $HOURS_UTC"
      echo "HOURS_OFF: $HOURS_OFF"
      if [ "$HOURS_OFF" -lt 0 ]; then
        # We're east of GMT, do not adjust
        HOURS_OFF=0
      fi
      if [ "$HOURS_OFF" -lt 10 ]; then
        HOURS_OFF=0$HOURS_OFF
      fi
      if [ "$DAY" != "" ] && [ "$DAY" -lt 10 ]; then
        DAY=0$DAY
      fi
      DATE_FORMATTED="$YEAR-$MONTH-$DAY-$HOURS_OFF:00"
      echo "DATE_FORMATTED: $DATE_FORMATTED" | tee -a $LOG_FILE
    
      echo "<p><img src='$FULL_FILE' alt='$TEXT' title='$TEXT' /></p>" >> $HTML_OUT
      echo "$BODY_TEXT" >> $HTML_OUT
      echo "  Post date: $DATE_FORMATTED; Count: $COUNT" >> $HTML_OUT
    
      # Upload this Twitpic data to Posterous
      if [ ! -z "$P_SITE_ID" ]; then
    
        # First make sure we're under the API upload limit
        if [ "$COUNT" -le "$UPLOAD_SKIP" ]; then
          echo Skipping upload...
          continue
        fi
        if [ "$COUNT" -gt "`expr $UPLOAD_SKIP + $P_API_LIMIT`" ]; then
          echo "Skipping upload due to daily Posterous API upload limit of $P_API_LIMIT."
          echo "To resume uploading where we left off today, supply UPLOAD_SKIP parameter of `expr $UPLOAD_SKIP + $P_API_LIMIT`."
          continue
        fi
    
        P_OUT_FILE="posterous-$P_SITE_ID-$ID.out"
        if [ -s "$P_OUT_FILE" ]; then
          rm "$P_OUT_FILE"
        fi
        echo "Uploading Twitpic image..."
        curl -u "$P_ID:$P_PW" "http://posterous.com/api/newpost" -o "$P_OUT_FILE" \
          -F "site_id=$P_SITE_ID" \
          -F "title=$TEXT" \
          -F "autopost=$P_AUTOPOST" \
          -F "private=$P_PRIVATE" \
          -F "date=$DATE_FORMATTED" \
          -F "tags=$P_TAGS_POST" \
          -F "source=burndive's Twitpic-to-Posterous script $SCRIPT_VERSION_STRING" \
          -F "sourceLink=http://tuxbox.blogspot.com/2010/03/twitpic-to-posterous-export-script.html" \
          -F "body=$BODY_TEXT" \
          -F "media=@$FULL_FILE"
        cat $P_OUT_FILE  | tee -a $UPLOAD_OUT
      fi
    done
    echo Done.
    CC-GNU GPL
    This software is licensed under the CC-GNU GPL version 2.0 or later.

    PS: If you use my code, I appreciate comments to let me know, and any feedback you may have, especially if it's not working right for you, but also just to say thanks.

    For convenience, you can download this script from my server.

    Sunday, February 28, 2010

    Facebook Gmail Phone Filter

    The other day I had an idea that I think is worth sharing. 

    I post to Twitter, but most people who see those posts don't see them via Twitter, they see them when the tweets are imported to Facebook as status updates. 

    When someone responds to your post on Twitter, you get an SMS with their reply.  When someone responds to my post from Facebook, which is where the vast majority of responses and reactions occur, I don't get notified on my phone, which is usually where I sent the original message from.  Often I'm nowhere near my computer, and won't be for hours.

    This means that I don't see the response until I check my e-mail (or Facebook, but e-mail is usually first).  I have Facebook configured to send me a message when someone responds to my posts.  It occurred to me that I could get those same notifications on my phone.  Here's how.

    I set up a filter in Gmail that forwards matching e-mails to my phone's multi-media message (MMS) e-mail address. 

    Here's what the filter looks like.

    Here's the first step in creating the filter.  I'm also forwarding Facebook messages to my phone.  If I were to leave off the word "your" and just say "commented on" then the filter would include comments on other people's posts that I had previously commented on.

    Here's the second step.  The MMS e-mail address is the address that appears on an e-mail if I send an MMS message (e.g., a picture) from my phone to my Gmail address.
    And that's it.  When someone responds to my Twitter/TwitPic posts from Facebook, I get the message on my phone right away.  Since it's an MMS and not an SMS, the messages are not limited to 160 characters.  I have a messaging plan with AT&T that doesn't distinguish between the two kinds of messages.

    Friday, February 12, 2010

    Google Buzz Kill

    For the past few days the Internet has been all aflutter about Google Buzz, some saying it's a Twitter killer.  Google Buzz is not like Twitter.  Rather, it is like FriendFeed.  I have used FriendFeed for quite some time to aggregate all of my online content into a single stream, and Google Buzz is designed to do exactly the same thing.

    Like FriendFeed, Google Buzz consumes Twitter and other content-generators, that is, you can have your Twitter posts show up on either service, as well as you blog posts, your online photos, forum comments, and so forth. Content originates in multiple places, but these services enable it to all come together in one place specific to the person who created it.

    Now, I have no problem with Google creating their own FriendFeed and then foisting it on all Gmail users.  I think it's a great idea.  My mother, for example, will never set up an account with FriendFeed, and she hasn't quite figured out Google Reader, but she might just try out this Buzz thing in her Gmail inbox, there she might see my latest tweet, or blog post, or photo album, or shared article. 

    Now, some of this stuff she already sees, since I import my Twitter updates and blog posts into Facebook, and so in a way, Google Buzz is competing with Facebook.

    Online Identity

    When you activate Buzz in your Google account, they let you know that they are making your Google Profile public, and that that includes your first and last name. 

    As it happens, I have gone through the trouble of NOT directly associating any of my public online content with my real name.  That way if you "Google" my name, you don't find all of my content (insert horror story here about prospective employers finding something they don't like or disagree with). 

    My real name is of course associated with my content inside of Facebook, but that content-name link is only available to my friends.  Most of the same content is available outside of Facebook, but it is tied to "burndive", not my name.

    Google's corporate mission is "to organize the world's information and make it universally accessible and useful".  This is no doubt why they are pushing for people to publicly link their full real name with all of their online content.  

    Well, I'm not going to be pushed.

    For many people who do not maintain a barrier online between their friends and the public, this will not be an issue, but for me it is.

    My Google account is used as my primary e-mail address.  I want my name to be associated with my e-mail address to my contacts, so I can't simply change my name to a pseudonym on my Google Profile, and it would be extremely disruptive for me to switch to another Google account. 

    Google is obviously aware of people in my situation, because they already have a feature in the Google Profile called a "nickname".  Anyone on my contacts list will see my real name on my profile, everyone else will see my nickname.  This is how it works with Google Reader shared items, and it's a very good system.  They just don't want to use it with Google Buzz.

    The Problem

    I went ahead and added my blogs, Google Reader, my Twitter account, and my Picasa Web account to Google Buzz, but nothing was being imported except Google Reader. 

    I looked further into the matter, and it turns out that it wasn't importing my content because after signing up for Buzz, I realized what had happened, and had restored my profile privacy settings.  "That's logical", I thought, "They won't let me post publicly because my name isn't public.  I'll just change the import settings so only my friends and family see the posts.  They can already see my name."  No dice.

    So what was up with Google Reader?  Google Reader has separate privacy settings, as it turns out, but, as I discovered, it will STILL share your full name on the posts and make it visible to the world.

    So, after a brief stint, I have turned off Google Buzz.  I never really intended to consume content there, but I had hoped it would be a venue for others to consume my content who would otherwise not occasion to see it, and a user-friendly comment forum.

    Friday, November 13, 2009

    Google Wave (Preview)

    I just got in on the Google Wave preview.

    I immediately had 8 invites, of which I have used 4, so far.  The first one went to my wife, of course.

    I like it.  I think it has awesome potential.

    It's a "preview" (a.k.a. "beta"--or, since we're talking Google's definition of "beta", it's an "alpha"), so there are lots of rough edges.

    Right off the bat, here's what bugs me.  Hopefully the bugs will get fixed.

    First of all, here's Google Wave:


    So here's the first thing I don't like.  Say I want to narrow down my contacts, to find the one I'm looking for.  I go to the Contacts widget, and type some text:
    Okay, so now I want to see the rest of my contacts, in the default view.  What do I press?  There's no little [X] button.  I have to select the text in the box and hit Delete or Backspace.  That is just bad UI design.  There needs to be an [X] right next to the magnifying glass that clears the field.  Google, please fix that.  (Yes, I've already submitted feedback about this.)

    This next one is probably just something I'll have to get used to.  When you go to create a new wave, or add someone to the wave, be careful when you click!  Creating a wave or adding someone to it is irrevocable, and the UI doesn't ask you for confirmation, it just shows up in their inbox, and there's nothing you can do about it.

    I accidentally added my friend Victor to my first wave, because I clicked his name:

    I was expecting there to be a confirmation dialogue, in stead, he was added.  I hope he enjoys my work.

    Applications are not easy to find.  There's a link to an Extensions Gallery wave in the introductory "Welcome to Google \/\/ave" wave that starts in your inbox, but all it has is Sodoku and half a dozen other apps.  I'm not knocking the apps.  They're good, but there are a whole bunch more out there that were shown off in the video.

    After some poking around, I found this list (and this list) of Bots, Apps and Gadgets.  The one I was most interested in, Bloggy, doesn't seem like it's working.  I added it to a wave, but it didn't do anything.  It's supposed to make the wave public and post it to your blog so that everyone (even those not logged in to Wave) can see it, and interact with it if you allow public editing.  Hopefully they brought it offline so that they could fix it, and that it will be fixed soon. 

    One last thing, and then I need to go to bed.  There's an "Options..." menu item that doesn't do anything for me.  I've only tried it in Firefox (and I'm using 3.6b2), but clicking on it doesn't do anything at all.


    Just so no one thinks I'm being negative, let me state this plainly:   I'm VERY excited about Google Wave.  I know it's a pre-released product, and I don't expect perfection by any means.  I'm documenting these things here because I want to share my experience, and I would like to see the shortcomings addressed so that the final product will be awesome.

    Yay for Google Wave!

    Thursday, July 23, 2009

    Google Wave

    Google Wave looks amazing! (For those with 10-minute attention spans, here's the abridged version. The longer version is worth the watch if you have the time.) It's a new Internet communication protocol/framework being developed by Google. It's not a walled garden: anyone can make their own implementation (or even base it on Google's code), and it will be interoperable with everyone else, just like e-mail. But this isn't your grandfather's e-mail. Wave is basically a conversation/collaboration tree, with full version control, history, and really cool tools for mashups, transformations, translations, and anything else anyone on earth can think of and write a plugin for. This is really that revolutionary. Imagine if every e-mail, chat, wiki, invitation, blog post, tweet, photo album, forum, and whatever else on the Internet was as simple to interact with as an item on Facebook or a wiki, only with way more powerful tools, and it wasn't confined to anyone's walled garden. Tomorrow's kids will laugh at us for using Facebook for the same reason that today's kids laugh at their elders for using Juno. I don't expect all of those other technologies to disappear, but to some extent they will be eclipsed, and they will have to keep up or be left behind.

    Monday, March 23, 2009

    The New Facebook: Faucet to Firehose

    Facebook seems to change to something "new" every few months or so, I think I should clarify. This is the (as of now, latest) change where now they have a list of "News Feeds" on the right, with all friends' updates in the center, and the popular items on the right. Basically, Facebook is trying to be like Twitter. Here's the problem: Facebook isn't Twitter. They're completely different kinds of social networks. Twitter is a firehose, and as such, I select who I am "following" on Twitter with care. If someone is too noisy or prolific, I don't subscribe to them, and I don't lose anything by it. Facebook, on the other hand, aspires to be the repository of all of my social contacts. If I know someone, I would like to add them as a friend on Facebook, and not need to worry that they will inundate me with events. Facebook used to allow its users to fine-tune the types of stories that appeared in our home feeds. If we wanted to see every note that a friend posted, we could crank "notes" up, and see them all, and if we didn't want to be bothered by changes in relationship status, we could crank that all the way down, and never see them. We could also fine-tune our preferences by the individual, so if so-and-so published too many links, we could turn those down for that friend in order to prevent those from clogging the feed, but still let a few trickle in, in case they started to get interesting. Facebook was thus ideally configured to allow me to maintain a stream of information from each of my friends, and they did a pretty good job of balancing the flow of information such that it wasn't overwhelming. Until, that is, they decided to copy Twitter. Twitter makes no attempt to filter or balance anything. If you're following someone on Twitter, you see everything they post. Because that's what you're asking for: that's what Twitter is for: listening to people. If you don't want to hear what they're eating for lunch, don't follow them. Facebook knows about this social difference, and they've accommodated it. Sort of. For a long time, they've had "Friend Lists", which are basically tags that you can apply to this or that friend, which you can also use to restrict or allow permissions to see certain sets of content. I have a list of "Family" and a list of "BSF" friends, and a list of people who only see my "Limited Profile" and so on. Facbook now features these lists on the home page at the top of the left-hand column. At first, when you click on a list (or the master list of all friends called "News Feed") you see everything that everyone on that list has posted. It can be a lot, but let's say that Suzy is on my "Seattle" list. That means that if I click the little "X" button on one of her stories on the "News Feed" list, I can still click on the "Seattle" list and see her items along with my other Seattle friends. But it's still all or nothing. I no longer have the option to see "some" of her stories, or even "certain types" of stories from her. It's all, or nothing. Just like Friendfeed. Now, I like Twitterand FriendFeed for what they do: they're firehoses. If I miss something, it's not a big deal. It's transient information, and its relevance has an expiration date. When Suzy posts pictures of her nieces, though, I don't want to miss that. [Note: Suzy is fictional] But leaving her in my main feed means that I have to put up with her constantly posting links to this or that tear-jerker website or deal that she found on socks on Amazon. Facebook took away my granularity, and I'm afraid that it's become much less useful as a result. Most people never knew about the ability to customize their feeds by tuning their friends in order to see "less" or "more" from them, but they benefited from the system anyway, because Facebook was automatically balancing their feed content for them. No longer. Now, they will find that they miss a lot, simply because they didn't log in or hit refresh in time before it got buried under wall posts and status updates from less important friends. They'll feel bad about silencing their frineds entirely, so they won't do it, and most people won't maintain different friend lists for different sets of friends. One of two things will happen with users: Facebook is hoping they will spend more time sitting in front of their browsers hitting "refresh", sifting through the garbage manually, hoping to catch the stories they care about. I think users will find Facebook to be too much of a time leech and less useful than before, and spend less time there as a result. They'll still log in occasionally, but they won't count on it the way that they did before.

    Saturday, March 07, 2009

    The Google Reader Commenting Problem

    Google Reader is an excellent feed reader. Let me just go right out and say that. It does an awesome job of gathering together the content from all my feeds, organizing it, and presenting it to me. When you have all that content together in one place, sometimes you want to share your thoughts on what you read, or point out an article to your friends so that they can read it as well. Google Reader has a feature both to "Share" and "Share with note" which perform their stated purposes. There is also a bookmarklet available so that if you come across something on the web that you want to share, you can do so even if you are not subscribed to a feed of it. The problem arises when you have a group of friends who all like to share things back and forth: sometimes an article starts a discussion, and two or more friends wish to have a forum for that discussion. The discussion was started over Google Reader, so the natural thing would be for Google Reader to provide a seamless arena for that discussion to occur. The way that Google Reader implements sharing "under the covers" (as we in Computer Science like to say) is that each user has what essentially amounts to a blog, where all of our shared items and our comments about them are stored. This blog page is accessible under "Shared items" and it has a web page, and a feed of its own. When a friend shares their shared items with you, you are simply granted access to their feed. There is even a web page at which your blog can be accessed, which, if you wish, you can share with your friends and/or the world. (The URL for this blog contains a unique identifier, which would be nearly impossible to guess, in order to protect your privacy--but only if you wish to keep it a secret.) Now, herein lies the problem: when I share something and comment on it, all my friends see that comment and the shared article. When Josh, who is my friend, sees this article and my comment, he can also share the article with his own comment: which will be seen by his friends, including me. But the set of my friends is disjoint from the set of his friends. The problem compounds as more people wish to participate in the discussion, since there will be a growing cloud of people on the edges of the friend network who (1) are being repeatedly shared the same article, and (2) do not have access to the whole discussion or are uninterested in it. The request to have an integrated, more fully functional system for story commenting has been brought before Google, and is currently being ignored. I think this is because in order to fix the problem, they would need to change the basic architecture of Google Reader, and they're not prepared to do that. Google Shared Stuff showed some promise, but it never offered a comment feature, and is being discontinued. Friend Connect might someday fill this niche. The ideal use case would be that every time someone shares an article, a new forum would be created for that article. If one of your friends has shared an article before you, you have the option of starting your own forum on that article, or joining the existing one, thereby making it available to all of your friends who weren't friends with the original forum creator. The privacy side-effect of this is that when you participate in one of these forums, your comments can potentially be passed along to anyone, if they're a friend of a friend of a friend. I don't see that as bad, but Google Reader is built on the assumption that if I want my comments to be exclusive to only my friends, Google Reader isn't going to pass them along to anyone else. In the use case I'm thinking of, articles that had been shared would be annotated like this:
    • Josh: "I think this is hilarious."
      • 3 replies | Reply
    • Brian: "I think these people should be locked up and the key thrown away!"
      • 0 replies | Reply
    • Share | Start discussion | Ignore
    Design goals in setting up the above example:
    • Maintain current functionality by allowing a user to see his friends' notes on shared items when they come up in his reader.
    • Co-locate friends' comments, so that a user can see what each of his friends said about an item in one place.
    • Ensure that the item appears when a friend starts a new discussion, but allow users to prevent a popular discussion they are not interested in from becoming annoying by repeatedly popping up (hence the "Ignore" option).
    • Allow a user to create a forum in order to share a comment that can be replied to by any of his friends, and any of their friends, who will now be able to see the discussion.
    • Notify other users that a forum has been created (or joined) by one of their friends when they see the article, so that they will not create redundant discussions unless that is there intent.
    Frankly, I don't see this happening, especially since Google Reader users have been promised the privacy of their comments, and this system allows comments to propagate along with items over the friend network. Come to think of it, I'm not sure I want Google Reader to turn into something like the above, since it would inevitably be abused. After all, MySpace wasn't that bad of an idea in concept, it's just that the users were given more control than they could handle responsibly, and the result is quite ugly. Most of what I want to read is what I'm subscribed to, and I'm willing to take a look at something that my friends think is especially great that they've read. So, the options are as follows:
    1. The status quo: continue to complain, hoping that Google will fix it someday. Lower expectations in the meantime and refrain from attempting to have 'conversations' about Google Reader shared content, being content with mere comments.
    2. Integrate a 3rd party solution: look for another service to which Google Reader conversations can be redirected in a relatively seamless manner.
      1. If none are satisfactory, create our own. IPO and retire as millionaires within a decade.
    3. Ditch Google Reader: stop using Google Reader as the primary feed reader, and switch to another feed reader that provides a conversation thread for each shared item.
      1. This would involve getting the entire group of friends to switch to a new network for sharing (not easy).
      2. I don't know that there are any that actually fit this bill, since this isn't so much a reader feature as a social feature.
    4. Split the difference: Use Google Reader for what it's good for--reading feeds and commenting on why you're sharing that particular feed, not what someone else said about it. If you want to start a discussion, start it elsewhere: e-mail, FriendFeed, Facebook, etc.
    • Right off the bat, I know FriendFeed can be a good supplement to Google Reader, and I'm trying to work out exactly how the two can fit together for discussions originating on Google Reader.
    • Facebook has this sort of comment system down pat, but they don't have a reader, and I don't want to spam all of my Facebook friends with every story I share unless they specifically want it. Mostly though, Facebook doesn't prioritize maintaining users' privacy and ownership of data.
    • There's a Firefox extension that turns any page into a chat box: Socialbrowse. However, it looks like it's simply a public comment system like Digg and reddit. I'm looking more for a system where comments and articles are primarily shared with friends.
    If you can't tell, I'm a verbal processor, and in the process of organizing the information laid out in this blog post, I have convinced myself that the best course of action is to encourage those who wish to have back-and-forth discussion about an online article to take those discussions to a service that specializes in that sort of thing.
    • E-mail is a perfectly legitimate system for a discussion thread, and Google Reader seems to have anticipated this by providing an "Email" feature, located right next to "Share with note".
    • For more casual discussions, where the attention demanded by an e-mail would be too much, I think FriendFeed is the way to go. I have all my Google Reader shared items automatically show up on my FriendFeed, and if you have get an account, you can start a comment thread on any item.

    Thursday, March 05, 2009

    Google Friend Connect

    I just published a post on my other blog about Google Friend Connect (and Blogger's "Follow") feature. I describe what they are, and how they work, as far as I can tell. I decided to post it over on my non-technical blog, because it's targeted at your average Internet user, and doesn't require any technical knowledge to follow (at least that's what I think). I would encourage those who enjoy my blogs to "Follow" them.

    Thursday, December 04, 2008

    Google Reader vs. FriendFeed

    It seems that I've been introducing some of my friends to the features of various online tools a lot lately. Not that I've been going out of my way, but it seems that I'm "that guy" who is both "in the know" about tech stuff and willing to answer questions. A friend of mine recently asked me about Gmail. Her frustration was with the fact that the inbox was perpetually cluttered, and there was no way to clear out the old e-mails she had already dealt with without deleting them. So she thought, that is, until I told her what that "Archive" button does. Without it, there is no difference between the Inbox and "All Mail". Labels (aka "Tags") are also an indespensible feature of Gmail when used properly, but that's not my topic. Recently, I started using FriendFeed, and I thought I would explain what how I got there, what it is, and how its niche differs from that of Google Reader. Recently, I started using Twitter. It began with just subscribing to a friend's Twitter feed in Google Reader (my feed (i.e., RSS, Atom) reader of choice), but it would only refresh the Twitter content about once every couple of days, so I would get nothing for a while, and then about ten posts all at once. When things come in little bits, they're time-sensitive, and so I decided to get a Twitter account of my own in order to keep track of my friends' feeds in a timely manner, and be able to reply if desired. Thus, I became a Twitter lurker. However, it didn't take me long to figure out how to hook up Twitter to my Facebook status, making my "tweets" (another 'word' I dislike) a replacement for updating my Facebook status, and transforming me into a 'real' Twitter user. That wasn't enough, however. Apparently, my pallet for up-to-the-minute online content would not be satisfied until I found FriendFeed. When I first encountered FriendFeed, it looked redundant to Twitter's funcitonality, with the added detriment that none of my friends (and only one of my acquaintances) actually used it (at the time). This turned out not to be the case upon further inspection. FriendFeed is to Twitter what Google Reader is to Blogs. Yes, it will keep you informed of your friends' latest updates to Twitter, but it will also keep you informed of their activities on Digg, Reddit, Flickr, Picasa Web, their shared articles (on any number of services), and absolutely anything else that can be accessed through a feed. The problem was, since none of my friends were using FriendFeed, that none of their content and activity was available there. Enter the "imaginary friend" feature. Say I have a friend who uses Blogger, Google Reader, Facebook, Twitter, and Digg, but this Friend does not use FriendFeed. I can create an "imaginary friend", complete with nickname and profile picture, that aggregates this friend's content from all the various sites and makes it visible in myfeed exactly as if that friend had signed up and entered all those services as their own. All I need to provide, depending on the service, is their account's display name or feed URL. But why, you might ask, would I need yet another feed aggregator, when I am already using Google Reader? The difference in the way that these two services are used is that while Google Reader provides a hub for consuming content, FriendFeed provides a hub for observing events. Google Reader is all about pulling in the meaty content: reading the whole article. Google Reader, therefore, displays all of the text and multimedia that it can, and keeps track for you of what you have and haven't read. FriendFeed, on the other hand, is a stream of things that "happened": so-and-so posted on their blog, this person updated their status, that person posted a photo or video. The substance of the content is not displayed on FriendFeed: only that it happened and a title, short snippet, or small thumbnail. When an event occurs, it appears as quicly as possible at the top of the page. Once something drops off the page, it's irrelevant. There are items that appear both in Google Reader and FriendFeed, but there are also items that only appear on one or the other. FriendFeed is all about, well, friends, therefore news sites, webcomics, and blogs by people I don't know are much better suited exclusively to Google Reader, where nothing is skipped, and information is handled exhaustively. By contrast, items with very little content, or of a transient nature, are better suited to FriendFeed, where they can be noticed and optionally interacted with should the occasion arise to do so.