<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.seomofo.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>! SEO Mofo !</title>
	
	<link>http://www.seomofo.com</link>
	<description>The Web's best search engine optimization website offering SEO tips to search engine optimizers opting to optimize their search engine optimisation options.</description>
	<lastBuildDate>Wed, 03 Mar 2010 00:24:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.seomofo.com/seomofo" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="seomofo" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">seomofo</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>What is the Maximum Character Length for a URL that Google Will Index?</title>
		<link>http://www.seomofo.com/experiments/title-and-h1-of-this-post-but-for-the-sake-of-keyword-prominence-stuffing-im-going-to-mention-it-again-using-various-synonyms-stemmed-variations-and-of-coursea-big-fat-prominent-font-size-heres-the-stumper-that-stumped-me-what-is-the-max-number-of-chars-in-a-url-that-google-is-willing-to-crawl-and-index-for-whatever-reason-i-thought-i-had-read-somewhere-that-googles-limit-on-urls-was-255-characters-but-that-turned-out-to-be-wrong-so-maybe-i-just-made-that-number-up-the-best-answer-i-could-find-was-this-quote-from-googles-webmaster-trends-analyst-john-mueller-we-can-certainly-crawl-and-index-urls-over-1000-characters-long-but-that-doesnt-mean-that-its-a-good-practice-the-setup-for-this-experiment-is-going-to-be-pretty-simple-im-going-to-edit-the-permalink-of-this-post-to-be-really-really-long-then-im-going-to-see-if-google-indexes-it-i-might-even-see-if-yahoo-and-bing-index-iteven-though-no-one-really-cares-what-those-assholes-are-doing-url-character-limits-unrelated-to-google-the-question-now-is-how-many-characters-should-i-make-the-url-of-this-post-there-are-a-couple-of-sources-ill-reference-to-help-me-make-this-decision-the-first-is-this-quote-from-the-microsoft-support-pages-microsoft-internet-explorer-has-a-maximum-uniform-resource-locator-url-length-of-2083-characters-internet-explorer-also-has-a-maximum-path-length-of-2048-characters-this-limit-applies-to-both-post-request-and-get-request-urls-the-second-source-ill-cite-is-the-http-11-protocol-which-says-the-http-protocol-does-not-place-any-a-priori-limit-on-the-length-of-a-uri-servers-must-be-able-to-handle-the-uri-of-any-resource-they-serve-and-should-be-able-to-handle-uris-of-unbounded-length-if-they-provide-get-based-forms-that-could-generate-such-uris-a-server-should-return-414-request-uri-too-long-status-if-a-uri-is-longer.html</link>
		<comments>http://www.seomofo.com/experiments/title-and-h1-of-this-post-but-for-the-sake-of-keyword-prominence-stuffing-im-going-to-mention-it-again-using-various-synonyms-stemmed-variations-and-of-coursea-big-fat-prominent-font-size-heres-the-stumper-that-stumped-me-what-is-the-max-number-of-chars-in-a-url-that-google-is-willing-to-crawl-and-index-for-whatever-reason-i-thought-i-had-read-somewhere-that-googles-limit-on-urls-was-255-characters-but-that-turned-out-to-be-wrong-so-maybe-i-just-made-that-number-up-the-best-answer-i-could-find-was-this-quote-from-googles-webmaster-trends-analyst-john-mueller-we-can-certainly-crawl-and-index-urls-over-1000-characters-long-but-that-doesnt-mean-that-its-a-good-practice-the-setup-for-this-experiment-is-going-to-be-pretty-simple-im-going-to-edit-the-permalink-of-this-post-to-be-really-really-long-then-im-going-to-see-if-google-indexes-it-i-might-even-see-if-yahoo-and-bing-index-iteven-though-no-one-really-cares-what-those-assholes-are-doing-url-character-limits-unrelated-to-google-the-question-now-is-how-many-characters-should-i-make-the-url-of-this-post-there-are-a-couple-of-sources-ill-reference-to-help-me-make-this-decision-the-first-is-this-quote-from-the-microsoft-support-pages-microsoft-internet-explorer-has-a-maximum-uniform-resource-locator-url-length-of-2083-characters-internet-explorer-also-has-a-maximum-path-length-of-2048-characters-this-limit-applies-to-both-post-request-and-get-request-urls-the-second-source-ill-cite-is-the-http-11-protocol-which-says-the-http-protocol-does-not-place-any-a-priori-limit-on-the-length-of-a-uri-servers-must-be-able-to-handle-the-uri-of-any-resource-they-serve-and-should-be-able-to-handle-uris-of-unbounded-length-if-they-provide-get-based-forms-that-could-generate-such-uris-a-server-should-return-414-request-uri-too-long-status-if-a-uri-is-longer.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 20:07:25 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Experiments]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1833</guid>
		<description><![CDATA[This experiment tries to find an answer to the question of how many characters long a URL can be and still get crawled and indexed by Google.]]></description>
			<content:encoded><![CDATA[<p></p>Earlier today, a very rare occurrence occurred: an SEO-related question arose to which I did not have an answer. I&#8217;m as shocked as you are. The question in question is already mentioned in the title and h1 of this post, but for the sake of keyword prominence/stuffing, I&#8217;m going to mention it again&#8211;using various synonyms, stemmed variations, and of course&#8230;a big fat prominent font size. Here&#8217;s the stumper that stumped me:   What is the max number of chars in a URL that Google is willing to crawl and index?   For whatever reason, I thought I had read somewhere that Google&#8217;s limit on URLs was 255 characters. But that turned out to be wrong, so maybe I just made that number up. The best answer I could find was this quote from Google&#8217;s Webmaster Trends Analyst, John Mueller:    We can certainly crawl and index URLs over 1000 characters long&#8211;but that doesn&#8217;t mean that it&#8217;s a good practice.     The setup for this experiment is going to be pretty simple: I&#8217;m going to edit the permalink of this post to be really, really long. Then I&#8217;m going to see if Google indexes it. I might even see if Yahoo! and Bing index it&#8230;even though no one really cares what those assholes are doing.  URL Character Limits Unrelated to Google  The question now is: How many characters should I make the URL of this post? There are a couple of sources I&#8217;ll reference to help me make this decision. The first is this quote from the Microsoft support pages:    Microsoft Internet Explorer has a maximum uniform resource locator (URL) length of 2,083 characters. Internet Explorer also has a maximum path length of 2,048 characters. This limit applies to both POST request and GET request URLs.     The second source I&#8217;ll cite is the HTTP 1.1 protocol, which says:    The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).  Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations might not properly support these lengths.   Experimental URL Character Length&#8230;  This experiment is going to try a URL of 2048 characters&#8230;that way, we can also see if Microsoft was telling the truth about Internet Explorer. I&#8217;ll update this post when I find out whether or not Google can index this ridiculously-long URL.   WordPress isn&#8217;t letting me edit this page&#8217;s permalink to be anything longer than 200 characters, so I&#8217;m going to try to edit the core WP files and the database settings to get it to work. So if this post doesn&#8217;t yet have 2000+ characters, just wait a little bit and check back later. If I have to, I&#8217;ll just create a static HTML file for this post.<img src="http://feeds.feedburner.com/~r/seomofo/~4/f4I3LFNj2Io" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/experiments/title-and-h1-of-this-post-but-for-the-sake-of-keyword-prominence-stuffing-im-going-to-mention-it-again-using-various-synonyms-stemmed-variations-and-of-coursea-big-fat-prominent-font-size-heres-the-stumper-that-stumped-me-what-is-the-max-number-of-chars-in-a-url-that-google-is-willing-to-crawl-and-index-for-whatever-reason-i-thought-i-had-read-somewhere-that-googles-limit-on-urls-was-255-characters-but-that-turned-out-to-be-wrong-so-maybe-i-just-made-that-number-up-the-best-answer-i-could-find-was-this-quote-from-googles-webmaster-trends-analyst-john-mueller-we-can-certainly-crawl-and-index-urls-over-1000-characters-long-but-that-doesnt-mean-that-its-a-good-practice-the-setup-for-this-experiment-is-going-to-be-pretty-simple-im-going-to-edit-the-permalink-of-this-post-to-be-really-really-long-then-im-going-to-see-if-google-indexes-it-i-might-even-see-if-yahoo-and-bing-index-iteven-though-no-one-really-cares-what-those-assholes-are-doing-url-character-limits-unrelated-to-google-the-question-now-is-how-many-characters-should-i-make-the-url-of-this-post-there-are-a-couple-of-sources-ill-reference-to-help-me-make-this-decision-the-first-is-this-quote-from-the-microsoft-support-pages-microsoft-internet-explorer-has-a-maximum-uniform-resource-locator-url-length-of-2083-characters-internet-explorer-also-has-a-maximum-path-length-of-2048-characters-this-limit-applies-to-both-post-request-and-get-request-urls-the-second-source-ill-cite-is-the-http-11-protocol-which-says-the-http-protocol-does-not-place-any-a-priori-limit-on-the-length-of-a-uri-servers-must-be-able-to-handle-the-uri-of-any-resource-they-serve-and-should-be-able-to-handle-uris-of-unbounded-length-if-they-provide-get-based-forms-that-could-generate-such-uris-a-server-should-return-414-request-uri-too-long-status-if-a-uri-is-longer.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Matt McGee is a Bitch, Danny Sullivan is a Poseur, &amp; Sphinn Sucks</title>
		<link>http://www.seomofo.com/orm/sphinn-sucks.html</link>
		<comments>http://www.seomofo.com/orm/sphinn-sucks.html#comments</comments>
		<pubDate>Tue, 16 Feb 2010 11:57:34 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Reputation Management]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1816</guid>
		<description><![CDATA[My Sphinn account was deleted and many of you are wondering why. Here’s the story behind why my content will never again grace the front page of Sphinn.]]></description>
			<content:encoded><![CDATA[<p></p>
<p>My account at Sphinn was deleted today, and many of you are wondering why. Hopefully this email exchange will answer that. I&#8217;ll add clarification as needed.</p>
<p>First, I published a new post over at SEOBullshit.com (<a href="http://seobullshit.com/google-losing-streak/">Google&#8217;s Epic Losing Streak</a>). Then I tweeted about it. Then I tried to submit it to Sphinn, but Sphinn was saying it had already been submitted. I didn&#8217;t know who this other person was, or how the hell they submitted my post so quickly, but I was annoyed and I contacted Sphinn through their contact form:</p>
<h2>From me to Sphinn</h2>
<blockquote>
<p>Is there any way to prevent this kind of thing?<br /><br />I just published an article and tried to submit to to Sphinn, but someone beat me to it:<br /><br />http://sphinn.com/story/141676/<br /><br />I have a couple of problems with this.<br /><br /> 1. My avatar isn&#8217;t shown next to the article&#8217;s title.<br /> 2. The article&#8217;s summary was written by someone else, and it&#8217;s&#8230;not what I would have chosen.<br /><br />So my first thought was to change my post&#8217;s URL, submit the new one, and destroy the old one&#8230;but that&#8217;s kind of a dick move, at least as far as this girl is concerned. So my question is&#8230;<br /><br />What can I do to take control of my Sphinn listing?</p></blockquote>
<h2>From Matt McGee to me</h2>
<p>Matt McGee, who is a punk-ass bitch, responded with this:</p>
<blockquote>
<p>Hey Darren,<br /> <br /> There are no rules about who can and can&#8217;t submit to Sphinn (or any other social voting site). As soon as you publish something, anyone can post it to Sphinn &#8212; so I guess the answer to your question is to submit as soon as you hit the Publish button next time.<br /> <br /> Matt</p></blockquote>
<p>It certainly doesn&#8217;t sound like anything out of the ordinary, but if you knew the history between me and McGee, you&#8217;d realize there are some subtle tones of mockery and condescension between the lines. It was obvious to me that Matt McGee wasn&#8217;t going to be helpful, so I submitted my own story using another URL. Then I tweeted about it and several people sphunn the story. The issue was essentially resolved at this point, assuming that whoever submitted the story the first time didn&#8217;t care about petty issues like avatars and summaries. However, Matt McGee decided to triple his bitch points by deleting my submission, sphinns and all.</p>
<p>(BTW&#8230;at this point, I took the time to investigate the Sphinn user who submitted my post, and I realized it was a lady whom I&#8217;m actually fond of and follow on Twitter. So FYI&#8230;she&#8217;s awesome and I have no hard feelings towards her whatsoever. And yes&#8230;this whole  incident probably could have been avoided if I had talked to her about it, but instead I ignored that part and focused on what an annoying bitch Matt McGee is.)</p>
<h2>From me to Matt McGee</h2>
<p>Then I responded with this:</p>
<blockquote>
<p>Who deleted my submission?</p></blockquote>
<h2>From Matt McGee to me</h2>
<p>Matt bitchfully responded with this:</p>
<blockquote>
<p>You should&#8217;ve received an email that says it was deleted because it&#8217;s a dupe submission. You can vote on the original here:<br /> <br /> http://sphinn.com/story/141676/</p></blockquote>
<h2>From me to Matt McGee</h2>
<p>To which I responded with this:</p>
<blockquote>
<p>Do you think you&#8217;re clever, Matt? Do you think your passive-aggressive bullshit goes unnoticed?<br /><br />I&#8217;m about to kick off a very passionate, very determined smear campaign. I need to know if I&#8217;ll be targeting you specifically, or Sphinn in general.<br /> <br />Please advise.</p></blockquote>
<h2>From Matt McGee to me</h2>
<p>Then Matt responds with this:</p>
<blockquote>
<p>Darren,<br /> <br /> I don&#8217;t understand the problem. The story is on Sphinn already and you can vote for it now, but you haven&#8217;t done so. What am I missing?</p></blockquote>
<p>&#8230;which again sounds like a perfectly normal response, unless you read between the lines&#8230;where you&#8217;ll discover that it&#8217;s really Matt playing dumb and being a bitch again. Plus, to make matters worse, someone from Sphinn told my ex-girlfriend about this entire exchange, presumably with the hope/expectation that she would calm down her psycho ex, and so now I had to explain myself to her&#8230;which is always a buzzkill, since she never takes my side.</p>
<h2>From me to Matt McGee</h2>
<p>So I responded the way any self-respecting psychopath would:</p>
<blockquote>
<p>Well, first your developers missed an <strong>obvious</strong> need for content owners to have the ability to control submissions of their own work. Or maybe they acknowledged the need, but instead opted for the cheaper solution: let the moderators handle it on a case-by-case basis. The point is&#8230;I write content to promote ME, just like everyone else does. I wrote the article&#8211;I should be able to submit it with MY avatar and MY summary. If you don&#8217;t understand why this might be important, let me write the summary for your next submission and I&#8217;ll make it clear.<br /> <br />Then after I took the time to contact the Sphinn staff PRIVATELY&#8211;per Danny&#8217;s request, following my last psychotic episode&#8211;you missed the opportunity to take me seriously and basically said &#8220;too bad.&#8221;<br /> <br />Then I took matters into my own hands and solved the problem myself, by submitting the story under an alias URL. Then I twittered my Sphinn submission&#8217;s URL, at which time several people sphunn it. All you had to do&#8230;was do NOTHING. Instead, you chose to do things &#8220;by the book&#8221; and deleted my submission, despite the obvious fact that it was the more-reputable submission of the two&#8230;AND despite the fact that it was the only one that had been sphunn several times.<br /> <br />On top of everything, you want to keep condescending me with your smug, passive-aggressive remarks:</p>
<ul>
<div>
	<li>There are no rules about who can and can&#8217;t submit to Sphinn (or any other social voting site).</li>
</div>
<div>
	<li>You should&#8217;ve received an email that says it was deleted because it&#8217;s a dupe submission. You can vote on the original here:</li>
</div>
<div>
	<li>The story is on Sphinn already and you can vote for it now, but you haven&#8217;t done so.</li>
</div></ul>
<p>Why don&#8217;t you just call me a retard, Matt McGee?<br /><br />And finally, you missed a very, VERY important opportunity&#8230;and that was the opportunity to NOT get Lisa involved.<br /><br />So the answer to YOUR question is&#8230;<br /> <br />The problem is you went out of your way to piss me off, and now I&#8217;m about to go to some seriously-ridiculous extremes to publicly shit all over your name, your reputation, anything you&#8217;ve ever published, and every brand you&#8217;ve ever been associated with.<br /> <br />Do you understand now?</p></blockquote>
<h2>From Danny Sullivan to me</h2>
<p>Matt then crawled under his bed, curled into a fetal position, and began trembling. This is where the situation turned shitty&#8230;as Danny Sullivan took it upon himself to butt into the conversation and blindly defend his employee:</p>
<blockquote>
<p>Darren, head over to Digg, then find how you can take control of a story someone has submitted from your site to Digg. You can’t. Pick any number of social news sites out there. None of them operate that way.</p>
<p>You absolutely can submit your own story with your own avatar. Nothing prevents you from doing it. It’s simply that in this case, someone else submitted your story before you did. You seem to want the right to rip that submission away from them, so that you could submit it instead.</p>
<p>Well, I can understand that request. I hope you can understand that it’s simply not how social sites have operated. If you were to submit a blog post from Google, would you want Google to have the right to pull the submission away from you.</p>
<p>Frankly, you’re the first person I know of to raise this issue with us. It just doesn’t seem to have been a burning issue with site owners. It’s something we can consider, and I’d welcome you starting a discussion about it in the Sphinn Zone to see what others think.</p>
<p>But before you do that, you need to apologize for your abusive, out of line email to Matt. I’ve read through the entire email thread below. He’s answered your questions politely and matter-of-factly. Your response is to assume he’s got the time to play some absurd passive-aggressive game with you.</p>
<p>He doesn’t. Nor was he. So you can push the reset button with us at Sphinn by apologizing. If you don’t want to do that, we’ll ban your account. You’re free to embark upon whatever smear campaign you want, if that’s going to make you feel better. I’d think you’d have better things to do, especially when no one was attempting to victimize you in any way.</p>
<p>danny</p></blockquote>
<p>The reason I say things turned shitty is because I personally think Danny&#8217;s a nice guy, and I really didn&#8217;t want him to get caught in the crossfire between me and that bitch McGee. But much to my disappointment, not only did Danny butt in&#8230;he also started demanding apologies and issuing &#8220;or else&#8221; statements, as if he&#8217;s the judge, jury, and execution for all things SEO and I&#8217;m required to offer him a sacrifice before I can enter his world.</p>
<h2>From me to Danny Sullivan</h2>
<p>I was definitely pissed beyond words at this point, but I really didn&#8217;t want to direct my anger towards Danny, because I know he means well. So I let off just a wee bit o&#8217; rage:</p>
<blockquote>
<p>Danny,<br /><br />First of all, Sphinn isn&#8217;t Digg. Nothing that happens there has anything to do with this. I have no idea why you and Matt would both try the &#8220;but everyone else is doing it&#8221; excuse, but personally I think it&#8217;s pathetic. Besides, do I really seem like the kind of person who makes decisions based on the norm?<br /> <br />Second of all, I never asked you to remove anyone&#8217;s submission.</p>
<p>Reading the entire email thread doesn&#8217;t make you qualified to have an opinion about this in the first place. I don&#8217;t expect you to understand or appreciate what was said between the lines, and it&#8217;s no surprise that you don&#8217;t. Matt&#8217;s a big boy; let him dig himself out.</p></blockquote>
<blockquote>
<p>So&#8230;in your best judgment&#8230;you&#8217;ve concluded that the best way to handle this situation is by demanding an apology from me and threatening to ban my account otherwise? Are you serious? Do you also scream at drunk people?<br /> <br />Absolutely, without question, if there&#8217;s one thing I&#8217;m NOT going to do&#8230;it&#8217;s apologize to Matt. I&#8217;m not even close to being sorry, and I&#8217;m not going to pretend otherwise. Furthermore, I&#8217;m not going to pretend like I give two shits about my account on Sphinn. Ban it. Delete it. Do whatever you want with it. If you want to rid your site of some of the highest-quality content this industry produces, then that&#8217;s your loss. I get nothing from Sphinn, and after what I&#8217;ve seen today, I&#8217;m embarrassed to have had anything to do with it. Sphinn is just another haven for SEO wannabes and talentless marketers who all want to circle-jerk each other and confirm the stereotype that this industry is bullshit.<br /> <br />Great advice, asking me to email you privately to resolve any future problems, Danny. It&#8217;s worked miracles for me. You&#8217;re quite the problem solver.</p></blockquote>
<h2>From Danny Sullivan to me</h2>
<p>Amazingly, Danny responded YET AGAIN by talking about &#8220;what everyone else does.&#8221;</p>
<blockquote>
<p>Darren, I’ll repeat again, we’ve never had anyone suggest they should seize control over a submission just because they wrote the content that was submitted. You’re the first.</p>
<p>I think you’re the first because Sphinn operates the same way many other social sharing sites operate, where site owners don’t have that type of control. It’s sort of like suggesting that no one should be able to tweet about your stories, or submit your stories to Delicious, or to Digg, or to Reddit, or to Hacker News, or bookmark them in Google Reader … and on and on and on.</p>
<p>Reading the email qualifies me plenty to feel you’ve been way out of line with a member of my staff. And that is indeed how I felt it was best handled.</p>
<p>If Sphinn was a shop, then you had a problem in the shop, someone in the shop has patiently tried to help you, and you’ve effectively started yelling at them and threatening them. That’s simply not acceptable behavior.</p>
<p>We’ll have your account terminated. I’ll also have the seomofo name blocked, as I recall someone who wasn’t you grabbed that ages ago, and we handed it to you when you asked. I’ll also have your site blocked from future submissions to Sphinn, which will prevent anyone from submitting your content, so that you [won't] find yourself facing any further upset.</p></blockquote>
<h2>From me to Danny Sullivan</h2>
<p>And that&#8217;s when I finally lost it and tried to be as offensive as possible:</p>
<blockquote>
<p>Danny&#8230;I&#8217;m going to tell you something, and I hope you take it to heart.<br /><br />It is people like you who have destroyed the SEO industry&#8217;s reputation. You are not an SEO, you are a marketer&#8211;a salesman. You sell people on ideas that you&#8217;re not even qualified to talk about, yet you do it anyway&#8230;because you value personal success over everything else.<br /> <br />You have the arrogance to ask ME to apologize to Sphinn? Are you out of your goddamn mind? Who the FUCK do you think you are? You&#8217;re a nobody. You&#8217;re a fucking pretender. Your only skill is your ability to convince other people that you know what the fuck you&#8217;re talking about. All you know how to do is regurgitate the ideas of others. You&#8217;re a LEECH on the internet and on SEO.<br /> <br />You want to know why I&#8217;m the first person who&#8217;s ever ____? Because I&#8217;m not a sellout like you and your fellow salesmen. You&#8217;ve padded yourself with peons who are afraid to call you on your bullshit because they don&#8217;t want to draw attention to their own. I don&#8217;t have anything to hide. When you run websites that steal my content and fuck me over, I&#8217;m going to speak up&#8211;without regard for how it might suit your god complex.<br /> <br />So with the utmost sincerity&#8230;I&#8217;d like to say: go fuck yourself, you poseur.</p></blockquote>
<p>So there it is. That&#8217;s the story behind why my content will never again grace the front page of Sphinn.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:PixelsPerInch>72</o:PixelsPerInch> <o:TargetScreenSize>1024&#215;768</o:TargetScreenSize> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin:0in; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoNormalCxSpFirst, li.MsoNormalCxSpFirst, div.MsoNormalCxSpFirst 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-style-type:export-only; 	margin:0in; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoNormalCxSpMiddle, li.MsoNormalCxSpMiddle, div.MsoNormalCxSpMiddle 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-style-type:export-only; 	margin:0in; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} p.MsoNormalCxSpLast, li.MsoNormalCxSpLast, div.MsoNormalCxSpLast 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-style-type:export-only; 	margin:0in; 	margin-bottom:.0001pt; 	mso-add-space:auto; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.0in 1.0in 1.0in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:96994848; 	mso-list-template-ids:-1969866330;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:.5in; 	mso-level-number-position:left; 	text-indent:-.25in; 	mso-ansi-font-size:10.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0in;} ul 	{margin-bottom:0in;} --><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin-top:0in; 	mso-para-margin-right:0in; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --> <!--[endif]-->
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">My account at Sphinn was deleted today, and many of you are wondering why. Hopefully this email exchange will answer that. I&#8217;ll add clarification as needed.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">First, I published a new post over at SEOBullshit.com. Then I tweeted about it. Then I tried to submit it to Sphinn, but Sphinn was saying it had already been submitted. I didn&#8217;t know who this other person was, or how the hell they submitted my post so quickly, but I was annoyed and I contacted Sphinn through their contact form:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From me to Sphinn</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Is there any way to prevent this kind of thing?<br /> <br /> I just published an article and tried to submit to to Sphinn, but someone beat me to it:<br /> <br /> http://sphinn.com/story/141676/<br /> <br /> I have a couple of problems with this.<br /> <br /> 1. My avatar isn&#8217;t shown next to the article&#8217;s title.<br /> 2. The article&#8217;s summary was written by someone else, and it&#8217;s&#8230;not what I would have chosen.<br /> <br /> So my first thought was to change my post&#8217;s URL, submit the new one, and destroy the old one&#8230;but that&#8217;s kind of a dick move, at least as far as this girl is concerned. So my question is&#8230;<br /> <br /> What can I do to take control of my Sphinn listing?</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From Matt McGee to me</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Matt McGee, who is a punk-ass bitch, responded with this:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Hey Darren,<br /> <br /> There are no rules about who can and can&#8217;t submit to Sphinn (or any other social voting site). As soon as you publish something, anyone can post it to Sphinn &#8212; so I guess the answer to your question is to submit as soon as you hit the Publish button next time.<br /> <br /> Matt</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">It certainly doesn&#8217;t sound like anything out of the ordinary, but if you knew the history between me and McGee, you&#8217;d realize there are some subtle tones of mockery and condescension between the lines. It was obvious to me that Matt McGee wasn&#8217;t going to be helpful, so I submitted my own story using another URL. Then I tweeted about it and several people sphunn the story. The issue was essentially resolved at this point, assuming that whoever submitted the story the first time didn&#8217;t care about petty issues like avatars and summaries. However, Matt McGee decided to triple his bitch points by deleting my submission, sphinns and all.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">(BTW&#8230;at this point, I took the time to investigate the Sphinn user who submitted my post, and I realized it was a lady whom I&#8217;m actually fond of and follow on Twitter. So FYI&#8230;she&#8217;s awesome and I have no hard feelings towards her whatsoever. And yes&#8230;this whole  incident probably could have been avoided if I had talked to her about it, but instead I ignored that part and focused on what an annoying bitch Matt McGee is.)</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From me to Matt McGee</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Then I responded with this:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Who deleted my submission?</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From Matt McGee to me:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Matt bitchfully responded with this:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">You should&#8217;ve received an email that says it was deleted because it&#8217;s a dupe submission. You can vote on the original here:<br /> <br /> http://sphinn.com/story/141676/</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From me to Matt McGee</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">To which I responded with this:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Do you think you&#8217;re clever, Matt? Do you think your passive-aggressive bullshit goes unnoticed?<br /> <br /> I&#8217;m about to kick off a very passionate, very determined smear campaign. I need to know if I&#8217;ll be targeting you specifically, or Sphinn in general.<br /> <br /> Please advise.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From Matt McGee to me</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Then Matt responds with this:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Darren,<br /> <br /> I don&#8217;t understand the problem. The story is on Sphinn already and you can vote for it now, but you haven&#8217;t done so. What am I missing?</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">&#8230;which again sounds like a perfectly normal response, unless you read between the lines&#8230;where you&#8217;ll discover that it&#8217;s really Matt playing dumb and being a bitch again. Plus, to make matters worse, someone from Sphinn told my ex-girlfriend about this entire exchange, presumably with the hope/expectation that she would calm down her psycho ex, and so now I had to explain myself to her&#8230;which is always a buzzkill, since she never takes my side).</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From me to Matt McGee</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">So I responded the way any self-respecting psychopath would:</span></p>
<p class="MsoNormal" style="margin-bottom: 12pt;"><span style="font-family: &amp;amp;amp;">Well, first your developers missed an <strong>obvious</strong> need for content owners to have the ability to control submissions of their own work. Or maybe they acknowledged the need, but instead opted for the cheaper solution: let the moderators handle it on a case-by-case basis. The point is&#8230;I write content to promote ME, just like everyone else does. I wrote the article&#8211;I should be able to submit it with MY avatar and MY summary. If you don&#8217;t understand why this might be important, let me write the summary for your next submission and I&#8217;ll make it clear.<br /> <br /> Then after I took the time to contact the Sphinn staff PRIVATELY&#8211;per Danny&#8217;s request, following my last psychotic episode&#8211;you missed the opportunity to take me seriously and basically said &#8220;too bad.&#8221;<br /> <br /> Then I took matters into my own hands and solved the problem myself, by submitting the story under an alias URL. Then I twittered my Sphinn submission&#8217;s URL, at which time several people sphunn it. All you had to do&#8230;was do NOTHING. Instead, you chose to do things &#8220;by the book&#8221; and deleted my submission, despite the obvious fact that it was the more-reputable submission of the two&#8230;AND despite the fact that it was the only one that had been sphunn several times.<br /> <br /> On top of everything, you want to keep condescending me with your smug, passive-aggressive remarks:</span></p>
<p><!--[if !supportLists]--><span style="font-size: 10pt; font-family: Symbol;"><span>·<span style="font-family: &amp;amp;amp; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"> </span></span></span><!--[endif]--><span style="font-family: &amp;amp;amp;">There are no rules about who can and can&#8217;t submit to Sphinn (or any other social voting site).</span></p>
<p><!--[if !supportLists]--><span style="font-size: 10pt; font-family: Symbol;"><span>·<span style="font-family: &amp;amp;amp; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"> </span></span></span><!--[endif]--><span style="font-family: &amp;amp;amp;">You should&#8217;ve received an email that says it was deleted because it&#8217;s a dupe submission. You can vote on the original here:</span></p>
<p><!--[if !supportLists]--><span style="font-size: 10pt; font-family: Symbol;"><span>·<span style="font-family: &amp;amp;amp; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"> </span></span></span><!--[endif]--><span style="font-family: &amp;amp;amp;">The story is on Sphinn already and you can vote for it now, but you haven&#8217;t done so.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;"><br /> Why don&#8217;t you just call me a retard, Matt McGee?<br /> <br /> And finally, you missed a very, VERY important opportunity&#8230;and that was the opportunity to NOT get Lisa involved.<br /> <br /> So the answer to YOUR question is&#8230;<br /> <br /> The problem is you went out of your way to piss me off, and now I&#8217;m about to go to some seriously-ridiculous extremes to publicly shit all over your name, your reputation, anything you&#8217;ve ever published, and every brand you&#8217;ve ever been associated with.<br /> <br /> Do you understand now?</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From Danny Sullivan to me</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Matt then crawled under his bed, curled into a fetal position, and began trembling. This is where the situation turned shitty&#8230;as Danny Sullivan took it upon himself to butt into the conversation and blindly defend his employee:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Darren, head over to Digg, then find how you can take control of a story someone has submitted from your site to Digg. You can’t. Pick any number of social news sites out there. None of them operate that way.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">You absolutely can submit your own story with your own avatar. Nothing prevents you from doing it. It’s simply that in this case, someone else submitted your story before you did. You seem to want the right to rip that submission away from them, so that you could submit it instead.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Well, I can understand that request. I hope you can understand that it’s simply not how social sites have operated. If you were to submit a blog post from Google, would you want Google to have the right to pull the submission away from you.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Frankly, you’re the first person I know of to raise this issue with us. It just doesn’t seem to have been a burning issue with site owners. It’s something we can consider, and I’d welcome you starting a discussion about it in the Sphinn Zone to see what others think.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">But before you do that, you need to apologize for your abusive, out of line email to Matt. I’ve read through the entire email thread below. He’s answered your questions politely and matter-of-factly. Your response is to assume he’s got the time to play some absurd passive-aggressive game with you.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">He doesn’t. Nor was he. So you can push the reset button with us at Sphinn by apologizing. If you don’t want to do that, we’ll ban your account. You’re free to embark upon whatever smear campaign you want, if that’s going to make you feel better. I’d think you’d have better things to do, especially when no one was attempting to victimize you in any way.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">danny</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">The reason I say things turned shitty is because I personally think Danny&#8217;s a nice guy, and I really didn&#8217;t want him to get caught in the crossfire between me and that bitch McGee. But much to my disappointment, not only did Danny butt in&#8230;he also started demanding apologies and issuing &#8220;or else&#8221; statements, as if he&#8217;s the judge, jury, and execution for all things SEO and I&#8217;m required to offer him a sacrifice before I can enter his world.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From me to Danny Sullivan</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">I was definitely pissed beyond words at this point, but I really didn&#8217;t want to direct my anger towards Danny, because I know he means well. So I let off just a wee bit o&#8217; rage:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Danny,<br /> <br /> First of all, Sphinn isn&#8217;t Digg. Nothing that happens there has anything to do with this. I have no idea why you and Matt would both try the &#8220;but everyone else is doing it&#8221; excuse, but personally I think it&#8217;s pathetic. Besides, do I really seem like the kind of person who makes decisions based on the norm?<br /> <br /> Second of all, I never asked you to remove anyone&#8217;s submission.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Reading the entire email thread doesn&#8217;t make you qualified to have an opinion about this in the first place. I don&#8217;t expect you to understand or appreciate what was said between the lines, and it&#8217;s no surprise that you don&#8217;t. Matt&#8217;s a big boy; let him dig himself out.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">So&#8230;in your best judgment&#8230;you&#8217;ve concluded that the best way to handle this situation is by demanding an apology from me and threatening to ban my account otherwise? Are you serious? Do you also scream at drunk people?<br /> <br /> Absolutely, without question, if there&#8217;s one thing I&#8217;m NOT going to do&#8230;it&#8217;s apologize to Matt. I&#8217;m not even close to being sorry, and I&#8217;m not going to pretend otherwise. Furthermore, I&#8217;m not going to pretend like I give two shits about my account on Sphinn. Ban it. Delete it. Do whatever you want with it. If you want to rid your site of some of the highest-quality content this industry produces, then that&#8217;s your loss. I get nothing from Sphinn, and after what I&#8217;ve seen today, I&#8217;m embarrassed to have had anything to do with it. Sphinn is just another haven for SEO wannabes and talentless marketers who all want to circle-jerk each other and confirm the stereotype that this industry is bullshit.<br /> <br /> Great advice, asking me to email you privately to resolve any future problems, Danny. It&#8217;s worked miracles for me. You&#8217;re quite the problem solver.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From Danny Sullivan to me:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Amazingly, Danny responded YET AGAIN by talking about &#8220;what everyone else does.&#8221;</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Darren, I’ll repeat again, we’ve never had anyone suggest they should seize control over a submission just because they wrote the content that was submitted. You’re the first.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">I think you’re the first because Sphinn operates the same way many other social sharing sites operate, where site owners don’t have that type of control. It’s sort of like suggesting that no one should be able to tweet about your stories, or submit your stories to Delicious, or to Digg, or to Reddit, or to Hacker News, or bookmark them in Google Reader … and on and on and on.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Reading the email qualifies me plenty to feel you’ve been way out of line with a member of my staff. And that is indeed how I felt it was best handled.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">If Sphinn was a shop, then you had a problem in the shop, someone in the shop has patiently tried to help you, and you’ve effectively started yelling at them and threatening them. That’s simply not acceptable behavior.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">We’ll have your account terminated. I’ll also have the seomofo name blocked, as I recall someone who wasn’t you grabbed that ages ago, and we handed it to you when you asked. I’ll also have your site blocked from future submissions to Sphinn, which will prevent anyone from submitting your content, so that you [won't] find yourself facing any further upset.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">From me to Danny Sullivan</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">And that&#8217;s when I finally lost it and tried to be as offensive as possible:</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">Danny&#8230;I&#8217;m going to tell you something, and I hope you take it to heart.<br /> <br /> It is people like you who have destroyed the SEO industry&#8217;s reputation. You are not an SEO, you are a marketer&#8211;a salesman. You sell people on ideas that you&#8217;re not even qualified to talk about, yet you do it anyway&#8230;because you value personal success over everything else.<br /> <br /> You have the arrogance to ask ME to apologize to Sphinn? Are you out of your goddamn mind? Who the FUCK do you think you are? You&#8217;re a nobody. You&#8217;re a fucking pretender. Your only skill is your ability to convince other people that you know what the fuck you&#8217;re talking about. All you know how to do is regurgitate the ideas of others. You&#8217;re a LEECH on the internet and on SEO.<br /> <br /> You want to know why I&#8217;m the first person who&#8217;s ever ____? Because I&#8217;m not a sellout like you and your fellow salesmen. You&#8217;ve padded yourself with peons who are afraid to call you on your bullshit because they don&#8217;t want to draw attention to their own. I don&#8217;t have anything to hide. When you run websites that steal my content and fuck me over, I&#8217;m going to speak up&#8211;without regard for how it might suit your god complex.<br /> <br /> So with the utmost sincerity&#8230;I&#8217;d like to say: go fuck yourself, you poseur.</span></p>
<p class="MsoNormal"><span style="font-family: &amp;amp;amp;">So there it is. That&#8217;s the story behind why my content will never again grace the front page of Sphinn.</span></p>
<p class="MsoNormalCxSpMiddle"></p>
</div>
<img src="http://feeds.feedburner.com/~r/seomofo/~4/uV1f_8g1Wn8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/orm/sphinn-sucks.html/feed/</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
		<item>
		<title>Install the TweetMeme Retweet Button… WITHOUT the Slow Page Loads!</title>
		<link>http://www.seomofo.com/wordpress/tweetmeme-retweet-button.html</link>
		<comments>http://www.seomofo.com/wordpress/tweetmeme-retweet-button.html#comments</comments>
		<pubDate>Wed, 10 Feb 2010 22:51:36 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Page Speed]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1573</guid>
		<description><![CDATA[If you use the TweetMeme Retweet Button on your WordPress blog or website, find out how to install it without slowing down your page speed. ]]></description>
			<content:encoded><![CDATA[<p><a class="post_image_link" href="http://www.seomofo.com/wordpress/tweetmeme-retweet-button.html" title="Permanent link to Install the TweetMeme Retweet Button&#8230; WITHOUT the Slow Page Loads!"><img class="post_image alignright" src="http://www.seomofo.com/img/tweetmeme-button-loading-slow.gif" width="180" height="180" alt="Please wait while the TweetMeme Retweet Button loads..." /></a>
</p><p>
If you&#8217;re using the TweetMeme Retweet Button on your blog or website, and you&#8217;ve noticed it&#8217;s been slowing down your page load times, then this article is for you. I will discuss two common ways to install the Retweet Button&#8211;through the <a href="http://www.seomofo.com/wordpress/" class="selfish">WordPress</a> plugin and through adding a custom <code>&lt;script&gt;</code> element to your HTML code&#8211;and I will explain why these two implementation methods are probably preventing your web pages from loading as quickly as they could be. Then I will show you how to install the TweetMeme Retweet Button in a way that doesn&#8217;t affect your page speed. My solution is not limited to the TweetMeme button, so a reasonably-intelligent person can apply these same steps to any iframe-based social media smart buttons.
</p>
<p>
Most bloggers use social media networks and micro-blogging sites like <a href="http://www.seomofo.com/antisocial-media/custom-twitter-background.html" class="selfish">Twitter</a> to promote their content. One of the easiest ways to do that is to install social media widgets on your blog and hope that your readers are grateful enough to share your content with their friends. I mean&#8230;it&#8217;s the least they can do, considering how many hours of your personal time you put into your blog posts. *ahem* Right?
</p>
<p>
The problem with some of these &#8220;smart&#8221; social media widgets (i.e., the ones that display a number of votes, diggs, sphinns, etc.) is that they usually require your page to make several HTTP requests for external files. Due to the way these widgets are normally installed, your page can&#8217;t finish loading until all of these requests have been answered. Ultimately, it doesn&#8217;t do you much good to put these things on your blog, if the result is a sluggish website that drives your readers away.
</p>
<p style="width:20em; float:left; margin-right:2em;">
One social media widget that has become very popular is the retweet button from TweetMeme.com. For most of you, it looks something like this:
</p>
<p style="width:14em; float:left; margin-top:2em;">
<img alt="TweetMeme button with 96 retweets" src="http://www.seomofo.com/img/tweetmeme-retweet-button.png" class="alignleft mb1em" width="50" height="61" />
</p>
<p style="clear:both; width:20em; float:left; margin-right:2em;">
When you write super-amazing content like I do, your TweetMeme buttons tend to look more like this:
</p>
<p style="width:14em; float:left; margin-top:2em;">
<img alt="TweetMeme button with 4,916,336,090 retweets" src="http://www.seomofo.com/img/tweetmeme-record-retweets.png" class="alignleft mb1em" width="100" height="61" />
</p>
<p style="clear:both; width:20em; float:left; margin-right:2em;">
But the purpose of today&#8217;s article is to show you how to prevent your retweet buttons from ending up like this:
</p>
<p style="width:14em; float:left; margin-top:1em;">
<img alt="Tab Loading... Waiting for api.tweetmeme.com..." src="http://www.seomofo.com/img/waiting-for-tweetmeme-api.gif" class="alignleft mb1em" width="200" height="100" />
</p>
<p style="clear:both; width:20em; margin-top:1em;">
As soon as you realize my animated .gif isn&#8217;t actually going to load anything, we can continue&#8230;
</p>
<p>
To fully understand the solution I propose in this article, you should probably read the next two sections, which explain why the WordPress plugin sucks&#8230;and why the customized <code>&lt;script&gt;</code> option sucks. However, you&#8217;re more than welcome to skip straight to <a href="#solution" style="vertical-align:-1px; text-decoration:none;">the solution&darr;</a>.
</p>




<h2 style="margin-top:3em;">Why does the TweetMeme WordPress plugin suck?</h2>
<p>
The TweetMeme Retweet Button plugin for WordPress has a couple of useful features, but ironically, inserting the Retweet Button code into your posts is <strong>not</strong> one of them. The features you might consider using are the TweetMeme Analytics interface, the option to automatically ping TweetMeme.com when you post new content, and the option to insert the Retweet button into your RSS feed pages. Unfortunately, the code that the WordPress plugin writes into your HTML source code is <strong>NOT usable for what we need to do</strong>. Therefore, if you keep the plugin activated, be sure to go to the TweetMeme settings and change the <b>Position</b> option to <b>Manual</b>.
</p>
<p>
Also, you will NOT be able to use the <code>tweetmeme();</code> function in your WordPress templates, because it writes the same unusable HTML code. Basically, our objective for this plugin or any other TweetMeme plugin is to prevent it from inserting the <code>&lt;iframe&gt;</code> markup directly into your HTML. Here is an example of the useless code that the WordPress plugin wants to crap into your page:
</p>
<pre class="brush: xml;">
&lt;div class=&quot;tweetmeme_button&quot;&gt;
	&lt;iframe src=&quot;http://api.tweetmeme.com/button.js?url=http%3A%2F%2Fwww.seomofo.com%2Fwordpress%2Ftweetmeme-retweet-button.html&amp;source=SEOmofo&amp;style=normal&amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</pre>
<p>
You DON&#8217;T want this <code>&lt;iframe&gt;</code> anywhere in your HTML, for several reasons, but most-importantly because: <a href="http://www.stevesouders.com/blog/2009/06/03/using-iframes-sparingly/">iframes block your page from loading</a>. We&#8217;re going to work around this by using JavaScript to write the <code>&lt;iframe&gt;</code> code into a container element, <strong>after the page is done loading</strong>. We&#8217;ll get to that in a second, but first you need to kill any plugins that put the <code>&lt;iframe&gt;</code> code directly into your pages&#8217; HTML.
</p>

<h3>Why Does the WordPress Plugin FAIL?</h3>
<p>
Here is an overview of how the WordPress plugin works, and how it eventually forces your pages to wait for the TweetMeme <code>&lt;iframe&gt;</code> to load.
</p>
<ol>
<li>WordPress builds an <code>&lt;iframe&gt;</code> (server-side) and inserts it into the HTML code of a page.</li>
<li>Server sends the page to the client. (e.g., a visitor&#8217;s web browser)</li>
<li>Web browser sees the <code>&lt;iframe&gt;</code> and requests its <code>src</code> file. Browser waits for <code>src</code> file to load completely before firing the onload event.</li>
<li><strong style="color:#600;">Your page can&#8217;t finish loading until the Retweet Button finishes loading.</strong> <img src="http://www.seomofo.com/img/emoticons/angry.png" width="24" height="24" style="margin:0;" alt="Angry face!" /></li>
</ol>

<h3 style="text-align:center; margin-top:3em;">First Steps for TweetMeme WordPress Plugin Users</h3>
<div style="width:75%; margin:0 auto 3em auto; padding:1em; background-color:#F3F6FF; border:1px solid #069;">
<p>
<strong>Good Idea:</strong> Go to the TweetMeme settings menu and change the <code>Position</code> option to <code>Manual</code>.
</p>
<p style="margin-bottom:0;">
<strong>Better Idea:</strong> Uninstall or deactivate the TweetMeme Retweet Button plugin. (fewer plugins = faster page speeds)
</p>
</div>



<h2 style="margin-top:3em;">Why does the TweetMeme button&#8217;s custom <code>&lt;script&gt;</code> suck?</h2>
<p>
The second method for installing the TweetMeme Retweet Button is to insert a <code>&lt;script&gt;</code> element into your HTML code, at the point where you want the button to appear. For details about this method, you can view the <a href="http://help.tweetmeme.com/2009/04/06/tweetmeme-button/">TweetMeme Button documentation</a> from TweetMeme.com. Or&#8230;just keep reading.
</p>
<p>
At a bare minimum, you would need to include the <code>&lt;script&gt;</code> element that calls the JavaScript file, button.js, from TweetMeme&#8217;s servers. In addition, there are 4 parameters that you could use to customize your Retweet Button. I&#8217;ll explain them briefly:
</p>
<ul>
	<li><strong>tweetmeme_url</strong> &#8211; the URL your retweet will link to on Twitter. By default, the button uses the URL of the page it&#8217;s on, so you don&#8217;t need to include this parameter unless you&#8217;re embedding the retweet button on Page A, but you want your Twitter status update to link to Page B. (For example, this would be handy for adding a retweet button to your RSS feed.)</li>
	<li><strong>tweetmeme_source</strong> &#8211; the Twitter @username that will appear after the &#8220;RT.&#8221; By default, this parameter is set to &#8220;tweetmeme,&#8221; which results in retweets like this: RT @tweetmeme TITLE URL</li>
	<li><strong>tweetmeme_style</strong> &#8211; choose between normal or compact button design. Default is normal. The compact button looks like this (I added the drop shadow):<br /><br />
<img alt="TweetMeme compact retweet button" src="http://www.seomofo.com/img/tweetmeme-compact-retweet-button.png" width="110" height="40" style="display:block; margin:0 auto;" /></li>
	<li><strong>tweetmeme_service</strong> &#8211; choose one from <a href="http://help.tweetmeme.com/2009/08/17/url-shorteners/">TweetMeme&#8217;s list of URL-shortening services</a>. Default is ow.ly.</li>
</ul>
<p>
The following code is an example of the kind of crap that the script method might use. Theoretically, you would paste this directly into your pages&#8217; HTML code.
</p>
<pre class="brush: xml;">
&lt;script type=&quot;text/javascript&quot;&gt;
	tweetmeme_url = 'http://yoururl.com'; // only necessary if different from current URL
	tweetmeme_source = 'SEOmofo';         // Twitter @username that will be retweeted
	tweetmeme_style = 'compact';          // only add this line if you want to create a smaller button
	tweetmeme_service = 'bit.ly';         // URL shortening service you want to use
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://tweetmeme.com/i/scripts/button.js&quot;&gt;
&lt;/script&gt;
</pre>
<p>
Are we going to be using the custom <code>&lt;script&gt;</code> parameters? No, not exactly. But you need to be familiar with them for our final method of installing the retweet button. We won&#8217;t be using them within <code>&lt;script&gt;</code> tags, but we <em>will</em> be using them to create a custom <code>src</code> URL for our iframe.
</p>
<p>
The reason why we DO NOT want to use these <code>&lt;script&gt;</code> tags is the same reason we don&#8217;t want to use the <code>&lt;iframe&gt;</code> code directly: <strong>they block the page from loading</strong>. When a web browser is rendering the page, it will see the <code>&lt;script&gt;</code> tag that references the <span class="uri_mofo">button.js</span> file and immediately send a request for it. To make things worse, the <span class="uri_mofo">button.js</span> script uses <code>document.write();</code> statements to insert the <code>&lt;iframe&gt;</code> code into your document&#8230;and then we&#8217;re back to square one, waiting for the <code>&lt;iframe&gt;</code> to load. In other words, this method for installing the retweet button is actually <em>worse</em> than the WordPress plugin, because instead of building the <code>&lt;iframe&gt;</code> code on the server side, it has to request <span class="uri_mofo">button.js</span> (client side) and wait for it to build the <code>&lt;iframe&gt;</code> for you.
</p>

<h3>Why Does the Custom <code>&lt;script&gt;</code> FAIL?</h3>
<p>
Here is an overview of how the <code>&lt;script&gt;</code> method of installing the button works, and how it eventually forces your page to wait for the <code>&lt;script&gt;</code> to build your <code>&lt;iframe&gt;</code> code and then waits for the TweetMeme <code>&lt;iframe&gt;</code> content to load.
</p>
<ol>
	<li>Server inserts custom <code>&lt;script&gt;</code> elements into the HTML code of a page.</li>
	<li>Server sends the page to the client. (e.g., a visitor&#8217;s web browser)</li>
	<li>Web browser sees the <code>&lt;script&gt;</code> and requests its <code>src</code> file. Browser waits for <code>src</code> file to load.</li>
	<li>Src file inserts an <code>&lt;iframe&gt;</code> into our document.</li>
	<li>Web browser sees the <code>&lt;iframe&gt;</code> and requests its <code>src</code> file. Browser waits for <code>src</code> file to load completely before firing the onload event.</li>
	<li><strong style="color:#600;">Your page can&#8217;t finish loading until the Retweet Button finishes loading.</strong> <img src="http://www.seomofo.com/img/emoticons/angry.png" width="24" height="24" style="margin:0;" alt="Angry face!" /></li>
</ol>








<p id="solution" style="margin:2em auto; text-align:center; font-family:Georgia, 'Times New Roman', Times, serif; font-size:600%; line-height:100%; color:#006699; letter-spacing:.2em; text-shadow:#000 0 1px 2px;">The Solution</p>



<h2>Load the TweetMeme Button AFTER the Page Loads</h2>
<p>
Despite all the bad things I&#8217;ve said about iframes and scripts, we&#8217;re actually going to use both in our implementation. The difference is we&#8217;re going to host our own JavaScript, and we&#8217;re not going to insert the TweetMeme button&#8217;s <code>&lt;iframe&gt;</code> into our document until after everything else is finished loading.
</p>
<h3 style="margin-top:6em;">STEP 1: Build Your Button&#8217;s <code>&lt;iframe&gt;</code> Code</h3>
<p>
Instead of relying on WordPress or <span class="uri_mofo">button.js</span> to build our <code>&lt;iframe&gt;</code> code, we&#8217;re going to do it ourselves. Don&#8217;t worry, it&#8217;s much easier than it sounds. To accomplish this, we first need to understand what <span class="uri_mofo">button.js</span> actually does. Here is the JavaScript code after I&#8217;ve formatted it and added comments to it. FYI, I&#8217;m not an expert on JavaScript, so my interpretation of this code might be totally wrong. But if you&#8217;ve read this far&#8230;there&#8217;s no turning back now, sucker!
</p>

<pre class="brush: jscript; collapse: true; light: false; toolbar: true;">
// Get page URL
var _url = window.location.href;

// Remove illegal characters
var _url = _url.replace(/((?:\?|&amp;)?fbc_receiver=.+)?(?:#.*)?$/, &quot;&quot;);

// Convert your custom script parameters into local JavaScript variables.
// Make sure they are strings and escape illegal characters.
var url = escape(typeof tweetmeme_url == &quot;string&quot; ? tweetmeme_url : typeof TWEETMEME_URL == &quot;string&quot; ? TWEETMEME_URL : _url).replace(/\+/g, &quot;%2b&quot;);
var source = typeof tweetmeme_source == &quot;string&quot; ? escape(tweetmeme_source) : typeof TWEETMEME_SOURCE == &quot;string&quot; ? escape(TWEETMEME_SOURCE) : false;
var style = typeof tweetmeme_style == &quot;string&quot; ? escape(tweetmeme_style) : typeof TWEETMEME_STYLE == &quot;string&quot; ? escape(TWEETMEME_STYLE) : &quot;normal&quot;;
var service = typeof tweetmeme_service == &quot;string&quot; ? escape(tweetmeme_service) : typeof TWEETMEME_SERVICE == &quot;string&quot; ? escape(TWEETMEME_SERVICE) : false;

// Apparently, if your URL-shortening service offers an API, you can 
// configure it with the tweetmeme_service_api parameter. I couldn't 
// find any documentation on this parameter from TweetMeme, so I'm not 
// sure about this.
var service_api = typeof tweetmeme_service_api == &quot;string&quot; ? escape(tweetmeme_service_api) : typeof TWEETMEME_SERVICE_API == &quot;string&quot; ? escape(TWEETMEME_SERVICE_API) : false;

// I didn't see any TweetMeme documentation about the tweetmeme_alias 
// parameter, so I have no idea what this does.
var alias = typeof tweetmeme_alias == &quot;string&quot; ? escape(tweetmeme_alias) : typeof TWEETMEME_ALIAS == &quot;string&quot; ? escape(TWEETMEME_ALIAS) : false;

// This is our iframe src URL before we've added our custom parameter 
// values to it in the form of a query string.
var src = &quot;http://api.tweetmeme.com/button.js&quot;;

// This is a poorly-programmed way of setting the height and width of 
// our iframe. (BTW...I tried using the rednose style but nothing 
// happened. It looked just like the default style.)
switch (style) {
	case &quot;compact&quot;:
		var h = 20;
		var w = 90;
		break;
	case &quot;rednose&quot;:
		var h = 61;
		var w = 50;
		break;
	default:
		var h = 61;
		var w = 50;
		break;
}

// Add our page URL to the src URL
src += &quot;?url=&quot; + url;

// Add our button style option to the src URL
src += &quot;&amp;style=&quot; + style;

// If we defined a value for the tweetmeme_source parameter, 
// then add it to the src URL.
if (source != false) {
	src += &quot;&amp;source=&quot; + source;
}

// If we defined a value for the tweetmeme_service parameter, 
// then add it to the src URL.
if (service) {
	src += &quot;&amp;service=&quot; + service;
}

// If we defined a value for the tweetmeme_service_api parameter, 
// then add it to the src URL.
if (service_api) {
	src += &quot;&amp;service_api=&quot; + service_api;
}

// If we defined a value for the tweetmeme_alias parameter, 
// then add it to the src URL.
if (alias) {
	src += &quot;&amp;alias=&quot; + alias;
}

// Insert iframe code into our page 
// (where we placed the script tags).
document.write('&lt;iframe src=&quot;'+src+'&quot; height=&quot;'+h+'&quot; width=&quot;'+w+'&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;');

// Inexplicably reset this huge fuckin' pile 
// of redundant JavaScript variables.
tweetmeme_url = null;
TWEETMEME_URL = null;
tweetmeme_source = null;
TWEETMEME_SOURCE = null;
tweetmeme_service = null;
TWEETMEME_SERVICE = null;
tweetmeme_service_api = null;
TWEETMEME_SERVICE_API = null;
tweetmeme_style = null;
TWEETMEME_STYLE = null;
</pre>

<p>
As you can see, the <span class="uri_mofo">button.js</span> script really doesn&#8217;t do much. All we really have to do is take this <code>&lt;iframe&gt;</code> code and replace the <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">variables</span> with our own values:
</p>
<p>
<code style="font-size:1em;">
&lt;iframe src="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">src</span>" scrolling="no" frameborder="0" width="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">w</span>" height="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">h</span>" &gt;&lt;/iframe&gt;
</code>
</p>
<p>
To build your <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">src</span> variable, you can follow this pattern:
</p>
<ol>
<li>Start with <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">http://api.tweetmeme.com/button.js</span></li>
<li>Add <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">?url=</span> followed by your page URL (for right now, just use <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">URL</span> as a placeholder)</li>
<li>Add <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">&amp;amp;style=</span> followed by either <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">normal</span> or <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">compact</span>.</li>
<li>Add <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">&amp;amp;source=</span> followed by your Twitter username.</li>
<li>Add <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">&amp;amp;service=</span> followed by a URL-shortening service from this list:<br />
<br />
<ul style="font-size:125%; font-weight:bold; font-family:'Courier New', Courier, monospace;">
	<li style="padding:0;"><span class="uri_mofo">bit.ly</span></li>
	<li style="padding:0;"><span class="uri_mofo">awe.sm</span></li>
	<li style="padding:0;"><span class="uri_mofo">cli.gs</span></li>
	<li style="padding:0;"><span class="uri_mofo">digg.com</span></li>
	<li style="padding:0;"><span class="uri_mofo">is.gd</span></li>
	<li style="padding:0;"><span class="uri_mofo">tinyurl.com</span></li>
	<li style="padding:0;"><span class="uri_mofo">tr.im</span></li>
	<li style="padding:0;"><span class="uri_mofo">su.pr</span></li>
	<li style="padding:0;"><span class="uri_mofo">ow.ly</span></li>
	<li style="padding:0;"><span class="uri_mofo">twurl.nl</span></li>
</ul>
</li>
<li>If you have a URL-shortener API, add <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">&amp;amp;service_api=</span> followed by your API key. (Only available for awe.sm, cli.gs, digg.com, and su.pr services. I&#8217;m not sure if you&#8217;re really supposed to put your API key here or not. Frankly, I just made that up.)</li>
</ol>
<p>
Your completed <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">src</span> variable should end up looking something like this:
</p>
<p>
<span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">http://api.tweetmeme.com/button.js?url=</span><span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">URL</span><span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">&amp;amp;style=normal&amp;amp;source=SEOmofo&amp;amp;service=bit.ly</span>
</p>
<p>
Now set the <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">w</span> and <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">h</span> attributes.
</p>
<p>
For a <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">normal</span> style button: <code style="font-size:1em;">width="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">50</span>" height="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">61</span>"</code>
</p>
<p>
For a <span class="uri_mofo" style="font-size:1em; font-weight:bold; font-family:'Courier New', Courier, monospace;">compact</span> style button: <code style="font-size:1em;">width="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">90</span>" height="<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">20</span>"</code>
</p>
<p>
Now that you have your values for the variables <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">src</span>, <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">w</span>, and <span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">h</span>, you can plug them back into your <code>&lt;iframe&gt;</code> code, which should now look something like this:
</p>
<p>
<code style="font-size:1em;">
&lt;iframe src="http://api.tweetmeme.com/button.js?url=<span style="font-weight:bold; font-family:Georgia, 'Times New Roman', Times, serif; color:#C00;">URL</span>&amp;amp;style=normal&amp;amp;source=SEOmofo&amp;amp;service=bit.ly" scrolling="no" frameborder="0" width="50" height="61" &gt;&lt;/iframe&gt;
</code>
</p>

<h3 style="margin-top:6em;">STEP 2: Create a Container for Your Retweet Button</h3>
<p>
In Step 1, we created our own <code>&lt;iframe&gt;</code> code. Our goal is to store that code in a JavaScript function that we can call after the onload event is triggered. In order for our JavaScript function to work, our web page needs to have a containing element ready to insert the <code>&lt;iframe&gt;</code> code into. This element should have a unique id attribute assigned to it, so that we can tell our JavaScript function exactly where to put the iframe. Here is an example: <code>&lt;div id="tm_button"&gt;&lt;/div&gt;</code>
</p>
<p>
If you&#8217;re using WordPress, you have several options for getting your container <code>&lt;div&gt;</code> into your page code. I&#8217;ve mentioned a few examples below. If you&#8217;re not using WordPress or you already know how to do this, then go to Step 3.
</p>
<ol>
	<li>Add it to a select number of posts, by simply typing the code directly into the HTML view of your <em>Edit Post</em> screen.</li>
	<li>Add it to your WordPress theme&#8217;s template files, which would add it to all web pages that use that template (e.g., single posts, pages, archives, etc.)</li>
	<li>Add it as a plain text widget in your sidebars.</li>
	<li>Add it to a WordPress hook, by writing a function in your theme&#8217;s functions.php file.</li>
	<li>Add it to a Thesis hook, by writing a function in your custom_functions.php file (only available to those of you using the <a href="http://www.seomofo.com/wordpress/thesis/" class="selfish">Thesis WordPress theme</a>).</li>
	<li>Create your own WordPress plugin that adds it to certain types of pages.</li>
</ol>

<h3 style="text-align:center;">For Thesis Theme Users</h3>
<div style="width:90%; margin:0 auto; padding:1em; background-color:#F3F6FF; border:1px solid #069;">
<p>
For those of you who are using Thesis, you can use the following example, which is what I&#8217;m currently using. It inserts the <code>&lt;div&gt;</code> into all my posts, but not previews of unpublished posts. If you want to customize it in other ways, check out the full list of <a href="http://codex.wordpress.org/Conditional_Tags">WordPress conditional tags</a>.
</p>
<pre class="brush: php;">
// Define a function that adds your TweetMeme container &lt;div&gt;
// to all posts except for when you're just previewing it.

if (!function_exists('addTMContainer')) {
	function addTMContainer() {
		if (is_single() &amp;&amp; !is_preview()) {
?&gt;
		&lt;div id=&quot;tm_box&quot;&gt;&lt;/div&gt;
&lt;?php }
	}
}

// Hook your TweetMeme container to a Thesis hook

add_action('thesis_hook_before_headline', 'addTMContainer');
		
</pre>
<p>
Here is the CSS I&#8217;m using to position the <code>&lt;div&gt;</code>:
</p>
<pre class="brush: css;">
/* Make room for my button next to the page title */

div.headline_area{position:relative; margin-right:6em;}

/* Move my button to the top right corner of .headline_area */

#tm_box{position:absolute; right:-6em;}
	
</pre>
</div>

<h3 style="margin-top:6em;">STEP 3: Define Your <code>&lt;iframe&gt;</code> Code as a JavaScript Function</h3>
<p>
There are several ways to do this, but I&#8217;ll show you what I consider the easiest one. Copy your HTML code and paste it into this tool that <a href="http://www.accessify.com/tools-and-wizards/developer-tools/html-javascript-convertor/">converts HTML into JavaScript</a>. Select the option that says <strong>Build up a string variable that you can use later</strong> and give your variable a name. I&#8217;ll call mine <var>iframeCode</var>.
</p>
<p>
<img alt="HTML to JavaScript converter tool" src="http://www.seomofo.com/img/html-to-javascript-converter.png" title="HTML to JavaScript converter tool" class="aligncenter" width="466" height="338" />
</p>
<p>
Copy the converted code and paste it into whatever program you use for editing JavaScript/HTML/plain text. Here is what my code looks like now:
</p>
<pre class="brush: jscript;">
var iframeCode=&quot;&quot;;
iframeCode += &quot;&lt;iframe src=\&quot;http:\/\/api.tweetmeme.com\/button.js?url=URL&amp;amp;style=normal&amp;amp;source=SEOmofo&amp;amp;service=bit.ly\&quot; scrolling=\&quot;no\&quot; frameborder=\&quot;0\&quot; width=\&quot;50\&quot; height=\&quot;61\&quot; &gt;&lt;\/iframe&gt;&quot;;
	
</pre>
<p>
If you remember&#8230;we still have a placeholder variable where our page URL is supposed to go. We can&#8217;t hard-code an actual URL here, because this JavaScript function has to work for any page that calls it. So instead, we make JavaScript get the requesting-page&#8217;s URL for us by replacing our placeholder URL with its JavaScript equivalent: <code>document.URL</code>. We can also use JavaScript&#8217;s <code>escape()</code> function to encode the URL just like TweetMeme does in their <span class="uri_mofo">button.js</span> script. Here is our new code:
</p>
<pre class="brush: jscript;">
var iframeCode=&quot;&quot;;
iframeCode += &quot;&lt;iframe src=\&quot;http:\/\/api.tweetmeme.com\/button.js?url=&quot; + escape(document.URL) + &quot;&amp;amp;style=normal&amp;amp;source=SEOmofo&amp;amp;service=bit.ly\&quot; scrolling=\&quot;no\&quot; frameborder=\&quot;0\&quot; width=\&quot;50\&quot; height=\&quot;61\&quot; &gt;&lt;\/iframe&gt;&quot;;
	
</pre>
<p>
We have defined the contents of our <var>iframeCode</var> variable, but we still need to put it in a function that writes this content into our TweetMeme container <code>&lt;div&gt;</code>. Here is an example:
</p>
<pre class="brush: jscript;">

function tweetMemeButton() {

	// If our TweetMeme container doesn't exist,
	// then this function will basically do nothing.

	if (document.getElementById(&quot;tm_box&quot;)) {

		// This is the code we wrote a second ago.

		var iframeCode = &quot;&quot;;
		iframeCode += &quot;&lt;iframe src=\&quot;http://api.tweetmeme.com/button.js?url=&quot; + escape(document.URL) + &quot;&amp;amp;style=normal&amp;amp;source=SEOmofo&amp;amp;service=bit.ly\&quot; scrolling=\&quot;no\&quot; frameborder=\&quot;0\&quot; width=\&quot;50\&quot; height=\&quot;61\&quot; &gt;&quot;;

		// Insert our iframe into our TweetMeme container

		document.getElementById(&quot;tm_box&quot;).innerHTML = iframeCode;
	}
}

</pre>

<h3 style="margin-top:6em;">STEP 4: Use the <code>window.onload</code> Event Handler to Call Your Function</h3>
<p>
The <code>window</code> object has an event handler called <code>onload</code> that occurs as soon as a page is done loading. What we&#8217;re going to do now is program our <code>tweetMemeButton()</code> function so that it gets called when the onload event is triggered. In other words, we&#8217;re not even going to begin loading our TweetMeme button <code>&lt;iframe&gt;</code> until after the page is officially done loading. In order for us to accomplish this, we can add <code>window.onload = tweetMemeButton;</code> to our JavaScript code, which is now ready to be pasted into an external .js file.
</p>
<p>
In the name of page speed and site performance, I&#8217;ve combined all of my site&#8217;s JavaScript files into one. I link to this file from the <code>&lt;head&gt;</code> section of every page on my site. However you want to go about it is up to you, but one way or another you need to put your JavaScript code somewhere where all the pages that need it can access it.
</p>
<p>
If you&#8217;re wondering something like this: &#8220;Can&#8217;t I just paste the entire code into the <code>&lt;head&gt;</code> section of every page?&#8221;, then by all means, go right ahead&#8230;and punch yourself in the face. Then do it the right way, by pasting <strong>a reference to your external .js file</strong> into the <code>&lt;head&gt;</code> section of every page (that uses the TweetMeme Retweet Button). For faster page rendering, it&#8217;s best to paste this code after (below) your CSS file references. For example:
</p>
<pre class="brush: xml;">
&lt;head&gt;
...
	&lt;link rel=&quot;stylesheet&quot; href=&quot;http://www.seomofo.com/wp-content/themes/thesis_16/custom/custom.css&quot; type=&quot;text/css&quot; /&gt;
...
	&lt;script type=&quot;text/javascript&quot; src=&quot;/external.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
	
</pre>



</p>
<p>
Here is our final JavaScript code, ready to be pasted into your external .js file:
</p>

<pre class="brush: jscript;">
function tweetMemeButton() {
	if (document.getElementById(&quot;tm_box&quot;)) {
		var iframeCode = &quot;&quot;;
		iframeCode += &quot;&lt;iframe src=\&quot;http://api.tweetmeme.com/button.js?url=&quot; + escape(document.URL) + &quot;&amp;amp;style=normal&amp;amp;source=SEOmofo&amp;amp;service=bit.ly\&quot; scrolling=\&quot;no\&quot; frameborder=\&quot;0\&quot; width=\&quot;50\&quot; height=\&quot;61\&quot; &gt;&quot;;
		document.getElementById(&quot;tm_box&quot;).innerHTML = iframeCode;
	}
}

window.onload = tweetMemeButton;
	
</pre>

<h3 style="margin-top:6em;">STEP 5: Share This Super-Amazing Article</h3>
<p>
That&#8217;s right&#8230;people are going to wonder why your blog is so damn fast, and when they do&#8230;you send them my way. Oh&#8230;and for more page speed tips to speed up WordPress, check out my previous masterpiece: <a href="http://www.seomofo.com/wordpress/comments-slow-page-speed.html">WordPress Comments Slow Down Page Speed</a>.
</p>
<p style="text-align:center; height:2em; line-height:200%; margin:6em 0;">
 Peace, I&#8217;m outta here. <img src="http://www.seomofo.com/img/emoticons/big-smile.png" width="24" height="24" style="margin:0; vertical-align:middle;" alt="Big smile!" />
</p><img src="http://feeds.feedburner.com/~r/seomofo/~4/ja7ENj9EzUo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/wordpress/tweetmeme-retweet-button.html/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>WordPress Comments Slow Down Page Speed</title>
		<link>http://www.seomofo.com/wordpress/comments-slow-page-speed.html</link>
		<comments>http://www.seomofo.com/wordpress/comments-slow-page-speed.html#comments</comments>
		<pubDate>Mon, 01 Feb 2010 11:51:30 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[AntiSocial Media]]></category>
		<category><![CDATA[Experiments]]></category>
		<category><![CDATA[Page Speed]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1321</guid>
		<description><![CDATA[Enabling comments and custom Gravatars on your WordPress blog can encourage visitors to participate, but it also negatively impacts your page speed. ]]></description>
			<content:encoded><![CDATA[<p></p><img style="float:right;" width="240" height="240" src="http://www.seomofo.com/img/wp-comments-slow-page-speed.png" alt="The tortoise is WordPress and the ball and chain is Gravatar. Gravatar slows down WordPress...get it?" />
<p> There has been a lot of buzz lately about page speed. Matt Cutts has commented about how <a href="http://www.webpronews.com/topnews/2009/11/13/google-page-speed-may-be-a-ranking-factor-in-2010">page speed might be added as a signal to Google&#8217;s ranking algorithm</a>, sometime in the future. Google has <a href="http://googlewebmastercentral.blogspot.com/2009/12/how-fast-is-your-site.html">released the Site Performance feature</a> in the Labs section of Google Webmaster Tools, <del>despite the fact that it&#8217;s useless</del>. And of course, all the popular SEO/SEM blogs have predictably started churning out virtually-useless blog posts about how to make your website faster. </p>
<p> Regardless of whether or not Google makes page speed a ranking factor, optimizing page load times and overall site speed is a best practice that all web developers should be mindful of. Besides, if the Site Performance Lab is any indication, I&#8217;d say Google won&#8217;t have their page speed data signal &#8220;production-ready&#8221; for another 15 years. Using the Google Toolbar to detect page load times is quite frankly one of the dumbest ideas I&#8217;ve ever heard, and I sincerely hope it&#8217;s just another scare tactic to get webmasters&#8217; minds off of SEO and PageRank (and onto something that actually benefits Google). I don&#8217;t know how Google collects the speed data they use in their AdSense quality score, but I pray to God it&#8217;s more robust than this Site Performance joke. Anyway, rants aside, the fact remains that everyone is suddenly very interested in making their websites faster&#8230;and this post is going to address one small piece of that puzzle: <strong>WordPress comments</strong>. </p>
<h2>How does WordPress handle comments?</h2>
<p> When WordPress responds to a page request, it has to figure out how to output the comments associated with that particular post. Here is a very basic overview of the steps WordPress follows: </p>
<ol>
	<li>Fetch the comments from the <code>wp_comments</code> database table.</li>
	<li>For each comment that matches the page ID being served, loop through and insert the raw data into HTML code. Here&#8217;s a simplified example:</li>
</ol>
<p style="line-height:normal;"> <code>&lt;h6&gt;&lt;a href="<span style="color:#090;">comment_author_url</span>"&gt;<span style="color:#090;">comment_author</span>&lt;/a&gt;&lt;/h6&gt;</code><br />
<code>&lt;p&gt;<span style="color:#090;">comment_date</span>&lt;/p&gt;</code><br />
<code>&lt;p&gt;&lt;img src="http://www.gravatar.com/avatar/<span style="color:#090;">comment_author_email</span> /&gt;&lt;/p&gt;</code><br />
<code>&lt;p&gt;<span style="color:#090;">comment_content</span>&lt;/p&gt;</code> </p>
<h2>How does WordPress handle Gravatars?</h2>
<p> If a post has 0 comments, the steps shown above end pretty quickly because there&#8217;s nothing more for WordPress to process. However, even if a post has several comments to process, the computation cost is relatively insignificant when you compare it to the cost of downloading each commenter&#8217;s Gravatar. In other words, WordPress can build the HTML page pretty quickly and send it to your browser, but then your browser still has to request the Gravatar images from gravatar.com. As you&#8217;re about to see, it is the multiple HTTP requests for Gravatar images that <em>really</em> slow down your pages. I&#8217;ll try to explain why that is&#8230;by giving you an overview of how Gravatar works (as I understand it). Here&#8217;s the gist: </p>
<ol>
	<li>For each comment, WordPress takes the commenter&#8217;s email address and applies the md5 hash algorithm to it (in order to protect commenters&#8217; email addresses).</li>
	<li>The hash is attached to a gravatar.com URL, which creates the src destination for the Gravatar&#8217;s img tag. For example: <code>&lt;img src="<span class="uri_mofo">http://www.gravatar.com/avatar/3904bc1a75d86eb05dd07425214002df</span>" /&gt;</code></li>
	<li>After the HTML page is sent to your browser, your browser sends a request to Gravatar&#8217;s servers for each Gravatar image embedded in the comments.</li>
	<li>Gravatar&#8217;s servers check their records for the hashed email address. If it exists (meaning the email address was registered at gravatar.com), Gravatar returns the corresponding image. If it doesn&#8217;t exist, Gravatar redirects to your blog&#8217;s default image, which you can select from the WP admin menu for <code>Settings</code> &rarr; <code>Discussion</code>:</li>
</ol>
<p style="text-align:center;"> <img src="http://www.seomofo.com/img/wordpress-default-avatar-settings.png" alt="WordPress admin settings for default avatar" width="501" height="717" /> </p>
<h2>Why do Gravatars slow down WordPress?</h2>
<p> Enabling comments and custom Gravatars on your WordPress blog can definitely encourage your visitors to participate and join the conversation, but on the other hand, the Gravatar system has some inherent flaws that negatively impact your page speed. Here are some examples: </p>
<ul>
	<li>Every comment contains an img element that points to a <strong>unique URL</strong> on gravatar.com. This means that every single person who comments on your blog post is costing you an extra HTTP request&#8230;regardless of whether or not they&#8217;ve registered their email address at gravatar.com.</li>
	<li>If a user is NOT registered at Gravatar.com, their image request will be redirected to the default location. This redirect means yet <em>another</em> HTTP request, either to your server or another gravatar.com URL (depending on what you set your default image as).</li>
	<li>Several different src URLs return the same exact image. This is because every email address results in a unique hash, which in turn creates a unique URL. Many of these unique URLs will redirect to the default Gravatar image, because not all your visitors will be signed up for Gravatar. This triggers a &#8220;page speed tip&#8221; in Google Webmaster Tools that looks like this:</li>
</ul>
<div style="width:75%; margin:0 auto; font-family:arial, sans-serif; font-size:13px; overflow-x:scroll; line-height:normal; border:1px solid #000; padding:1em;">
	<p> <strong>Serve resources from a consistent URL</strong><br />
	<br />
	The following resources have identical contents, but are served from different URLs. Serve these resources from a consistent URL to save <em>10.7</em> KB and <em>5</em> requests: </p>
	<ul>
		<li>http://www.gravatar.com/avatar/f5264f0487ece922e2f512b58e2bf1d8?s=48&amp;d=http%3A%2F%2Fwww.seomofo.com%2Fwp-content%2Fthemes%2Fthesis_16%2Fcustom%2Fimages%2Fgravatars%2Fc01.png%3Fs%3D48&amp;r=X</li>
		<li>http://www.gravatar.com/avatar/f018690430517b80b907581087479ebf?s=48&amp;d=http%3A%2F%2Fwww.seomofo.com%2Fwp-content%2Fthemes%2Fthesis_16%2Fcustom%2Fimages%2Fgravatars%2Fc01.png%3Fs%3D48&amp;r=X</li>
		<li>http://www.gravatar.com/avatar/5160428f6f123b4bd5b83924eb87fefd?s=48&amp;d=http%3A%2F%2Fwww.seomofo.com%2Fwp-content%2Fthemes%2Fthesis_16%2Fcustom%2Fimages%2Fgravatars%2Fc01.png%3Fs%3D48&amp;r=X</li>
		<li>http://www.gravatar.com/avatar/d36c9a1e57814dfbf9f16457f3f53405?s=48&amp;d=http%3A%2F%2Fwww.seomofo.com%2Fwp-content%2Fthemes%2Fthesis_16%2Fcustom%2Fimages%2Fgravatars%2Fc01.png%3Fs%3D48&amp;r=X</li>
		<li>http://www.gravatar.com/avatar/9081da00619e7205805ecc0735dda190?s=48&amp;d=http%3A%2F%2Fwww.seomofo.com%2Fwp-content%2Fthemes%2Fthesis_16%2Fcustom%2Fimages%2Fgravatars%2Fc01.png%3Fs%3D48&amp;r=X</li>
		<li>http://www.gravatar.com/avatar/b958344045e263b90eb521a64aaedb4e?s=48&amp;d=http%3A%2F%2Fwww.seomofo.com%2Fwp-content%2Fthemes%2Fthesis_16%2Fcustom%2Fimages%2Fgravatars%2Fc01.png%3Fs%3D48&amp;r=X</li>
	</ul>
</div>
<h2>Page Speed Testing</h2>
<p> Below you&#8217;ll find some page speed data I collected, using <a href="http://www.webpagetest.org/">this web page speed tool</a>. It is the same tool Matt Cutts mentioned in his WebPro News interview. The page I used in this test was my article about how <a href="http://www.seomofo.com/antisocial-media/stupid-people-hate-new-rt.html">stupid people hate Twitter&#8217;s new retweet feature</a>, which had a total of 18 comments (from 10 unique users) at the time of testing. The detailed results are linked to below, but I&#8217;ve summarized the data results for you as well. </p>
<p> <img src="http://www.seomofo.com/img/wordpress-page-speed-graph.png" alt="WordPress page speed graph comparing comments and Gravatars" class="mb2em" /> </p>
<table cellspacing="0" cellpadding="0" style="width:100%; font-size:50%; line-height:normal; margin-bottom:6em;">
	<tr style="font-weight:bold; text-align:right;">
		<td></td>
		<td>Load<br />Time</td>
		<td>First<br />Byte</td>
		<td>Start<br />Render</td>
		<td>Requests</td>
		<td>Bytes&nbsp;In</td>
		<td>Bandwidth</td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left; width:40%;">No Comments (1st View)</td>
		<td>0.956</td>
		<td>0.502</td>
		<td>0.726</td>
		<td>20</td>
		<td>227 KB</td>
		<td>4.09 Mbps</td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">No Comments (2nd View)</td>
		<td>0.695</td>
		<td>0.537</td>
		<td>0.689</td>
		<td>2</td>
		<td>9 KB</td>
		<td></td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | No Gravatars (1st View)</td>
		<td>1.122</td>
		<td>0.620</td>
		<td>0.909</td>
		<td>22</td>
		<td>238 KB</td>
		<td>3.90 Mbps</td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | No Gravatars (2nd View)</td>
		<td>0.876</td>
		<td>0.677</td>
		<td>0.829</td>
		<td>2</td>
		<td>20 KB</td>
		<td></td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | Gravatars Default = Blank (1st View)</td>
		<td>1.191</td>
		<td>0.629</td>
		<td>0.917</td>
		<td>37</td>
		<td>253 KB</td>
		<td>3.70 Mbps</td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | Gravatars Default = Blank (2nd View)</td>
		<td>1.037</td>
		<td>0.673</td>
		<td>0.804</td>
		<td>8</td>
		<td>23 KB</td>
		<td></td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | Gravatars Default = Mystery Man (1st View)</td>
		<td>1.312</td>
		<td>0.629</td>
		<td>0.922</td>
		<td>38</td>
		<td>260 KB</td>
		<td>3.12 Mbps</td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | Gravatars Default = Mystery Man (2nd View)</td>
		<td>1.025</td>
		<td>0.662</td>
		<td>0.793</td>
		<td>8</td>
		<td>23 KB </td>
		<td></td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | Gravatars Default = Custom (1st View)</td>
		<td>1.215</td>
		<td>0.633</td>
		<td>0.911</td>
		<td>37</td>
		<td>265 KB</td>
		<td>3.77 Mbps</td>
	</tr>
	<tr style="text-align:right;">
		<td style="text-align:left;">Comments | Gravatars Default = Custom (2nd View)</td>
		<td>1.031</td>
		<td>0.675</td>
		<td>0.822</td>
		<td>8</td>
		<td>23 KB</td>
		<td></td>
	</tr>
</table>
<p> <strong>For the full results of each speed test, click the links below:</strong> </p>
<p style="font-family:monospace;"> No comments&nbsp;&bull;&nbsp;No Gravatars&nbsp;&rarr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.webpagetest.org/result/100127_4MB4/">Speed Test 1</a><br />
&nbsp;&nbsp;&nbsp;Comments&nbsp;&bull;&nbsp;No Gravatars&nbsp;&rarr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.webpagetest.org/result/100127_4MB7/">Speed Test 2</a><br />
&nbsp;&nbsp;&nbsp;Comments&nbsp;&bull;&nbsp;&nbsp;&nbsp;&nbsp;Gravatars&nbsp;&bull;&nbsp;Default is Blank&nbsp;&rarr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.webpagetest.org/result/100127_4MBB/">Speed Test 3</a><br />
&nbsp;&nbsp;&nbsp;Comments&nbsp;&bull;&nbsp;&nbsp;&nbsp;&nbsp;Gravatars&nbsp;&bull;&nbsp;Default is Mystery Man&nbsp;&rarr;&nbsp;<a href="http://www.webpagetest.org/result/100127_4MCD/">Speed Test 4</a><br />
&nbsp;&nbsp;&nbsp;Comments&nbsp;&bull;&nbsp;&nbsp;&nbsp;&nbsp;Gravatars&nbsp;&bull;&nbsp;Default is Custom&nbsp;&rarr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.webpagetest.org/result/100127_4MDK/">Speed Test 5</a> </p>
<h2>What can I do to speed up my comments?</h2>
<p>
Here are some suggestions for speeding up your WordPress posts by optimizing your comment settings. I will try to list these based on how big of an impact they have on your page speed. The suggestions that could improve your page speed the most are listed first:
</p>
<ol>
<li>Disable comments completely.</li>
<li>Load comments dynamically (e.g. a button that says &#8220;click here to view comments&#8221;).</li>
<li>Delete any comments that don&#8217;t add value to your post. (Ego boosts don&#8217;t add value.)</li>
<li>Disable Gravatars.</li>
<li>Set your default Gravatar to Blank.</li>
<li>Set your default Gravatar to a custom image on your server.</li>
<li>Restrict your Gravatar images to small dimensions (e.g. 32px).</li>
</ol>
<h3 id="kill-smiley">Kill the Smiley Faces!</h3>
<p>
I just thought of one more setting you can tweak to speed up your WordPress comments. You can UN-check the option that says &#8220;Convert emoticons like <code>&#58;&#45;&#41;</code> and <code>&#58;&#45;&#80;</code> to graphics on display.&#8221; This will prevent WordPress from having to request the emoticon images such as <img class="wp-smiley" alt=":-)" src="http://www.seomofo.com/wp-includes/images/smilies/icon_smile.gif"> and <img class="wp-smiley" alt=":-P" src="http://www.seomofo.com/wp-includes/images/smilies/icon_razz.gif">.
</p>
<p style="text-align:center;" >
<img width="426" height="147" src="http://www.seomofo.com/img/convert-smilies-into-emoticons.png" alt="" />
</p>
<p class="info_mofo">
Something I found interesting about WordPress is that the Mystery Man default Gravatar image is stored on gravatar.com. So the reason why the Blank avatar and my custom avatar returned faster page load speeds&#8230;is because they are both stored on my own server. Theoretically, you might be able to speed up your page loads by simply saving a copy of Mystery Man to your own server and designating it as your default (I&#8217;ll eventually write a post that explains how to do this). Older browsers will only maintain 2 connections to any given host, so if your web browser is requesting ALL the Gravatar images from www.gravatar.com, then it can only grab two at a time. On the other hand, if the default Gravatar image is located on your own server, then your web browser can grab it even when both www.gravatar.com connections are busy.
</p>
<h2>To put it all in perspective&#8230;</h2>
<p>
<img class="alignright" width="308" height="148" src="http://www.seomofo.com/img/neil-yeomans-tweet.png" alt="@rishil the difference is negligible in that article though. Google more bothered with 10-20 sec load times imo #travelsites" title="@rishil the difference is negligible in that article though. Google more bothered with 10-20 sec load times imo #travelsites" />
After reading a Twitter response to this article, I realized that I wasn&#8217;t entirely clear about how much comments slow down WordPress posts&#8230;as a <em>relative</em> measurement. I&#8217;ll try to put it into perspective for you.
</p>
<p>
First of all, I only ran the speed tests on one page, so certainly these <strong>results will vary</strong>, depending on variables such as:
</p>
<ul>
<li>How fast is your server, compared to gravatar.com&#8217;s server?</li>
<li>How many comments does the WordPress post have?</li>
<li>How many of those comments are from unique visitors (i.e. unique email addresses)?</li>
<li>What type of web browser are your visitors using to view the page?*</li>
</ul>
<p style="font-size:75%; line-height:1.25; width:90%; margin:2em auto;">
* Older browsers only permitted 2 persistent connections per host. Newer browsers support more, and therefore multiple Gravatar images can be downloaded from www.gravatar.com in parallel. For more details, see the <a href="http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/">Roundup on Parallel Connections</a> by <a href="http://stevesouders.com/">website speed guru, Steve Souders</a>.
</p>
<p>
One of the reasons why my test results only differ by a couple 10ths of a second is because my test page only had 18 comments, and only 10 of those were from unique email addresses. Also, I&#8217;ve been busy tweaking. My website, in order to improve overall performance. So <strong>try not to</strong> think in terms of my specific test page, because <strong>this data will mislead you</strong>:
</p>
<ol>
<li>Without any comments, the test page loaded in = 0.956 seconds.<br /><code>t<sub>1</sub>&nbsp;&nbsp;=&nbsp;&nbsp;0.956s</code></li>
<li>After I enabled the comments (with<strong>out</strong> Gravatars), the test page required an <em>additional</em> 0.166 seconds to load.<br /><code>t<sub>2</sub>&nbsp;&nbsp;=&nbsp;&nbsp;t<sub>1</sub> + 0.166s</code></li>
<li>After I enabled the Gravatars, the test page required an <em>additional</em>&nbsp; 0.190 seconds to load.<br /><code>t<sub>3</sub>&nbsp;&nbsp;=&nbsp;&nbsp;t<sub>2</sub> + 0.190s&nbsp;&nbsp;=&nbsp;&nbsp;t<sub>1</sub> + 0.356s</code></li>
</ol>
<h3>Why is that data misleading?</h3>
<p>
It&#8217;s misleading because some of you [lesser intelligent] people don&#8217;t know the importance of <em><strong>relative</strong></em> measurements, and you&#8217;ll interpret my data to mean something like this:
</p>
<blockquote>
<p>
Hooray! Comments and avatars only slow down a WordPress post by 0.356 seconds! That&#8217;s totally&#8230;like&#8230;<em>not</em> a long time to wait. Social media <em>really is</em> the best internet marketing strategy evar, tee-hee! I&#8217;m gonna put a trillion comments on every page of my site! Even the comments on my comments will have comments!
</p>
</blockquote>
<p>
Instead, look at it from a glass-half-empty point of view:
</p>
<ol>
<li>Without any comments, the test page loaded in some [unknown] amount of time.<br /><code>t<sub>1</sub>&nbsp;&nbsp;=&nbsp;&nbsp;<strong><var>x</var></strong></code></li>
<li>After I enabled the comments (with<strong>out</strong> Gravatars), the test page took 17.3% longer to load.<br /><code>t<sub>2</sub>&nbsp;&nbsp;=&nbsp;&nbsp;(117.3%)(t<sub>1</sub>)</code></li>
<li>After I enabled the Gravatars, the test page took 16.9% longer to load than the page without Gravatars. And compared to the first page (which had no comments and no Gravatars), the test page took 37.2% longer to load.<br /><code>t<sub>3</sub>&nbsp;&nbsp;=&nbsp;&nbsp;(116.9%)(t<sub>2</sub>)&nbsp;&nbsp;=&nbsp;&nbsp;(137.2%)(t<sub>1</sub>)</code></li>
</ol>
<h3>Get your math equations out of my face and just spell it out in plain English!</h3>
<p>
What I&#8217;m telling you is&#8230;<br />
</p>
<p>
<strong>Adding 18 comments to my blog post made it 37.2% SLOWER.</strong>
</p>
<h3>I&#8217;m still not convinced!</h3>
<p>
Alright, I got another test case for you. This one is a comparison between two different posts on Outspoken Media: one that has 5 comments vs one that has 130 comments. The content isn&#8217;t exactly the same, but it&#8217;s close enough. No? It&#8217;s not close enough? You demand more-accurate testing? Fine, I copied the content portion of these posts, pasted it into empty HTML pages, hosted them on my own site, and ran the tests again on <em>just the content</em>. If you really want to see the difference, the results are here:&nbsp;&nbsp;<a href="http://www.webpagetest.org/result/100201_4SYC/">Page#1</a>&nbsp;&nbsp;<a href="http://www.webpagetest.org/result/100201_4SY6/">Page#2</a>. The only relevant information those results show is that the page with 130 comments has a slight disadvantage (due to an extra image) and takes 0.2 seconds longer to load (not including the comments, of course). Anyhow&#8230;let&#8217;s get to the important stuff now. Let&#8217;s compare the page load times of the actual posts&#8230;comments and all.
</p>
<h4>Speed Test #1</h4>
<ul>
<li>Post: <a href="http://outspokenmedia.com/online-marketing/you-just-suck/">It’s Not the Recession, You Just Suck</a></li>
<li><strong>130</strong> comments</li>
<li><strong>85</strong> unique Gravatars</li>
<li>Average load time before cache: <strong>9.315</strong>s</li>
<li>Average load time after cache: <strong>4.155</strong>s</li>
<li><a href="http://www.webpagetest.org/result/100201_4SVA/">full test results</a></li>
</ul>
<h4>Speed Test #2</h4>
<ul>
<li>Post: <a href="http://outspokenmedia.com/seo/duplicate-content-penalties/">Penalties, issues and filtering; it’s all just confusing me</a></li>
<li><strong>5</strong> comments</li>
<li><strong>5</strong> unique Gravatars</li>
<li>Average load time before cache: <strong>4.636</strong>s</li>
<li>Average load time after cache: <strong>2.352</strong>s</li>
<li><a href="http://www.webpagetest.org/result/100201_4SVJ/">full test results</a></li>
</ul>
<h3>In plain English</h3>
<p>
The results of this second set of tests indicate that&#8230;<br />
</p>
<p>
<strong>Compared to the post with 5 comments&#8230;the post with 130 comments took roughly TWICE as long to load.</strong>
</p>
<h2 id="finale" style="text-align:center;">Grand Finale</h2>
<p style="margin:1em auto; width:60%;">
Click the small green button below to see the waterfall graph comparison between the 130-comment post and the 5-comment post.
</p>
<p style="text-align:center;">
<img src="http://www.seomofo.com/img/show-graph.png" alt="Show waterfall graph comparison" onclick="this.src='http://www.seomofo.com/img/outspoken-media-page-speed-charts.png'; this.style.cursor='default'" style="cursor:pointer;" />
</p>

<img src="http://feeds.feedburner.com/~r/seomofo/~4/i1ALAy0hGnc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/wordpress/comments-slow-page-speed.html/feed/</wfw:commentRss>
		<slash:comments>49</slash:comments>
		</item>
		<item>
		<title>Evil Found in Google Sidewiki Patent</title>
		<link>http://www.seomofo.com/advanced/patents/evil-found-in-google-patent.html</link>
		<comments>http://www.seomofo.com/advanced/patents/evil-found-in-google-patent.html#comments</comments>
		<pubDate>Wed, 06 Jan 2010 18:58:12 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Google Patents]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1037</guid>
		<description><![CDATA[We’ve all heard the Google motto, Don’t be evil, but that didn't stop them from incorporating evil into Sidewiki or making it accessible to evil users.]]></description>
			<content:encoded><![CDATA[<p><a class="post_image_link" href="http://www.seomofo.com/advanced/patents/evil-found-in-google-patent.html" title="Permanent link to Evil Found in Google Sidewiki Patent"><img class="post_image alignright" src="http://www.seomofo.com/img/evil-google.png" width="72" height="72" alt="Evil Found in Google Sidewiki Patent" /></a>
</p><p>I was checking out a few of Google&#8217;s recent patent applications, and I inadvertently made a startling discovery: <strong style="color:#c00;">evil</strong>. That&#8217;s right&#8230;we&#8217;ve all heard the Google motto, &#8220;<a href="http://investor.google.com/conduct.html">Don&#8217;t be evil</a>,&#8221; but apparently that doesn&#8217;t stop them from incorporating evil into their technology or making it accessible to evil users, as is clearly depicted in the following document:
</p>
<p style="text-align:center; margin:2em;">
<strong>United States Patent Application 20090327855</strong><br />
<strong><a href="http://www.freepatentsonline.com/y2009/0327855.html">Annotating Webpage Content</a></strong>
</p>
<p>
To be honest, I didn&#8217;t even read this patent thoroughly. I just skimmed through it&#8230;searching for SEO-related gems. It looked to me like a patent for Google Sidewiki, although it never actually mentioned that name. It did, however, mention the ability to annotate web pages and how to use the Google Toolbar to fetch any annotations that are stored remotely for that given web page. Since Sidewiki has no implications for SEO, I mostly just looked at the diagrams (which I cannot stress enough how helpful they are for understanding patents). Some of the diagrams represent users with a crude stick man (who apparently rides horses a lot), and all of the stick men look like pretty decent people:
</p>
<p>
<img src="http://www.seomofo.com/img/google-patent-user-stick-man.png" alt="Google patent user stick man" class="aligncenter" />
</p>
<p>
But then when you get to Figure 9, you find a stick man who obviously has evil intentions, as is indicated by his black eyes:
</p>
<p>
<img src="http://www.seomofo.com/img/google-patent-sidewiki-satan.png" alt="Google patents Sidewiki Satan" class="aligncenter" />
</p>
<p>
So the question is&#8230;why did Google draw only this one user with solid black eyes? Does Google think all laptop users are evil? Is this user actually an alien, researching our solar system in preparation for enslaving mankind? Is Google trying to corner the intergalactic online ad-serving market? It&#8217;s too hard to say at this point. The only thing we know for sure&#8230;is that this post was totally useless.
</p><img src="http://feeds.feedburner.com/~r/seomofo/~4/njkuZDfmmR8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/advanced/patents/evil-found-in-google-patent.html/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Customize Your Robots Meta Tags in Thesis</title>
		<link>http://www.seomofo.com/wordpress/thesis/customize-robots-meta-tags.html</link>
		<comments>http://www.seomofo.com/wordpress/thesis/customize-robots-meta-tags.html#comments</comments>
		<pubDate>Tue, 05 Jan 2010 00:57:06 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Thesis Theme]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1074</guid>
		<description><![CDATA[This post shows you how to customize the robots meta tag for each type of page on your blog--assuming you are using the Thesis theme for WordPress.]]></description>
			<content:encoded><![CDATA[<p></p><p>
This is a followup response to <a href="http://twitter.com/everfluxx" style="font-weight:bold; color:#FF0066;">Everfluxx</a>, who wrote a post about the robots meta tags that Thesis inserts into archive pages.
</p>
<p style="float:left; width:154px;">
<img src="http://www.seomofo.com/img/add-noindex-to-archive-pages.png" alt="Add Noindex to Archive Pages" style="margin:0;" />
</p>
<p style="float:left; width:390px; padding:0 1em; margin-bottom:0;">
Everfluxx discovered that when you opt to add the <code>noindex</code> attribute to your pages&#8217; robots meta tags, Thesis automatically assumes you meant <code>noindex, nofollow</code>. However, the <code>nofollow</code> attribute can cause a loss of site-wide PageRank, so many Thesis users will probably need a way to remove it.
<img src="http://www.seomofo.com/img/custom-meta-robots-with-thesis.png" alt="Customize your robots meta tags with Thesis" class="aligncenter mb1em" />
</p>
<p style="clear:both; border:2px dotted #FF0066; padding:.5em; text-align:center;">
For a complete explanation, check out this must-read post from Everfluxx:<br />
<a href="http://www.everfluxx.com/thesis-hidden-nofollow-on-archive-pages/">Using Thesis? Then beware of the &#8220;hidden&#8221; nofollow on archive pages!</a>
</p>
<p>
In his post, Everfluxx describes the problem and proposes a solution. His solution is quick and easy, but it requires editing Thesis core files, which makes some bloggers nervous (since they would have to redo that code edit every time a new version of Thesis is released). In his closing paragraph, Everfluxx writes:
</p>
<blockquote>
<p style="color:#FF6699;">
A final word to fellow Thesis developers/hackers: if you can think of a Better Way To Do It that does not require editing the theme files (e.g., via WP hooks, I dunno), please drop it in the comments. Thanks
</p>
</blockquote>
<p>
I was in the mood for some php coding, so I set to work and made it happen. But&#8230;it was just too beautiful to leave as a comment&#8230;so I kept it all to myself! (Sorry, Everfluxx! If it&#8217;s any consolation, I&#8217;ve used hot pink throughout this post&#8230;in your honor! =P)
</p>
<h2>How to Customize Your Robots Meta Tags in Thesis</h2>
<ol>
<li>UN-check the boxes under <strong>Add Noindex to Archive Pages</strong> in the <strong>Thesis Options</strong> menu. (The code below will add the robots meta tag for you, so if you leave the Thesis options checked&#8230;you&#8217;ll end up with 2 robots meta tags on each page.)</li>
<li>Copy the code below and paste it into your <abbr title="/wpcontent/themes/thesis_16/custom/custom_functions.php" style="cursor:help;"><code>custom_functions.php</code></abbr> file.</li>
<li>Edit the robots meta tag that corresponds with each page type to suit your specific needs. I have included a variety of page types already, but feel free to delete the ones you don&#8217;t need. For more-advanced customizations, reference the <a href="http://codex.wordpress.org/Conditional_Tags">WordPress conditional tags</a>.</li>
<li>Promote this post for me by clicking the social media widgets below.</li>
</ol>


<pre class="brush: php;">
// Define your motherfuckin' meta robots tags
function my_mofo_meta_robo() {
	if (is_home())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;index, follow\&quot; /&gt;\n&quot;; // HOME PAGE
	elseif (is_single())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;index, follow\&quot; /&gt;\n&quot;; // SINGLE BLOG POSTS
	elseif (is_page())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;index, follow\&quot; /&gt;\n&quot;; // PAGES
	elseif (is_category())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;index, follow\&quot; /&gt;\n&quot;; // CATEGORY ARCHIVES
	elseif (is_tag())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;noindex, follow\&quot; /&gt;\n&quot;; // TAG ARCHIVES
	elseif (is_author())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;noindex, follow\&quot; /&gt;\n&quot;; // AUTHOR ARCHIVES
	elseif (is_date())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;noindex, follow\&quot; /&gt;\n&quot;; // DATE ARCHIVES
	elseif (is_search())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;noindex, follow\&quot; /&gt;\n&quot;; // SEARCH PAGES
	elseif (is_404())
		$mofo_robo = &quot;&lt;meta name=\&quot;robots\&quot; content=\&quot;noindex, follow\&quot; /&gt;\n&quot;; // 404 ERROR PAGE

	echo $mofo_robo;
}

// Add your motherfuckin' meta robots tag to the &lt;head&gt; section
add_action('wp_head', 'my_mofo_meta_robo');
</pre><img src="http://feeds.feedburner.com/~r/seomofo/~4/UBBVcK9MTHE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/wordpress/thesis/customize-robots-meta-tags.html/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>First Changes to My New WordPress Installation</title>
		<link>http://www.seomofo.com/wordpress/first-changes-to-new-wp.html</link>
		<comments>http://www.seomofo.com/wordpress/first-changes-to-new-wp.html#comments</comments>
		<pubDate>Sat, 02 Jan 2010 23:43:26 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=1056</guid>
		<description><![CDATA[This page lists the changes I made to my site during the first month after I installed Thesis/WordPress. It might give you ideas for a fresh WP install. ]]></description>
			<content:encoded><![CDATA[<p><a class="post_image_link" href="http://www.seomofo.com/wordpress/first-changes-to-new-wp.html" title="Permanent link to First Changes to My New WordPress Installation"><img class="post_image alignright" src="http://www.seomofo.com/img/new-wordpress-thesis-installation.png" width="340" height="257" alt="First month of changes to new Thesis WordPress installation" /></a>
</p><p class="info_mofo" style="width:200px;">
The content below used to be on the page called &#8220;Updates.&#8221; I no longer need to keep track of changes to my site, so I&#8217;m moving this to a regular post under the <a href="http://www.seomofo.com/wordpress/">WordPress category</a>. This page simply lists all the changes I made to my site during the first month after I installed Thesis/WordPress. It might give you some ideas for what to do after a fresh WP install.
</p>
<p><strong>Nov. 28, 2009</strong></p>
<ul>
	<li>Updated a few posts with new formatting styles.</li>
</ul>
<p><strong>Nov. 27, 2009</strong></p>
<ul>
	<li>Added the <a href="http://ocaoimh.ie/wp-super-cache/">WordPress Super Cache</a> plugin.</li>
	<li>Added the <a href="http://www.bad-behavior.ioerror.us/documentation/wordpress/">Bad Behavior on WordPress</a> plugin.</li>
	<li>Added the <a href="http://yoast.com/wordpress/breadcrumbs/">WordPress Breadcrumbs</a> plugin.</li>
</ul>
<p><strong>Nov. 26, 2009</strong></p>
<ul>
	<li>Added a sweet, sweet image of stupid Taz to my <a href="http://www.seomofo.com/antisocial-media/stupid-people-hate-new-rt.html">Stupid People Hate Twitter’s New Retweet</a> post.</li>
</ul>
<p><strong>Nov. 23, 2009</strong></p>
<ul>
	<li>Added custom default Gravatar image.</li>
</ul>
<p><strong>Nov. 21, 2009</strong></p>
<ul>
	<li>Added social network links and widgets after the content of each post.</li>
</ul>
<p><strong>Nov. 20, 2009</strong></p>
<ul>
	<li>Published a post about why <a href="http://www.seomofo.com/antisocial-media/stupid-people-hate-new-rt.html">Stupid People Hate Twitter’s New Retweet</a>.</li>
</ul>
<p><strong>Nov. 19, 2009</strong></p>
<ul>
	<li>Spent most of the day trying to ignore the constant stream of complaints about the new Twitter RT feature.</li>
	<li>Started writing a rant about stupid people.</li>
</ul>
<p><strong>Nov. 17, 2009</strong></p>
<ul>
	<li>Changed home page <code>&lt;meta name="description" /&gt;</code> content (back to my ASCII art version).</li>
	<li>Configured Comment Link Manager to whitelist a few comment authors.</li>
	<li>Enabled nested comments.</li>
</ul>
<p><strong>Nov. 16, 2009</strong></p>
<ul>
	<li>Published <a href="http://www.seomofo.com/orm/monitor-sidewiki-comments.html">How to Monitor Google Sidewiki Comments</a>.</li>
</ul>
<p><strong>Nov. 14, 2009</strong></p>
<ul>
	<li>Installed the <a href="http://wordpress.org/extend/plugins/comment-link-manager/">Comment Link Manager</a> plugin, which requires comment authors to have 10 approved comments before their links become active.</li>
	<li>Installed the <a href="http://www.web-strategy.jp/wp_plugin/ps_disable_auto_formatting/">PS Disable Auto Formatting</a> plugin, which prevents WordPress from adding/deleting <code>&lt;p&gt;</code> and <code>&lt;br /&gt;</code>.</li>
	<li>Modified my Twitter icon again. This time I made it into a sprite to reduce page size and speed up the hover effect.</li>
	<li>Started adding content to my About page.</li>
</ul>
<p><strong>Nov. 13, 2009</strong></p>
<ul>
	<li>Installed the <a href="http://wordpress.org/extend/plugins/tweetmeme/">TweetMeme</a> WordPress plugin.</li>
	<li>Modified a Twitter icon to use for &#8220;Follow Me&#8221; link.</li>
</ul>
<p><strong>Nov. 12, 2009</strong></p>
<ul>
	<li>Updated to WordPress 2.8.6.</li>
	<li>Set up the MyBrand feature on Feed Burner. Feed URL is now <span class="uri_mofo">http://feeds.seomofo.com</span>.</li>
	<li>Installed the <a href="http://www.google.com/support/feedburner/bin/answer.py?hl=en&amp;answer=78483">FeedBurner FeedSmith plugin</a>.</li>
	<li>Added Subscribe links to right-hand column.</li>
	<li>Enabled the Google XML Sitemap plugin.</li>
	<li>301 redirected all date archive URLs to the home page. Here&#8217;s the mod_rewrite code I added to <span class="uri_mofo">.htaccess</span>: <pre class="brush: plain;">
RewriteCond %{REQUEST_URI} ^/[0-9]+/ [NC]
RewriteRule ^(.*)$ http://www.seomofo.com/ [R=301,L]
</pre><br /><br /></li>
</ul>
<p><strong>Nov. 11, 2009</strong></p>
<ul>
	<li>Battled the DNS monster some more today and finally defeated that beast. Site should be up and running now.</li>
	<li>Removed the smiley face image [ <img style="vertical-align:middle;" src="http://www.seomofo.com/img/wp-stats-smiley.gif" alt="WordPress Stats smiley" /> ] that&#8217;s inserted by WP Stats. <pre class="brush: css;">
/* KILL THE WP STATS SMILEY IN FOOTER */
img#wpstats{display:none;}
</pre><br /><br /></li>
	<li>Added Updates tab to top navigation.</li>
</ul>
<p><strong>Nov. 10, 2009</strong></p>
<ul>
	<li>I spent most of today battling the semi-functional DNS dashboards on 3 different hosting sites. Site will be down until DNS propagates. Probably could have avoided down time if I were patient, but I&#8217;m not&#8230;so to the 20 people who visit my site today: I apologize.</li>
</ul>
<p><strong>Nov. 9, 2009</strong></p>
<ul>
	<li>In preparation for setting up my blog feed at <span class="uri_mofo">feeds.seomofo.com</span>, I&#8217;ve started to move my site from its cheap hosting over to my VPS hosting.</li>
</ul>
<p><strong>Nov. 4, 2009</strong></p>
<ul>
	<li>Wrote a post called <a href="http://www.seomofo.com/advanced/patents/best-way-to-research-patents.html">Best Way to Research Google Patents</a>.</li>
	<li>Removed the Thesis default header and added my own.</li>
	<li>Added some sweet, sweet shadow effects to my new header logo and some <code>&lt;h2&gt;</code> headings.</li>
	<li>Here is the code I added to the <span class="uri_mofo">custom_functions.php</span> file: 	<pre class="brush: php;">
// Remove the Thesis header
remove_action('thesis_hook_header', 'thesis_default_header');&lt;br /&gt;&lt;br /&gt;// Define my own header
function mofo_header() {
?&gt;
		&lt;div id=&quot;logo_mofo&quot;&gt;
			&lt;div id=&quot;domain_mofo&quot;&gt;&lt;a href=&quot;/&quot;&gt;&lt;em&gt;SEO&lt;/em&gt;&lt;/a&gt;&lt;span&gt; &lt;/span&gt;mofo&lt;span id=&quot;dot_mofo&quot;&gt;.&lt;/span&gt;com&lt;/div&gt;
			&lt;div id=&quot;slogan_mofo&quot;&gt;The &lt;span&gt;&amp;uarr;&lt;/span&gt; &lt;b&gt;SEO&lt;/b&gt; links to my home page!&lt;/div&gt;
		&lt;/div&gt;
&lt;?php	
}&lt;br /&gt;&lt;br /&gt;// Add my header
add_action('thesis_hook_header', 'mofo_header');
</pre><br /><br /></li>
</ul>
<p><strong>Nov. 3, 2009</strong></p>
<ul>
	<li>Wrote a post called <a href="http://www.seomofo.com/wordpress/thesis/phi-column-layout.html">Thesis Phi-Column Layout</a>. In it, I marked up phi with <code>&lt;var&gt;&lt;/var&gt;</code> tags, despite the fact that <var>φ</var> represents an irrational constant. Does that make me a bad person?</li>
	<li>Changed a bunch of formatting in <span class="uri_mofo">custom.css file</span>.</li>
</ul>
<p><strong>Nov. 2, 2009</strong></p>
<ul>
	<li>Added favicon code to <code>&lt;head&gt;</code> section.</li>
	<li>Changed Twitter widget settings to show last 3 tweets.</li>
	<li>Installed the <a href="http://wordpress.org/extend/plugins/syntaxhighlighter/">Syntax Highlighter Evolved</a> plugin.</li>
	<li>Changed Thesis default formatting for the &#8220;current&#8221; tabs so that it shows a pointer when you mouse over it (instead of the text cursor). Here&#8217;s the CSS I added to <span class="uri_mofo">custom.css</span>: <pre class="brush: plain;">
ul.menu li.current a:hover{cursor:pointer;}
</pre><br /><br /></li>
	<li>Edited <span class="uri_mofo">.htaccess</span> file to redirect <span class="uri_mofo">/blog</span> to <span class="uri_mofo">/</span>.</li>
	<li>I&#8217;ve also temporarily deactivated my XML Sitemap plugin and the ping-o-matic feature until I&#8217;m ready for the new URLs to be crawled.</li>
	<li>Installed the <a href="http://txfx.net/wordpress-plugins/subscribe-to-comments/">Subscribe to Comments</a> plugin.</li>
</ul>
<p><strong>Oct. 30, 2009</strong></p>
<ul>
	<li>Posted <a href="http://www.seomofo.com/marketing/nokia-promo-spam-email.html">Nokia Promo Spam Email</a>.</li>
</ul>
<p><strong>Oct. 29, 2009</strong></p>
<ul>
	<li>Moved WordPress from <span class="uri_mofo">/blog</span> to <span class="uri_mofo">/</span>.</li>
	<li>Edited Thesis design options and <span class="uri_mofo">custom.css</span> styles.</li>
	<li>Wrote a post about <a href="http://www.seomofo.com/wordpress/thesis/rounded-corners-menu.html">how to add rounded corners to the Thesis top navigation menu</a>.</li>
</ul>
<p><strong>Oct. 25, 2009</strong></p>
<ul>
	<li>Wrote a <a href="http://www.seomofo.com/wordpress/thesis/thesis-1-6-made-this-post-irrelevant.html">crapost</a> about a typo/bug I discovered in the Thesis font formatting options, but then Thesis 1.6 was released and the typo/bug disappeared.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/seomofo/~4/F4jmQG9utEc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/wordpress/first-changes-to-new-wp.html/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Thesis Comment Form Border Fix</title>
		<link>http://www.seomofo.com/wordpress/thesis/comment-form-border-fix.html</link>
		<comments>http://www.seomofo.com/wordpress/thesis/comment-form-border-fix.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 10:08:05 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Thesis Theme]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=951</guid>
		<description><![CDATA[If you use the Thesis WordPress theme and you've selected the option to 'Show list of allowed HTML tags,' then your comment form borders need this fix.]]></description>
			<content:encoded><![CDATA[<p></p><h2>Who should read this article?</h2>
<p>If you meet the following criteria, this post is for you:</p>
<ol>
<li>You use the Thesis theme for WordPress.</li>
<li>You allow comments on your posts.</li>
<li>Under <b>Thesis Options</b>, you have selected the option to &#8220;Show list of allowed HTML tags.&#8221;</li>
<li>The solid border around your comment form&#8217;s <code>&lt;textarea&gt;</code> does not line up with the dotted border of the element underneath it (the element that contains the text <em>You can use these HTML tags and attributes</em>&#8230;).</li>
<li>You want to fix the borders so they line up perfectly!</li>
</ol>
<p>
If you qualify, read on, valued reader! If you don&#8217;t qualify, read on, valued reader! If you don&#8217;t want to hear me nitpick petty details, then just skip to <a href="#stfu">the solution</a>.
</p>
<h2>What are these comment form borders you speak of?</h2>
<p>
<strong>Here is an example of a comment form with misaligned borders:</strong>
</p>
<p>
<img src="http://www.seomofo.com/img/thesis-comment-form-borders.png" alt="Thesis comment form borders misaligned" title="Thesis comment form borders misaligned" width="548" height="265" class="alignnone size-full wp-image-961" />
</p>
<h2 style="text-align:center;">Show list of allowed HTML tags</h2>
<p style="text-align:center; width:300px; margin-left:auto; margin-right:auto;">
<strong>Here is the Thesis Options menu where you enable this option:</strong>
</p>
<p>
<img src="http://www.seomofo.com/img/thesis-options-show-html-tags.png" alt="Thesis Options - Show list of allowed HTML tags" title="Thesis Options - Show list of allowed HTML tags" width="300" height="356" class="aligncenter size-full wp-image-956" />
</p>
<h2>Why aren&#8217;t my borders aligned?</h2>
<p>
If you show the allowed HTML tags, and your main content column width is <strong>outside</strong> the range of approximately 438px &#8211; 508px, then chances are your borders are effed up. Complicating the issue further is the fact that your borders will appear more effed up or less effed up, depending on the web browser you&#8217;re using. Below is a zoomed-in view of the borders on <a href="http://www.mattcutts.com/blog/type/googleseo/">Matt Cutts</a>&#8217; comment form, as seen in some major web browsers (using Windows Vista for all of them except IE6 and IE7, which were captured via their respective Microsoft Virtual PC images running on Windows XP SP3):
</p>
<p>
<img src="http://www.seomofo.com/img/thesis-comment-form-comparison.png" alt="Thesis comment form border in major web browsers" title="Thesis comment form border in major web browsers" width="414" height="320" class="aligncenter size-full wp-image-981 mb2em" />
</p>
<p class="info_mofo mb4em">
The illustration above revealed a couple of interesting observations: <strong>(1)</strong> IE8 (which is supposed to be the most standards-compliant version of Internet Explorer) deviates the furthest from the intended dimensions. Every other web browser rendered the width of the top part (the <code>&lt;textarea&gt;</code> element) as either 686px or 687px, while IE8 rendered it at 682px! WTF, Microsoft? <strong>(2)</strong> IE8 in compatibility mode was NOT rendered exactly the same as it was in IE7.
</p>
<h2>Comment form HTML node tree</h2>
<p>
For your reference, I&#8217;ve created a simple HTML node tree of the comment form elements. Think of this as the raw HTML source code, with all the content, irrelevant attributes, and closing tags removed. The only information this node tree is meant to convey is the hierarchical nesting of HTML elements. This notation is helpful for understanding CSS styles and how they cascade. Check it out:
</p>

<pre class="brush: xml;">
&lt;form id=&quot;commentform&quot;&gt;
	&lt;p&gt;
		&lt;input class=&quot;text_input&quot; id=&quot;author&quot;&gt;
		&lt;label&gt;
			&lt;span class=&quot;required&quot;&gt;
	&lt;p&gt;
		&lt;input class=&quot;text_input&quot; id=&quot;email&quot;&gt;
		&lt;label&gt;
			&lt;span class=&quot;required&quot;&gt;
	&lt;p&gt;
		&lt;input class=&quot;text_input&quot; id=&quot;url&quot;&gt;
		&lt;label&gt;
	&lt;p class=&quot;comment_box&quot;&gt;
		&lt;textarea&gt;
		&lt;span class=&quot;allowed&quot;&gt;
			&lt;span&gt;
				&lt;em&gt;
					&lt;acronym&gt;
	&lt;p class=&quot;subscribe-to-comments&quot;&gt;
		&lt;input id=&quot;subscribe&quot;&gt;
		&lt;label&gt;
	&lt;p&gt;
		&lt;input class=&quot;form_submit&quot; id=&quot;submit&quot;&gt;
</pre>

<p>
If you take a look at lines 14 and 15, you&#8217;ll find the sibling elements who just can&#8217;t seem to get along. In plain English, that means that <code>&lt;textarea&gt;</code> and <code>&lt;span&nbsp;class="allowed"&gt;</code> are the two elements whose borders don&#8217;t line up. <strong>Therefore, our goal is to make these two elements the same width.</strong>
</p>
<h2>Thesis Writes Dynamic Stylesheets</h2>
<p>
If you haven&#8217;t spent much time tweaking the CSS styles for Thesis, you probably don&#8217;t know that the 2 primary stylesheets are dynamically built by your server, based on the font size you&#8217;ve defined in the Thesis Design Options menu, under Content Area. So for example, Thesis wants the border of its comment form to be 1px, regardless of what your font size is, but it also wants to define everything in <code>em</code> units (which is usually the preferred unit for maximizing cross-browser compatibility and displaying properly across many different devices and display resolutions). Therefore, if you set your content font size to 16 (where 1em = 16px), then Thesis will build a stylesheet that defines the border of its comment form to be <code>0.063em</code>. Multiply (16 pixels/em)(0.063em), and you get a border width of 1.008px, which rounds to 1px. The only reason I&#8217;m mentioning this about Thesis is because my illustration below shows the <code>&lt;textarea&gt;</code> padding (defined in <span class="uri_mofo">/wp-content/themes/thesis/custom/layout.css</span>) as 3px on each side, but your layout.css file will define it in em units. Thesis will adjust the em value to ensure that all font sizes result in 3px of padding on all sides of the <code>&lt;textarea&gt;</code>, and 0px of padding on the <strong>sides</strong> of the <code>&lt;span&nbsp;class="allowed"&gt;</code> (it has 7px of padding on the top and bottom, but this doesn&#8217;t affect our border issue).
</p>
<p>
<img src="http://www.seomofo.com/img/thesis-comment-form-elements.png" alt="Default styles of Thesis comment form elements" title="Default styles of Thesis comment form elements" width="559" height="341" class="aligncenter size-full wp-image-976" />
</p>
<hr />
<p>
From looking at the illustration, you can see that our two elements will line up when the following equation is true:
</p>
<p style="text-align:center;">
<code>(.96)(parent width) + 6px = (.973)(parent width)</code>
</p>
<hr class="mb3em" />
<h2>Sub-pixel Rounding in Major Web Browsers</h2>
<p>
Even though the equation above has only one solution, we can actually take advantage of sub-pixel rounding to get a range of acceptable solutions. In order for these two elements to be the same width, the parent element (<code>p.comment_box</code>) needs to be in the range of approximately 415px &#8211; 485px. After taking the 23px into account, this means our content column width (which you can define in the Thesis Design Options menu) needs to be in the range of approximately 438px &#8211; 508px&#8230;otherwise the borders will break. If you left your content column width at the Thesis default value of 480px, then your borders should be okay&#8230;at least in SOME browsers. The chances of your borders lining up in IE8, however, are extremely slim&#8230;due to the fact that Internet Explorer is absolutely the shittiest browser in the World. With terrible browsers like Internet Explorer still in use, we need to find a solution that doesn&#8217;t require any unit conversions (e.g. 1.3% = 6px). This won&#8217;t guarantee that all browsers render the comment form at the same width, but it will guarantee that the borders line up.
</p>
<div id="stfu"></div>
<h2>Can you STFU and give us the solution now?</h2>
<p>
Sure. Copy this code and paste it in your custom.css file:
</p>
<pre class="brush: css;">
#commentform textarea{width:97.3%; padding:0;}
</pre>
<h2>Serious? I just read all that crazy shit for one line of code?</h2>
<p>Yup.</p>
<h2>How do I know if this will work for my blog?</h2>
<p>
Simple. Just save <a href="javascript:void(document.getElementById('comment').style.width='97.3%');void(document.getElementById('comment').style.padding='0');">this bookmarklet</a> to your bookmarks, go stare at your effed up comment form borders, and click this sumbitch. Did it work?
</p>
<h2>OMG, you rock! How can I ever repay you?</h2>
<p>
Hmm&#8230;maybe you could click on some of these awesome social media widgets:
</p>







<img src="http://feeds.feedburner.com/~r/seomofo/~4/7PjfeHLjiDw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/wordpress/thesis/comment-form-border-fix.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How to Design a Custom Twitter Background Image</title>
		<link>http://www.seomofo.com/antisocial-media/custom-twitter-background.html</link>
		<comments>http://www.seomofo.com/antisocial-media/custom-twitter-background.html#comments</comments>
		<pubDate>Mon, 14 Dec 2009 11:51:53 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[AntiSocial Media]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=939</guid>
		<description><![CDATA[This guide shows you how to design a custom Twitter background image that looks great on any screen resolution and sends a professional first impression.]]></description>
			<content:encoded><![CDATA[<p></p><a href="http://twitter.com/SEOmofo"><img height="170" width="316" alt="My custom twitter background" src="http://www.seomofo.com/img/custom-twitter-background.png" class="post_image alignright" /></a>
<div style="width:206px; margin:0; padding:1em; line-height:normal; border:1px solid #AAA; background-color:#F3F6FF;">
<p style="font-size:.875em; text-align:center; margin-bottom:1em;">
<strong>Table of Contents</strong>
</p>
<ul style="margin:0; list-style:none;">
<li><a href="#pagesize" style="text-decoration:none;">Twitter page dimensions</a></li>
<li><a href="#imagesize" style="text-decoration:none;">Twitter Background image dimensions</a></li>
<li><a href="#designtips" style="text-decoration:none;">Tips for designing your own Twitter background</a></li>
<li><a href="#template" style="text-decoration:none;">Custom Twitter background template</a></li>
</ul>
</div>
<p style="clear:both;"></p>
<p>If you&#8217;re using Twitter to promote yourself or your company, then you need your profile page to make a good first impression. Twitter offers a handful of simple formatting options for customizing your profile page, and one of those is the option to use a <strong>custom background image</strong>. This article will show you how to design a Twitter background that looks great on all of the most common computer monitor resolutions, and therefore appeals to the broadest audience possible.
</p>
<p>
A well-designed background image can have a positive influence on how your brand is perceived by your customers, business contacts, and colleagues. On the other hand, a poorly-designed background image can make you seem incompetent, lazy, disorganized, or just plain stupid. The goal of this article is to establish some intelligent guidelines and best practices for creating a custom Twitter background image. Since I am a perfectionist, I will probably go into ridiculously-detailed details about why or how I determined my final guidelines. However, if you already know that I&#8217;m a genius and that everything I say is a holy gift handed down to me by Informinus (the Roman god of correct information), then you&#8217;re certainly welcome to skip to the <a href="#designtips">design tips</a> or the <a href="#template">template</a>. If you&#8217;re not yet convinced of my awesomeness, then put on your <acronym title="obsessive compulsive disorder">OCD</acronym> thinking caps and follow me.</p>

<div id="pagesize"></div>
<h2>What are the Twitter page dimensions?</h2>

<p>
In order to create an optimal background image, we need to know the dimensions of the various elements in the page layout. In other words, we need to know where Twitter&#8217;s content is going to appear so we can build our image around it. We&#8217;ll start by measuring the elements whose dimensions are independent of the user&#8217;s monitor resolution. Then we&#8217;ll discuss the dimensions that DO change as the monitor resolution changes.
</p>
<h3>Static Dimensions</h3>
<p>
Some of the dimensions of the header spacing and navigation menu are defined in relative units (meaning they could increase or decrease if a user changes the default font size of their web browser), but for the sake of designing our image, we will assume that our users have not changed the default font size (1em = 12px). Here are the dimensions of the page that we can assume will never change:<br /><br />
<a href="/img/static-twitter-dimensions-full.png" title="Click to view larger image"><img src="/img/static-twitter-dimensions.png" alt="Dimensions of static Twitter page elements" class="aligncenter" width="405" height="161" style="border:1px solid blue; margin-bottom:0;" /></a><span style="font-size:.5em; line-height:100%; display:block; margin:1em auto; text-align:center;">CLICK IMAGE TO VIEW LARGER</span>
</p>
<br />
<p>
In the image above, I have highlighted the dimensions that might be useful to know. The image also has a chart of the heights of each color-coded section. The first measurement represents the height as it is rendered in a web browser. Some of the elements have a second measurement in parentheses&#8211;these represent the dimensions as they are actually defined in Twitter&#8217;s CSS stylesheet. For reference, here are the CSS styles from the original Twitter stylesheet (colored squares correspond to the image above):
</p>

<div style="font-family:monospace; color:#000; line-height:100%;">
<p>
#container {<br />
&nbsp;&nbsp;width:763px;<br />
&nbsp;&nbsp;margin:1em auto; <span style="background-color:#99FF66;">&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;text-align:left;<br />
&nbsp;&nbsp;position:relative;<br />
}</p>
<p>
#logo img {<br />
&nbsp;&nbsp;margin-top:-2px;<br />
&nbsp;&nbsp;position:absolute;<br />
&nbsp;&nbsp;left:0;<br />
}</p>
<p>
.top-navigation&gt;li&gt;a {<br />
&nbsp;&nbsp;padding:.5em .15em; <span style="background-color:#CC66CC;">&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;border:1px solid transparent; <span style="background-color:#CC66CC;">&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;<del>font-size:1.05em;</del><br />
&nbsp;&nbsp;display:inline-block;<br />
}</p>
<p>
body .top-navigation&gt;li&gt;a {<br />
&nbsp;&nbsp;font-size:1em; <span style="background-color:#CC66CC;">&nbsp;&nbsp;</span><br />
}</p>
<p>
.content-bubble-arrow {<br />
&nbsp;&nbsp;margin-top:1em; <span style="background-color:#33CCCC;">&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;padding-top:11px; <span style="background-color:#6666FF;">&nbsp;&nbsp;</span><br />
&nbsp;&nbsp;background-repeat:no-repeat;<br />
&nbsp;&nbsp;background-position:25px 0;<br />
&nbsp;&nbsp;background-image:url(&#8216;/a/1259882278/images/arr2.gif&#8217;);<br />
}</p>
</div>

<p>
The only one that might be confusing is the purple section&#8217;s dimensions. Note that the purple section&#8217;s height is defined by more than one CSS style. Once you take the 12px font&#8217;s line-height into consideration (default = 125% = 15px), you get the purple height as the sum of:
</p>
<p style="text-align:center; font-size:.875em;">
&lt;1px border&gt;&lt;6px padding&gt;&lt;15px line-height&gt;&lt;6px padding&gt;&lt;1px border&gt;
</p>
<br /><br />
<p class="info_mofo">
Damn it! As I&#8217;m writing this, the developers at Twitter are changing their CSS file! Grrrrr. Ok, as far as I can tell, they only removed the style that defines the top nav text as font-size:1em. Since this style was overriding the one before it, deleting it brings us back to 1.05em. I don&#8217;t know which of these is going to be used long-term, so I&#8217;ll just show both. The difference is only a couple of pixels:
</p>
<p>
<a href="/img/static-twitter-dimensions-full-2.png" title="Click to view larger image"><img src="/img/static-twitter-dimensions-2.png" alt="Dimensions of static Twitter page elements" class="aligncenter" width="405" height="161" style="border:1px solid blue; margin-bottom:0;" /></a><span style="font-size:.5em; line-height:100%; display:block; margin:1em auto; text-align:center;">CLICK IMAGE TO VIEW LARGER</span>
</p>
<br />
<h3>Variable Dimensions</h3>

<p>
This is the trickiest part of designing your custom background, and it&#8217;s the area where most people fail. After you upload your new image, it will be positioned in the upper-left corner of your web browser window, and it will stay at that position regardless of the users&#8217; monitor resolutions. However, the container element (i.e. the main page content) is centered in the browser window, so its starting position DOES change, depending on the size of the monitor. You can see this for yourself by going to Twitter.com and adjusting the size of your browser window. As you drag the side of the window to make it bigger/smaller, you should notice that the containing element readjusts so that it&#8217;s always centered. As a result, the visible portion of our background image changes as well. One of the things we need to figure out&#8230;is the relationship between a user&#8217;s monitor resolution and the size of our drawing &#8220;canvas,&#8221; shown here in green:
</p>
<p>
<img src="/img/dimensions.png" alt="Twitter dynamic dimensions" class="aligncenter" width="533" height="285" />
</p>
<h4>Canvas Width vs. Monitor Resolution</h4>
<p>
To find the width of our canvas, we start with the monitor width and subtract out any widths of browser window borders and scroll bars. This is tricky, because scroll bars have different widths, depending on the operating system&#8230;and browser borders have different widths, depending on which browser it is. So we&#8217;re going to have to make a generalization here, erring on the side of caution.
</p>
<p>
After testing all of the major browsers in Windows Vista, I found that most of them have no side borders when the window size is maximized. However, Internet Explorer and Opera both kept some type of borders, even when maximized. Of the two, Internet Explorer had the thickest borders at 2px per side. So our generalized measurement for all browsers will be 4px of total width assigned to browser borders. This generalization assumes that your visitors are using a maximized browser window. (Otherwise, they will have adjusted their browser window to an arbitrary width and height, and you can&#8217;t really plan for that.)
</p>
<p>
<img src="/img/xp-vista-scroll-bars.png" alt="scroll bars in Windows XP and Vista" class="alignright" width="40" height="155" />Scroll bars can change sizes, depending on the operating system being used. I don&#8217;t have access to many different OS&#8217;s, so I only measured the widths in Windows XP (left) and Windows Vista (right). Both came out to 17px wide. If you know of any operating systems that use scroll bars wider than 17px, let me know. Until then, our generalized measurement for all scroll bars will be 17px.
</p>
<p>
After subtracting 21 pixels from the screen resolution, we then subtract the width of the container element, which is 763px. The result equals both sides of the exposed background image, but we only care about the left side, so we divide by 2. Overall, our formula for canvas width is:
</p>
<p style="text-align:center; font-size:.875em;">
canvas width = (monitor width &#8211; 4px borders &#8211; 17px scroll bar &#8211; 763px container) / 2
</p>
<h4>Canvas Height vs. Monitor Resolution</h4>
<p>
Measuring the canvas height is not as accurate as the width was. With the width, we only had to generalize the width of the browser borders and scroll bar. These dimensions do not vary much. But the height has to take more into consideration, such as the height of all menu bars and task bars. These dimensions vary greatly, depending on the browser and the operating system. For example, compare the top of Chrome to the top of Firefox after I installed several Firefox plugins:
</p>
<p>
<img alt="" src="/img/firefox-vs-chrome-top-menus.png" title="menu bars of Firefox vs. Chrome" class="aligncenter" width="574" height="238" />
</p>
<p>
Since the browser choice can make such a big difference in the canvas size, the generalized measurements will be much shorter than what some users will see. We will assume that all users have a ridiculously plugin-laden Firefox installation like mine, and they are running Windows Vista. In addition to the 238px height of the top portion (shown in the comparison above), we must also take the bottom portion into consideration. Here is the Vista task bar + Firefox bottom:
</p>
<p>
<img src="/img/vista-task-bar.png" alt="Vista task bar + Firefox bottom menu bar" class="aligncenter" width="320" height="52" /> 
</p>
<p>
Our generalized formula for canvas height would be:
</p>
<p style="text-align:center; font-size:.875em;">
canvas height = monitor height &#8211; 238px top &#8211; 52px bottom
</p>
<p>
Okay, the hard part is over. Now all we have to do is take a list of common screen resolutions and adjust the width and height, according to our formulas. The end result will be a list of canvas sizes we can expect to work with as we create our custom background image. In order to determine what the most common screen resolutions are, I sampled Google Analytics data taken from 4 different websites over a period of 6 months, from July 1, 2009 &#8211; December 1, 2009. This data represents 3.1 million total visitors, so it should be a pretty good representation of internet users in general. Below are the top 18 screen resolutions and their corresponding canvas sizes. These 2 graphs are the same data, but one is sorted by popularity and the other is sorted by screen resolution:
</p>

<div style="width:50%; float:left; margin-bottom:2em;">
<p style="font-size:.75em; text-align:center;">
SORTED BY MOST POPULAR
</p>
<table cellspacing="0" cellpadding="0" style="font-family:monospace; border:1px solid #CCC; padding:1em; margin:0 auto;">
  <col width="100" />
  <col width="60" />
  <col width="60" />
  <tr style="line-height:100%;">
    <th style="text-align:left;">MONITOR<br />SIZE</th>
    <th>CANVAS<br />SIZE</th>
    <th style="text-align:right;">USAGE</th>
  </tr>
  <tr>
    <td>1024&#215;768</td>
    <td>120&#215;478</td>
    <td align="right">23.0%</td>
  </tr>
  <tr>
    <td>1280&#215;800</td>
    <td>248&#215;510</td>
    <td align="right">21.0%</td>
  </tr>
  <tr>
    <td>1280&#215;1024</td>
    <td>248&#215;734</td>
    <td align="right">11.1%</td>
  </tr>
  <tr>
    <td>1440&#215;900</td>
    <td>328&#215;610</td>
    <td align="right">10.0%</td>
  </tr>
  <tr>
    <td>1680&#215;1050</td>
    <td>448&#215;760</td>
    <td align="right">7.5%</td>
  </tr>
  <tr>
    <td>1920&#215;1200</td>
    <td>568&#215;910</td>
    <td align="right">4.0%</td>
  </tr>
  <tr>
    <td>&nbsp;800&#215;600</td>
    <td>&nbsp;&nbsp;8&#215;310</td>
    <td align="right">2.2%</td>
  </tr>
  <tr>
    <td>1366&#215;768</td>
    <td>291&#215;478</td>
    <td align="right">2.2%</td>
  </tr>
  <tr>
    <td>1152&#215;864</td>
    <td>184&#215;574</td>
    <td align="right">2.0%</td>
  </tr>
  <tr>
    <td>1280&#215;768</td>
    <td>248&#215;478</td>
    <td align="right">1.7%</td>
  </tr>
  <tr>
    <td>1920&#215;1080</td>
    <td>568&#215;790</td>
    <td align="right">1.2%</td>
  </tr>
  <tr>
    <td>&nbsp;320&#215;396</td>
    <td>&nbsp;&nbsp;0&#215;106</td>
    <td align="right">1.0%</td>
  </tr>
  <tr>
    <td>1600&#215;1200</td>
    <td>408&#215;910</td>
    <td align="right">0.9%</td>
  </tr>
  <tr>
    <td>1024&#215;600</td>
    <td>120&#215;310</td>
    <td align="right">0.8%</td>
  </tr>
  <tr>
    <td>1280&#215;960</td>
    <td>248&#215;670</td>
    <td align="right">0.8%</td>
  </tr>
  <tr>
    <td>1280&#215;720</td>
    <td>248&#215;430</td>
    <td align="right">0.7%</td>
  </tr>
  <tr>
    <td>1400&#215;1050</td>
    <td>308&#215;760</td>
    <td align="right">0.7%</td>
  </tr>
  <tr>
    <td>1600&#215;900</td>
    <td>408&#215;610</td>
    <td align="right">0.6%</td>
  </tr>
</table>

</div>
<div style="width:50%; float:left; margin-bottom:2em;">

<p style="font-size:.75em; text-align:center;">
SORTED BY SMALLEST RESOLUTION
</p>
<table cellspacing="0" cellpadding="0" style="font-family:monospace; border:1px solid #CCC; padding:1em; margin:0 auto;">
  <col width="100" />
  <col width="60" />
  <col width="60" />
  <tr style="line-height:100%;">
    <th style="text-align:left;">MONITOR<br />SIZE</th>
    <th>CANVAS<br />SIZE</th>
    <th style="text-align:right;">USAGE</th>
  </tr>
  <tr>
    <td>&nbsp;320&#215;396</td>
    <td>&nbsp;&nbsp;0&#215;106</td>
    <td align="right">1.0%</td>
  </tr>
  <tr>
    <td>&nbsp;800&#215;600</td>
    <td>&nbsp;&nbsp;8&#215;310</td>
    <td align="right">2.2%</td>
  </tr>
  <tr>
    <td>1024&#215;600</td>
    <td>120&#215;310</td>
    <td align="right">0.8%</td>
  </tr>
  <tr>
    <td>1024&#215;768</td>
    <td>120&#215;478</td>
    <td align="right">23.0%</td>
  </tr>
  <tr>
    <td>1152&#215;864</td>
    <td>184&#215;574</td>
    <td align="right">2.0%</td>
  </tr>
  <tr>
    <td>1280&#215;1024</td>
    <td>248&#215;734</td>
    <td align="right">11.1%</td>
  </tr>
  <tr>
    <td>1280&#215;720</td>
    <td>248&#215;430</td>
    <td align="right">0.7%</td>
  </tr>
  <tr>
    <td>1280&#215;768</td>
    <td>248&#215;478</td>
    <td align="right">1.7%</td>
  </tr>
  <tr>
    <td>1280&#215;800</td>
    <td>248&#215;510</td>
    <td align="right">21.0%</td>
  </tr>
  <tr>
    <td>1280&#215;960</td>
    <td>248&#215;670</td>
    <td align="right">0.8%</td>
  </tr>
  <tr>
    <td>1366&#215;768</td>
    <td>291&#215;478</td>
    <td align="right">2.2%</td>
  </tr>
  <tr>
    <td>1400&#215;1050</td>
    <td>308&#215;760</td>
    <td align="right">0.7%</td>
  </tr>
  <tr>
    <td>1440&#215;900</td>
    <td>328&#215;610</td>
    <td align="right">10.0%</td>
  </tr>
  <tr>
    <td>1600&#215;1200</td>
    <td>408&#215;910</td>
    <td align="right">0.9%</td>
  </tr>
  <tr>
    <td>1600&#215;900</td>
    <td>408&#215;610</td>
    <td align="right">0.6%</td>
  </tr>
  <tr>
    <td>1680&#215;1050</td>
    <td>448&#215;760</td>
    <td align="right">7.5%</td>
  </tr>
  <tr>
    <td>1920&#215;1080</td>
    <td>568&#215;790</td>
    <td align="right">1.2%</td>
  </tr>
  <tr>
    <td>1920&#215;1200</td>
    <td>568&#215;910</td>
    <td align="right">4.0%</td>
  </tr>
</table>
</div>

<p style="margin-top:2em; clear:both;">
Many of these screen resolutions have similar widths, so I compressed the top 18 screen resolutions into the top 6 screen <em>widths</em>. The majority of the poorly-designed backgrounds I&#8217;ve seen contain information or graphics that are <strong>too wide</strong>. Look at the following graph&#8230;you should notice that more than a quarter of internet users are using screens that are 1024 pixels wide. This means your background image needs to display all your contact information and important graphics <strong>within the leftmost 120 pixels</strong>&#8211;otherwise a quarter of your viewers won&#8217;t be able to read it!
</p>
<p>
<img src="/img/common-screen-widths.png" alt="common computer screen widths" class="aligncenter" width="375" height="425" />
</p>
<p>
I haven&#8217;t seen nearly as many backgrounds exceeding the canvas height, but I&#8217;ll show the chart anyway. The data in this chart suggests that you <strong>keep your important information within the topmost 478 pixels</strong>.
</p>
<p>
<img src="/img/common-screen-heights.png" alt="common computer screen heights" class="aligncenter" width="375" height="425" />
</p>

<h3>More Screen Resolution Statistics</h3>
<p>
The following table contains <a href="http://www.w3schools.com/browsers/browsers_display.asp">popular screen size data</a> provided by W3Cschools.com. They also have <a href="http://www.w3schools.com/browsers/default.asp">web browser stats</a> that you might find useful or interesting.
</p>
<p style="font-size:.75em; text-align:center; font-weight:bold; line-height:normal;">
W3Cschools.com Users<br />January 2010
</p>
<table cellspacing="0" cellpadding="0" style="font-family:monospace; border:1px solid #CCC; padding:1em; margin:0 auto;">
	<tr style="line-height:100%;">
		<th align="left">Display<br />Resolution</th>
		<th align="right">% of Total<br />Users</th>
	</tr>
	<tr>
		<td>1024&#215;768</td>
		<td align="right">20.0</td>
	</tr>
	<tr>
		<td>1280&#215;1024</td>
		<td align="right">18.2</td>
	</tr>
	<tr>
		<td>1280&#215;800</td>
		<td align="right">17.3</td>
	</tr>
	<tr>
		<td>1440&#215;900</td>
		<td align="right">10.5</td>
	</tr>
	<tr>
		<td>1680&#215;1050</td>
		<td align="right">10.0</td>
	</tr>
	<tr>
		<td>Other &gt; 1024&#215;768</td>
		<td align="right">4.8</td>
	</tr>
	<tr>
		<td>1920&#215;1200</td>
		<td align="right">4.6</td>
	</tr>
	<tr>
		<td>1366&#215;768</td>
		<td align="right">3.6</td>
	</tr>
	<tr>
		<td>Unknown</td>
		<td align="right">3.0</td>
	</tr>
	<tr>
		<td>1920&#215;1080</td>
		<td align="right">2.3</td>
	</tr>
	<tr>
		<td>1152&#215;864</td>
		<td align="right">2.1</td>
	</tr>
	<tr>
		<td>1600&#215;1200</td>
		<td align="right">1.4</td>
	</tr>
	<tr>
		<td>1280&#215;768</td>
		<td align="right">1.2</td>
	</tr>
	<tr>
		<td>800&#215;600</td>
		<td align="right">1.0</td>
	</tr>
	<tr>
		<td>640&#215;480</td>
		<td align="right">0.0</td>
	</tr>
</table>

<div id="imagesize"></div>
<h2>What are the Twitter background image dimensions?</h2>
<p>
Many people fail to realize that <strong>the viewable portion of a Twitter background image changes</strong>, depending on the dimensions of the viewer&#8217;s monitor. In other words, there are no one-size-fits-all measurements. However, Twitter does impose a limit on the width of any images you upload, and it will automatically scale your image down to 2048px wide. The height is not limited, but it will change proportionately to the width, if Twitter has to scale your image down to meet the 2048 pixel cutoff.
</p>
<h3><strong>Recommended</strong> Background Image Dimensions</h3>
<p>
<strong>Width:</strong> 1920 pixels<br />
<strong>Height:</strong> 1200 pixels
</p>
<h3>Maximum Background Image Dimensions</h3>
<p>
<strong>Width:</strong> 2048 pixels<br />
<strong>Height:</strong> no limit
</p>
<p>
Fitting your important information within your visitors&#8217; viewable background is only half the battle. The other half is making sure your image completely fills the background on your viewers&#8217; screens. There are 2 ways to accomplish this.
</p>
<h3>Make it Big</h3>
<p>
The simplest way to make sure your background image is big enough&#8230;is to make it as big as the biggest monitors you can reasonably expect your visitors to use. In my opinion, the minimum size you should use is 1920&#215;1200 (this size is used by more than 5% of users). This will cover the vast majority of your visitors&#8217; screens. If your image is relatively simple (i.e. increasing the dimensions by a lot only increases the file size by a little), then you might consider going up to 2048&#215;1600, which is the maximum width that Twitter allows, coupled with the height of a 30&#8243; monitor.
</p>
<h3>Blend the Edges</h3>
<p>
The second way to make sure your image is big enough&#8230;is to use an image that terminates in a solid color at the edges, and set that color as your background-color. To change your background color, you click Settings &rarr; Design.
</p>
<p>
<img src="/img/twitter-background-color.png" alt="change your Twitter background color" class="aligncenter" width="536" height="297" />
</p>
<p>
If I were designing a background image to use with the color #C4E0EC, it might look something like this:
</p>
<p>
<img src="/img/twitter-background.png" alt="Worlds Greatest SEO Twitter background image" class="alignnone" width="45" height="241" style="margin-left:38px;" />
</p>
<p style="text-align:center;">
And adding it to my #C4E0EC background would be seamless:
</p>
<p>
<img src="/img/seamless-twitter-background.png" alt="seamless Twitter background image" class="aligncenter" width="500" height="236" />
</p>
<p class="info_mofo">
If you already have an image, but you don&#8217;t know how to match the background color to it&#8230;you can use the Firefox plugin called <a href="http://www.colorzilla.com/firefox/">Colorzilla</a>, which lets you click on anything in your browser and it tells you the color code for that pixel. It&#8217;s basically like the eyedropper tool in Paint, Photoshop, Illustrator, etc., but it works in your browser.
</p>

<div id="designtips"></div>
<h2>Tips for Designing Your Own Twitter Background</h2>
<p>
<strong>1. </strong>If your custom background image displays important information like your business name, website, email address, etc., then it should be no wider than the leftmost 120 pixels. Any wider than this and your information will be unreadable to about 25% of your visitors (using monitors that are 1024px wide).
</p>
<p>
<strong>2. </strong>The viewable height of your background image depends on which web browser your visitors are using, how many plugins they&#8217;ve installed in it, and which operating system they&#8217;re using (i.e. the height of the task bar). A conservative estimate of your usable background would be the topmost 478 pixels.
</p>
<p>
<strong>3. </strong>The space between the document window and the top of the main container element (i.e., the space where the Twitter logo and top navigation are located) is 66 pixels tall. If your background image displays contact information in the top 66 pixels, then visitors using 800&#215;600 monitors (only about 2-3% of users) will see the Twitter logo on top of that information. If you wish to avoid this, display your information below the top 66px.
</p>
<p>
<strong>4. </strong>To make sure your background image fills your visitors&#8217; entire screens, you have two options. You can blend your image into a solid color around the edges and set your Twitter profile&#8217;s background-color to match it. Or you can make your background big enough to cover the highest resolutions available on the consumer market. If you choose the latter, your background image should be at least 1920&#215;1200.
</p>
<div id="template"></div>
<h2>Custom Twitter Background Image Template</h2>
<p>
The images below are guides to help you with the design of your custom Twitter background. The one on the left is the recommended 1920&#215;1200 resolution, and the one on the right is the XL resolution of 2048&#215;1600. The XL version is not very practical, but I&#8217;ve included it for the sake of completeness. The colored boxes represent the canvas sizes as they are viewed in each of the top 6 most common screen sizes, and the XL version also contains the yellow area, which represents the viewable dimensions of the 2560&#215;1600 pixel monitors. The images are also annotated with helpful tips that explain each section of the layout. You can copy an image and paste it into your image editing program, and then build your own background image over it.
</p>

<div style="width:50%; float:left; margin-top:2em;">
<h4 style="text-align:center;">Recommended Background Size</h4>
<p style="height:224px;">
<a href="/img/twitter-background-template.png" title="Click to view larger image"><img src="/img/twitter-background-template-small.png" alt="custom Twitter background image template" class="aligncenter mb1em" width="240" height="150" /></a><span style="font-size:.5em; line-height:100%; display:block; margin:1em auto; text-align:center;">CLICK IMAGE TO VIEW LARGER</span>
</p>
<p>
<br /><a href="http://www.seomofo.com/downloads/twitter-template-1920x1200.zip"><img src="/img/icons/photoshop.png" alt="download the original Photoshop file" class="aligncenter mb1em" width="112" height="92" /></a><span style="font-size:.5em; line-height:100%; display:block; margin:1em auto; text-align:center;">CLICK ICON TO DOWNLOAD .PSD FILE</span>
</p>
</div>
<div style="width:50%; float:left; margin-top:2em;">
<h4 style="text-align:center;">Maximum Background Size</h4>
<p>
<a href="/img/twitter-background-template-xl.png" title="Click to view larger image"><img src="/img/twitter-background-template-xl-small.png" alt="custom Twitter background image template" class="aligncenter mb1em" width="256" height="200" /></a><span style="font-size:.5em; line-height:100%; display:block; margin:1em auto; text-align:center;">CLICK IMAGE TO VIEW LARGER</span>
</p>
<p>
<br />
<a href="http://www.seomofo.com/downloads/twitter-template-2048x1600.zip"><img src="/img/icons/photoshop.png" alt="download the original Photoshop file" class="aligncenter mb1em" width="112" height="92" /></a><span style="font-size:.5em; line-height:100%; display:block; margin:1em auto; text-align:center;">CLICK ICON TO DOWNLOAD .PSD FILE</span>
</p>
</div>
<div style="clear:both;"></div><img src="http://feeds.feedburner.com/~r/seomofo/~4/uUdtRysQlHs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/antisocial-media/custom-twitter-background.html/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Google Turned My Plain Text URL Into a Link</title>
		<link>http://www.seomofo.com/experiments/text-url-into-a-link.html</link>
		<comments>http://www.seomofo.com/experiments/text-url-into-a-link.html#comments</comments>
		<pubDate>Tue, 08 Dec 2009 17:11:54 +0000</pubDate>
		<dc:creator>SEO mofo</dc:creator>
				<category><![CDATA[Experiments]]></category>

		<guid isPermaLink="false">http://www.seomofo.com/?p=814</guid>
		<description><![CDATA[I found at least one example of Google treating a text URL like a link. However, what I found is not an intentional use of text URLs as a ranking signal.]]></description>
			<content:encoded><![CDATA[<p></p><img src="/img/google-eating-text.png" alt="Google eating text and crapping links" class="alignright" width="274" height="274" style="margin-bottom:0;" />
<p class="info_mofo" style="width:40%;">
If you want to stay current with all the incredible information this site has to offer, you can <a href="http://feeds.seomofo.com/seomofo">subscribe to my feed</a><sup style="color:#c00; font-weight:bold;">1</sup>, or set your web browser&#8217;s home page to http://www.seomofo.com<sup style="color:#c00; font-weight:bold;">2</sup>.
</p>
<p style="font-size:.75em;">
<span style="color:#c00; font-weight:bold;">1</span> &#8211; Example of a link.<br />
<span style="color:#c00; font-weight:bold;">2</span> &#8211; Example of a plain text URL.
</p>
<p>
One of the <acronym title="search engine optimization">SEO</acronym> theories I&#8217;ve heard is that if Google finds a plain text URL in your content, it might interpret that URL as some kind of signal. Does it count as a link to the URL? Does it contribute to the URL&#8217;s authority? Does it count towards anything at all? Probably not. Matt Cutts addressed this theory in one of his Webmaster videos and essentially killed it:
</p>
<p class="mofo_embed_youtube">
<object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/nlByfISlj5w&#038;hl=en_US&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/nlByfISlj5w&#038;hl=en_US&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object>
</p>
<p>
It sounds to me like plain text URLs aren&#8217;t counted for anything&#8230;but you can never be too confident about these sorts of things. Sometimes these theories end up being partially true, simply because Google engineers have overlooked rare cases that indirectly validate the theory. I came across a particular case today that shows at least one instance of Google treating a text URL like a link. Mind you, what I found is more like a bug in Google&#8217;s caching logic, and not an intentional use of text URLs as a ranking signal. In other words, the information in this post may be interesting, but it&#8217;s virtually useless. (Unlike most SEO bloggers, I hate publishing useless shit, but I&#8217;ll make an exception for myself this time.)
</p>
<p>
Earlier today, I viewed the text-only cached copy of my amazing article about <a href="http://www.seomofo.com/orm/monitor-sidewiki-comments.html">monitoring Google Sidewiki comments through RSS</a>. My goal was to see how Google was caching my social media widgets that I insert at the bottom of every blog post. If you don&#8217;t know what I&#8217;m talking about, scroll to the end of this article and take a look at my sweet widget collection. And while you&#8217;re down there, you should probably try out each of the widgets and make sure they&#8217;re functioning properly. Also, according to some recent studies I just made up, promoting my site has been shown to improve your site&#8217;s rankings and increase traffic!
</p>
<p>
Anyway&#8230;back to my story. So I was viewing Google&#8217;s cached text version of my page, because I wanted to see if Google was executing the widget scripts that are remotely hosted on their respective social network domains. Why would I care about that? Well&#8230;I&#8217;ve run into problems before where Google has executed locally-hosted scripts, which led to a whole bunch of JavaScript-driven links being counted as regular HTML links. (FYI: <a href="http://www.youtube.com/watch?v=mmoHmfy5AcQ">you CAN lose PageRank through JavaScript links</a>.)
</p>
<p>
So I viewed the source code of Google&#8217;s cached page and compared it to the original source code. I was glad to see Google was NOT caching any content from the JavaScript-driven widgets. Instead, it just stripped out the <code>&lt;script&gt;</code> elements. But then I noticed something very odd: Google had also stripped out the <code>&lt;textarea&gt;</code> tags that I use for my link widget. Take a look&#8230;you&#8217;ll notice that lines 2 and 4 are gone:
</p>
<p class="mofo_label">
Original Code
</p>
<pre class="brush: xml;">
&lt;div class=&quot;post_widget_mofo&quot; id=&quot;copy_link_mofo&quot;&gt;
	&lt;textarea onclick=&quot;this.focus();this.select();&quot; rows=&quot;5&quot; cols=&quot;24&quot;&gt;
		&lt;a href=&quot;http://www.seomofo.com/orm/monitor-sidewiki-comments.html&quot;&gt;How to Monitor Google Sidewiki Comments&lt;/a&gt;
	&lt;/textarea&gt;
	&lt;p style=&quot;color:#999; font-size:10px; line-height:1.2em; text-align:center; margin:0;&quot;&gt;Link&lt;/p&gt;
&lt;/div&gt;
</pre>
<p class="mofo_label">
Google&#8217;s Cached Code
</p>
<pre class="brush: xml;">
&lt;div class=&quot;post_widget_mofo&quot; id=&quot;copy_link_mofo&quot;&gt;
	&lt;a href=&quot;http://www.seomofo.com/orm/monitor-sidewiki-comments.html&quot;&gt;How to Monitor Google Sidewiki Comments&lt;/a&gt;
	&lt;p style=&quot;color:#999; font-size:10px; line-height:1.2em; text-align:center; margin:0;&quot;&gt;Link&lt;/p&gt;
&lt;/div&gt;
</pre>
<p>
When text and HTML code are enclosed in <code>&lt;textarea&gt;</code> tags, web browsers will not render the HTML; they will treat all of it like plain text. This is why my link widget contains un-encoded HTML but is displayed in the browser as plain text:
</p>
<div style="margin:0 auto; width:50px; font-size:75%;">
	<textarea onclick="this.focus();this.select();" rows="5" cols="24" style="width:100%; overflow:hidden; margin:0; font-size:10px; color:#666; background-color:#F3F6FF; border:1px solid #CCC; -moz-border-radius:.5em; -webkit-border-radius:.5em;"><a href="http://www.seomofo.com/orm/monitor-sidewiki-comments.html">How to Monitor Google Sidewiki Comments</a></textarea>
	<p style="color:#999; font-size:10px; line-height:1.2em; text-align:center; margin:0;">Link</p>
</div>
<br />
<p>
&#8230;but obviously if Google strips the <code>&lt;textarea&gt;</code> tags, then all that&#8217;s left is the HTML code, and now Google shows a link for what was supposed to be plain text:
</p>
<p class="mofo_label">
Original Widgets
</p>
<p>
<img src="/img/social-media-widgets.png" alt="social media widgets" class="aligncenter" width="570" height="90" />
</p>
<p class="mofo_label">
Cached Widgets
</p>
<p>
<img alt="" src="/img/text-url-as-link.png" title="text URL showing as a link" class="aligncenter" width="427" height="99" />
</p>
<p>
To be honest, I didn&#8217;t even know <code>&lt;textarea&gt;</code> elements would show un-encoded HTML as text. I&#8217;m usually very conscious about encoding HTML brackets (using <code>&amp;lt;</code> instead of <code>&lt;</code> and <code>&amp;gt;</code> instead of <code>&gt;</code>), but I didn&#8217;t catch this one because it was rendering the way I wanted it to.
</p>
<p>
I have updated my WordPress function to use encoded HTML brackets in my widget, but I still want to play around with this bug, so I&#8217;m going to set up several <code>&lt;textarea&gt;</code> elements with various code snippets in them&#8230;and wait for Google to cache them. I&#8217;ll update this post in a few days with the results&#8230;but it will probably still be virtually worthless information.
</p>
<br />
<div id="exhibit_a" style="width:25%; float:left;">
	<p class="mofo_label">Exhibit A</p>
	<textarea onclick="this.focus();this.select();" rows="5" cols="16" style="width:90%; margin:0 auto; font-size:.75em;" style="width:90%; margin:0 auto; font-size:.75em;"><a href="http://www.seomofo.com/">World&#8217;s Greatest SEO</a></textarea>
</div>
<div id="exhibit_b" style="width:25%; float:left;">
	<p class="mofo_label">Exhibit B</p>
	<textarea rows="5" cols="16" style="width:90%; margin:0 auto; font-size:.75em;"><a href="http://www.seomofo.com/">World&#8217;s Greatest SEO</a></textarea>
</div>
<div id="exhibit_c" style="width:25%; float:left;">
	<p class="mofo_label">Exhibit C</p>
	<textarea onclick="this.focus();this.select();" rows="5" cols="16" style="width:90%; margin:0 auto; font-size:.75em;"><img src="http://www.seomofo.com/img/seo-mofo-149px.png" alt="SEO Mofo" /></textarea>
</div>
<div id="exhibit_d" style="width:25%; float:left;">
	<p class="mofo_label">Exhibit D</p>
	<textarea onclick="this.focus();this.select();" rows="5" cols="16" style="width:90%; margin:0 auto; font-size:.75em;"><script type="text/javascript">alert('OMG!');</script></textarea>
</div>
<br style="clear:both;" />
<br />
<p style="font-size:.75em; line-height:125%;">
<strong>Exhibit A:</strong> this is basically a repeat of what I&#8217;ve already seen. I&#8217;m including this to verify that Google is still behaving the way I observed already.<br /><br />
<strong>Exhibit B:</strong> the onclick attribute is removed from the <code>&lt;textarea&gt;</code> element. Is this attribute what caused Google to strip out these tags?<br /><br />
<strong>Exhibit C:</strong> the link HTML has been replaced with an image tag. Can I smuggle an image into Google&#8217;s text-only cache by wrapping it in <code>&lt;textarea&gt;</code> tags?<br /><br />
<strong>Exhibit D:</strong> the link HTML has been replaced with a simple JavaScript function. Can I execute JavaScript from within Google&#8217;s text-only cache by wrapping it in <code>&lt;textarea&gt;</code> tags?<br /><br />
</p>
<br />
<h2>The Results Are In!</h2>
<p>
Wow, that was fast. According to Google&#8217;s cache date, this post was crawled at 19:57:08 GMT. I posted it at 9:11 am, Pacific time&#8230;so that would be 17:11 GMT&#8230;which means it took Google about 2 hours and 46 minutes to find my page and crawl it. I don&#8217;t know when it appeared cached, but it couldn&#8217;t have been more than 4 hours from the crawl time (I noticed it was cached when I checked at about 23:45 GMT).
</p>
<p>
So here are the results! First off, here is the cached code (you don&#8217;t have to analyze it too much&#8230;I&#8217;ll interpret it for you below):
</p>
<pre class="brush: xml;">
&lt;div id=&quot;exhibit_a&quot; style=&quot;width:25%; float:left;&quot;&gt;
	&lt;p class=&quot;mofo_label&quot;&gt;Exhibit A&lt;/p&gt;
	&lt;a href=&quot;http://www.seomofo.com/&quot;&gt;World&amp;#8217;s Greatest SEO&lt;/a&gt;
&lt;/div&gt;
&lt;div id=&quot;exhibit_b&quot; style=&quot;width:25%; float:left;&quot;&gt;
	&lt;p class=&quot;mofo_label&quot;&gt;Exhibit B&lt;/p&gt;
	&lt;a href=&quot;http://www.seomofo.com/&quot;&gt;World&amp;#8217;s Greatest SEO&lt;/a&gt;
&lt;/div&gt;
&lt;div id=&quot;exhibit_c&quot; style=&quot;width:25%; float:left;&quot;&gt;
	&lt;p class=&quot;mofo_label&quot;&gt;Exhibit C&lt;/p&gt;
	SEO Mofo
&lt;/div&gt;
&lt;div id=&quot;exhibit_d&quot; style=&quot;width:25%; float:left;&quot;&gt;
	&lt;p class=&quot;mofo_label&quot;&gt;Exhibit D&lt;/p&gt;
	
&lt;/div&gt;
</pre>
<p>
Here&#8217;s what it looks like rendered:
</p>
<p>
<img src="/img/cached-results.png" alt="textarea code samples rendered in Googles cached text" class="aligncenter" width="538" height="67" />
</p>
<p>
And finally&#8230;here&#8217;s what it all means:
</p>
<p style="font-size:.75em; line-height:125%;">
<strong>Exhibit A:</strong> as you can see, Google turned our HTML text into a link by removing the <code>&lt;textarea&gt;</code> tags. This is just more of what we already saw.<br /><br />
<strong>Exhibit B:</strong> this has also been stripped of its <code>&lt;textarea&gt;</code> tags, which suggests that the onclick attribute in the <code>&lt;textarea&gt;</code> tag was NOT the reason why Google removes them.<br /><br />
<strong>Exhibit C:</strong> this has also been stripped, but so has my <code>&lt;img&gt;</code> tag, leaving nothing but the alt text in its place. This suggests that Google parses the content nested in the <code>&lt;textarea&gt;</code> element independently. My attempt to smuggle in an image failed.<br /><br />
<strong>Exhibit D:</strong> same result as Exhibit C, but this was a <code>&lt;script&gt;</code> element, so it didn&#8217;t have any alt text to leave behind&#8211;just a hole where the script used to be. If the <code>&lt;img&gt;</code> trick failed, then it makes sense that this one would too.<br /><br />
</p>
<h2>Conclusion</h2>
<p>
The conclusion here is that Google&#8217;s engineers have overlooked a minor detail. When Google processes a page and prepares the text-only content, it fails to recognize that the content of a <code>&lt;textarea&gt;</code> element should be treated like <em>text</em> and not like <em>HTML code</em><sup>&dagger;</sup>. If Google is going to strip out the <code>&lt;textarea&gt;</code> tags, it should also make sure the newly-exposed content is encoded properly so it doesn&#8217;t render as HTML.<br /><br />&dagger; The W3C specification says: &#8220;The <a href="http://www.w3.org/TR/html401/interact/forms.html#h-17.7">TEXTAREA</a> element creates a multi-line text input control. User agents should use the contents of this element as the initial value of the control and should render this text initially.&#8221;
</p>
<h3>Any Takeaways?</h3>
<p>
Not much to take away here. The only things I can think of are:
</p>
<ol>
<li>If you&#8217;re trying to comment-spam a site that doesn&#8217;t allow links, maybe it allows links wrapped in <code>&lt;textarea&gt;</code> tags? Ha. Somehow I doubt any CMS programmers would make a special exception like this&#8230;but hey, it&#8217;s possible.</li>
<li>Every once in awhile, view a couple of your pages&#8217; cached text versions. A lot of times it will reveal content that Google is caching that you don&#8217;t want getting cached, for example: &#8220;This site requires Flash&#8230;blah blah blah&#8230;please click here to go to the Flash download page. If you get lost, just follow my PageRank.&#8221;</li>
</ol>
<br />
<div style="text-align:center;">
<h2>Sweet Widget Collection</h2>
<p style="font-size:.875em; margin-top:0;">
Go ahead&#8230;you can touch them.
</p>
</div>



<img src="http://feeds.feedburner.com/~r/seomofo/~4/VsDgM9Z_kZs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.seomofo.com/experiments/text-url-into-a-link.html/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
