Automate Everything w/ Bash, Linux & Command Line
  1. Strange URLs Appearing in Google After Redesign

    A couple of weeks ago I wrote a post showing some efficient ways to verify your server side redirects. In that post, I describe several ways to get lists of all the different canonical URLs that Google and other search engines may be aware of so that you can setup redirects ahead of the redesigned site launch.

    I wrote that post because I was managing two such relaunches at that time. Last week on Tuesday, those two sites went live. Since then I’ve been monitoring Google Position reports daily to see how my positions and pages have been changing. Since we made the decision to change several of our URLs, it’s also important to make sure the changes are being understood properly. Here are some of the thing’s I’ve been paying attention to:

    1. Individual keyword position swings, like changes of 3 spots or more.
    2. Have the 301 redirects from old URLs to the new URLs been understood? Meaning, when the old URL isn’t positioning anymore, has the new equivalent replaced it?
    3. Are category pages still positioning for my head keywords? Are product pages or content pages still positioning for the longer-tail keywords?
    4. Are all the new URLs being indexed?

    Everything is looking great. Our positions are holding through the transition and each day I see a few more positioning URLs transition over from the old URLs to the new ones.

    Then, the Google Surprise

    Then I started to see something strange. I started to see URLs appear to be positioning that I’ve never seen before. The URL structure looked familiar enough, but the actual URL hasn’t ever shown up in Google’s index before (that I recorded). In each of these instances, the positioning URL was either the second URL for our domain positioning for that keyword.

    To recap, the URL that was positioning for the old site has now been replaced with an old canonical version that doesn’t exist on the new site and never positioned when the old site was live. This is really strange behavior, but I’m not really surprised because our old site had ridiculous amounts of canonical URLs. It would be sickening for any knowledgeable SEO.

    I found a handful of occurrences like this that fit the same pattern. To double check that I wasn’t mistaken, I double checked the server responses for those pages and found that they are indeed returning 404 (as they should). Again, this doesn’t really bother me because overall SEO performance has been great and each of these instances are just secondary positions. It’s just strange and I haven’t ever seen it before.

    Next Steps

    I honestly think that things will sort themselves out within a week or two. In the meantime, I’m going to continue with my daily position reports. When I find strange situations like this where new URLs show up, I’ll just create 301 redirects for them to the most relevant page on the new site. It shouldn’t take too long for Google to figure it out.

     
  2. Verifying 301 Redirects During Site Redesign

    I’m currently working on finishing up redesigns on two e-commerce sites at my day job. This is the culmination of many months of work and significant resources. We’re within days of launch. I’m pretty excited, but I decided that I needed to do another review of my 301 redirects to make sure I didn’t miss anything.

    This analysis showed me that I had.

    When designing and architecting new sites, it’s really easy to only think about how awesome things will be with the new platform/design/whatever. However, it’s projects like organizing 301 redirects for old URLs to new URLs that require you not to forget how bad things once were. For me, this analysis forced me to recall how many problems these sites have had over the years with canonical URLs.

    We were able to overcome our internal canonicalization issues by using the rel=canonical tag and fixing internal linking. However, there were years before where several different URLs were used for any one page. Some of those alternate URLs are still haunting us today.

    My challenge is to dig up all those old URL versions and make sure we have 301 redirects in place so that when we launch our new sites, visitors and search engines see our 404 page as little as possible. We just need to get a list of all those URLs to get started with.

    Sources of URLs

    Here’s a list of several sources I used to get together a list of URLs to check. I wanted to make sure I used a variety of sources with the thinking that a wider net is better.

    1. HTML Sitemap
    2. XML Sitemap
    3. PPC Account Landing Pages
    4. Google Webmaster Tools
    5. Blekko In-Bound Link Report (see my bookmarklet for easy data extraction)
    6. Server Logs
    7. Google Analytics

    It isn’t important to me to keep URLs separated by source. Once I had extracted URLs from one source, I just dumped them into an Excel worksheet. Later on you can use Excel to remove duplicates.

    Checking Server Responses on URLs

    Once you have your list of pages you’ll need an efficient (automated) way to check the server response for each. The server response code, i.e. 200, 301, 302, 404, 500, etc. is a part of the HTTP header that sent by the server to the web browser for each page request. I decided to write a short script to extract just the HTTP header.

    Here’s the Bash one-liner:

    wget --spider -S "$url_to_check" 2>&1;
    

    Now just replace $url_to_check with the actual URL, like http://www.google.com. Here’s an example:

    wget --spider -S "http://www.google.com" 2>&1;
    

    This is what you’ll get back (Google sends a rather large header):

    Spider mode enabled. Check if remote file exists.
    --2012-07-24 16:11:15--  http://www.google.com/
    Resolving www.google.com (www.google.com)... 74.125.225.176, 74.125.225.180, 74.125.225.178, ...
    Connecting to www.google.com (www.google.com)|74.125.225.176|:80... connected.
    HTTP request sent, awaiting response... 
      HTTP/1.1 200 OK
      Set-Cookie: NID=62=GZrQmPOvK5AyPhgA1RYRKP3KCxVdFL_QZ_GptmYGQrOI2d9nUqQETovH7MhtWroeeFOL_xKGt1w-YffuGhmP5IjF38IcR6IbNlTVBLLU_t35rQwaVZFW7H7jKGVqRIr3; expires=Wed, 23-Jan-2013 20:12:05 GMT; path=/; domain=.google.com; HttpOnly
      Date: Tue, 24 Jul 2012 20:12:05 GMT
      Expires: -1
      Cache-Control: private, max-age=0
      Content-Type: text/html; charset=ISO-8859-1
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: PREF=ID=d72f33e49b899251:FF=0:TM=1343160725:LM=1343160725:S=B8YfflyvIQvhgjE8; expires=Thu, 24-Jul-2014 20:12:05 GMT; path=/; domain=.google.com
      Set-Cookie: NID=62=d-OSrg2MYi6_7kbY5lHpW3qQ5ASiMMblUeUfBqppHahxDRXQL4qqPuI1nNxbgV3MoQnwxOuD6mPSTRrCK4xZk_ApFTi0KSsyDibrQ6-KHRXKZlPpECBr6AW39QNfhC9G; expires=Wed, 23-Jan-2013 20:12:05 GMT; path=/; domain=.google.com; HttpOnly
      P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657www.google.com (www.google.com)... 74.125.225.176, 74.125.225.180, 74.125.225.178, ...
    Connecting to www.google.com (www.google.com)|74.125.225.176|:80... connected.
    HTTP request sent, awaiting response... 
      HTTP/1.1 200 OK
      Set-Cookie: NID=62=GZrQmPOvK5AyPhgA1RYRKP3KCxVdFL_QZ_GptmYGQrOI2d9nUqQETovH7MhtWroeeFOL_xKGt1w-YffuGhmP5IjF38IcR6IbNlTVBLLU_t35rQwaVZFW7H7jKGVqRIr3; expires=Wed, 23-Jan-2013 20:12:05 GMT; path=/; domain=.google.com; HttpOnly
      Date: Tue, 24 Jul 2012 20:12:05 GMT
      Expires: -1
      Cache-Control: private, max-age=0
      Content-Type: text/html; charset=ISO-8859-1
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
      Set-Cookie: PREF=ID=d72f33e49b899251:FF=0:TM=1343160725:LM=1343160725:S=B8YfflyvIQvhgjE8; expires=Thu, 24-Jul-2014 20:12:05 GMT; path=/; domain=.google.com
      Set-Cookie: NID=62=d-OSrg2MYi6_7kbY5lHpW3qQ5ASiMMblUeUfBqppHahxDRXQL4qqPuI1nNxbgV3MoQnwxOuD6mPSTRrCK4xZk_ApFTi0KSsyDibrQ6-KHRXKZlPpECBr6AW39QNfhC9G; expires=Wed, 23-Jan-2013 20:12:05 GMT; path=/; domain=.google.com; HttpOnly
      P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
      Server: gws
      X-XSS-Protection: 1; mode=block
      X-Frame-Options: SAMEORIGIN
      Transfer-Encoding: chunked
    Length: unspecified [text/html]
    Remote file exists and could contain further links,
    but recursion is disabled -- not retrieving.
    

    All you should really care about is the line that says “HTTP/1.1 200 OK”. That is the server response that we want to verify. To extract just the server response from the output, let’s pipe the HTTP header out to grep to filter it.

    Run this…

    wget --spider -S "http://www.google.com" 2>&1 | grep "HTTP/"
    

    …and you’ll get…

    HTTP/1.1 200 OK
    

    Perfect, except that it would be very tedious to do this one URL at a time. Let’s use a Bash for loop to finish this up. Since you should be doing all of this PRIOR to launching your new site, you’ll need to replace your productiondomain in the URLs with the stage.productiondomain for the development site. sed is perfect for that. Also, update the /path/to/url-file.txt to match the actual path to the file containing URLs. This assumes that there isn’t any other data in the text file except for the URLs you want to check.

     for URL in `cat "/path/to/url-file.txt" | sed 's/productiondomain.com/stage.productiondomain.com/g'`; do echo "$URL" - `wget --spider -S "$URL" 2>&1 | grep "HTTP/"` ; done
    

    For this example, let’s take the following URLs as the example:

    http://www.slipxsolutions.com
    http://www.slipxsolutions.com/slip-X_NEXT.php
    http://www.slipxsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/75/Bath__and__Shower_Appliques/
    http://www.slipxsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/
    http://www.slipxsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/134/75_Safety_Treads/
    http://www.slipxsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/78/145_and_quot_Safety_Treads/
    http://www.slipxsolutions.com/product/23/Drain_PlugsDrain_Products/46/Snug_Plug_Drain_Stopper_/
    http://www.slipxsolutions.com/product/23/Drain_PlugsDrain_Products/48/StopAClog_Drain_Protector/
    http://www.slipxsolutions.com/product/23/Drain_PlugsDrain_Products/126/Bottomless_Bath/
    http://www.slipxsolutions.com/product/30/Bath__and__Home_Accessories/113/Shower_Splash_Guard/
    

    Once I run the tool I get this as output:

    http://www.slip-xsolutions.com - HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/slip-X_NEXT.php - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/75/Bath__and__Shower_Appliques/ - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/ - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/134/75_Safety_Treads/ - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/product/41/Safety_TreadsTub_Appliqu_and_233s/78/145_and_quot_Safety_Treads/ - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/product/23/Drain_PlugsDrain_Products/46/Snug_Plug_Drain_Stopper_/ - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    http://www.slip-xsolutions.com/product/23/Drain_PlugsDrain_Products/48/StopAClog_Drain_Protector/ - HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK
    

    Now all you have to do is watch and look for server response codes that don’t match your expectations. Notice that curl when using the --spider operator will check each page along the redirect path. If there are 6 redirects, it should follow every one and output the server responses.

    Let me know if you have any questions. Happy redirecting.

     
  3. Blekko Inbound Links Extractor Bookmarklet

    Let’s get right to it. Start using the bookmarklet by dragging the following bookmarklet link to your bookmark toolbar.

    Blekko - Inbound Links

    1. Go to a Blekko Inbound Links SEO report like: ubuntuforums.com/ /domainlinks
    2. Click on the Blekko - Inbound Links bookmarklet from your toolbar.
    3. Watch for a new <textarea></textarea> to be added to the top of the page containing all the link data from the report.

    If you’re pulling data for a popular site like Twitter or Google, be prepared to be patient because there’s a shit ton of scraping going on. Average and/or small sites typically take a second or two. The example provided above takes only 3 or 4 seconds.

    On the topic of links…link to me or share it if you like it!

    The How and Why

    I’m still working to improve my jQuery skills. Recently I needed to automate some tasks relating to scraping data from a site. That particular site was built relying heavily on Javascript and Ajax requests, which meant that I couldn’t use my favorite combination of cURL, grep, cut and Bash to do the scraping. I needed something that would run client-side and execute Javascript.

    After thinking about it for a while, I decided I should learn about whether or not I’d be able to create a bookmarklet to do the job. I’ve been learning jQuery over the past few months, so I also wanted to make sure I could pair my developing jQuery skills with this bookmarklet project. I found this great post that provided the exact starting point I was looking for.

    After using the framework provided in that post, I was able to complete that project. In fact, the project ended up working so well that I started to wonder about other ways I could use this technique to automate daily tasks.

    Blekko’s SEO Inbound Links Report

    Very frequently, I use Blekko’s SEO tools to research sites. I’m a big fan of all the free information Blekko provides webmasters and search engine marketers. In particular, I use the Blekko Inbound Links report often. This report shows all the incoming links for any site that Blekko has in its index. It’s really easy to use and navigate. To see this report for yourself, you’ll need to create an account with Blekko (FREE).

    After your account is created, you can enter automateeverything.tumblr.com/ /domainlinks to see all the incoming links for this site. My blog is still very young (at the time of writing), so my link profile isn’t very impressive (you can help change that by linking to me!!). Here’s a screenshot of what you get by getting the same report for plus.google.com/ /domainlinks.

    So, here’s the rundown of what you’re seeing:

    • An overall summary of how many incoming links by how many unique domains.
    • A list of domains, sorted by most authority to least (as judged by Blekko’s “Host Rank”).
    • The count of how many links there are from each host/domain.

    While this is good summary information, I also want to know which pages on the domain the links are coming from, what the anchor text is, what page is being linked to and whether it’s a nofollow link or not. To get that extra detail, you have to click on each of the link counts for each linking domain. That will load a detailed list of links and will show all the information I mentioned above.

    Let me say again, I think it’s great that Blekko is providing all this information for free. But…I want more. I want it all in one place. I want it in Excel. I don’t want to try to combine browser addons and/or macros to get all this data. I don’t want to go to each individual from domain links page to get all the to, from and anchor link details. This would take a ton of time to do manually. This time would be far better spent actually analyzing the link data.

    At the time of writing, Blekko does not provide an export option. That’s why I’m going to do it for everyone!

    The Bookmarklet

    This bookmarklet will automate the entire process. In just a second or so, it will scrape all of the information on the page, request each “links” page, scrape all that and then finally output a nicely formatted report in a text box at the top of the page. From there you’ll be able to just copy and paste into Excel to be used in a pivot table, graph or whatever.

    I love Ubuntu, so I thought I’d do a demo on UbuntuForums.com to show the power of this bookmarklet.

    Like I said, easy and fast! Here’s a few sample lines from the output of the UbuntuForums.com report:

    From_Host   Host_Rank   Link_From_URL   Link_From_Anchor    nofollow    Link_To_URL
    www.43things.com    468.7   http://www.43things.com/things/view/2140/use-linux      nf  http://ubuntuforums.com/
    www.linuxjournal.com    1343.3  http://www.linuxjournal.com/content/post-penguicon-unity-unification-story          http://ubuntuforums.com/
    ubuntuforums.org    1167.3  http://ubuntuforums.org/showthread.php?t=520091&page=2351           http://ubuntuforums.com/bump.php?
    ubuntuforums.org    1167.3  http://ubuntuforums.org/showthread.php?t=635117 www.ubuntuforums.com        http://www.ubuntuforums.com/
    bugs.launchpad.net  653.8   https://bugs.launchpad.net/ubuntu/+source/evolution/+bug/349312     nf  http://ubuntuforums.com/
    bugs.launchpad.net  653.8   https://bugs.launchpad.net/ubuntu/+source/fglrx-installer/+bug/545257       nf  http://ubuntuforums.com/
    bugs.launchpad.net  653.8   https://bugs.launchpad.net/ubuntu/+source/fglrx-installer/+bug/545257/comments/6        nf  http://ubuntuforums.com/
    www.geek.com    927.7   http://www.geek.com/articles/geek-pick/microsoft-expertzone-training-teaches-best-buy-employees-about-linux-inferiority-2009097/        nf  http://www.ubuntuforums.com/
    www.ubuntugeek.com  257.5   http://www.ubuntugeek.com/avast-antivirus-for-ubuntu-desktop.html       nf  http://www.ubuntuforums.com/
    www.ubuntugeek.com  257.5   http://www.ubuntugeek.com/avast-antivirus-for-ubuntu-desktop.html/comment-page-2        nf  http://www.ubuntuforums.com/
    www.piratbyran.org  100.6   http://www.piratbyran.org/index.php?view=forum&a=thread&id=37918&fview=34           http://www.ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/    Official Ubuntu forums/suppport site        http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21953   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21959   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21969   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21974   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21985   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/www.43things.com    468.7   http://www.43things.com/things/view/2140/use-linux      nf  http://ubuntuforums.com/
    www.linuxjournal.com    1343.3  http://www.linuxjournal.com/content/post-penguicon-unity-unification-story          http://ubuntuforums.com/
    ubuntuforums.org    1167.3  http://ubuntuforums.org/showthread.php?t=520091&page=2351           http://ubuntuforums.com/bump.php?
    ubuntuforums.org    1167.3  http://ubuntuforums.org/showthread.php?t=635117 www.ubuntuforums.com        http://www.ubuntuforums.com/
    bugs.launchpad.net  653.8   https://bugs.launchpad.net/ubuntu/+source/evolution/+bug/349312     nf  http://ubuntuforums.com/
    bugs.launchpad.net  653.8   https://bugs.launchpad.net/ubuntu/+source/fglrx-installer/+bug/545257       nf  http://ubuntuforums.com/
    bugs.launchpad.net  653.8   https://bugs.launchpad.net/ubuntu/+source/fglrx-installer/+bug/545257/comments/6        nf  http://ubuntuforums.com/
    www.geek.com    927.7   http://www.geek.com/articles/geek-pick/microsoft-expertzone-training-teaches-best-buy-employees-about-linux-inferiority-2009097/        nf  http://www.ubuntuforums.com/
    www.ubuntugeek.com  257.5   http://www.ubuntugeek.com/avast-antivirus-for-ubuntu-desktop.html       nf  http://www.ubuntuforums.com/
    www.ubuntugeek.com  257.5   http://www.ubuntugeek.com/avast-antivirus-for-ubuntu-desktop.html/comment-page-2        nf  http://www.ubuntuforums.com/
    www.piratbyran.org  100.6   http://www.piratbyran.org/index.php?view=forum&a=thread&id=37918&fview=34           http://www.ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/    Official Ubuntu forums/suppport site        http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21953   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21959   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21969   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21974   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    www.forevergeek.com 122.7   http://www.forevergeek.com/2005/04/ubuntu_504_hoary_hedgehog_review/?replytocom=21985   Official Ubuntu forums/suppport site    nf  http://ubuntuforums.com/
    

    Notes on Usage

    • The bookmarklet is cross-browser and cross-platform. If you run into any compatibility issues at all, please drop me a comment with the details of your platform and the query in Blekko.
    • This bookmarklet works by calling the actual Javascript file from my public Dropbox folder. You can see the full code here: http://dl.dropbox.com/u/56691816/automateeverything/bookmarklets/blekko-inbound-links.js
    • Since this bookmarklet executes code that’s pulled from an external source, it’s functionality and feature set is subject to change. Not to freak you out but if I decided to do nasty things with the Javascript at some point in the future, the only way you’d know is if you inspected the file each time before running it. But, isn’t that the case with any software that updates its-self?

    I hope you enjoy it. Please feel free to let me know if you have feature requests or bugs.

    Enjoy and happy automation!