January 14 2010

Unladen Follow 2: How annoying would this user be?

A new version of Unladen Follow is now live. Over the holidays, I received a lot of awesome feedback from users and beta testers, as well as some insight from using it myself. The focus of v2 is researching a potential followee, rather than simply your current ones. Changes include:

  • User detail pages give you linkable details about one Twitterer.
  • “What If” lets you see where a user would rank in your list.1
  • Your followees list now only shows the loudest users by default.
  • The algorithms now completely ignore @replies.2
  • A logout mechanism.
  • A diagram to explain why I created an unfollow helper anyway.

I was tempted to wait for in-app unfollow and more robust error handling before launch, but I’ve been too busy to add much in the last couple weeks. What do you think of what’s live so far?

  1. You can also use this as a trick to update the score of a user you follow using more data. []
  2. In general, your followers won’t see your @replies so they’re not annoying. It would be nice to only count @replies that you can’t see, but now that there’s parts of the app that don’t require authentication, that’s not feasible. []

see also


2 Comments

December 31 2009

Crafting realistic interfaces

Mike Rundle has a great article on subtly realistic visual design for newbies. My visual design skills are the weakest part of my software development toolbox, and this hit a sweet spot for me.


Comment!

December 17 2009

Tab Modality: Chrome makes it happen

I’ve always hated modal interruptions, and Chrome has done what should have been done ages ago: made them modal per tab rather than per window. Apparently this is quite tricky in Cocoa, but I’m glad they bothered to make it happen. Death to modal interruptions!


2 Comments

December 10 2009

Announcing Unladen Follow

The Unladen Follow mascot. He is fat because he ate too many tweets.If you’re like me, you find Twitter can have a high noise to signal ratio. I wrote recently about stopping the fire hose for blogs, but it can be trickier on Twitter, where you don’t have Google Reader’s Trends.

To this end, I built a little tool to help you tone down your Twitter following list: Unladen Follow. It scans your incoming tweets, and uses some metrics to suggest people for you to unfollow. I imagine that an unfollow helper may be construed as antisocial, but I think of it the other way around. By unfollowing a couple spammy users, you can socialize with many more casual Twitterers without overloading your brain.

As you might have concluded from my recent OAuth howto, Unladen Follow uses Ruby, the OAuth Gem, a trivial amount of Rails, and a fair bit of Javascript1.

I have a todo list for version 2, but I’m curious what the Twitter users in the crowd think of it. Is it neat? Is it useful? Is it evil?

  1. I originally used Grackle, which has a great design: instead of wrapping the Twitter API, it dynamically passes Ruby calls into API calls, making it lightweight and resilient. Unfortunately, a memory leak in the package motivated me to move most of the server code into the client. I considered also dropping Rails for Sinatra, which I will do if performance becomes a problem. []

see also


4 Comments

December 8 2009

Chrome for Mac annoyances

I'm so clever.Google Chrome for Mac hit beta today. I’ve been living on Mac Chrome alpha builds for a couple months now, and although it has some great performance improvements over Firefox, my heart still isn’t in it for a few reasons.

Somewhat Less Awesome Bar

As you may know, I am obsessed with Firefox’s AwesomeBar. Google’s Omnibox goes most of the way towards competing with the AwesomeBar, with the bonus that it does away with the pointless detached search field. However, Chrome’s location bar is still immature compared to Firefox’s.

Partial word matching is one example. In Firefox, when I typed ha it knew I meant Hacker News. In Chrome, my destination won’t even be suggested until I type the full word “hacker”, so I end up typing ne to prefix-match the domain. Another example is that when I type aapl, Firefox always knew I meant Google Finance’s AAPL page. In Chrome, my destination doesn’t even come up in the list, even though it’s bookmarked and frequently visited. Chrome’s lack of match highlighting for your URL bar search term makes the matches feel even weaker. Lastly, the default action is a full Google Search, rather than I’m Feeling Lucky. This is totally understandable from a revenue perspective, but annoying.

Unexpected Behaviour

The biggest thing that drove me away from Firefox was flakiness. Chrome’s architecture eliminates most of the beachballing and problems caused by other tabs. As it currently stands, though, Chrome is plagued by some of the same type of issues that Firefox 3 is, where you navigate and nothing happens, often not filling the Location field for you to retry with. The reasons behind these sorts of bugs are often subtle1, but it’s possibly the most frustrating thing a browser can do other than crash.

Flash

I hate Flash. Everybody hates Flash. This is why some of the most popular browser extensions are Flash blockers. Without either ClickToFlash or FlashBlock, hitting Flash in Chrome is painful. This is exaggerated by Chrome’s slightly buggy Flash support. Extension support is coming, and surely one of the first extensions will be a flash blocker, but until then I’m grumpy.

Conclusion

Despite these annoyances, the speed a responsiveness of Chrome makes it just about worth it. When Firefox finishes their multi-process work, I’ll give it another whole-hearted try. Until then, it’s the browser frontier for me.

  1. I’ve seen one based on the rendering processes crashing due to an automatic update, and another caused by command-clicking a link causing a new tab which downloaded something but didn’t display the download manager to indicate this happened. []

see also



5 Comments

December 1 2009

Accessing Twitter with the OAuth Gem and Rails

Ruby is the only programming language I know of that gets away with a literal logo.OAuth is the authorization protocol that Twitter1 provides to let third party apps use the Twitter API without seeing your Twitter password.

You might think the question “How do I use the OAuth Ruby gem to actually start an OAuth session with Twitter” would be easily answered on Google. It is not. There are a few reasons for this:

  • OAuth is new.
  • OAuth is changing.
  • Most documentation on OAuth is either excessively in-depth, or out of date.

The Readme of the oauth gem, as well as the howto it links to on the topic is from early 2008, which is millenia in OAuth years, and is written from the perspective of a persistent Ruby process rather than a web app.

From the comments in that article, a lot of people are having problems, so here’s the current (as of late 2009) way I got it running:

  def login
    require 'oauth'

    consumer = get_consumer

    # Get a request token from Twitter
    @request_token = consumer.get_request_token :oauth_callback
        => ('http://' + request.env['HTTP_HOST'] + '/default/oauth/')

    # Store the request token's details for later
    session[:request_token] = @request_token.token
    session[:request_secret] = @request_token.secret

    # Hand off to Twitter so the user can authorize us
    redirect_to @request_token.authorize_url
  end

  def oauth
    require 'oauth'

    consumer = get_consumer

    # Re-create the request token
    @request_token = OAuth::RequestToken.new(consumer,
        session[:request_token], session[:request_secret])

    # Convert the request token to an access token using the verifier Twitter gave us
    @access_token = @request_token.get_access_token(:oauth_verifier =>
        params[:oauth_verifier])

    # Store the token and secret that we need to make API calls
    session[:oauth_token] = @access_token.token
    session[:oauth_secret] = @access_token.secret

    # Hand off to our app, which actually uses the API with the above token and secret
    redirect_to '/app/'
  end

  private

  def get_consumer
    OAuth::Consumer.new(
      YOUR_CONSUMER_KEY,
      YOUR_CONSUMER_SECRET,
      {:site => 'http://twitter.com'}
    )
  end

Some things to note that are different than other howtos out there:

  • The Twitter callback URL does not work anymore, even though their site lets you specify it.
  • The OAuth gem assumes you are running a persistent Ruby process, as opposed to something like Rails. It wants you to create an Access Token object and keep it around, but they can’t be stored in a Rails session, so this is a pain.
  • You need to pass oauth_verifier to get_access_token. This apparently is a new requirement.

Alternatively, you can use a huge Twitter gem that does everything from OAuth to abstracting the Twitter API. I didn’t do that because I love the feel of Grackle, which is a thin wrapper around the Twitter API that just passes through your API calls, meaning it doesn’t need to be updated when the API changes, and it is very light weight.

If you have any tips on how to make my code more Rubylike, elegant, or have any other suggestions, please post a comment.

  1. Other sites provide OAuth too. As a matter of fact, very few OAuth howtos use Twitter as an example, even though it’s the highest profile user. []

see also




3 Comments

November 19 2009

IE9 will be faster and rounder

The Internet Explorer team has given their first look at what web standards advances they’re making for IE9. So far they’re committed to big performance gains, rounded corners, and CSS3 selectors. This is a big deal because it’s the first time Microsoft has implemented a new working draft web standard in many many years.


3 Comments

November 18 2009

Feeds worth reading

The noble writers I link to here do their first drafts with a quill.In response to my recent crusade for feed unsubscription, I was asked who I’m still reading. Out of my remaining feeds, here are two active favourites from each of my categories, with a link to a recent article that I appreciate from each one1.

Web Programming

My web development reading is centered around Javascript since it’s my working language right now. Francisco Tolmasky, one of the creators of Cappuccino, writes thoughtfully and infrequently on building thick client web apps.

John Resig, creator of JQuery, has a similarly consistent blog on pushing boundaries with Javascript.

Business of Software

If you’re fascinated by the startup world, Paul Graham is a staple.

For more applied thoughts on software business and product design, I read Signal vs. Noise. I’ve looked up to the 37signals guys since I came across them almost ten years ago, and their “do less” mantra has always resonated with me.

Vancouver Notables

I don’t generally follow people just because they’re local, but there are lots of people worth reading that are in town. Boris Mann is a central figure in the Vancouver tech and startup scenes.

Dave Shea is a central figure in standards-based web design, and gets super bonus points for introducing me to The Alibi Room.

Design

For Mac-centric design writing, Cocoia is top notch.

On the more technical side, Jon Snook writes on a mix of design and web programming.

Fun Stuff

I try to keep my feeds professionally oriented – getting distracted is enough of a danger without it being fed into your system automatically. That said, the geeky dark humour of SMBC and Zero Punctuation are classics.

Projects

RSS is perfect for subscribing to feeds of projects you use, even if they rarely update. It kicks mailing list ass, that’s for sure. The SproutCore Blog, for example, is great for me as a user of the framework.

Google Chrome Releases takes the format of the wonderful Burning Edge, and is great for me since I live on the Chrome Mac development builds.

Friends

I’m blessed with many friends who write about technology. Forced to pick a top two, I’d name Curtis Lassam and Bruce Alderson. Both write well on both web technology and creative topics, and I think of their blogs as cousins to Antipode.

Apple

John Gruber is in some of ways the pulse of the Apple geek community. It is with reluctance I’m still subscribed to his high-volume links feed rather than simply full posts2, but a posts-only feed is available too.

On serious Mac development, I read Cocoa with Love. I’m a novice Objective-C developer, so Matt’s in-depth Cocoa development posts sometimes go over my head, but that’s the point. If you’re not reading some things that go over your head, you’re in trouble.

More

I’m always trimming my feeds and keeping an eye out for more. Do you have any suggestions based on my this list or my topics here?

  1. I’m linking to specific articles partially because I think I’ve linked to every single one of these people before, with the exception of the comics. Still, writing this was a great exercise in thinking about who I’m inspired by. []
  2. Daring Fireball has by far the highest post volume in my feed reader, and often posts things he doesn’t have in-depth knowledge of. On the other hand, the link mix and annotation are so good that they stay on my list. []

see also




9 Comments

Next Page »

Check out the Archives, or read more about Apple, Blogging, CSS, Failure, Games, Google, iPhone, Javascript, User Interface, or Vancouver.