<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Zach Browne</title>
	<atom:link href="http://zachbrowne.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://zachbrowne.com</link>
	<description>Blogger, Developer &#38; Web Strategist</description>
	<lastBuildDate>Thu, 02 Feb 2012 16:58:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Track and Chart the Daily Fluctuations of Keyword Searches at RankPulse</title>
		<link>http://zachbrowne.com/9240-track-and-chart-the-daily-fluctuations-of-keyword-searches-at-rankpulse/</link>
		<comments>http://zachbrowne.com/9240-track-and-chart-the-daily-fluctuations-of-keyword-searches-at-rankpulse/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 20:28:51 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Website Reviews]]></category>
		<category><![CDATA[Chart]]></category>
		<category><![CDATA[Daily]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[Keyword Searches]]></category>
		<category><![CDATA[RankPulse]]></category>
		<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[search engines]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=9240</guid>
		<description><![CDATA[Every time you visit Google and type in a term or phrase, Google must decide which websites to display and in what order. Some keywords appear in Google&#8217;s database hundreds of millions of times, however the first page of the search results displays only ten websites. Google spends a ton of time and resources to...]]></description>
			<content:encoded><![CDATA[<p></p><p><a rel="nofollow" href="http://zachbrowne.blob.core.windows.net/cdn/2011/12/rankpulse.jpg"><img src="http://zachbrowne.blob.core.windows.net/cdn/2011/12/rankpulse.jpg" alt="RankPulse" title="RankPulse" width="250" height="193" class="alignleft size-full wp-image-9241" /></a>Every time you visit Google and type in a term or phrase, Google must decide which websites to display and in what order. Some keywords appear in Google&#8217;s database hundreds of millions of times, however the first page of the search results displays only ten websites. Google spends a ton of time and resources to ensure that the top results are the most relavent to your query as possible.</p>
<p>Google, like the other leading search engines, rely on very complex algorithms that consistently change to determine which websites to display first and in what order; they literally tweak the algorithms daily. As a result, the rankings are always fluctuating; sometimes a position or two and sometimes hundreds of positions. This is where <a rel="nofollow" href="http://www.rankpulse.com" title="RankPulse">RankPulse</a> comes in &#8211; it is a rudimentary but valuable website that uses Google&#8217;s own API to track and chart the daily fluctuations of the top 1,000 keyword searches at Google.</p>
<p>Search engines have been the primary gateway to an unlimited amount of forever growing content, RankPulse provides some insight into how they work. One of their primary goals is to show webmasters that unscrupulous search engine optimization (SEO) techniques may yield temporary benefits, they are not foundations for a sound and sustainable website.</p>
<p>So check it out and bookmark it. It&#8217;s a great resource to use in multiple situations.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/9240-track-and-chart-the-daily-fluctuations-of-keyword-searches-at-rankpulse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Cube Shaped Printer Creates iPhone Sized Newspapers from Your Social Media Feeds</title>
		<link>http://zachbrowne.com/9198-new-cube-shaped-printer-creates-iphone-sized-newspapers-from-your-social-media-feeds/</link>
		<comments>http://zachbrowne.com/9198-new-cube-shaped-printer-creates-iphone-sized-newspapers-from-your-social-media-feeds/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 17:05:33 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Berg Matt Web]]></category>
		<category><![CDATA[Cube]]></category>
		<category><![CDATA[design studio]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[phone]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[Printer]]></category>
		<category><![CDATA[Sized]]></category>
		<category><![CDATA[Social Media Feeds]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=9198</guid>
		<description><![CDATA[Berg, a design studio in London behind the first magazine platform for the iPad, has created a very cool, small, box-shaped printer. It connects to a cloud platform and you can place it anywhere you want. It is always thinking and finds your favorite articles and assembles the content you care about into a very...]]></description>
			<content:encoded><![CDATA[<p></p><p><img class="alignleft size-full wp-image-9199" title="Little-Printer" src="http://zachbrowne.blob.core.windows.net/cdn/2011/11/Little-Printer.jpg" alt="Little Printer by Berg" width="150" height="150" /><a title="Berg" rel="nofollow" href="http://bergcloud.com/">Berg</a>, a design studio in London behind the first magazine platform for the iPad, has created a very cool, small, box-shaped printer. It connects to a cloud platform and you can place it anywhere you want. It is always thinking and finds your favorite articles and assembles the content you care about into a very neat design twice a day. Called the &#8220;Little Printer&#8221;, it&#8217;s planned launch date is 2012 and will launch with a few big named partners such as Google, Arup, Foursquare and the Guardian.</p>
<p>Once you configure Little Printer from your phone, it will deliver print outs of your favorite content to actually read off-screen. It is a small white cube with a black stencil of what seems to be a child&#8217;s face and prints iPhone width paper at lengths of about 10 inches long.</p>
<p>CEO of Berg Matt Web feels that online information can be made more &#8216;palatable&#8217; in physical form. I guess we&#8217;ll find out soon. I think it a unique and interesting idea. I&#8217;ve personally missed the feel of paper and look forward to making sure I have a charge on my phone before I read the news. Also staring at a screen all day for a change might not be such a bad thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/9198-new-cube-shaped-printer-creates-iphone-sized-newspapers-from-your-social-media-feeds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Commands for Moving WordPress to a New Domain</title>
		<link>http://zachbrowne.com/8409-mysql-commands-for-moving-wordpress-to-a-new-domain/</link>
		<comments>http://zachbrowne.com/8409-mysql-commands-for-moving-wordpress-to-a-new-domain/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 01:32:30 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[http://old-domain.com]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web files]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=8409</guid>
		<description><![CDATA[When you move WordPress to a new domain you would think that just moving your database and your web files over and launching it would do the trick… but it doesn’t. Not only will your custom url settings be skewed but the database will redirect most links back to the original site. Once you’ve moved...]]></description>
			<content:encoded><![CDATA[<p></p><p>When you move WordPress to a new domain you would think that just moving your database and your web files over and launching it would do the trick… but it doesn’t. Not only will your custom url settings be skewed but the database will redirect most links back to the original site. Once you’ve moved the database and web files you still need to use either <a title="PHPMyAdmin" href="http://www.phpmyadmin.net/home_page/index.php" rel="nofollow">PHPMyAdmin</a> or a program like my favorite, <a title="Navicat for MySQL" href="http://www.navicat.com/en/products/navicat_mysql/mysql_overview.html" rel="nofollow">Navicat for MySQL</a>. Just connect to your database and issue these three commands in the console:</p>
<pre>UPDATE wp_options SET option_value = replace(option_value, 'http://old-domain.com', 'http://new-domain.com') WHERE option_name = 'home' OR option_name = 'siteurl';</pre>
<pre>UPDATE wp_posts SET guid = replace(guid, 'http://old-domain.com','http://new-domain.com');</pre>
<pre>UPDATE wp_posts SET post_content = replace(post_content, 'http://old-domain.com', 'new-domain.com');</pre>
<p>Good luck, and thanks to <a title="My Digital Life" href="http://www.mydigitallife.info/how-to-move-wordpress-blog-to-new-domain-or-location/" rel="nofollow">My Digital Life</a> for the tutorial that I learned this from.</p>
<p><strong>Updated 12/01/2011.</strong></p>
<p>Quoted from Bill below in the comments, in case you miss it ~ Very important step.</p>
<blockquote><p>There’s one set of URLs that can’t be done this way – serialized arrays. If you do a find/replace on a serialized array and the length of the URL changes, the whole array gets destroyed. The most common data you’ll have this issue with is widgets. I include a few shortcodes for generating URLs ( <a rel="nofollow" href="https://github.com/billerickson/BE-Genesis-Child/blob/master/lib/functions/shortcodes.php ">https://github.com/billerickson/BE-Genesis-Child/blob/master/lib/functions/shortcodes.php</a>), and then I can use those in text widgets like this:</p>
<p>Here’s some more information on my technique <a rel="nofollow" href="http://www.billerickson.net/how-to-move-your-wordpress-website/">http://www.billerickson.net/how-to-move-your-wordpress-website/</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/8409-mysql-commands-for-moving-wordpress-to-a-new-domain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not SEO Anymore, It&#8217;s SSOM</title>
		<link>http://zachbrowne.com/8884-not-seo-anymore-its-ssom/</link>
		<comments>http://zachbrowne.com/8884-not-seo-anymore-its-ssom/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 14:08:18 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[anchor text]]></category>
		<category><![CDATA[building]]></category>
		<category><![CDATA[competitors analysis]]></category>
		<category><![CDATA[creation guidelines]]></category>
		<category><![CDATA[Quality]]></category>
		<category><![CDATA[set]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[social outreach]]></category>
		<category><![CDATA[URLs]]></category>
		<category><![CDATA[word separators]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=8884</guid>
		<description><![CDATA[I recently read a post on SEOmoz.com that inferred that SEO is Dead&#8230; Interesting comment until I read the solution by SEOCopy. Makes sense he? The steps: 1. Technical SEO – Define and resolve technical issues with the site, such as: Canonical 4xx and 5xx errors 3xx codes Duplicate content Broken links Slow site performance...]]></description>
			<content:encoded><![CDATA[<p></p><p>I recently read a post on SEOmoz.com that inferred that SEO is Dead&#8230; Interesting comment until I read the solution by <a rel="nofollow" href="http://www.seomoz.org/users/profile/291753">SEOCopy</a>. Makes sense he?</p>
<p>The steps:</p>
<p>1. Technical SEO – Define and resolve technical issues with the site, such as:</p>
<ul>
<li>Canonical</li>
<li>4xx and 5xx errors</li>
<li>3xx codes</li>
<li>Duplicate content</li>
<li>Broken links</li>
<li>Slow site performance</li>
<li>Non-indexation of URLs</li>
</ul>
<p>2. Key Terms/Competitors Analysis – Analyze and define competitors / relevant key terms</p>
<p>3. On page SEO – Define and resolve on page issues, such as:</p>
<ul>
<li>Empty page titles/meta tags</li>
<li>Relevance of site content</li>
<li>Quality of site content</li>
</ul>
<p>4. Content Development – Define targeted, relevant content strategies</p>
<ul>
<li>Develop quality, targeted, relevant content</li>
<li>Develop company-based content creation guidelines, which include:
<ul>
<li>How titles will be written (for SERPs and on page)</li>
<li>How meta data will be handled</li>
<li>A set of foundational topics</li>
<li>A set of secondary topics</li>
<li>A set of tertiary topics</li>
<li>How bios will be written</li>
<li>How URLs will be handled. Examples:
<ul>
<li>Short</li>
<li>Stop words stripped</li>
<li>Hyphens, underscores or pluses, etc. as word separators</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>5. Digital Asset Guidelines – Define how the company will deal with digital assets, such as:</p>
<ul>
<li>Set up guidelines/checklist to handle PDFs, such as filling in document properties</li>
<li>Set up guidelines/checklist for other types of documents, such as Excel files</li>
<li>Set up guidelines for optimizing videos for upload and hosting on YouTube or other video sites</li>
</ul>
<p>6. Link Building Strategies – Define how link building programs will be handled</p>
<ul>
<li>Develop link building guidelines, including:
<ul>
<li>Type and quality of potential linking sites (for outreach linking)</li>
<li>Internal linking strategies</li>
<li>External linking strategies</li>
<li>Anchor text guidelines</li>
</ul>
</li>
<li>Define whether local optimization is viable and, if so, where to develop accounts, such as:
<ul>
<li>Google Places</li>
<li>Yelp</li>
<li>Yellow Pages</li>
</ul>
</li>
</ul>
<p>7. Social Strategies – Define how social outreach programs will be handled</p>
<ul>
<li>Develop social guidelines, including:
<ul>
<li>How business profiles will be set up</li>
<li>Should employee personal profiles be connected to the business site?
<ul>
<li>If yes, should the business site have a disclaimer that employees’ views do not reflect the views of the company?</li>
</ul>
</li>
<li>Define how links will be handled when sharing on social networks. Example:</li>
<li>Using only tinyurl, bit.ly, etc. to shorten links</li>
<li>Hash tags to be used when posting on Twitter</li>
</ul>
</li>
</ul>
<p>8. Reputation Management – Define how the company&#8217;s online reputation will be managed and tracked, such as:</p>
<ul>
<li>Through social mentions</li>
<li>Through monitoring sites</li>
<li>Through alerts</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/8884-not-seo-anymore-its-ssom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Huge List of SEO Resources</title>
		<link>http://zachbrowne.com/8120-huge-list-seo-resources/</link>
		<comments>http://zachbrowne.com/8120-huge-list-seo-resources/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 02:38:40 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[anchor text]]></category>
		<category><![CDATA[Explorer]]></category>
		<category><![CDATA[generating profit]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[quality search engine]]></category>
		<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[seo search engine optimization]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=8120</guid>
		<description><![CDATA[A website that pleases its visitors pleases Google and a high quality, search engine optimized website and closing business goes hand-in-hand. You already offer great customer service, have an excellent business model and every reason to be generating profit &#8211; you should be getting all the sales you want. If you&#8217;re not, you most likely need help with...]]></description>
			<content:encoded><![CDATA[<p></p><p>A website that pleases its visitors pleases Google and a high quality, search engine optimized website and closing business goes hand-in-hand. You already offer great customer service, have an excellent business model and every reason to be generating profit &#8211; you <em>should</em> be getting all the sales you want. If you&#8217;re not, you most likely need help with your SEO (Search Engine Optimization).</p>
<p>A website that is properly optimized for <strong>SEO</strong> opens up a whole new world of possibilities. It will save you money that is traditionally spent on advertising and save you time that you are currently spending on promotion. Most importantly it will start driving <em>highly qualified </em>leads that convert into new sales for your business.</p>
<p>If your website appeared on the first page of Google&#8217;s search results, it would be a consistent source of new leads.</p>
<h3>List of SEO Tasks</h3>
<ul>
<li><strong>Create unique, accurate page titles to show in the search results</strong> - to accurately describe the page&#8217;s content, create unique title tags for each page, and use brief, but descriptive titles.</li>
</ul>
<ul>
<li><strong>Make use of the &#8220;description&#8221; meta tag</strong> - Unique summaries should be defined for each page to accurately summarize the page&#8217;s content.</li>
</ul>
<ul>
<li><strong>Improve the structure of your URLs</strong> - Use words in URL, create a simple directory structure, and provide one version of a URL to reach a document.</li>
</ul>
<ul>
<li><strong>Make your site easier to navigate</strong> - Create a naturally flowing hierarchy, use mostly text for navigation, put an HTML site map page on your site, and use an XML Sitemap file, and have a useful 404 page.</li>
</ul>
<ul>
<li><strong>Offer quality content and services</strong> - by writing easy-to-read text, staying organized around the topic, creating fresh, unique content, creating content primarily for your users, not<br />
search engine</li>
</ul>
<ul>
<li><strong>Write better anchor text</strong> - Choose descriptive text, write concise text, format links so they&#8217;re easy to spot, and think about anchor text for internal links too.</li>
</ul>
<ul>
<li><strong>Optimize your use of images</strong> - Use brief, but descriptive filenames and alt text, supply alt text when using images as links, and supply an Image Sitemap file.</li>
</ul>
<ul>
<li><strong>Use heading tags appropriately</strong> - Imagine you&#8217;re writing an outline and use headings sparingly across the page</li>
</ul>
<ul>
<li><strong>Make effective use of robots.txt</strong> - Restrict crawling where it&#8217;s not needed<br />
with robots.txt and use more secure methods for sensitive content.</li>
</ul>
<ul>
<li><strong>Be aware of rel=&#8221;nofollow&#8221; for links</strong> - Combat comment spam with &#8220;nofollow&#8221; and automatically add &#8220;nofollow&#8221; to comment columns and message boards.</li>
</ul>
<ul>
<li><strong>Notify Google of mobile sites</strong> - Configure mobile sites so that they can be<br />
indexed accurately, verify that your mobile site is indexed by Google, and verify that Google can recognize your mobile URLs.</li>
</ul>
<ul>
<li><strong>Guide mobile users accurately</strong> - Running desktop and mobile versions of<br />
your site, redirect mobile users to the correct version, and switch content based on User-agent.</li>
</ul>
<ul>
<li><strong>Promote your website in the right ways</strong> - Increasing backlinks with an<br />
intention to increase the value of the site, master making announcements via blogs and being recognized online, know about social media sites and reach out to those in your site&#8217;s related community.</li>
</ul>
<ul>
<li><strong>Make use of free webmaster tools</strong> - Make Googlebot crawling smoother by using Webmaster Tools and high-level analysis is possible via Google Analytics and Website Optimizer.</li>
</ul>
<h3>List of SEO Tools</h3>
<p>This are the tools I&#8217;ve run across and used in my time. They are high quality and will do the job.</p>
<h4>Competitor Research</h4>
<ul>
<li><a href="https://siteexplorer.search.yahoo.com/" rel="nofollow">Yahoo Site Explorer</a></li>
<li><a href="http://www.compete.com/" rel="nofollow">Compete</a></li>
<li><a href="http://www.marketsamurai.com/" rel="nofollow">Market Samurai</a></li>
<li><a href="http://www.spyfu.com/" rel="nofollow">SpyFu</a></li>
<li><a href="http://www.serpanalytics.com/#competitor//summary" rel="nofollow">SERP Analytics</a></li>
<li><a href="http://authoritylabs.com/" rel="nofollow">Authority Labs</a></li>
</ul>
<h4>Keyword Research</h4>
<ul>
<li><a href="https://adwords.google.com/select/KeywordToolExternal" rel="nofollow">Google Keyword Tool</a></li>
<li><a href="http://www.google.com/trends" rel="nofollow">Google Trends</a></li>
<li><a href="http://www.google.com/insights/search/#" rel="nofollow">Google Insights</a></li>
<li><a href="http://advertising.microsoft.com/support-center/adcenter-downloads/microsoft-advertising-intelligence" rel="nofollow">Microsoft Ad Intelligence</a></li>
<li><a href="http://clues.yahoo.com/" rel="nofollow">Yahoo Clues</a></li>
<li><a href="http://www.marketsamurai.com/" rel="nofollow">Market Samurai</a></li>
<li><a href="http://tools.seobook.com/keyword-tools/seobook/" rel="nofollow">SEO Book Keyword Suggestion Tool</a></li>
<li><a href="http://authoritylabs.com/" rel="nofollow">Authority Labs</a></li>
<li><a href="http://www.seoprofiler.com/keywords/tools/" rel="nofollow">SEO Prolifer</a></li>
<li><a href="http://www.wordtracker.com/find-the-best-keywords" rel="nofollow">Word Tracker</a></li>
<li><a href="http://data.mint.com/" rel="nofollow">Mint Data</a></li>
<li><a href="http://stats.grok.se/" rel="nofollow">Wikipedia Article Traffic Stats</a></li>
<li><a href="http://www.serpanalytics.com/#keyword//summary" rel="nofollow">SERP Analytics</a></li>
</ul>
<h4>Keyword Revision</h4>
<ul>
<li><a href="http://advertising.microsoft.com/support-center/adcenter-downloads/microsoft-advertising-intelligence" rel="nofollow">Mircosoft Ad Intelligence</a></li>
<li><a href="http://clues.yahoo.com/" rel="nofollow">Yahoo Clues</a></li>
</ul>
<h4>Synonym / Alternate Keywords</h4>
<ul>
<li><a href="http://clues.yahoo.com/" rel="nofollow">Yahoo Clues</a></li>
</ul>
<h4>Keyword Difficulty</h4>
<ul>
<li><a href="http://www.seomoz.org/keyword-difficulty/" rel="nofollow">SEOmoz</a></li>
<li><a href="http://www.seochat.com/seo-tools/keyword-difficulty/" rel="nofollow">SEO Chat</a></li>
</ul>
<h4>Keyword Density</h4>
<ul>
<li><a href="http://www.seoquake.com/" rel="nofollow">SEO Quake</a></li>
<li><a href="http://www.seoprofiler.com/keywords/tools/keyword-density-calculator" rel="nofollow">SEO Prolifer</a></li>
<li><a href="http://labs.wordtracker.com/seo-blogger/" rel="nofollow">SEO Blogger</a></li>
</ul>
<h4>Keyword Rankings</h4>
<ul>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://tools.seobook.com/firefox/rank-checker/" rel="nofollow">Rank Checker | SEO Book</a></li>
<li><a href="http://www.seomoz.org/rank-tracker" rel="nofollow">Rank Tracker | SEOmoz</a></li>
<li><a href="http://authoritylabs.com/" rel="nofollow">Authority Labs</a></li>
<li><a href="http://www.keywordenvy.com/" rel="nofollow">Keyword Envy</a></li>
</ul>
<h4>InBound Links</h4>
<ul>
<li><a href="https://siteexplorer.search.yahoo.com/" rel="nofollow">Yahoo Site explorer</a></li>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://www.opensiteexplorer.org/" rel="nofollow">Open Site Explorer &#8211; SEOmoz</a></li>
<li><a href="http://www.linkdiagnosis.com" rel="nofollow">Link Diagnosis</a></li>
<li><a href="http://www.prelovac.com/vladimir/browser-addons/seo-doctor" rel="nofollow">SEO Doctor</a></li>
<li><a href="http://www.soloseo.com/tools/linkSearch.html" rel="nofollow">Link Search Tool | Solo SEO</a></li>
<li><a href="http://www.majesticseo.com/" rel="nofollow">Majestic SEO</a></li>
</ul>
<h4>Anchor Text</h4>
<ul>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://www.linkdiagnosis.com" rel="nofollow">Link Diagnosis</a></li>
<li><a href="http://www.opensiteexplorer.org/" rel="nofollow">Open Site Explorer &#8211; SEOmoz</a></li>
</ul>
<h4>Internal Links</h4>
<ul>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="https://siteexplorer.search.yahoo.com/" rel="nofollow">Yahoo Site Explorer</a></li>
<li><a href="http://www.opensiteexplorer.org/" rel="nofollow">Open Site Explorer &#8211; SEOmoz</a></li>
<li><a href="http://www.seoquake.com/" rel="nofollow">SEO Quake</a></li>
</ul>
<h4>Analytics</h4>
<ul>
<li><a href="http://www.google.com/analytics/" rel="nofollow">Google Analytics</a></li>
<li><a href="http://www.compete.com/" rel="nofollow">Compete</a></li>
<li><a href="http://statcounter.com/" rel="nofollow">Stat Counter</a></li>
<li><a href="http://www.woopra.com/" rel="nofollow">Woopra</a></li>
<li><a href="http://wordpress.org/extend/plugins/statpress/" rel="nofollow">StatPress (WordPress)</a></li>
</ul>
<h4>PageRank</h4>
<ul>
<li><a href="http://www.google.com/toolbar/ff/index.html" rel="nofollow">Google Toolbar</a></li>
<li><a href="http://www.prelovac.com/vladimir/browser-addons/seo-doctor" rel="nofollow">SEO Doctor</a></li>
</ul>
<h4>Local Business Listings</h4>
<ul>
<li><a href="http://getlisted.org/" rel="nofollow">GetListed.org</a></li>
<li><a href="http://places.google.com/business" rel="nofollow">Google Places</a></li>
<li><a href="http://local.yahoo.com/" rel="nofollow">Yahoo Local</a></li>
<li><a href="http://www.yelp.com/business/" rel="nofollow">Yelp</a></li>
<li><a href="http://www.yellowbot.com/" rel="nofollow">Yellow Bot</a></li>
<li><a href="http://www.insiderpages.com/" rel="nofollow">Insider Pages</a></li>
<li><a href="http://www.citysearch.com" rel="nofollow">City Search</a></li>
</ul>
<h4>Analytics</h4>
<ul>
<li><a href="http://www.google.com/webmasters/tools/" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://www.seoquake.com/" rel="nofollow">SEO Quake</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/102178/" rel="nofollow">SEO Doctor</a></li>
<li><a href="http://websitegrader.com/" rel="nofollow">Website Grader</a></li>
<li><a href="http://www.myseotool.com/" rel="nofollow">MySeoTool</a></li>
<li><a href="http://juicystudio.com/services/image.php" rel="nofollow">Image Analyzer</a></li>
<li><a href="http://www.alchemyapi.com/api/demo.html" rel="nofollow">Alchemy API</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/8120-huge-list-seo-resources/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Huge List of Page Speed Optimization Factors</title>
		<link>http://zachbrowne.com/8117-huge-list-page-speed-optimization-factors/</link>
		<comments>http://zachbrowne.com/8117-huge-list-page-speed-optimization-factors/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 02:37:35 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Online]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[website]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=8117</guid>
		<description><![CDATA[Website  load  times  have  been  identified  as  a  crucial  factor  to  measure  the  performance  of  a  website.  With  the  information  deluge  on  the  Internet,  user’s  patience  levels  have  been  continuously decreasing.  Web   users  are  constantly  begging  for  faster  page  downloads. According  to  the  findings  of  independent  surveys  conducted  by  Lightner,  Bose  and  Salvendy  indicates  that  the  most  widely...]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://zachbrowne.com/wp-content/uploads/2011/07/Huge-List-of-Page-Speed-Optimization-Factors.jpg"><img class="alignleft size-full wp-image-9011" title="Huge-List-of-Page-Speed-Optimization-Factors" src="http://zachbrowne.com/wp-content/uploads/2011/07/Huge-List-of-Page-Speed-Optimization-Factors.jpg" alt="Huge-List-of-Page-Speed-Optimization-Factors" width="150" height="150" /></a>Website  load  times  have  been  identified  as  a  crucial  factor  to  measure  the  performance  of  a  website.  With  the  information  deluge  on  the  Internet,  user’s  patience  levels  have  been  continuously decreasing.  Web   users  are  constantly  begging  for  faster  page  downloads.</p>
<p>According  to  the  findings  of  independent  surveys  conducted  by  Lightner,  Bose  and  Salvendy  indicates  that  the  most  widely  cited  problem  with  using  the  world  wide  web  was  that  it  took  too  long  to  download  Web  pages.</p>
<h3>Why do I need a faster website?</h3>
<h4>Akamai&#8217;s 2-Second Study¹</h4>
<ul>
<li><strong>47%</strong> of consumers expect a web page to load in two seconds or less.</li>
<li><strong>40%</strong> of consumers will wait no more than three seconds for a web page to render before abandoning the site.</li>
<li><strong>52%</strong> of online shoppers state that quick page loading is important to their site loyalty.</li>
<li><strong>14%</strong> of internet users become distracted when made to wait for a page to load and will begin shopping at another site.</li>
<li><strong>23%</strong> will stop shopping completely or walk away from their computer if a page is loading slow.</li>
<li><strong>79%</strong> of online shoppers who experience a dissatisfying visit are less likely to buy from that site again.</li>
<li><strong>64%</strong> will simply purchase from another online store.¹</li>
</ul>
<h4>Pear Analytics Study²</h4>
<ul>
<li>Zona research said in <strong>1999</strong> that you could lose up to<strong> 33%</strong> of your visitors if you page took more than <strong>8 seconds</strong>to load.²</li>
<li>Akamai said in <strong>2006</strong> that you could lose up to <strong>33%</strong> of your visitors if your page took more than <strong>4 seconds</strong> to load on a broadband connection.</li>
<li>Tests done at Amazon in <strong>2007</strong> revealed that for every <strong>100ms</strong> increase in load time, sales would decrease <strong>1%</strong>.</li>
<li>Tests done at Google in <strong>2006</strong> revealed that going from <strong>10 to 30</strong> results per page increased load time by a mere<strong>0.5 seconds</strong>, but resulted in a <strong>20%</strong> drop in traffic.</li>
</ul>
<p><strong>You can <em>speed up</em> your website by as much as 300%</strong> by adding features such as a content delivery network, HTML caching, Google Pagespeed and minification.</p>
<p>About <strong>96%</strong> of websites can be made faster and more responsive. The fact is a faster site offers a <strong><em>much better</em></strong> user experience and allows Google and other search engines to more easily index your website resulting in <em><strong>higher website rankings</strong></em> and <em><strong>much happier visitors </strong></em>that will <em><strong>convert into new business.</strong></em></p>
<p><em><strong></strong></em>There are around 35 factors that will help increase the speed of your website.</p>
<h2>How can I speed up my website?</h2>
<p>Take all the components for speeding up your website based on Yahoo and Google&#8217;s best practices and work through each one until you’ve achieved optimum results.</p>
<p><strong>Google&#8217;s </strong><strong>Recommendations</strong></p>
<ul>
<li><strong>Optimizing caching</strong> — keeping your application&#8217;s data and logic <em>off</em> the network altogether</li>
<li><strong>Minimizing round-trip times</strong> — reducing the number of serial request-response cycles</li>
<li><strong>Minimizing request overhead</strong> — reducing upload size</li>
<li><strong>Minimizing payload size</strong> — reducing the size of responses, downloads, and cached pages</li>
<li><strong>Optimizing browser rendering</strong> — improving the browser&#8217;s layout of a page</li>
<li><strong>Optimizing for mobile</strong>— tuning a site for the characteristics of mobile networks and mobile devices</li>
</ul>
<p><strong>Yahoo&#8217;s Recommendations</strong></p>
<ul>
<li><strong>Minimize HTTP Requests</strong> by combining files, using CSS sprites, image maps and inline images so your WordPress website will be much faster for first time visitors, before they have a chance to cache your site.</li>
<li><strong>Use a CDN (Content Delivery Network)</strong> to disperse your static content across multiple servers in order to deliver it in a closer proximity to your visitor’s location.</li>
<li><strong>Add Cache Control Headers</strong> to make components like images, scripts, stylesheets, &amp; flash cachable so your visitors will avoid unnecessary HTTP requests on subsequent visits.</li>
<li><strong>Use Gzip Components</strong> to reduce response times by reducing the size of the HTTP requests.</li>
<li><strong>Put Stylesheets At the Top</strong> of your page to allow the page to render progressively. This makes the page appear to load faster.</li>
<li><strong>Put Scripts At the Bottom</strong> of your page to stop them from blocking parallel downloads. A browser can only make 2 HTTP requests at a time and nothing else loads while a script is loading.</li>
<li><strong>Remove CSS Expressions </strong>to limit the amount of times the page is evaluated.</li>
<li><strong>Make Javascript and CSS External</strong> if possible to encourage the browser to cache them.</li>
<li><strong>Reduce DNS Lookups</strong> to reduce the amount of parallel downloading that are taking place in each page.</li>
<li><strong>Minify JavaScript and CSS</strong> When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab).</li>
<li><strong>Avoid Redirects</strong> to improve the overall user experience.</li>
<li><strong>Remove Duplicate Scripts</strong> to decrease unnecessary HTTP requests and wasted JavaScript executions.</li>
<li><strong>Configure ETags</strong> to reduce the size of the HTTP headers in both the response and subsequent requests.</li>
<li><strong>Make Ajax Cacheable</strong> to improve the speed of feedback to the user.</li>
<li><strong>Flush the Buffer Early</strong> to improve the overall user experience.</li>
<li><strong>Use GET for AJAX Requests</strong> to improve the speed of feedback to the user.</li>
<li><strong>Post-load Components</strong> to only load crucial components first, then the rest.</li>
<li><strong>Preload Components</strong> to cache component before the user hits the page.</li>
<li><strong>Reduce the Number of DOM Elements</strong> by optimizing the markup.</li>
<li><strong>Split Components Across Domains</strong> to maximize parallel downloads.</li>
<li><strong>Minimize the Number of iframes</strong> to improve the overall user experience.</li>
<li><strong>No 404s</strong> to reduce useless responses.</li>
<li><strong>Reduce Cookie Size</strong> to minimize the impact on the user response time.</li>
<li><strong>Use Cookie-free Domains for Components</strong> to reduce creating network traffic for no good reason.</li>
<li><strong>Minimize DOM Access</strong> to cache references to accessed elements.</li>
<li><strong>Develop Smart Event Handlers</strong> to reduce the extra event handlers attached to different elements of the DOM tree.</li>
<li><strong>Choose <tt></tt>over <tt>@import</tt></strong> to improve CSS response times.</li>
<li><strong>Avoid Filters</strong> to decrease memory consumption.</li>
<li><strong>Optimize Images</strong> to decrease image sizes.</li>
<li><strong>Optimize CSS Sprites</strong> by arranging the images in the sprite horizontally &amp; combining similar colors.</li>
<li><strong>Don&#8217;t Scale Images in HTML</strong> to reduce extra calls.</li>
<li><strong>Make favicon.ico Small and Cacheable</strong> to avoid 404 error.</li>
<li><strong>Keep Components under 25K</strong> to improve load times.</li>
<li><strong>Pack Components into a Multipart Document</strong> to fetch several components with one HTTP request.</li>
<li><strong>Avoid Empty Image src</strong> to avoid extra browser requests to your server.</li>
</ul>
<p>¹<small>Cited from <a href="http://www.akamai.com/html/about/press/releases/2009/press_091409.html">Akamai&#8217;s 2 second study</a></small>.<br />
²<small>Cited from <a href="http://www.pearanalytics.com/blog/wp-content/uploads/2010/05/Load-time-relates-to-visitor-loss.pdf">Pear Analytics</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/8117-huge-list-page-speed-optimization-factors/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Discovers Huge BlackHat Malware Scam Infecting Millions of Users</title>
		<link>http://zachbrowne.com/8000-google-discovers-huge-blackhat-malware-scam-infecting-millions-of-users/</link>
		<comments>http://zachbrowne.com/8000-google-discovers-huge-blackhat-malware-scam-infecting-millions-of-users/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 17:41:48 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=8000</guid>
		<description><![CDATA[Today Google found a large amount of unusual search traffic while they were performing routine maintenance on one of their data centers. After meeting with with a number of engineers at the organizations that were sending the unusual search traffic, they discovered that the organization&#8217;s machines were exhibiting a very peculiar behavior that&#8217;s similar  to...]]></description>
			<content:encoded><![CDATA[<p></p><p>Today Google found a large amount of unusual search traffic while they were performing routine maintenance on one of their data centers. After meeting with with a number of engineers at the organizations that were sending the unusual search traffic, they discovered that the organization&#8217;s machines were exhibiting a very peculiar behavior that&#8217;s similar  to a particular strain of malware. The discovery caused Google to create a very obvious notification at the top infected users search results that looks like this:</p>
<p><a href="http://zachbrowne.com/wp-content/uploads/2011/07/MalwareWarningScreenshot.png"><img class="size-medium wp-image-8017 alignnone" title="MalwareWarningScreenshot" src="http://zachbrowne.com/wp-content/uploads/2011/07/MalwareWarningScreenshot-300x78.png" alt="" width="300" height="78" /></a></p>
<h5></h5>
<p>If infected, this particular malware will your computer to send all traffic to Google through a proxy servers before reaching Google. They are confident that the notification will prompt users to update their antivirus software and remove the infections.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/8000-google-discovers-huge-blackhat-malware-scam-infecting-millions-of-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List of the Best SEO Tools Available</title>
		<link>http://zachbrowne.com/7998-list-of-the-best-seo-tools-available/</link>
		<comments>http://zachbrowne.com/7998-list-of-the-best-seo-tools-available/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 23:18:33 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Clues]]></category>
		<category><![CDATA[competitor research]]></category>
		<category><![CDATA[google webmaster tools]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[local business listings]]></category>
		<category><![CDATA[mint data]]></category>
		<category><![CDATA[Open]]></category>
		<category><![CDATA[seo book]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=7998</guid>
		<description><![CDATA[Competitor Research Yahoo Site Explorer Compete Market Samurai SpyFu SERP Analytics Authority Labs Keyword Research Google Keyword Tool Google Trends Google Insights Microsoft Ad Intelligence Yahoo Clues Market Samurai SEO Book Keyword Suggestion Tool Authority Labs SEO Prolifer Word Tracker Mint Data Wikipedia Article Traffic Stats SERP Analytics Keyword Revision Mircosoft Ad Intelligence Yahoo Clues...]]></description>
			<content:encoded><![CDATA[<p></p><h3>Competitor Research</h3>
<ul>
<li><a href="https://siteexplorer.search.yahoo.com/" rel="nofollow">Yahoo Site Explorer</a></li>
<li><a href="http://www.compete.com/" rel="nofollow">Compete</a></li>
<li><a href="http://www.marketsamurai.com/" rel="nofollow">Market Samurai</a></li>
<li><a href="http://www.spyfu.com/" rel="nofollow">SpyFu</a></li>
<li><a href="http://www.serpanalytics.com/#competitor//summary" rel="nofollow">SERP Analytics</a></li>
<li><a href="http://authoritylabs.com/" rel="nofollow">Authority Labs</a></li>
</ul>
<h3>Keyword Research</h3>
<ul>
<li><a href="https://adwords.google.com/select/KeywordToolExternal" rel="nofollow">Google Keyword Tool</a></li>
<li><a href="http://www.google.com/trends" rel="nofollow">Google Trends</a></li>
<li><a href="http://www.google.com/insights/search/#" rel="nofollow">Google Insights</a></li>
<li><a href="http://advertising.microsoft.com/support-center/adcenter-downloads/microsoft-advertising-intelligence" rel="nofollow">Microsoft Ad Intelligence</a></li>
<li><a href="http://clues.yahoo.com/" rel="nofollow">Yahoo Clues</a></li>
<li><a href="http://www.marketsamurai.com/" rel="nofollow">Market Samurai</a></li>
<li><a href="http://tools.seobook.com/keyword-tools/seobook/" rel="nofollow">SEO Book Keyword Suggestion Tool</a></li>
<li><a href="http://authoritylabs.com/" rel="nofollow">Authority Labs</a></li>
<li><a href="http://www.seoprofiler.com/keywords/tools/" rel="nofollow">SEO Prolifer</a></li>
<li><a href="http://www.wordtracker.com/find-the-best-keywords" rel="nofollow">Word Tracker</a></li>
<li><a href="http://data.mint.com/" rel="nofollow">Mint Data</a></li>
<li><a href="http://stats.grok.se/" rel="nofollow">Wikipedia Article Traffic Stats</a></li>
<li><a href="http://www.serpanalytics.com/#keyword//summary" rel="nofollow">SERP Analytics</a></li>
</ul>
<h3>Keyword Revision</h3>
<ul>
<li><a href="http://advertising.microsoft.com/support-center/adcenter-downloads/microsoft-advertising-intelligence" rel="nofollow">Mircosoft Ad Intelligence</a></li>
<li><a href="http://clues.yahoo.com/" rel="nofollow">Yahoo Clues</a></li>
</ul>
<h3>Synonym / Alternate Keywords</h3>
<ul>
<li><a href="http://clues.yahoo.com/" rel="nofollow">Yahoo Clues</a></li>
</ul>
<h3>Keyword Difficulty</h3>
<ul>
<li><a href="http://www.seomoz.org/keyword-difficulty/" rel="nofollow">SEOmoz</a></li>
<li><a href="http://www.seochat.com/seo-tools/keyword-difficulty/" rel="nofollow">SEO Chat</a></li>
</ul>
<h3>Keyword Density</h3>
<ul>
<li><a href="http://www.seoquake.com/" rel="nofollow">SEO Quake</a></li>
<li><a href="http://www.seoprofiler.com/keywords/tools/keyword-density-calculator" rel="nofollow">SEO Prolifer</a></li>
<li><a href="http://labs.wordtracker.com/seo-blogger/" rel="nofollow">SEO Blogger</a></li>
</ul>
<h3>Keyword Rankings</h3>
<ul>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://tools.seobook.com/firefox/rank-checker/" rel="nofollow">Rank Checker | SEO Book</a></li>
<li><a href="http://www.seomoz.org/rank-tracker" rel="nofollow">Rank Tracker | SEOmoz</a></li>
<li><a href="http://authoritylabs.com/" rel="nofollow">Authority Labs</a></li>
<li><a href="http://www.keywordenvy.com/" rel="nofollow">Keyword Envy</a></li>
</ul>
<h3>InBound Links</h3>
<ul>
<li><a href="https://siteexplorer.search.yahoo.com/" rel="nofollow">Yahoo Site explorer</a></li>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://www.opensiteexplorer.org/" rel="nofollow">Open Site Explorer &#8211; SEOmoz</a></li>
<li><a href="http://www.linkdiagnosis.com" rel="nofollow">Link Diagnosis</a></li>
<li><a href="http://www.prelovac.com/vladimir/browser-addons/seo-doctor" rel="nofollow">SEO Doctor</a></li>
<li><a href="http://www.soloseo.com/tools/linkSearch.html" rel="nofollow">Link Search Tool | Solo SEO</a></li>
<li><a href="http://www.majesticseo.com/" rel="nofollow">Majestic SEO</a></li>
</ul>
<h3>Anchor Text</h3>
<ul>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://www.linkdiagnosis.com" rel="nofollow">Link Diagnosis</a></li>
<li><a href="http://www.opensiteexplorer.org/" rel="nofollow">Open Site Explorer &#8211; SEOmoz</a></li>
</ul>
<h3>Internal Links</h3>
<ul>
<li><a href="https://www.google.com/webmasters/tools/home?hl=en" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="https://siteexplorer.search.yahoo.com/" rel="nofollow">Yahoo Site Explorer</a></li>
<li><a href="http://www.opensiteexplorer.org/" rel="nofollow">Open Site Explorer &#8211; SEOmoz</a></li>
<li><a href="http://www.seoquake.com/" rel="nofollow">SEO Quake</a></li>
</ul>
<h3>Analytics</h3>
<ul>
<li><a href="http://www.google.com/analytics/" rel="nofollow">Google Analytics</a></li>
<li><a href="http://www.compete.com/" rel="nofollow">Compete</a></li>
<li><a href="http://statcounter.com/" rel="nofollow">Stat Counter</a></li>
<li><a href="http://www.woopra.com/" rel="nofollow">Woopra</a></li>
<li><a href="http://wordpress.org/extend/plugins/statpress/" rel="nofollow">StatPress (WordPress)</a></li>
</ul>
<h3>PageRank</h3>
<ul>
<li><a href="http://www.google.com/toolbar/ff/index.html" rel="nofollow">Google Toolbar</a></li>
<li><a href="http://www.prelovac.com/vladimir/browser-addons/seo-doctor" rel="nofollow">SEO Doctor</a></li>
</ul>
<h3>Local Business Listings</h3>
<ul>
<li><a href="http://getlisted.org/" rel="nofollow">GetListed.org</a></li>
<li><a href="http://places.google.com/business" rel="nofollow">Google Places</a></li>
<li><a href="http://local.yahoo.com/" rel="nofollow">Yahoo Local</a></li>
<li><a href="http://www.yelp.com/business/" rel="nofollow">Yelp</a></li>
<li><a href="http://www.yellowbot.com/" rel="nofollow">Yellow Bot</a></li>
<li><a href="http://www.insiderpages.com/" rel="nofollow">Insider Pages</a></li>
<li><a href="http://www.citysearch.com" rel="nofollow">City Search</a></li>
</ul>
<h3>Analytics</h3>
<ul>
<li><a href="http://www.google.com/webmasters/tools/" rel="nofollow">Google Webmaster Tools</a></li>
<li><a href="http://www.seoquake.com/" rel="nofollow">SEO Quake</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/102178/" rel="nofollow">SEO Doctor</a></li>
<li><a href="http://websitegrader.com/" rel="nofollow">Website Grader</a></li>
<li><a href="http://www.myseotool.com/" rel="nofollow">MySeoTool</a></li>
<li><a href="http://juicystudio.com/services/image.php" rel="nofollow">Image Analyzer</a></li>
<li><a href="http://www.alchemyapi.com/api/demo.html" rel="nofollow">Alchemy API</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/7998-list-of-the-best-seo-tools-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detailed List of Factors to Consider When Evaluating a Site for Proper SEO</title>
		<link>http://zachbrowne.com/7996-detailed-list-of-factors-to-consider-when-evaluating-a-site-for-proper-seo/</link>
		<comments>http://zachbrowne.com/7996-detailed-list-of-factors-to-consider-when-evaluating-a-site-for-proper-seo/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 17:04:22 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[Factors]]></category>
		<category><![CDATA[link anchor]]></category>
		<category><![CDATA[meta description tag]]></category>
		<category><![CDATA[meta keywords tag]]></category>
		<category><![CDATA[Popularity]]></category>
		<category><![CDATA[proper search engine]]></category>
		<category><![CDATA[Registration]]></category>
		<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[zachbrowne]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=7996</guid>
		<description><![CDATA[This is a list of factors I&#8217;ve collected from several resources, SEOMoz being one, that are a must if you want to thoroughly evaluate a website for proper search engine optimization. On-Page (Keyword-Specific) Ranking Factors Keyword Use Anywhere in the Title Tag Keyword Use as the First Word(s) of the Title Tag Keyword Use in...]]></description>
			<content:encoded><![CDATA[<p></p><p>This is a list of factors I&#8217;ve collected from several resources, SEOMoz being one, that are a must if you want to thoroughly evaluate a website for proper search engine optimization.</p>
<h3>On-Page (Keyword-Specific) Ranking Factors</h3>
<ul>
<li>Keyword Use Anywhere in the Title Tag</li>
<li>Keyword Use as the First Word(s) of the Title Tag</li>
<li>Keyword Use in the Root Domain Name (e.g. keyword.com)</li>
<li>Keyword Use Anywhere in the H1 Headline Tag</li>
<li>Keyword Use in Internal Link Anchor Text on the Page</li>
<li>Keyword Use in External Link Anchor Text on the Page</li>
<li>Keyword Use as the First Word(s) in the H1 Tag</li>
<li>Keyword Use in the First 50-100 Words in HTML on the Page</li>
<li>Keyword Use in the Subdomain Name (e.g. keyword.zachbrowne.com)</li>
<li>Keyword Use in the Page Name URL (e.g. zachbrowne.com/folder/keyword.html)</li>
<li>Keyword Use in the Page Folder URL (e.g. zachbrowne.com/keyword/page.html)</li>
<li>Keyword Use in other Headline Tags (&lt; h2 &gt; – &lt; h6 &gt;)&lt; /h6 &gt;&lt; /h2 &gt;</li>
<li>Keyword Use in Image Alt Text</li>
<li>Keyword Use / Number of Repetitions in the HTML Text on the Page</li>
<li>Keyword Use in Image Names Included on the Page (e.g. keyword.jpg)</li>
<li>Keyword Use in &lt; b &gt; or &lt; strong &gt; Tags</li>
<li>Keyword Density Formula (# of Keyword Uses ÷ Total # of Terms on the Page)</li>
<li>Keyword Use in List Items &lt; /li &gt;&lt; li &gt; on the Page</li>
<li>Keyword Use in the Page’s Query Parameters (e.g. zachbrowne.com/page.html?keyword</li>
<li>Keyword Use in &lt; i &gt; or &lt; em &gt; Tags</li>
<li>Keyword Use in the Meta Description Tag</li>
<li>Keyword Use in the Page’s File Extension (e.g. zachbrowne.com/page.keyword)</li>
<li>Keyword Use in Comment Tags in the HTML</li>
<li>Keyword Use in the Meta Keywords Tag</li>
</ul>
<h3>On-Page (Non-Keyword)Ranking Factors</h3>
<ul>
<li>Existence of Substantive, Unique Content on the Page</li>
<li>Recency (freshness) of Page Creation</li>
<li>Use of Links on the Page that Point to Other URLs on this Domain</li>
<li>Historical Content Changes (how often the page content has been updated)</li>
<li>Query Parameters in the URL vs. Static URL Format</li>
<li>Ratio of Code to Text in HTML</li>
<li>Existence of a Meta Description Tag</li>
<li>HTML Validation to W3C Standards</li>
<li>Use of Flash Elements (or other plug-in content)</li>
<li>Use of Advertising on the Page</li>
<li>Use of Google Ad Sense (specifically) on the Page</li>
</ul>
<h3>Page-Specific Link Popularity Factors</h3>
<ul>
<li>Keyword-Focused Anchor Text from External Links</li>
<li>External Link Popularity (quantity/quality of external links)</li>
<li>Diversity of Link Sources (links from many unique root domains)</li>
<li>Page-Specific Trust Rank (whether the individual page has earned links from trusted sources)</li>
<li>Iterative Algorithm-Based, Global Link Popularity (PageRank)</li>
<li>Topic-Specificity/Focus of External Link Sources (whether external links to this page come from topically relevant pages/sites)</li>
<li>Keyword-Focused Anchor Text from Internal Links</li>
<li>Location in Information Architecture of the Site (where the page sits in relation to the site’s structural hierarchy)</li>
<li>Internal Link Popularity (counting only links from other pages on the root domain)</li>
<li>Quality of Nofollowed Links to the Page</li>
<li>Percent of Followed vs. Nofollowed Links that Point to the Page</li>
</ul>
<h3>Site-Wide Link Based Ranking Factors</h3>
<ul>
<li>Trustworthiness of the Domain Based on Link Distance from Trusted Domains (e.g. TrustRank, Domain mozTrust, etc.)</li>
<li>Global Link Popularity of the Domain Based on an Iterative Link Algorithm (e.g. PageRank on the domain graph, Domain mozRank, etc.)</li>
<li>Link Diversity of the Domain (based on number/variety of unique root domains linking to pages on this domain)</li>
<li>Links from Hubs/Authorities in a Given Topic-Specific Neighborhood (as per the “Hilltop” algorithm)</li>
<li>Temporal Growth/Shrinkage of Links to the Domain (the quantity/quality of links earned over time and the temporal distribution)</li>
<li>Links from Domains with Restricted Access TLD Extensions (e.g. .edu, .gov, .mil, .ac.uk, etc.)</li>
<li>Percent of Followed vs. Nofollowed Links that Point to the Domain</li>
</ul>
<h3>Site-Wide (non-link based)Ranking Factors</h3>
<ul>
<li>Site Architecture of the Domain (whether intelligent, useful hierarchies are employed)</li>
<li>Use of External Links to Reputable, Trustworthy Sites/Pages</li>
<li>Length of Domain Registration</li>
<li>Domain Registration History (how long it’s been registered to the same party, number of times renewed, etc.)</li>
<li>Server/Hosting Uptime</li>
<li>Hosting Information (what other domains are hosted on the server/c-block of IP addresses)</li>
<li>Domain Registration Ownership Change (whether the domain has changed hands according to registration records)</li>
<li>Inclusion of Feeds from the Domain in Google News</li>
<li>Use of XML Sitemap(s)</li>
<li>Domain Ownership (who registered the domain and their history)</li>
<li>Domain Registration with Google Local</li>
<li>Domain “Mentions” (text citations of the domain name/address even in the absence of direct links)</li>
<li>Inclusion of Feeds from the Domain in Google Blog Search</li>
<li>Citations/References of the Domain in the Yahoo! Directory (beyond the value of the link alone)</li>
<li>Citations/References of the Domain in DMOZ.org (beyond the value of the link alone)</li>
<li>Citations/References of the Domain in Wikipedia (beyond the value of the link alone)</li>
<li>Use of Feeds on the Domain</li>
<li>Citations/References of the Domain in the Librarian’s Internet Index &#8211; Lii.org (beyond the value of the link alone)</li>
<li>Domain Registration with Google Webmaster Tools</li>
<li>Activation of Google’s “Enhanced Image Search” (aka image labeler)</li>
<li>Use of Security Certificate on the Domain (for HTTPS transactions)</li>
<li>Validity of Mailing Address/Phone Numbers/Records from Domain Registration</li>
<li>Citations/References of the Domain in Google Knol Articles (beyond the value of the link alone)</li>
<li>Use of a Google Search Appliance on the Domain</li>
<li>Use of Google AdSense on the Domain</li>
<li>Use of Google AdWords for Ads Pointing to the Domain</li>
<li>Alexa Rank of the Domain (independent of actual traffic)</li>
<li>Compete.com Rank of the Domain (independent of actual traffic)</li>
<li>Use of Google’s Hosted Web Apps (not App Engine) on the Domain</li>
</ul>
<h3>Social Media/Social Graph Based Ranking Factors</h3>
<ul>
<li>Delicious Data About the Domain or Page</li>
<li>StumbleUpon Data About the Domain or Page</li>
<li>Twitter Data About the Domain or Page</li>
<li>LinkedIn Data About the Domain or Page</li>
<li>Facebook Data About the Domain or Page</li>
<li>MySpace Data About the Domain or Page</li>
</ul>
<h3>Usage Data Ranking Factors</h3>
<ul>
<li>Historical Click-Through Rate from Search Results to the Exact Page/URL</li>
<li>Historical Click-Through Rate from Search Results to Pages on this Domain</li>
<li>Search Queries for the Domain Name or Associated Brand</li>
<li>Use of Query Refinement Post-Click on a Search Result</li>
<li>Average “Time on Page” Duration</li>
<li>Data from Google’s SearchWiki Voting, Ratings, Comments</li>
<li>References/Links to the Domain in Gmail Emails</li>
</ul>
<h3>Negative Ranking Factors</h3>
<ul>
<li>Cloaking with Malicious/Manipulative Intent</li>
<li>Link Acquisition from Known Link Brokers/Sellers</li>
<li>Links from the Page to Web Spam Sites/Pages</li>
<li>Cloaking by User Agent</li>
<li>Frequent Server Downtime and Site Inaccessibility</li>
<li>Hiding Text with same/similar colored text/background</li>
<li>Links from the Domain to Web Spam Sites/Pages</li>
<li>Excessive Repetition of the Same Anchor Text in a High Percentage/Quantity of External Links to the Site/Page</li>
<li>Cloaking by IP Address</li>
<li>Hiding Text with CSS by Offsetting the Pixel display outside the visible page area</li>
<li>Excessive Number of Dynamic Parameters in the URL</li>
<li>Excessive Links from Sites Hosted on the Same IP Address C-Block</li>
<li>Link Acquisition from Manipulative Bait-and-Switch Campaigns (301’ing microsites, etc.)</li>
<li>Keyword Stuffing in the On-Page Text</li>
<li>Hiding Text with CSS display:none; Styling</li>
<li>Keyword Stuffing in the</li>
<li>Keyword Stuffing in the URL</li>
<li>Link Acquisition from Manipulative Widget/Badge Campaigns</li>
<li>Cloaking by JavaScript/Rich Media Support Detection</li>
<li>Cloaking by Cookie Detection</li>
<li>Link Acquisition from Low Quality Paid Directories</li>
<li>Excessive Links from Sites Owned by the Same Registrant</li>
<li>Links to the Page from Web Spam Sites/Pages</li>
<li>Links to the Domain from Web Spam Sites/Pages</li>
<li>Link Acquisition from Manipulative Viral Campaigns</li>
<li>Cloaking with Positive User Experience Intent</li>
<li>Over-Optimization of Internal Link Anchor Text</li>
<li>Use of “Poison” Keywords in Anchor Text of External Links (e.g. student credit cards, buy viagra, porn terms, etc.)</li>
<li>Link Acquisition from Buying Old Domains and Redirecting</li>
<li>Excessively Long URL</li>
<li>Use of Keyword-Rich Anchor Text Internal Links in Footers</li>
<li>Keyword Stuffing in the Meta Description Tag</li>
<li>Link Acquisition from Buying Old Domains and Adding Links</li>
<li>Overuse of Nofollow on Internal Links for “PageRank Sculpting”</li>
<li>Forum Link Building (Signatures, Link Drops, etc.)</li>
<li>Excessively Long Title Tag</li>
<li>Keyword Stuffing in the Meta Keywords Tag</li>
</ul>
<h3>Factors Negatively Affecting the Value of an External Link</h3>
<ul>
<li>Domain Banned from Google’s Index for Web Spam</li>
<li>Domain’s Rankings Penalized in Google for Web Spam</li>
<li>Link is Determined to be “Paid” Rather than Editorially Given</li>
<li>Domain Contains Links to a Significant Amount of Web Spam</li>
<li>Domain Has Not Earned Trusted Links</li>
</ul>
<h3>Geo-Targeting Factors</h3>
<ul>
<li>Country Code TLD of the Root Domain (e.g. .co.uk, .de, .fr, .com.au, etc.)</li>
<li>Language of the Content Used on the Site</li>
<li>Links from Other Domains Targeted to the Country/Region</li>
<li>Geographic Location of the Host IP Address of the Domain</li>
<li>Manual Review/Targeting by Google Engineers and/or Quality Raters</li>
<li>Geo-Targeting Preference Set Inside Google Webmaster Tools</li>
<li>Registration of the Site with Google Local in the Country/Region</li>
<li>Address in On-Page Text Content</li>
<li>Address Associated with the Registration of the Domain</li>
<li>Geographic Location of Visitors to the Site (the country/region from which many/most visitors arrive)</li>
<li>Geo-Tagging of Pages via Meta Data (e.g. Dublin Core Meta Data Initiative)</li>
</ul>
<p>If you have any good ideas or changes you think should be made, please leave a comment.</p>
<hr />
<div>Like this blog post? Grab my newsletter to receive a valuable monthly digest of membership only information for free!</div>

                <div class='gf_browser_unknown gform_wrapper' id='gform_wrapper_9' ><form method='post' enctype='multipart/form-data'  id='gform_9'  action='/feed/'>
                        <div class='gform_body'>
                            <ul id='gform_fields_9' class='gform_fields top_label description_above'><li id='field_9_3' class='gfield    first_name           gfield_contains_required' ><label class='gfield_label' for='input_9_3'>First Name<span class='gfield_required'>*</span></label><div class='ginput_container'><input name='input_3' id='input_9_3' type='text' value='' class='medium'  tabindex='1'  /></div></li><li id='field_9_4' class='gfield    last_name           gfield_contains_required' ><label class='gfield_label' for='input_9_4'>Last Name<span class='gfield_required'>*</span></label><div class='ginput_container'><input name='input_4' id='input_9_4' type='text' value='' class='medium'  tabindex='2'  /></div></li><li id='field_9_2' class='gfield    email_address           gfield_contains_required' ><label class='gfield_label' for='input_9_2'>Email<span class='gfield_required'>*</span></label><div class='ginput_container'><input name='input_2' id='input_9_2' type='text' value='' class='medium'  tabindex='3'  /></div></li><li id='field_9_5' class='gfield    gform_validation_container' ><label class='gfield_label' for='input_9_5'>Name</label><div class='ginput_container'><input name='input_5' id='input_9_5' type='text' value='' /></div><div class='gfield_description'>This field is for validation purposes and should be left unchanged.</div></li>
                            </ul></div>
        <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_9' class='button gform_button' value='Submit' tabindex='4' />
            <input type='hidden' class='gform_hidden' name='is_submit_9' value='1' />
            <input type='hidden' class='gform_hidden' name='gform_submit' value='9' />
            <input type='hidden' class='gform_hidden' name='gform_unique_id' value='4f2e0a17c6cb0' />
            <input type='hidden' class='gform_hidden' name='state_9' value='YToyOntpOjA7czo2OiJhOjA6e30iO2k6MTtzOjMyOiIzMTdiMjM0NzJiNWRlZmQ4ZTliNzUyMTViYjkzNzkwZiI7fQ==' />
            <input type='hidden' class='gform_hidden' name='gform_target_page_number_9' id='gform_target_page_number_9' value='0' />
            <input type='hidden' class='gform_hidden' name='gform_source_page_number_9' id='gform_source_page_number_9' value='1' />
            <input type='hidden' name='gform_field_values' value='' />
            
        </div>
                </form>
                </div>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/7996-detailed-list-of-factors-to-consider-when-evaluating-a-site-for-proper-seo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List of High Quality Resources for Link Building in 2011</title>
		<link>http://zachbrowne.com/7963-list-of-high-quality-resources-for-link-building-in-2011/</link>
		<comments>http://zachbrowne.com/7963-list-of-high-quality-resources-for-link-building-in-2011/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 04:53:45 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[building]]></category>
		<category><![CDATA[cyber promotions]]></category>
		<category><![CDATA[goetsch]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[rand fishkin]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[Stuntdubl]]></category>
		<category><![CDATA[unwanted search]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=7963</guid>
		<description><![CDATA[Search Engine Blogs Official Google Blog Official Yahoo! Search Blog Official Bing Search Blog Official Ask.com Blog Great Link Building Articles Your Roadmap to Ranking #1 in Google &#8211; Things to consider when building links to your website, what you really want and need. (Published February 10, 2011) 21 Advanced Link Building Strategies &#8211; Here...]]></description>
			<content:encoded><![CDATA[<p></p><h3>Search Engine Blogs</h3>
<ul>
<li><a title="http://googleblog.blogspot.com/" rel="nofollow" href="http://googleblog.blogspot.com/">Official Google Blog</a></li>
<li><a title="http://www.ysearchblog.com/" rel="nofollow" href="http://www.ysearchblog.com/">Official Yahoo! Search Blog</a></li>
<li><a title="http://www.bing.com/community/site blogs/b/search/default.aspx" rel="nofollow" href="http://www.bing.com/community/site_blogs/b/search/default.aspx">Official Bing Search Blog</a></li>
<li><a title="http://blog.ask.com/" rel="nofollow" href="http://blog.ask.com/">Official Ask.com Blog</a></li>
</ul>
<h3>Great Link Building Articles</h3>
<ul>
<li><a title="http://www.searchenginejournal.com/seo-competitive-analysis-your-roadmap-to-ranking-1-on-google/27763/" rel="nofollow" href="http://www.searchenginejournal.com/seo-competitive-analysis-your-roadmap-to-ranking-1-on-google/27763/">Your Roadmap to Ranking #1 in Google</a> &#8211; Things to consider when building links to your website, what you really want and need. (Published February 10, 2011)</li>
<li><a title="http://kaiserthesage.com/advanced-link-building-strategies/" rel="nofollow" href="http://kaiserthesage.com/advanced-link-building-strategies/">21 Advanced Link Building Strategies</a> &#8211; Here is a non-numbered list of different link building strategies. (Published February 27, 2011)</li>
<li><a title="http://linkbuildcomp.livejournal.com/3256.html" rel="nofollow" href="http://linkbuildcomp.livejournal.com/3256.html">Deep Link Building Strategies</a> (Published June 29, 2010)</li>
<li><a title="http://www.linking101.com/articles/linkbuy.htm" rel="nofollow" href="http://www.linking101.com/articles/linkbuy.htm">To Buy Links or Not to Buy &#8211; That is the Question</a> (Published by Merle&#8217;s Cyber Promotions)</li>
<li><a title="http://www.wordstream.com/blog/ws/2010/07/15/how-to-find-and-drain-link-juice" rel="nofollow" href="http://www.wordstream.com/blog/ws/2010/07/15/how-to-find-and-drain-link-juice">How to Get More Link Juice</a> &#8211; Here is an article with good visuals to help you learn how to gain more link juice. (Published July 15, 2010)</li>
<li><a title="http://www.linking101.com/articles/business.htm" rel="nofollow" href="http://www.linking101.com/articles/business.htm">Links Are Good for Business</a> (Published by Scottie Claiborne)</li>
<li><a title="http://outspokenmedia.com/seo/link-building-interview/" rel="nofollow" href="http://outspokenmedia.com/seo/link-building-interview/">Link Building Q/A with Industry Experts, 2010</a> &#8211; Hear what industry experts have to say about link building. (Published July 7, 2010)</li>
<li><a title="http://www.linking101.com/articles/onewaylink.htm" rel="nofollow" href="http://www.linking101.com/articles/onewaylink.htm">One Way Link Building Secures Long Term Ranking Results</a> (Published by Daria Goetsch)</li>
<li><a title="http://www.seomoz.org/blog/whiteboard-friday-we-bought-links-and-it-worked" rel="nofollow" href="http://www.seomoz.org/blog/whiteboard-friday-we-bought-links-and-it-worked">Rand Fishkin Bought Links and they worked</a> &#8211; Here is an article that includes a 3 experiment video hosted by Rand Fishkin. (Published June 24th, 2010)</li>
<li><a title="http://trutricks.com/2010/07/the-importance-of-building-a-natural-link-profile/" rel="nofollow" href="http://trutricks.com/2010/07/the-importance-of-building-a-natural-link-profile/">The Importance of Building a Natural Link Profile</a> &#8211; Website link building is essential to getting found in SERP&#8217;s, here are good tips to make it look natural. (Published July 18, 2010)</li>
<li><a title="http://www.seodesignsolutions.com/blog/link-building/balancing-link-diversity-link-velocity-and-link-volume/" rel="nofollow" href="http://www.seodesignsolutions.com/blog/link-building/balancing-link-diversity-link-velocity-and-link-volume/">How to Balance Link Diversity, Velocity and Volume</a> &#8211; Learn ranking factors and how to manage your websites links. (Published March 13, 2008)</li>
</ul>
<h3>Google Algorithm Articles</h3>
<ul>
<li><a title="http://techlunatic.com/2011/03/playing-nice-with-the-panda-how-to-take-advantage-of-the-latest-google-update/" rel="nofollow" href="http://techlunatic.com/2011/03/playing-nice-with-the-panda-how-to-take-advantage-of-the-latest-google-update/">Playing Nice with Panda &#8211; How to Take Advantage of Latest Google Update</a> (Published April 6, 2011)</li>
<li><a title="http://www.wordtracker.com/academy/google-panda-farmer" rel="nofollow" href="http://www.wordtracker.com/academy/google-panda-farmer">Google Panda Farmer Update</a> &#8211; Detailed article on what the Panda update with details on how to track information and update your website. (Published March 10, 2011)</li>
<li><a title="http://www.stayonsearch.com/google-announces-user-generated-filters-for-unwanted-search-results" rel="nofollow" href="http://www.stayonsearch.com/google-announces-user-generated-filters-for-unwanted-search-results">Google Announces User Generated Filters for Unwanted Search Results</a> &#8211; Now internet users can filter their search results using this cool new feature. (Published March 11, 2011)</li>
<li><a title="http://googleblog.blogspot.com/2011/02/finding-more-high-quality-sites-in.html" rel="nofollow" href="http://googleblog.blogspot.com/2011/02/finding-more-high-quality-sites-in.html">Finding Higher Quality Sites in Search</a> &#8211; Changes made to search algorithm to provide searchers with what they are actually searching for. (Published February 24, 2011)</li>
<li><a title="http://googleblog.blogspot.com/2011/01/google-search-and-search-engine-spam.html" rel="nofollow" href="http://googleblog.blogspot.com/2011/01/google-search-and-search-engine-spam.html">Google Search and Search Engine Spam</a> &#8211; Here is a post on Googles Official Blog that speaks in detail about webspam and what action is being taken. (Published January 21, 2011)</li>
<li><a title="http://www.hobo-web.co.uk/google-pagerank-update-october-2010/" rel="nofollow" href="http://www.hobo-web.co.uk/google-pagerank-update-october-2010/">Google Pagerank Update October 2010 Explained</a> &#8211; . (Published October 2010)</li>
<li><a title="http://googleblog.blogspot.com/2010/12/being-bad-to-your-customers-is-bad-for.html" rel="nofollow" href="http://googleblog.blogspot.com/2010/12/being-bad-to-your-customers-is-bad-for.html">Treating Customers Poorly is Bad for Business &#8211; Algorithm Update</a> &#8211; Algo update due to NY eye glasses merchant was rude to customers that incited them to review his company more often online. (Published Dec 1, 2010)</li>
<li><a title="http://www.searchenginejournal.com/google-pagerank-update-june-2009/11367/" rel="nofollow" href="http://www.searchenginejournal.com/google-pagerank-update-june-2009/11367/">Google May / June PageRank Update</a> &#8211; May of 2009 Google began updating their toolbar PR. (Published June 25, 2009)</li>
<li><a title="http://www.dailybloggr.com/2008/12/google-pagerank-update-december-31st-2008/" rel="nofollow" href="http://www.dailybloggr.com/2008/12/google-pagerank-update-december-31st-2008/">PageRank Update Dec 32, 2008</a> &#8211; Confirmation tweet by Matt Cutts on Google PR update. (Published December 31, 2008)</li>
</ul>
<h3>Link Bait &amp; Viral Content Link Building</h3>
<ul>
<li><a title="http://googlewebmastercentral.blogspot.com/2011/05/more-guidance-on-building-high-quality.html" rel="nofollow" href="http://googlewebmastercentral.blogspot.com/2011/05/more-guidance-on-building-high-quality.html">More Guidance on How to Create High Quality Content</a> (Published May 6, 2011)</li>
<li><a title="http://www.contentmarketinginstitute.com/2011/04/using-the-valuable-content-checklist/" rel="nofollow" href="http://www.contentmarketinginstitute.com/2011/04/using-the-valuable-content-checklist/">Step By Step Guide for Content Types</a></li>
<li><a title="http://www.seoptimise.com/blog/2011/04/is-your-content-great-big-or-just-long-quality-vs-size.html" rel="nofollow" href="http://www.seoptimise.com/blog/2011/04/is-your-content-great-big-or-just-long-quality-vs-size.html">Content Great, Big or Just long &#8211; Quality VS Size</a></li>
<li><a title="http://webmasterformat.com/blog/integrating-social-media-into-content-strategy" rel="nofollow" href="http://webmasterformat.com/blog/integrating-social-media-into-content-strategy">Enough with Content Rules, Where Do You Get the Content From</a> (Published April 11, 2011)</li>
<li><a title="http://searchengineland.com/why-quality-is-the-only-sustainable-seo-strategy-69244" rel="nofollow" href="http://searchengineland.com/why-quality-is-the-only-sustainable-seo-strategy-69244">Why Quality Is The Only Sustainable SEO Strategy</a> (Published March 28, 2011)</li>
<li><a title="http://www.viperchill.com/blog-post-headlines/" rel="nofollow" href="http://www.viperchill.com/blog-post-headlines/">Get Hundreds of Links to Your Next Blog Post, Guaranteed</a>(Published March 14, 2011)</li>
<li><a title="http://www.rosshudgens.com/link-building-model/" rel="nofollow" href="http://www.rosshudgens.com/link-building-model/">A Model For Link Building: Beyond “Great Content”</a> (Published March 15, 2011)</li>
<li><a title="http://www.searchenginepeople.com/blog/17-ways-accelerate-links-link-bait-linkable-content.html" rel="nofollow" href="http://www.searchenginepeople.com/blog/17-ways-accelerate-links-link-bait-linkable-content.html">17 Ways to Increase Links to Your Link Bait Content</a> &#8211; Entice online users to link to your companies web content. (Published by Garrett French)</li>
<li><a title="http://www.seohosting.com/blog/blogging-tips/22-linkbait-headlines-almost-every-blogger-can-use/" rel="nofollow" href="http://www.seohosting.com/blog/blogging-tips/22-linkbait-headlines-almost-every-blogger-can-use/">22 Link Bait Headlines Anyone Can Use</a> &#8211; Here are some great starter ideas to get the link bait ball rolling. (Published March 11, 2010)</li>
<li><a title="http://www.websitemagazine.com/content/blogs/posts/pages/the-anatomy-of-linkbait.aspx" rel="nofollow" href="http://www.websitemagazine.com/content/blogs/posts/pages/the-anatomy-of-linkbait.aspx">The ELements to Create Link Bait Success</a> &#8211; Very informational article that still holds true today for link bait. (Published September 23, 2009)</li>
<li><a title="http://www.toprankblog.com/2008/08/link-building-vs-content-promotion-for-links/" rel="nofollow" href="http://www.toprankblog.com/2008/08/link-building-vs-content-promotion-for-links/">Link Building vs Content Promotion for Links</a> &#8211; How link building and content promotion work together to create more backlinks. (Published August 2008)</li>
<li><a title="http://sem-group.net/search-engine-optimization-blog/3-good-link-bait-tips-3-bad-link-bait-tips/" rel="nofollow" href="http://sem-group.net/search-engine-optimization-blog/3-good-link-bait-tips-3-bad-link-bait-tips/">Link Bait Tips &#8211; 3 Good and 3 Bad</a> (Published February 24th, 2010)</li>
</ul>
<h3>Guest Blogging and Social Media Link Building</h3>
<ul>
<li><a title="http://piggybankpie.com/guest-blogging/8-reasons-to-start-guest-blogging/" rel="nofollow" href="http://piggybankpie.com/guest-blogging/8-reasons-to-start-guest-blogging/">8 Reasons to Start Guest Blogging</a></li>
<li><a title="http://ontolo.com/blog/3-limitations-guest-postings-scalability-link-building" rel="nofollow" href="http://ontolo.com/blog/3-limitations-guest-postings-scalability-link-building">3 Limitations on Guest Posting&#8217;s Scalability for Link Building</a></li>
<li><a title="http://socialmediatoday.com/theseoagency/278770/5-social-media-monitoring-tools-you-want-check-out" rel="nofollow" href="http://socialmediatoday.com/theseoagency/278770/5-social-media-monitoring-tools-you-want-check-out">5 FREE Social Media Monitoring Tools</a></li>
<li><a title="http://www.theseoagency.com/2011/01/social-media-best-practices-lackin/" rel="nofollow" href="http://www.theseoagency.com/2011/01/social-media-best-practices-lackin/">Are There Social Media Best Practices?</a></li>
<li><a title="http://www.madimmarketing.com/internet-marketing/beginners-guide-to-optimizing-social-media-channels/" rel="nofollow" href="http://www.madimmarketing.com/internet-marketing/beginners-guide-to-optimizing-social-media-channels/">Beginners Guide To Optimizing Social Media Channels</a></li>
<li><a title="http://www.textlinkbrokers.com/blog/2011/01/eight-seo-ppc-link-building-and-social-media-resolutions-to-make-for-2011/" rel="nofollow" href="http://www.textlinkbrokers.com/blog/2011/01/eight-seo-ppc-link-building-and-social-media-resolutions-to-make-for-2011/">Eight 2011 Link Building, SEO, PPC and Social Media Resolutions to Make</a> 8 Resolutions to make in 2011 when working with your <a title="http://www.theseoagency.com/" rel="nofollow" href="http://www.theseoagency.com/">SEO Agency</a>. (Published on January 3, 2011)</li>
<li><a title="http://www.textlinkbrokers.com/blog/2010/12/how-“social-signals”-from-twitter-and-facebook-affect-google-and-bing-search-rankings/" rel="nofollow" href="http://www.textlinkbrokers.com/blog/2010/12/how-%E2%80%9Csocial-signals%E2%80%9D-from-twitter-and-facebook-affect-google-and-bing-search-rankings/">Twitter and Facebook Affect Google and Bing Search Rankings</a> (Published December 7, 2010)</li>
<li><a title="http://www.pamorama.net/2011/01/30/65-terrific-social-media-infographics/" rel="nofollow" href="http://www.pamorama.net/2011/01/30/65-terrific-social-media-infographics/">65 Great Social Media Infographics</a> &#8211; Here are 65 great social media infographics. (Published January 30, 2011)</li>
<li><a title="http://searchenginewatch.com/3641552" rel="nofollow" href="http://searchenginewatch.com/3641552">How Social Media Can Assist Link Building Campaigns</a> &#8211; Good visual article that references how social media can assist in your link building campaign. (Published November 16, 2010)</li>
<li><a title="http://choosyinfo.com/link-building-guest-post-opportunities.html" rel="nofollow" href="http://choosyinfo.com/link-building-guest-post-opportunities.html">29 Ways to Find Guest Blog Opportunties</a> &#8211; Use unique search terms to find places to guest post. (Published November 24, 2010)</li>
<li><a title="http://www.sitepronews.com/2010/10/22/article-marketing-vs-guest-blog-posting/" rel="nofollow" href="http://www.sitepronews.com/2010/10/22/article-marketing-vs-guest-blog-posting/">Article Marketing vs Guest Blogging</a> &#8211; The comparison betweet articles and guest posts. (Published October 2010)</li>
<li><a title="http://piggybankpie.com/guest-blogging/" rel="nofollow" href="http://piggybankpie.com/guest-blogging/">Guest Blogging Guide</a> &#8211; This article touches on why to guest blog, where to start and how to move about the process. (Published by PiggyBankPie)</li>
<li><a title="http://ezinearticles.com/?The-Social-Media-Revolution-Is-Forever-Changing-the-Way-We-Do-Business&amp;id=5574475" rel="nofollow" href="http://ezinearticles.com/?The-Social-Media-Revolution-Is-Forever-Changing-the-Way-We-Do-Business&amp;id=5574475">The Social Media Revolution Is Forever Changing the Way We Do Business</a> &#8211; Social media has had a lasting impact on how online businesses target their audience. (Published by Michael Jon Lazar)</li>
</ul>
<h3>Archived Link Building</h3>
<ul>
<li><a title="http://www.searchnewz.com/blog/talk/sn-6-20061117Alinkisareferenceandwhatitisforus.html" rel="nofollow" href="http://www.searchnewz.com/blog/talk/sn-6-20061117Alinkisareferenceandwhatitisforus.html">A Link Is A Reference And What It Is For Us</a> &#8211; Just how valuable are some links to you? (Published on 11-17-2006)</li>
<li><a title="http://www.seopedia.org/google-and-seo/link-building/5-facts-on-link-building/" rel="nofollow" href="http://www.seopedia.org/google-and-seo/link-building/5-facts-on-link-building/">5 Facts on Link Building</a> &#8211; A good article if you are new to link building (Published on 06-15-2006)</li>
<li><a title="http://www.usatoday.com/tech/news/2006-06-13-web-marketing x.htm" rel="nofollow" href="http://www.usatoday.com/tech/news/2006-06-13-web-marketing_x.htm">Website designers want searches to work for free</a> &#8211; A couple things to point out. First this is USA Today talking about search but more importantly it&#8217;s an article with interviews of people in the industry all saying the same thing &#8211; if you want good rankings you need links (Published June 14, 2006).</li>
<li><a title="http://www.jimwestergren.com/link-building-guide/" rel="nofollow" href="http://www.jimwestergren.com/link-building-guide/">Link Building Guide</a>  &#8211; Great guide for link building (Published June 5, 2006).</li>
<li><a title="http://www.oilman.ca/sem/natural-link-acquisition/" rel="nofollow" href="http://www.oilman.ca/sem/natural-link-acquisition/">Natural Link Acquisition</a> &#8211; Oilman&#8217;s take on link building. Tip &#8211; it must appear natural (Posted on 12-01-2005).</li>
<li><a title="http://www.stuntdubl.com/2006/02/13/linkbait-2/" rel="nofollow" href="http://www.stuntdubl.com/2006/02/13/linkbait-2/">Link Baiting</a> &#8211; An article about link baiting (Published on 02-13-2006).</li>
<li><a title="http://www.stuntdubl.com/2006/03/09/emarketing-talkshow/" rel="nofollow" href="http://www.stuntdubl.com/2006/03/09/emarketing-talkshow/">Too Many Links?</a> &#8211; Has links to some very good podcasts on link building (Published on 03-09-2006).</li>
<li><a title="http://www.jimboykin.com/co-citation-understanding-how-it-effects-your-seo/" rel="nofollow" href="http://www.jimboykin.com/co-citation-understanding-how-it-effects-your-seo/">Article on Link co-citation</a> &#8211; How link co-citation can affect your SEO (and link building) efforts (Published on 03-15-2006).</li>
<li><a title="http://www.stuntdubl.com/2006/04/05/how-to-write-successful-subject-titles-for-link-requests/" rel="nofollow" href="http://www.stuntdubl.com/2006/04/05/how-to-write-successful-subject-titles-for-link-requests/">Proper Link Requests</a> &#8211; Providing suggestions for email subject lines that get noticed and get responses (Published on 04-05-2006).</li>
<li><a title="http://www.stuntdubl.com/2006/04/06/buying-links/" rel="nofollow" href="http://www.stuntdubl.com/2006/04/06/buying-links/">I Am Not a Link Communist</a> &#8211; Great article from Todd Malicoat of Stuntdubl.com (Published on 04-06-2006).</li>
<li><a title="http://www.ezinearticles.com/?Getting-Inbound-Links-To-Your-Website&amp;id=180127" rel="nofollow" href="http://www.ezinearticles.com/?Getting-Inbound-Links-To-Your-Website&amp;id=180127">E-Zine Article</a> &#8211; Tips for building inbound links (Published 04-17-2006).</li>
<li><a title="http://www.stuntdubl.com/2006/05/10/link-math/" rel="nofollow" href="http://www.stuntdubl.com/2006/05/10/link-math/">How to Get the Links You Need &#8211; Doing the Math on Link Building</a> &#8211; Yet another great article by Stuntdubl. Maybe you don&#8217;t need as many links as you think? (Published on 05-10-2006).</li>
<li><a title="http://www.stuntdubl.com/2006/05/10/link-test/" rel="nofollow" href="http://www.stuntdubl.com/2006/05/10/link-test/">The 5 minute Link Value Test &#8211; 6 Link Quality Indicators</a> &#8211; Some common ways to find the value of links from Stuntdubl (Published on 05-10-2006).</li>
<li><a title="http://www.isedb.com/db/articles/1439/" rel="nofollow" href="http://www.isedb.com/db/articles/1439/">Preventing Link Popularity Leakage</a> &#8211; Not strictly link building however it does show how to maximize your link popularity inheritance from the home page (Published on 05-10-2006).</li>
<li><a title="http://news.com.com/2100-1028 3-6072601.html?part=rss&amp;tag=6072601&amp;subj=news" rel="nofollow" href="http://news.com.com/2100-1028_3-6072601.html?part=rss&amp;tag=6072601&amp;subj=news">News.com Article</a> Discusses new laws which, among other things, may hold site owners legally (and likely criminally) responsible for outgoing links (Published on 05-16-2006).</li>
<li><a title="http://news.stepforth.com/blog/2006/05/thinking-lot-about-linking.php" rel="nofollow" href="http://news.stepforth.com/blog/2006/05/thinking-lot-about-linking.php">Thinking (a lot) about linking</a> &#8211; A good article that touches on many aspects of how site interlinking works (Published on 05-30-2006).</li>
<li><a title="http://www.ezinearticles.com/?SEO-Tips:-Link-Building&amp;id=169840" rel="nofollow" href="http://www.ezinearticles.com/?SEO-Tips:-Link-Building&amp;id=169840">E-Zine Article</a> &#8211; Link Building Article (Published 05-30-2006).</li>
<li><a title="http://jeremy.zawodny.com/blog/archives/006800.html" rel="nofollow" href="http://jeremy.zawodny.com/blog/archives/006800.html">Nofollow No Good</a> &#8211; Jeremy Zawodny raises some interesting points about the effectivness (or lack thereof) of the nofollow attribute (Published 05-30-2006).</li>
<li><a title="http://www.stuntdubl.com/2005/07/25/link-development-tools/" rel="nofollow" href="http://www.stuntdubl.com/2005/07/25/link-development-tools/">Link Development Tools</a> &#8211; A great one-stop-shop for a variety of link building tools, tips and tricks (Published on 07-25-2005).</li>
<li><a title="http://www.rustybrick.com/seo articles 10.php" rel="nofollow" href="http://www.rustybrick.com/seo_articles_10.php">Web Links from the Search Engine&#8217;s Perspective</a> &#8211; Barry Swartz aka Rusty Brick provides his ideas on link building (Published on 11-04-2004).</li>
</ul>
<h3>Backlink Analyzers</h3>
<ul>
<li><a title="http://www.opensiteexplorer.org/" rel="nofollow" href="http://www.opensiteexplorer.org/">OpenSiteExplorer</a> &#8211; A popular choice for analyzing backlinks. OSE has its on crawl data and doesnt rely on other backlink sources such as Yahoo Site Explorer, which only shows limited Data.</li>
<li><a title="http://www.majesticseo.com/" rel="nofollow" href="http://www.majesticseo.com/">MajesticSEO</a> &#8211; Another popular choice for analyzing backlinks. Majestic has its own crawl data.</li>
<li><a title="https://siteexplorer.search.yahoo.com/" rel="nofollow" href="https://siteexplorer.search.yahoo.com/">Yahoo Site Explorer</a> &#8211; Allows users to check incoming links to websites and specific pages.</li>
</ul>
<h3>Rank Checking/Tracking Tools</h3>
<ul>
<li><a title="http://www.advancedwebranking.com/" rel="nofollow" href="http://www.advancedwebranking.com/">Advanced Web Rankings</a> &#8211; Windows based software for checking rankings. One of the most fully featured on the market</li>
<li><a title="http://www.link-assistant.com/rank-tracker/" rel="nofollow" href="http://www.link-assistant.com/rank-tracker/">Rank Tracker by Link-Assistant</a> &#8211; Another popular Windows based rank tracker.</li>
</ul>
<h3>Pagerank Lookup/PageRank Tools</h3>
<ul>
<li><a title="http://www.prprowler.com/" rel="nofollow" href="http://www.prprowler.com/">PrProwler</a> &#8211; Prprowler is another really great link analysis tool. Allows you to quickly analyze, collect info, and sort backlinks from your competitors and from analysis of top ranked sites for particular keywords.</li>
</ul>
<h3>Class C IP Tools</h3>
<ul>
<li><a title="http://www.webrankinfo.com/english/tools/class-c-checker.php" rel="nofollow" href="http://www.webrankinfo.com/english/tools/class-c-checker.php">WebrankInfo Class C checker</a> &#8211; Allows you to check if some sites are hosted on the same Class C IP Range.</li>
</ul>
<h3>Keyword Research and Management Tools</h3>
<ul>
<li><a title="http://www.keywordspy.com/" rel="nofollow" href="http://www.keywordspy.com/">KeywordSpy</a> Very popular tool for researching keywords. They maintain a huge database of millions of keywords and track where websites rank for those keywords. Great for competitive research.</li>
<li><a title="http://www.SEMRush.com/" rel="nofollow" href="http://www.SEMRush.com/">SEMRush</a> Similar to KeywordSpy and just as popular.</li>
<li><a title="http://www.Spyfu.com/" rel="nofollow" href="http://www.Spyfu.com/">SpyFu</a> Similar to KeywordSpy and SEMrush</li>
<li><a title="http://www.wordstream.com/" rel="nofollow" href="http://www.wordstream.com/">Wordstream Keyword Management</a> Online tool that helps you research and organize your keywords. Great for SEO/SEM companies that deal with lots of keyword lists. Helps with keyword discovery, keyword grouping, keyword organization, keyword analytics, search marketing work flow, with the ability to act on keyword data for PPC and SEO.</li>
<li><a title="http://www.nichebot.com/" rel="nofollow" href="http://www.nichebot.com/">Keyword Search Volumes</a> &#8211; Provides keyword data using Wordtracker and Google search results.</li>
<li><a title="http://www.wordtracker.com" rel="nofollow" href="http://www.wordtracker.com">Word Tracker</a> &#8211; Probably one of the oldest and most well known keyword research tools. Requires paid subscription</li>
</ul>
<h3>Firefox Extensions</h3>
<ul>
<li><a title="http://www.quirk.biz/searchstatus/" rel="nofollow" href="http://www.quirk.biz/searchstatus/">SearchStatus Plugin</a> &#8211; SearchStatus gives you Pagerank, Alexa, Compete right in the status bar of firefox, it also provides links to find backlinks and other stats for a domain/page in Google, Yahoo, MSN.</li>
<li><a title="http://tools.seobook.com/firefox/seo-for-firefox.html" rel="nofollow" href="http://tools.seobook.com/firefox/seo-for-firefox.html">SEOBook&#8217;s SEO for Firefox</a> &#8211; A great plugin that allows you to see a ton of data about sites inside of Google or Yahoo Search.</li>
<li><a title="https://addons.mozilla.org/firefox/1471/" rel="nofollow" href="https://addons.mozilla.org/firefox/1471/">RankQuest SEO Toolbar</a> &#8211; Toolbar provides you quick access to more than 25 intuitive SEO tools.</li>
<li><a title="https://addons.mozilla.org/firefox/2279/" rel="nofollow" href="https://addons.mozilla.org/firefox/2279/">SEO Keyword Competition Research</a> &#8211; Gives you backlinks number, indexed pages, keyword occurences on the page, page rank and more.</li>
<li><a title="https://addons.mozilla.org/firefox/2233/" rel="nofollow" href="https://addons.mozilla.org/firefox/2233/">SEO Tools</a> &#8211; Collection of useful SEO Tools</li>
<li><a title="https://addons.mozilla.org/firefox/570/" rel="nofollow" href="https://addons.mozilla.org/firefox/570/">SEOpen</a> &#8211; Provides some basic tools to help with search engine optimization and link building.</li>
<li><a title="https://addons.mozilla.org/firefox/669/" rel="nofollow" href="https://addons.mozilla.org/firefox/669/">SEO Bar</a> &#8211; Another SEO Toolbar.</li>
<li><a title="https://addons.mozilla.org/firefox/247/" rel="nofollow" href="https://addons.mozilla.org/firefox/247/">a4seo</a> &#8211; Use to examine a site&#8217;s backlinks.</li>
<li><a title="https://addons.mozilla.org/en-US/firefox/addon/firebug/" rel="nofollow" href="https://addons.mozilla.org/en-US/firefox/addon/firebug/">FireBug</a> &#8211; Tool used to pick apart web page coding.</li>
<li><a title="https://addons.mozilla.org/en-US/firefox/addon/nodofollow/" rel="nofollow" href="https://addons.mozilla.org/en-US/firefox/addon/nodofollow/">NoDoFollow</a> &#8211; Highlights no-follow links pink to easily determine what is follow and what is no-follow.</li>
</ul>
<h3>PageSpeed Testing</h3>
<ul>
<li><a title="http://tools.pingdom.com/" rel="nofollow" href="http://tools.pingdom.com/">Test the load time of a web page</a> &#8211; Test Now</li>
<li><a title="http://pagespeed.googlelabs.com/" rel="nofollow" href="http://pagespeed.googlelabs.com/">Google Suggestions to Speed Up Page Loading Time</a> &#8211; Test Now</li>
</ul>
<h3>Link Building Tool Directories</h3>
<ul>
<li>These are some of the best papers published by students, individuals and employees of major search engines.</li>
<li><a title="http://www-db.stanford.edu/pub/papers/google.pdf" rel="nofollow" href="http://www-db.stanford.edu/pub/papers/google.pdf">The Anatomy of a large-scale hypertextual Web search engine</a> &#8211; The definitive paper on how Google works (pdf)</li>
<li><a title="http://theory.lcs.mit.edu/~ruhl/papers/2001-icdm.pdf" rel="nofollow" href="http://theory.lcs.mit.edu/%7Eruhl/papers/2001-icdm.pdf">Who Links to Whom: Mining Linkage between Web Sites (pdf)</a> &#8211; From Google Labs</li>
<li><a title="http://coblitz.codeen.org:3125/citeseer.ist.psu.edu/cache/papers/cs/92/http:zSzzSzwww.research.digital.comzSzSRCzSzpersonalzSzmonikazSzpaperszSzsigir98.pdf/bharat98improved.pdf" rel="nofollow" href="http://coblitz.codeen.org:3125/citeseer.ist.psu.edu/cache/papers/cs/92/http:zSzzSzwww.research.digital.comzSzSRCzSzpersonalzSzmonikazSzpaperszSzsigir98.pdf/bharat98improved.pdf">Improved Algorithms for Topic Distillation in a Hyperlinked Environment (1998) (pdf)</a> &#8211; From CiteSeer (Penn State)</li>
<li><a title="http://coblitz.codeen.org:3125/citeseer.ist.psu.edu/cache/papers/cs/15889/http:zSzzSzwww.neci.nj.nec.comzSzhomepageszSzflakezSzkdd2000.pdf/flake00efficient.pdf" rel="nofollow" href="http://coblitz.codeen.org:3125/citeseer.ist.psu.edu/cache/papers/cs/15889/http:zSzzSzwww.neci.nj.nec.comzSzhomepageszSzflakezSzkdd2000.pdf/flake00efficient.pdf">Efficient Identification of Web Communities (2000) (pdf)</a> &#8211; Discusses using links to find communities of sites</li>
<li><a title="http://research.yahoo.com/publication/YRL-2004-038.pdf" rel="nofollow" href="http://research.yahoo.com/publication/YRL-2004-038.pdf">Fast Parallel PageRank (pdf)</a> &#8211; A new method for improving PageRank calculations</li>
<li><a title="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=/netahtml/PTO/search-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PG01&amp;s1=20050071741&amp;OS=20050071741&amp;RS=20050071741" rel="nofollow" href="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;Sect2=HITOFF&amp;p=1&amp;u=%2Fnetahtml%2FPTO%2Fsearch-bool.html&amp;r=1&amp;f=G&amp;l=50&amp;co1=AND&amp;d=PG01&amp;s1=20050071741&amp;OS=20050071741&amp;RS=20050071741">Informational Retrieval Based on Historical Data</a></li>
<li><a title="http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?lang=en&amp;doc=1999-66&amp;format=pdf&amp;compression=&amp;name=1999-66.pdf" rel="nofollow" href="http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?lang=en&amp;doc=1999-66&amp;format=pdf&amp;compression=&amp;name=1999-66.pdf">The Pagerank Citation Ranking: Bringing Order to the Web</a></li>
<li><a title="http://www-cs-students.stanford.edu/~taherh/papers/topic-sensitive-pagerank-tkde.pdf" rel="nofollow" href="http://www-cs-students.stanford.edu/~taherh/papers/topic-sensitive-pagerank-tkde.pdf">Topic-Sensitive PageRank &#8211; A Context-Sensitive Ranking Algorithm for Web Search</a></li>
<li><a title="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&amp;Sect2=HITOFF&amp;d=PG01&amp;p=1&amp;u=/netahtml/PTO/srchnum.html&amp;r=1&amp;f=G&amp;l=50&amp;s1=&quot;20060095416&quot;.PGNR.&amp;OS=DN/20060095416&amp;RS=DN/20060095416" rel="nofollow" href="http://appft1.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&amp;Sect2=HITOFF&amp;d=PG01&amp;p=1&amp;u=%2Fnetahtml%2FPTO%2Fsrchnum.html&amp;r=1&amp;f=G&amp;l=50&amp;s1=%2220060095416%22.PGNR.&amp;OS=DN/20060095416&amp;RS=DN/20060095416">Link Based Spam Detection &#8211; Yahoo Patent</a></li>
</ul>
<h3>Link Building Books</h3>
<ul>
<li><a title="http://www.amazon.com/gp/product/0750659793/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0750659793/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; Marketing Through Search Optimization: How to be found on the web (Paperback) by Alex Michael, Ben Salter 2003 &#8211; 264 pages</li>
<li><a title="http://www.amazon.com/gp/product/0735712565/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0735712565/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; Search Engine Visibility (Paperback) by Shari Thurow 2002 &#8211; 320 pages</li>
<li><a title="http://www.amazon.com/gp/product/0735713243/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0735713243/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; Speed Up Your Site: Web Site Optimization (Paperback) by Andrew B King &#8211; 2003 &#8211; 528 pages</li>
<li><a title="http://www.amazon.com/gp/product/1931644217/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/1931644217/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; 101 Ways to Promote Your Web Site : Filled with Proven Internet Marketing Tips, Tools, Techniques, and Resources to Increase Your Web Site Traffic (Paperback) &#8211; by Susan Sweeney &#8211; 2004 &#8211; 460 pages</li>
<li><a title="http://www.amazon.com/gp/product/0735713995/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0735713995/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; Search Engine Advertising : Buying Your Way to the Top to Increase Sales (Voices That Matter) (Paperback) &#8211; by Catherine Seda &#8211; 2004 &#8211; 368 pages</li>
<li><a title="http://www.amazon.com/gp/product/0618276793/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0618276793/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; Guerrilla Marketing for Free: Dozens of No-Cost Tactics to Promote Your Business and Energize Your Profits (Paperback) &#8211; by Jay Conrad Levinson &#8211; 2003 &#8211; 188 pages</li>
<li><a title="http://www.amazon.com/gp/product/0596008570/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0596008570/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; Google Hacks : Tips &amp; Tools for Smarter Searching (Hacks) (Paperback) &#8211; by Tara Calishain, Rael Dornfest &#8211; Computers &#8211; 2004 &#8211; 443 pages</li>
<li><a title="http://www.amazon.com/gp/product/0072231742/102-2590613-7717724?n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0072231742/102-2590613-7717724?n=283155">Amazon Link</a> &#8211; How to Do Everything with Google (Paperback) by Fritz Schneider, Nancy Blachman, Eric Fredricksen &#8211; 2003 &#8211; 350 pages</li>
<li><a title="http://www.amazon.com/gp/product/0471787531/sr=1-1/qid=1147185467/ref=sr 1 1/102-2590613-7717724? encoding=UTF8" rel="nofollow" href="http://www.amazon.com/gp/product/0471787531/sr=1-1/qid=1147185467/ref=sr_1_1/102-2590613-7717724?%5Fencoding=UTF8">Amazon Link</a> &#8211; Search Engine Optimization : An Hour a Day (Paperback) &#8211; by Jennifer Grappone, Gradiva Couzin &#8211; 2006 &#8211; 312 pages</li>
<li><a title="http://www.amazon.com/gp/product/1411622510/ref=pd bxgy text b/102-2590613-7717724? encoding=UTF8" rel="nofollow" href="http://www.amazon.com/gp/product/1411622510/ref=pd_bxgy_text_b/102-2590613-7717724?%5Fencoding=UTF8">Amazon Link</a> &#8211; The ABC of SEO (Paperback) &#8211; by David George &#8211; 2005 &#8211; 172 pages</li>
<li><a title="http://www.amazon.com/gp/product/0764567586/ref=pd sim b 2/102-2590613-7717724? encoding=UTF8&amp;v=glance&amp;n=283155" rel="nofollow" href="http://www.amazon.com/gp/product/0764567586/ref=pd_sim_b_2/102-2590613-7717724?%5Fencoding=UTF8&amp;v=glance&amp;n=283155">Amazon Link</a> &#8211; Search Engine Optimization for Dummies (Paperback) &#8211; by Peter Kent &#8211; 2004 &#8211; 384 pages</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/7963-list-of-high-quality-resources-for-link-building-in-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guide to Performing Basic SEO</title>
		<link>http://zachbrowne.com/6431-guide-to-performing-basic-seo/</link>
		<comments>http://zachbrowne.com/6431-guide-to-performing-basic-seo/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 07:14:36 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[check]]></category>
		<category><![CDATA[google search bar]]></category>
		<category><![CDATA[google yahoo]]></category>
		<category><![CDATA[keyword ideas]]></category>
		<category><![CDATA[keyword suggestion tool]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[visual thesaurus]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=6431</guid>
		<description><![CDATA[This guide will take you through the basic steps of performing SEO on your website. Keyword Research Keywords are the words that web surfers enter in search engines like Google, Yahoo! or Bing &#8211; with the probable intent of finding products to buy, useful information, news or things to entertain. You&#8217;ll want to optimize your...]]></description>
			<content:encoded><![CDATA[<p></p><p>This guide will take you through the basic steps of performing SEO on your website.</p>
<h2>Keyword Research</h2>
<p>Keywords are the words that web surfers enter in search engines like Google, Yahoo! or Bing &#8211; with the probable intent of finding products to buy, useful information, news or things to entertain. You&#8217;ll want to optimize your website for effective keywords that might bring you lots of targeted visitor traffic from the search engines.</p>
<h3>Building a Keyword List</h3>
<h4>Create your keyword core by picking basic keywords that depict your business.</h4>
<p>Brainstorm broad terms that are related to your business, products and services. These words are going to build your keyword core that you will further use to create a list of keyword phrase combos to optimize your site for.</p>
<p>Good keyword tools:</p>
<p><strong>Keyword suggestion tools</strong></p>
<ul>
<li><a rel="nofollow" href="https://adwords.google.co.uk/select/KeywordToolExternal">Google External Keyword Tool</a> – The “big daddy” of keyword tools straight from the belly of the beast. Check out the beta link to the advanced version.</li>
<li><a rel="nofollow" href="http://www.wordstream.com/keywords">WordStream</a> – Really great aggregator of other suggest tools</li>
<li><a rel="nofollow" href="http://adlab.msn.com/">Microsoft AdCenter Labs</a> – Keyword suggest tool along with a multitude of “experimental tools” like the search funnels, keyword research, keyword mutation tool, etc.</li>
<li>Google’s <a rel="nofollow" href="http://www.google.com/sktool/">Search-based Keyword Tool</a> provides keyword ideas based on actual Google search queries and matched to specific pages of your website with your ad and search share.</li>
<li><a rel="nofollow" href="http://freekeywords.wordtracker.com/">WordTracker’s Keyword Suggestion Tool</a></li>
</ul>
<p><strong>Engine suggestions</strong></p>
<p>Suggestions in the drop-down menus that appear when you start typing in a search box:</p>
<ul>
<li><a rel="nofollow" href="http://tools.seobook.com/general/keyword-information/">Google Suggest Keyword Suggestion Scraper Tool</a> – This tool grabs the top queries from <a rel="nofollow" href="http://www.google.com/webhp?complete=1&amp;hl=en">Google Suggest</a> which normally appears in a drop down menu under the Google search bar as you type a query.</li>
<li><a rel="nofollow" href="http://soovle.com/">Soovle</a> is a free tool that provides the search suggestions from various engines around the net including Google, Yahoo, Bing, Wikipedia, Amazon, etc.</li>
</ul>
<p><strong>Visualization tools &amp; word clouds</strong></p>
<ul>
<li><a rel="nofollow" href="www.quintura.com/">Quintara Word Cloud</a></li>
<li><a rel="nofollow" href="http://www.google.com/">Google Wonder Wheel.</a></li>
<li><a rel="nofollow" href="http://www.visualthesaurus.com/">Visual Thesaurus</a></li>
<li><a rel="nofollow" href="http://clusty.com/">Clusty</a> – A search engine that provides results parsed into categories.</li>
<li><a rel="nofollow" href="http://www.wordle.net/">Wordle</a> – Creates a visual keyword cloud based on the terms you enter.</li>
</ul>
<p><strong>Topical/categorical</strong></p>
<ul>
<li><a rel="nofollow" href="http://www.gorank.com/seotools/ontology/">GoRank Ontology Finder</a> (Related Keywords Lookup Tool) – Checks the top 1000 Google results for your keywords by running a related word query. Not really for synonyms but rather other words in that topic.</li>
<li><a rel="nofollow" href="http://www.google.com/trends">Google Trends</a> – See search terms and activity around certain topics.</li>
<li>With <a rel="nofollow" href="http://google.com/insights/search/">Google Insights for Search</a>, you can compare search volume patterns across specific regions, categories, time frames and properties.</li>
<li><a rel="nofollow" href="http://labs.google.com/sets">Google Sets</a> – Enter a few items from a set of things and Google will try to predict other items in the set. Can be handy to uncover terms related to your keywords.</li>
</ul>
<p><strong>Synonyms &amp; word meanings</strong></p>
<ul>
<li><a rel="nofollow" href="//thesaurus.com/">Thesaurus.com</a> – You can’t beat the basic thesaurus for finding terms.</li>
<li>Princeton University’s <a rel="nofollow" href="http://wordnetweb.princeton.edu/perl/webwn">WordNet lexicon tool</a> goes beyond the thesaurus and really drives into the different meanings of specified words.</li>
<li><a rel="nofollow" href="http://www.lexfn.com/">Lexical FreeNet</a> – A powerful tool that shows the relationship between words.</li>
</ul>
<p><strong>Typos and misspellings</strong></p>
<ul>
<li><a rel="nofollow" href="http://tools.seobook.com/spelling/keywords-typos.cgi">Keyword typo generator by SEO Book</a></li>
<li><a rel="nofollow" href="http://www.online-utility.org/text/misspellizer.jsp">Produces misspelled text</a></li>
<li><a rel="nofollow" href="http://www.seochat.com/seo-tools/keyword-typo-generator/">Keyword typo generator by SEO Chat</a></li>
</ul>
<p><strong>Keyword Manipulation </strong></p>
<ul>
<li><a rel="nofollow" href="http://tools.seobook.com/keyword-list-cleaner/stripper.php">SEO Tools Bad Keyword &amp; Number Stripper</a> – Use this tool to remove bad keywords from your keyword lists.</li>
<li><a rel="nofollow" href="http://www.mikes-marketing-tools.com/adwords-wrapper.html">AdWords Wrapper</a> – Simply enter a list of keyword phrases and the Google AdWords Wrapper will turn it into 4 separate lists; a combination of broad, phrase and exact match, a combination of phrase and exact match, phrase match only, and exact match only.</li>
<li><a rel="nofollow" href="http://www.jumbokeyword.com/">Jumbo Keyword tool</a> – A myriad of features such as auto-lowercase, auto-dedupe, delete blank lines, create phrase, exact, and broad match versions of keywords. Make sure to click the advanced tab for the most options.</li>
<li><a rel="nofollow" href="http://www.iwebtool.com/list_cleaner">iwebTools Quick Dedupe</a> – Paste in a list of terms and it will quickly remove duplications</li>
</ul>
<p><strong>Keyword Density </strong></p>
<p>These tools detect how often terms appear in content.</p>
<ul>
<li><a rel="nofollow" href="http://tools.davidnaylor.co.uk/keyworddensity/">Dave Naylor keyword density tool</a></li>
<li><a rel="nofollow" href="http://www.seochat.com/seo-tools/keyword-density/">SEOChat keyword density checker</a></li>
<li><a rel="nofollow" href="http://www.gorank.com/seotools/">GoRank keyword density analyzer and comparer</a> – Compare the keyword density of different pages</li>
<li><a rel="nofollow" href="http://www.seomoz.org/term-extractor">SEOMoz term extractor</a> – A keyword density tool but allows you to paste in text instead of inputting a URL.</li>
<li><a rel="nofollow" href="http://www.online-utility.org/text/analyzer.jsp">Text analysis tool</a> – Allows you to find the most frequent phrases and frequencies of words. Non-English language texts are supported. It also counts number of words, characters, sentences and syllables.</li>
</ul>
<p><strong>Geotargeting</strong></p>
<ul>
<li>For the low cost of a free blog mention, you can get <a rel="nofollow" href="http://www.zipcodeguy.com/blog/">ZipCodeGuy’s geo-database</a> which has a list of all cities and counties in the U.S. along with some other good resources.</li>
<li><a rel="nofollow" href="http://5minutesite.com/local_keywords.php">Generate local AdWords &amp; keyword lists</a> – Enter a zip code and chose the radius around it you want to geotarget. The tool will combine your keywords with the cities and states within the radius. Really great tool!</li>
</ul>
<p><strong>Keyword monitors </strong></p>
<p>These tools let you input a list of keywords, and then tracks rankings and competitor activity over time.</p>
<ul>
<li><a rel="nofollow" href="http://www.adgooroo.com/">AdGooroo</a></li>
<li><a rel="nofollow" href="http://www.thesearchmonitor.com/">The search monitor</a></li>
<li><a rel="nofollow" href="http://keywordcompetitor.com/">Keyword competitor</a></li>
</ul>
<p><strong>Permutation tools</strong></p>
<p>These tools let you combine lists together—see <a title="PPC Magic: 3 Steps To Turning Hundreds Of  Keywords Into Millions" rel="nofollow" href="../../ppc-magic-3-steps-to-turning-hundreds-of-keywords-into-millions-41198">PPC Magic: 3 Steps To Turning Hundreds Of Keywords Into Millions</a> for more info.</p>
<ul>
<li><a rel="nofollow" href="http://www.maxivista.com/adwords_keyword_juggler.php">AdWords juggler tool</a></li>
<li><a rel="nofollow" href="http://kw.tre.sk/">Search phrase builder</a></li>
<li><a rel="nofollow" href="http://www.ranks.nl/tools/keyword_combinations.html">Keyword combinations</a></li>
<li><a rel="nofollow" href="http://www.keywordlizard.com/">Keyword lizard</a></li>
<li><a rel="nofollow" href="http://www.searchenginepromotionhelp.com/m/keywords-combiner/word-combinations.php">Combine keywords</a></li>
</ul>
<p><strong>Keyword competitor tools</strong></p>
<p>Find out who’s ranking on specified terms along with other useful data.</p>
<ul>
<li><a rel="nofollow" href="http://searchanalytics.compete.com/">Compete search analytics</a></li>
<li><a rel="nofollow" href="http://www.keywordspy.com/">Keyword Spy</a></li>
<li><a rel="nofollow" href="http://www.spyfu.com/">SpyFu</a></li>
<li><a rel="nofollow" href="http://www.semrush.com/">SEMRush</a></li>
<li><a rel="nofollow" href="http://seodigger.com/">SEODigger</a></li>
</ul>
<p><strong>Engine upload tools</strong></p>
<ul>
<li><a rel="nofollow" href="http://www.google.com/intl/en/adwordseditor/">Google AdWords Editor</a></li>
<li><a rel="nofollow" href="http://advertising.yahoo.com/desktop/en_US">Yahoo Search Marketing Desktop</a></li>
<li><a rel="nofollow" href="http://advertising.microsoft.com/learning-center/downloads/adcenter-desktop">Microsoft adCenter Desktop (Beta)</a></li>
</ul>
<p><strong>Negative terms</strong></p>
<ul>
<li><a rel="nofollow" href="http://www.wordstream.com/negative-keyword-tool">WordStream’s negative keyword tool</a></li>
<li><a rel="nofollow" href="http://www.engineready.com/txt/negative-keywords.txt">EngineReady.com’s negative keyword list</a> – 420 negative keywords by major vertical, along with a list of general negative keywords that should work well for any industry.</li>
<li><a rel="nofollow" href="http://spearmarketing.com/blog/26-must-have-negative-keywords-for-b2b-ppc-campaigns/">26 must have negative keywords for B2B</a></li>
<li><a rel="nofollow" href="http://www.komarketingassociates.com/blog/200-plus-negative-keywords-to-consider-for-b2b-ppc/">200+ negative keywords to consider for B2B PPC</a></li>
</ul>
<p><strong>Modifier lists</strong></p>
<ul>
<li><a rel="nofollow" href="http://tools.seobook.com/keyword-worksheets/keyword-worksheet.xls">Keyword modifiers list by SEO Book</a> – Spreadsheet showing common keyword modifiers organized by categories such as price, location, and other common variables.</li>
<li><a rel="nofollow" href="http://www.scribd.com/doc/337919/PPC-Keyword-Modifiers-Dating-Niche">Keyword modifiers for dating industry</a> – Okay it’s very niche, but it will get you thinking in the right direction for your own industry.</li>
<li><a rel="nofollow" href="http://www.seodesignsolutions.com/blog/internet-marketing/keywords-and-modifers-how-visitors-find-your-website/">Some purchase term modifiers</a></li>
</ul>
<p><strong>Miscellaneous tools</strong></p>
<ul>
<li><a rel="nofollow" href="http://www.wordstream.com/keyword-grouper/">Free Keyword Grouper</a> – This tool from WordStream can transform your list (up to 10,000 keywords) into an organized keyword structure ready for high-performance PPC campaigns and an SEO-friendly information architecture.</li>
<li><a rel="nofollow" href="http://www.wordstream.com/keyword-niche-finder/">The Free Keyword Niche Finder</a> – An innovative new keyword tool from WordStream that returns <em>structured </em>keyword suggestions rather than a disorganized list. Just enter a keyword to find your most relevant and profitable keyword niches for pay-per-click advertising and SEO.</li>
<li><a rel="nofollow" href="http://www.apogee-web-consulting.com/tools/keyword_tool.php">Apogee’s meta data research tool</a> – Sure, it’s easy enough to view the source code of a site and see its meta keywords, but this makes it even easier.</li>
</ul>
<p>Keep in mind that one word keywords are not very targeted so they are not very effective: most people use a two to four word phrase in a search. For example, if you are male and plan to buy a bike jacket it will not be very helpful to enter jackets in the Google searchbox. You&#8217;d rather narrow down your search to men&#8217;s bike jackets to find exactly what you want.</p>
<p><strong><em>Tip</em></strong>: Do not think only about the keywords and phrases which are most popular and will drive the most traffic. Also use long-tail, more specific terms &#8211; these might convert the most sales, leads or phone calls.</p>
<p>In other words, you are supposed to pinpoint your Keyword Niche. It should be large enough to draw good visitor traffic, yet narrow and specific enough to let you outplay your competitors and get to the top on the SEs.</p>
<h4>Use the keyword tools listed above to expand your keyword list with related and synonymous phrases.</h4>
<p>For example, if you sell all kinds of dresses online, you may want to add the following phrases to your list:<br />
black dress, evening dresses, plus size dresses, cocktail dresses, formal dresses, party dresses, maxi dress, summer dresses, designer dresses, white dresses, mother of the bride dresses, strapless dresses, vintage dresses, long dresses, dresses for sale, dresses online.</p>
<h2>SEO</h2>
<p>Once you are done with the keyword research, you can now get to your site optimization. This includes enriching the existing site pages with the targeted keywords, making your site structure and page source code search-engine-friendly, creating new optimized content, doing local SEO and submitting your site to search engines, directories and other valuable web resources.</p>
<h3>Basic SEO Milestones</h3>
<h4>Purchase a domain name which contains your keywords.</h4>
<p>In case you haven&#8217;t purchased a domain yet, you may want to choose a domain name that includes some of your keywords, e.g. http://www.keyword1-keyword2.com.</p>
<p>If you use several keywords in a domain name, make sure to separate them with a hyphen, the best word separator recognized by all search engines. Another benefit of using a hyphen as a word separator is that many people linking to your site will most probably use your domain name in the anchor text of the backlinks, so your keywords will be there automatically, too.</p>
<p>Note: If you target local audience, it is recommended that you purchase a country-specific domain. The major search engines (Google, Yahoo!, and Bing) check top-level domain (TLD) names to determine where a website is located.</p>
<p>If your site has a country code top-level domain name, that is, a domain name that ends in a country code like &#8220;.ca&#8221; for Canada, &#8220;.uk&#8221; for the United Kingdom, &#8220;.fr&#8221; for France, etc. &#8211; then your site will be included in the country-specific search results. In most cases, the local TLD will outrank a .com name when it comes to local search results.</p>
<p>Here&#8217;s a list of tools to find a good domain:</p>
<ul>
<li><a rel="nofollow" href="http://domai.nr/">Domainr</a> - Nowadays, it&#8217;s difficult to find a domain name that end with the popular .com, .net, and .org <a title="Top-level Domains - Wikipedia entry." rel="nofollow" href="http://en.wikipedia.org/wiki/Top-level_domain">TLD</a>&#8216;s. <em>Domainr</em> is an innovative web tool that helps you explore other TLD&#8217;s that have made popular websites like last.fm and delicious.com stand out from the crowd. Of course, searches will also include popular top-level domains that are available.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.dotomator.com/">Dot-o-mator</a> - <em>Dot-o-mator</em> is a web tool that suggests site names based on prefixes and suffixes that you’ve entered (keywords). Alternatively, you can use a category of prefixes (like &#8220;Tech&#8221; or &#8220;Games&#8221;) and suffixes (like &#8220;Hardware&#8221; or &#8220;Web 2.0 words&#8221;) to generate suggested site names for you. It’s a helpful tool for, at the very least, obtaining inspiration for a site name.They also have a fun tool called <a rel="nofollow" href="http://www.dotomator.com/web20.html">Web 2.0 Domain Name Generator</a> that generates &#8220;Web 2.0&#8243; site names like &#8220;Yakidoo&#8221; or &#8220;Zoompulse&#8221;.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.bustaname.com/">BustAName</a> - <em>BustAName</em> is a robust and feature-packed domain finder that uses linguistic data to help you search domains. BustAName allows you to save and manage/organize your searches for later use. It has a &#8220;List of Words&#8221; feature that advise you of similar words to your search – which you can then organize inside folders.Available domains that are returned can be sorted in a number of ways such as &#8220;by quality (readability)&#8221; or &#8220;by length&#8221; for easier viewing. Though the web tool is very intuitive, the creators have a <a rel="nofollow" href="http://www.bustaname.com/">video tutorial</a> on how to utilize BustAName.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.domaintools.com/">Domain Tools</a> - <em>Domain Tools</em> is a set of domain name search engines that will help you uncover relevant information about certain domain names. They have a &#8220;Whois&#8221; search that reveals records about the party who registered the domain, a &#8220;Suggestions&#8221; search to help you find similar domain names, a &#8220;Domain Search&#8221; which shows you what TLDs of a domain name are available, and domain names that are &#8220;For Sale&#8221; or &#8220;At Auction&#8221;.</li>
</ul>
<ul>
<li><a rel="nofollow" href="https://domize.com/">Domize</a> - <em>Domize</em> is a fast, Ajax-based search engine that you can use to rapidly check the availability of domains. Domize has <a title="Demo of Domize widget." rel="nofollow" href="http://phasetwo.org/post/coming-soon-domize-domain-name-widget.html">a widget</a> that you can install on your website to provide a domain search engine to your visitors. Domize also has an <a rel="nofollow" href="http://www.apple.com/webapps/searchtools/domizeinstantdomainnamelookup.html">iPhone app</a> – because domain name inspiration can hit you at anytime (hopefully you have your iPhone with you when it happens).</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://squurl.com/">squurl</a> - <em>squurl</em> is another fast Ajax-based domain search engine. It has a &#8220;Suggestions&#8221; feature to help you discover similar domains to the ones you’ve typed.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.domainsbot.com/">DomainsBot</a> - <em>DomainsBot</em> is a domain search engine that has an &#8220;Advanced&#8221; search feature so that you can conduct a more customized and refined search. For example, you can set the maximum domain character length to eliminate lengthy domain names from the results or exclude domain results that have a hyphen (-).</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.dnscoop.com/">dnScoop</a> - <em>dnScoop</em> tries to estimate the value of a particular domain based on several statistics such as site traffic, links pointing to the domain, and other factors. This will help you gain some insight on the value of a particular domain name in case the name you really want is &#8220;for sale&#8221; and you want to see if the asking price is fair, or to make an offer to a site owner that owns the domain you really want.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.stuckdomains.com/">StuckDomains</a> - <em>StuckDomains</em> is a database of expired domain names that previous owners have not renewed. This can be an opportunity to find a domain name that doesn’t involve odd names like &#8220;fujiyakuku.com&#8221;.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://www.nameboy.com/">Nameboy</a> - <em>Nameboy</em> is a popular domain name generator. This straightforward web tool asks for a &#8220;Primary Word&#8221; and &#8220;Secondary Word&#8221; that describe the topic of your website, and based on your input, it suggests possible domain names.For example, typing in &#8220;web&#8221; as the Primary Word and &#8220;superman&#8221; as the Secondary Word returned results such as webhero, supeweb and supermanweb. There’s a &#8220;Rhyme&#8221; option that tries to suggest domain names that rhyme with the search phrases, but the feature didn’t seem to work on the above example.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://dyyo.com/search_form.php">dyyo.com</a> - It’s common practice to keep domain names as short as possible so that it can be quickly typed and also so that they’re easier to remember. <em>dyyo.com</em> specializes in helping you find 4-letter domain names to keep your URLs terse.</li>
</ul>
<ul>
<li><a rel="nofollow" href="http://ajaxwhois.com/">Ajax Whois</a> - <em>Ajax Whois</em> is a simple Ajax-based domain search that makes domain-name-hunting effortless and rapid. To make your searches even faster, they have <a rel="nofollow" href="http://ajaxwhois.com/shortcuts/">a set of useful keyboard shortcuts</a> to satisfy the power user in you.</li>
</ul>
<h4>Select the most valuable pages of your site that you will optimize for the targeted keywords.</h4>
<p>You have already picked keywords to optimize your pages for. Now you should think which pages of your site should be optimized for high search engine rankings. These are definitely NOT the Terms of Use or Privacy Policy pages, but the pages that are meant to showcase your merchandise, attract targeted visitors and serve as landing pages.</p>
<p>It is recommended that you optimize each page for no more than 3 keywords (1 major keyword and 2 complementary ones). Each specific page should be optimized for an individual set of keywords.</p>
<h4>Optimize the TITLEs of your pages for the targeted keywords.</h4>
<p>The TITLE tag is the most important tag on a page; it tells both search engines and users what the page is about. Search engines take its contents into account when determining the page theme and its relevance.<br />
From the usability standpoint, the TITLE tag includes the text that shows up in a browser window header when users open your page and on the search results pages. They can also see this text in their Bookmarks/Favorites menu after they save the page to bookmarks.</p>
<p>In the code of the page, the TITLE tag looks like the following:</p>
<p>The appropriate length of a title tag is under 70 characters.</p>
<p>Make sure it is the first tag in the area. It is also important to use only one TITLE per page.</p>
<h4>Create a unique and relevant META Description tag for each optimized page.</h4>
<p>The META Description tag is a summary of your page content. This tag was primarily meant for the search engines to let them know what the page was about; it could seriously impact your search engine rankings.</p>
<p>Nowadays, the META Description tag no longer plays a crucial role in your search engine rankings however it is still important because the search engines may use the contents of this tag as a snippet for your page in the SE results.</p>
<p>In the code of the page, the META Description tag looks like the following:</p>
<p>Create a descriptive META Description tag for each page that you optimize; this tag can be 1-2 sentences long (between 150-160 characters best).</p>
<p>Include keywords relevant to this page; do not use instant keyword repetitions to avoid being considered a spammer by the SEs.</p>
<h4>Optimize the headings of your pages for the targeted keywords.</h4>
<p>When creating web pages, people use Heading tags (&lt; h1 &gt; &lt; h2 &gt; &lt; h3 &gt; &lt; h4 &gt; &lt; h5 &gt;) to label headlines.  Some search engines still consider the contents of these tags as important (especially the first-level heading tag), however their importance is much lower than the TITLE tag.</p>
<p>Include your most important keywords and key phrases within the first-level heading:</p>
<p>Your first-level heading with keywords</p>
<p>Use only one tag on any page. In most cases, the top-level heading will be the same as the TITLE.</p>
<p>Also use and tags on a page in order to structure information in a proper way; make sure to enrich them with keywords, too.</p>
<h4>Optimize the anchor text of your page links for the targeted keywords.</h4>
<p>The anchor text of your page links is the underlined text that your visitors click when they navigate the pages. It tells both users and search engines what the target page is about, so it is important to include keywords here.</p>
<p>In the code of the page, the anchor text looks like the following:</p>
<pre><a rel="nofollow" href="http://www.example.com/keyword-phrase.html" target="_blank">Visible anchor text with keywords</a></pre>
<p>When optimizing the anchor text of the links that point to a valuable page, do your best to include keywords that you optimize the other page for, instead of using common phrases like &#8220;click here&#8221; or &#8220;read more&#8221;.</p>
<h4>Optimize image ALTs and image titles of your pages for the targeted keywords.</h4>
<p>If you use your images as links to other pages, you may want to use keyword-rich image ALTs and titles. This can help you to increase the relevance of your pages and have your images included in Google Images search results.</p>
<p>In the code of the page, image ALTs and titles look like the following:</p>
<p><img title="Your text with keyword2" src="images/some-keyword.gif" alt="Your text with keyword1" width="415" height="100" /></p>
<h2>Results Monitoring</h2>
<p>Once you are done with the keyword research and website optimization, it&#8217;s time to track the first results of your undertakings. See how well your site is doing on the search engines: check if your pages have been indexed by the SEs, track your site rankings, and analyze your link popularity and visitor activity.</p>
<h3>Indexed pages check</h3>
<h4>Check if your pages have been indexed by the search engines.</h4>
<p>After you have submitted your site to the search engines and directories, it makes sense to wait for several weeks and then check if the search engine robots have visited your site and put your pages in their indices.</p>
<p>Go to Google.com and enter the following in the search box (substitute www.example.com with your domain):<br />
site:www.example.com</p>
<h3>Rankings check</h3>
<h4>Check rankings for your keywords on the major and local search engines.</h4>
<p>Site ranking is the position your site occupies for a particular keyword in the search engine result pages. You can choose to check your site rankings manually by entering keywords in the SE search box and looking for your site in the SE results.</p>
<h3>Backlinks check</h3>
<h4>Check your backlinks on the major search engines.</h4>
<p>Tools to be added here later.</p>
<h3>Site Traffic Analysis</h3>
<h4>Set up Google Analytics for your site, and analyze visitor traffic.</h4>
<p>Site visitors may come from the search engines, social media sites, partner networks where you place your ads, etc. It is important to implement a Web Analytics solution on your site at the very beginning of your website promotion activities &#8211; to see if your site gets any visitor traffic, and analyze the sources of this traffic.</p>
<p>Whatever solution you choose to use, you will get stats on unique visitors and page views, referring sites, search engines and even the keywords that brought you the most traffic from the search engines. Advanced web analytics solutions will also let you track sales, subscriptions, registrations and opt-ins, plus view info on conversions, revenue and ROI.</p>
<p>I recommend that you use a real-time visitor tracking system that provides far more exact figures if compared to log analyzers. Google Analytics is a good example of a free real-time visitor tracking tool.</p>
<p>To set up Google Analytics for your site, you should first sign in with a Google account, add your website&#8217;s URL, and install the tracking code for your site. For more help on installing the tracking code, you can refer to the <a rel="nofollow" href="http://google.com/analytics">Google Analytics Help Center</a>.</p>
<h2>Link Building</h2>
<h3>One-Way Link Building</h3>
<h4>Ask for a link from those who mention your name but don&#8217;t yet link to you.</h4>
<p>Search for articles, sites, or posts that mention your personal or business name though do not link to it; contact them and suggest that they place a direct link to your site.</p>
<h4>Ask your clients for a link from their site.</h4>
<p>Ask for links from suppliers, service providers, clients, and complementary businesses. It is good to get links with relevant partners that can send you targeted traffic.</p>
<h4>Ask your employees to link to your company site from their personal sites.</h4>
<p>Ask your employees to link to your company site from their personal sites and blogs, online profiles, virtual business cards, etc. It is preferable that they use targeted keywords in anchor text, and also include niche-related text around the link.</p>
<h4>Connect your own sites.</h4>
<p>If you have other sites related to your topic place links from them to your site. Don&#8217;t use this technique if your websites are hosted on the same server. Connect sites with different IPs only.</p>
<p>Don&#8217;t participate in the manipulative link schemes that are prohibited by the search engines&#8217; guidelines. Inbound links or cross change links with a site that does not deal with your topic can be seen by SEs as a Gray-Hat or even a Black-Hat technique.</p>
<h4>Ask your web design company to link to your site.</h4>
<p>Most web design companies list their client sites in the Portfolio section of their sites. Make sure it is not a script-based link and not a redirected link.</p>
<h4>Create a virtual business card and include a link to your site.</h4>
<p>Look for high quality card exchange sites and create a virtual business card on each site. Generally virtual business cards are professional, clean, flexible and customizable and meant to be exchanged because of the information they contain. Fill the information for your online bio with the link back to your site.</p>
<p>Sites to consider:</p>
<ul>
<li><a rel="nofollow" href="http://businesscard2.com">BusinessCard2</a></li>
<li><a rel="nofollow" href="http://thebcard.com">theBcard</a></li>
<li><a rel="nofollow" href="http://dooid.com">Dooid</a></li>
<li><a rel="nofollow" href="http://retaggr.com">reTAGgr</a></li>
<li><a rel="nofollow" href="http://magntize.com">Magntize</a></li>
<li><a rel="nofollow" href="http://myonepage.com">MyOnePage</a></li>
</ul>
<h4>Write a testimonial on someone&#8217;s product and have it posted on their website.</h4>
<p>You have to share your experience of the product or service with people; the company you are writing for will appreciate and value it. When working on a testimonial you need to be 100% honest and include things in your testimonial within your direct experience.</p>
<p>Be specific. That means write about specific details and not general comments. Where possible give permission for your full name and company name to be used. The testimonial will be posted on their site so you can ask for a link back to your company site.</p>
<h4>Ask someone to review your product.</h4>
<p>Sites with active user bases can give you links with your keywords that can help your search engine rankings, in addition to bringing you direct traffic and a good reputation via favorable reviews. Search for relevant blogs and reach their authors.</p>
<p><strong>Tip</strong>: Do not go after A-list bloggers, focus on the mid-list bloggers instead. These people are often much more accessible, and much more willing to check out your offerings.</p>
<h4>Order a paid post from a prominent blogger.</h4>
<p>If you can&#8217;t write yourself or need an additional audience and traffic to your site, try getting a post about you from an experienced blogger whose topics are relevant to your website/service/product. This way you will automatically get a high quality link pointing to your site.</p>
<h4>Donate to charity and expect a thankful link back to your site.</h4>
<p>Donate some of the profits you generate every month to charity. Being involved in this activity is great for promotion in the media and for the good will of clients: they will feel like they&#8217;re helping out the charity by purchasing from you. Besides, charity sites may list their donators in a special section of their site.</p>
<h4>Donate your skills to non-profit sites in exchange for a link.</h4>
<p>If you are a web designer, programming engineer or an SEO expert, you can offer your help for free to non-profit organizations. Actually you can be an expert in any field where you can help &#8211; just think what you can really offer.<br />
Target .gov and .edu sites (colleges and universities, organizations, etc.) that can post a thankful link back to your site.</p>
<h4>Sponsor an event and expect a link from the Sponsors page.</h4>
<p>All sorts of contests and conferences link to their sponsors. Companies can display their corporate or brand names or logos on event signs, buildings, equipment, programs, uniforms, or promotional materials. In addition event sponsorship is a way to reach a self-selected audience, hopefully interested in purchasing the company&#8217;s products or services.</p>
<p>Become a sponsor of an event and provide your site details to be posted on the event&#8217;s site. Interact with the guests: take part in discussions, exchange experience and share contact details.</p>
<h4>Post comments on the blogs related to your niche.</h4>
<p>Track the most popular blogs in your niche. Post comments when you have something to say or share, and include a link to your site in a signature. The subtle mentioning of your products or services in comments helps to build relationships, customer loyalty, and branding. Don&#8217;t overdo it however; your comments should not sound as open advertising.</p>
<h4>Join forum discussions.</h4>
<p>Make quality contributions in forums related to your topic. Add links to your company site in your signature and user profile if this is allowed by the rules of a forum. Every time you post a new topic or a reply, forum readers will be able to follow the links you provide.</p>
<p>Remember that your posts should offer useful information to web surfers, forum fans and return visitors.</p>
<p><strong>Note</strong>: If there is no nofollow attribute forum links may also help you in ranking.</p>
<h4>Make an offer of free samples.</h4>
<p>Provide free product samples to your readers, clients, etc in exchange for feedback. Offer a discount or free product samples to others who blog about your product.</p>
<h3>Link Exchange</h3>
<h4>Look for relevant sites to exchange links with.</h4>
<p>Link exchange is an old yet effective method of acquiring two-way links, as it may help you improve the PageRank of a page that is linked to, raise your site link popularity and help you get ranked better for targeted keywords. Remember, however, that only authoritative links with relevant anchor text can help you improve your link popularity.</p>
<p>To find link partners, look for:</p>
<ul>
<li>Sites that link to your competitors. Find pages linking to a certain domain by entering queries using a special syntax in the search boxes of the search engines. For Google, use the following syntax:<br />
link:www.yourcompetitor.com</li>
<li>Sites that are ranked high for the keywords that are indirectly related to your niche (thematic partners yet not your competitors in your country/region/language). Enter your keyword or key phrase and search for them on a search engine. It will return relevant result pages.</li>
</ul>
<p>It is good to exchange links with suppliers, clients, and complementary businesses. Make sure to exchange links only with relevant partners that can send you traffic.</p>
<h4>Contact your potential link partners by email and offer link exchange.</h4>
<p>Once you&#8217;ve built a list of your potential link partners, it is time to swap links with them. To send a link exchange proposition, you need to have an email address of a webmaster, site owner or another contact related to the site in question. You can find the addresses on their websites, use whois data, or add the office, webmaster or other common prefixes to the @ sign and a domain name.</p>
<p><strong>Important</strong>: Ask to include your keywords in anchor text of links. However don&#8217;t make all links with the same anchor text and pointing to the same page.</p>
<h3>Measuring the results of link building</h3>
<ul>
<li>Use a backlink checker to track your site backlinks on major SEs.</li>
<li>Use a rank checker to check your site rankings for the targeted keywords.</li>
<li>Use Google Analytics to track the results of your link building campaigns.</li>
</ul>
<p>Now you can analyze the effectiveness of your link building campaigns and fine-tune them if needed. If you build links for traffic but the number of your visitors doesn&#8217;t increase, take a closer look at the sites you have your links on. Whenever you open up new avenues of traffic through quality links, you should see a traffic increase.</p>
<h2>Social Media Marketing</h2>
<p>Nowadays social media marketing is an indispensable element of the promotional mix. You should center your efforts on the creation of content that attracts attention and encourages readers to share it with their social networks. Social media marketing benefits you by providing an additional channel for customer support, a means to gain customer and competitive insight, and a method of managing your reputation online.</p>
<h3>Buzz Tracking</h3>
<h4>Track social media channels to see what others are saying in your niche.</h4>
<p>Before you dive deep into the social media marketing mix, it would benefit you to first probe the ground and listen to the social media buzz on your products and services, your brand and your niche in general.</p>
<ul>
<li>Build Large, Busy Networks on Facebook, LinkedIn, and Twitter</li>
<li>Participating in Community Answers</li>
<li><span style="font-size: 13px;">Ask or answer a question related to your niche on Yahoo! Answers.</span></li>
</ul>
<p>Participating in Yahoo! Answers is a great way to showcase your expertise, get new skills and knowledge, build new relations within your niche community, acquire new prospects and clients and get target traffic.</p>
<p>Become a member of Yahoo! Answers, upload an avatar and fill in your profile with general and accurate information. Pick the category most relevant to your business or site.</p>
<p>Perform searches in Yahoo! for your main keywords and answer the questions supplied by Yahoo! Answers in the normal Yahoo! Search results. This will get the most web search eyes and possibly clicks on your links.</p>
<p>Use the Yahoo! Answers social network to make friends with every person asking or answering questions within that category. Answer the questions that you can and link to your site as a reference when best suited. Do not forget to link to other sites as references so your answers are not mistaken as spamming.</p>
<p>Remember that Yahoo! Answers information will be indexed by Yahoo! It is integrated into Yahoo! Local, Yahoo! Search, Yahoo! Brand Channels and other Yahoo! content channels, so your audience will grow significantly.</p>
<h4>Ask or answer a question related to your niche on Answers.com.</h4>
<p>Go to the Answer section and search for the question you can answer and show your expertise about.</p>
<p>When answering a question, you can use your site as a valuable reference for the answer. This way you will not only build expert recognition, but get traffic, links and sales.</p>
<p>The two main rules of answering questions are: don&#8217;t spam (jamming your site&#8217;s URL into every answer will just scare people off) and be active (contribute value, help people out and you will be rewarded).</p>
<h4>Ask or answer a LinkedIn question related to your niche.</h4>
<p>Go to LinkedIn Answers and first of all pay attention to New Questions From Your Network section. You are here not only to answer questions and show your knowledge, but to establish good relationships within the community.</p>
<p>Browse the category that you&#8217;ve got experience in, and look for questions related to your niche. Add a link to your site or blog post to support your answer. Avoid looking like a spammer; your answers should contribute value.</p>
<p>You can also ask a question if you are sure that your network can provide an answer. Always thank people for their good answers and connect with the people who are helpful.</p>
<h3>Social Media Optimization</h3>
<h4>Prepare your site pages and blog posts for sharing via social media.</h4>
<p><strong>Increase your linkability.</strong></p>
<p>To optimize a site for social media, you will need to increase the linkability of the content. Adding a blog is a great step. You can also create white papers or ebooks or even simply aggregate content that exists elsewhere into a useful format. Your visitors should want to link to your content.</p>
<p><strong>Make tagging and bookmarking easy.</strong></p>
<p>Use social media share-me buttons connected to bookmarking sites, social news sites, social event sites and other social media channels; add tagging options; add RSS feeds.</p>
<p>One of the most popular plug-ins of this kind is AddThis. AddThis is compatible with any website, most popular blogging platforms (Blogger, WordPress, TypePad, Tumblr), social networks (e.g. Myspace), most popular content management systems (Joomla! and Drupal), email newsletters, Microsoft Office Live and RSS Feeds.<br />
Add share-this buttons at the end of each article, news or blog post, rather than creating one share button for the entire newsletter or blog.</p>
<p><strong>Know how to target your audience.</strong></p>
<p>You will have to understand both the subject matter and the community by living and breathing it. This is the only way to create content or marketing ideas compelling to a niche. Create ideas which resonate with your audience, and you can forge great relationships and build vital brand allies.</p>
<h4>Connect your site/blog to social media channels.</h4>
<p>Use the YouTube or Vimeo video sharing options on your site. This will make it easy for your visitors to socialize, tag videos and post comments.</p>
<p>Incorporate third-party community functionalities like images and slide share. Create profiles on slideshow sharing sites (SlideShare, Slideboom, etc.) and display Flickr pictures on your site.</p>
<h4>Add social networking features to your site or blog.</h4>
<p>All social networks offer widgets that you can use on your site to connect your users to the social networks and let people chat online, buy virtual gifts, play games, take quizzes, take part in polls and ratings, share photos, videos and other media without leaving your site.</p>
<p><strong>Community building widgets.</strong></p>
<p>Use Google Friend Connect on your blog. With it you can create a community, see who your members are and reach out to them if you choose.</p>
<p><strong>Subscription widgets.</strong></p>
<p>Choose a suitable widget that lets your visitors subscribe to your RSS feed easily.</p>
<p><strong>Social networking widgets.</strong></p>
<p>Social networking widgets encourage visitors to connect with you on Twitter, Facebook, BlogCatalog, MyBlogLog and other key social bookmarking and social networking sites.</p>
<p><strong>Content sharing widgets.</strong></p>
<p>The AddThis widget at the end of each article makes it very easy for you to share content with friends in your networks.</p>
<h3>Link Building with Social Media</h3>
<h4>Create your page on Wikipedia.</h4>
<p>Make a compelling descriptive page about your company, write in a neutral tone, be objective and unbiased. Remember that Wikipedia prohibits promotional articles and it is better to read Wikipedia guidelines carefully.</p>
<p>Include external links, not to your company&#8217;s homepage, but academic papers, scientific journals and industry-specific websites to give your article the credibility it needs and that Wikipedia demands. You may indirectly link to your website through a research paper with your link on it.</p>
<h4>Create a Squidoo Lens and promote your site.</h4>
<p>Squidoo lets you create as many one page websites as you like. Create your own lens to promote your product. Concentrate on a single topic &#8211; Squidoo calls any web page you create a &#8220;lens&#8221; because of this focus.</p>
<p>Search engines like Squidoo Lenses so use appropriate keywords and link to your site. You will then have relevant dofollow links that improve your site&#8217;s ranking.</p>
<p>Join groups in Squidoo. These will get extra links to your lens from other Squidoo pages, boosting your incoming links and helping your search engine results too.</p>
<h4>Create an Amazon.com product list.</h4>
<p>Place a product list on Amazon.com that reviews top products and also mention your product using a background link. Register on Amazon and use the Web-based tools, a free desktop software application, or text files to upload details of your inventory.</p>
<h4>Ask your clients to review your product on Yahoo! Local.</h4>
<p>If your business model is appropriate make a listing on Yahoo! Local. Ask your clients to write a positive review on your product on Yahoo! Local, in case your service can be geographically targeted (restaurant, store, clinic, coffee shop, bar, etc.).</p>
<h3>Social Bookmarking</h3>
<h4>Do social bookmarking for your site pages and blog posts.</h4>
<p>Remember to add all your fresh content to social bookmarking sites like Delicious, Yahoo! Bookmarks, Google bookmarks, Buddymarks, etc.</p>
<p>Pay enough attention to add a catchy description, tag the story with your keywords. Ask friends / colleagues / fellow bloggers to bookmark the same URL too.</p>
<h3>Social News Sharing</h3>
<h4>Submit a story to social news and social recommendation sites.</h4>
<p>Submit a story to social news and social recommendation sites. Go for Digg, Reddit, StumbleUpon, etc.</p>
<p>Submit the story yourself, ask a friend or ask a top user in these communities. Tag your story with your keywords. If your site turns out to be attractive for the community, expect thousands upon thousands of users to visit and review your site themselves.</p>
<h3>Media Sharing</h3>
<h4>Take photos of your products or the things related to your niche and upload them to the photo sharing sites.</h4>
<p>Take a camera with you everywhere and make unique, funny or interesting photos of your products or the things related to your niche, and upload them to the photo sharing sites. Consider sites like Flickr, Photobucket, etc.</p>
<p>Think of Flickr first of all, as it is not only integrated within Yahoo! Image Search and gets listings in Google&#8217;s search results, Technorati, personalized start pages (Netvibes etc.), various other portals, websites and blogs which pull in and display public Flickr pictures via RSS, but Flickr also has a great social component.</p>
<p>Join a group and submit your photos. This is a good way to get some exposure for your website and profile. Another networking method is to actively comment on pictures that you come across. This will get some users to click through to your profile page, which should have an introduction and link to your website or business.</p>
<p>Alternatively, you can also create your own group if you do not find any which fit your interests or website focus. Starting your own Flickr Group is rather easy and only takes a few minutes. Creating a Flickr group is useful when you are unable to find a group that is relevant to your website or interests.</p>
<h4>Create a video on your topic and upload it to the video sharing sites.</h4>
<p>Another thing you should not neglect is a video on your topic which you should upload to the video sharing sites. Start with the popular sites like YouTube, Vimeo, MetaCafe, etc.</p>
<p>You can also search for local video sharing sites that are popular in your country or region. If you want your video to be distributed virally, it should be interesting, funny, useful, or shocking. Remember that on YouTube, the number of times a video has been viewed plays a role in YouTube popularity rankings. Maximize organic search visibility and drive quality traffic to your video by including keyword-rich titles, descriptions and video tags on your video upload page. YouTube&#8217;s organic search results are based on the relevancy of video tags, titles, descriptions and popularity. Because only 1,000 characters show in the initial search, be compelling and brief.</p>
<h4>Create a presentation and upload it on slideshow sharing sites</h4>
<p>One more media sharing method is to create a presentation and upload it on slideshow sharing sites. Start with a PowerPoint presentation that showcases the tools/techniques on how to solve niche-related problems, offers useful tips or advice, presents a useful Guide or To-Do list, etc.</p>
<p>Create profiles on slideshow sharing sites (SlideShare, Slideboom, etc.); add your website link to your profiles and upload the presentation. Do not forget to tweet about your new uploads and share them via social media bookmarking sites.</p>
<h3>Social Media Tracking</h3>
<h4>Track your social media activity results.</h4>
<p>Analyze readers&#8217; reaction and engagement in your social media activities. Track blog post views, trackbacks and comments, RSS subscribers, social bookmarks, YouTube views, Twitter retweets and followers, number of Facebook fans/friends, Facebook and LinkedIn Group discussions, Digg and Reddit votes, etc. Analyze trends in your reader engagement.</p>
<p>Through social media tracking you can gain insights from the conversations people are having online every day and to make improvements to products, customer service and marketing as a result.</p>
<p>Make sure you grab the feed for this and watch for updates for this SEO article!</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6431-guide-to-performing-basic-seo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guide to WordPress Comment SPAM</title>
		<link>http://zachbrowne.com/6281-dealing-with-comment-spam/</link>
		<comments>http://zachbrowne.com/6281-dealing-with-comment-spam/#comments</comments>
		<pubDate>Mon, 30 May 2011 07:16:33 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[auto detection]]></category>
		<category><![CDATA[CAPTCHA]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[Dashboard]]></category>
		<category><![CDATA[force effort]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[natural target]]></category>
		<category><![CDATA[page popularity]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://localhost/wp/?p=6281</guid>
		<description><![CDATA[As your WordPress blog gets noticed and generates traffic, it becomes a natural target for spammers. If you’re noticing posts on your site that you don’t expect, or see users in the Dashboard that you didn’t create, you have other security problems. Most likely, your blog posts will accrue a variety of spam comments as...]]></description>
			<content:encoded><![CDATA[<p></p><p><span class="drop_cap">A</span>s your WordPress blog gets noticed and generates traffic, it becomes a natural target for spammers. If you’re noticing posts on your site that you don’t expect, or see users in the Dashboard that you didn’t create, you have other security problems. Most likely, your blog posts will accrue a variety of spam comments as a side effect of being popular.</p>
<p>You can recognize spam by a list of links within the comment or content-free comments saying that the poster enjoying your writing, with an attached URL or source address that invites you to a less-than reputable destination. In either case, the goal of comment spam is to generate more web content that points back to the spammer’s site, taking advantage of the page popularity ranking algorithms used by Google and others that give weight to incoming links. The best way to deal with spam is to simply get rid of it, denying spammers the opportunity to use your site to boost their own visibility.</p>
<p>There are three basic approaches to dealing with the problem: make it impossible for anyone to leave comments, increase the difficulty of a spammer sneaking a comment onto your site, and enable auto-detection of common spam patterns. Obviously, disabling comments (through the Dashboard) is a bit harsh, and defeats the goals of establishing conversation with your readers. On the other hand, if you decide to take this drastic step, remember that changing the settings for posts on the control panel only affects future posts; anything already on your blog will still have comments enabled unless you go through the Dashboard and turn them off individually. If you don’t mind an even greater bit of brute-force effort, you can remove the wp-comments.php file from the WordPress core, which somewhat unceremoniously puts an end to the ability to comment on your posts.</p>
<h3>Comment Moderation &amp; CAPTCHAs</h3>
<p>One approach to comment spam is to slow down the spammers; however, the simple approach slows down valid commenters as well. You can require commenters to register as site users before being allowed to post comments, as we discuss later in this chapter, but that has the downside of preventing passing-by users from adding their thoughts. It also requires that you stay on top of the user registration, as you may see seemingly valid users that are created purely for the purpose of posting spam to your blog.</p>
<p>Moderation is another tool in the slow-but-don’t-stop vein; you can hold all comments for moderation or require all commenters to have a previously approved comment. In effect, you’re putting the burden of spam detection on yourself, looking at each comment as it appears and deciding whether to post it to your blog or flush it. Again, an innocuous looking comment may be the approval stepping stone for an avalanche of spam later on from the same user. As with many security mechanisms, the bad guys are continually getting smarter and more automated, and testing the edge protection and response of the systems they want to infiltrate.</p>
<p>A variation of the brute-force and moderation method is to blacklist IP addresses that seem to be the primary sources of spam; the access controls can be put in your .htaccess file. Again, this is perhaps a bit of hunting bugs with an elephant gun, as you’re likely to block valid IP sources from common carriers who are unfortunately home to some low-limit spammers.</p>
<p>Enter CAPTCHA methods meaning ‘‘Completely Automated Public Turing test for telling Computers and Humans Apart’’ . It&#8217;s goal is to impede spammers’ ability to post unwelcome comments by requiring them to enter some additional, dynamic piece of information. There are quite a few CAPTCHA generating plugins for WordPress, all of which add a displayed word or math problem to the end of the comment posting form, requiring the user to enter the correct information before the form is submitted. The simplest of these, the Math Test plugin, displays a two-term addition problem that must be solved by the user. The basic idea is that an automated spamming process won’t be able to recognize the distorted words or solve the problems, alleviating the spam at the point of insertion. There’s some debate as the effectiveness of CAPTCHAs, with their failure rates suggested as high as 20 percent. You’re also adding a step for commenters, albeit a trivial one. If your site attracts a large, non-English speaking audience, CAPTCHAs depending upon wavy English words will be effective, but only in preventing valid comments from frustrated users.</p>
<p>The WP-Spamfree plugin is an inverse CAPTCHA; it tries to ensure that the commenter is using a browser, and not coming in via an automated process. This combination of JavaScript tricks is a variation on the spam impedance theme, and like the others, its effectiveness and user impact will vary depending upon the demographics of your site viewers.</p>
<h3>Automatic SPAM Detection &amp; Elimination</h3>
<p>The first step in automating spam detection is blacklisting certain types of posts or particular words. In the Dashboard’s Options -&gt; Discussion -&gt; Comment Moderation box, you’ll find an option to block any comment that contains more than a particular number of links. Don’t set this to zero, or anyone who includes their own blog URL in a comment is going to filtered. This cuts down on the obvious spam messages, however. Similarly, adding words to the blacklist like ‘‘Vicodin’’ will eliminate the pharmacy spam, but if you’re perturbed by offers of fake Rolexes, don’t add ‘‘watches’’ to the blacklist or you’ll drop any comment that uses ‘‘watches’’ as a verb as well as a fake product noun. Word blacklists are universally effective in blocking comments with those words, irrespective of context.</p>
<p>Fortunately, WordPress has the Akismet plugin built-in for dealing with comment spam that relies on a crowd sourced blacklist and is transparent to users. Go to http://akismet.com/personal to register for an API key for the service; when you open up the Dashboard and configure the Akismet plugin you’ll need this to make sure your instance of WordPress can connect to the Akismet service. Effectively, Akismet takes each comment as posted, runs it through a database of spam comments hosted by Automattic, and decides whether or not to mark the comment as spam. Statistics on the akismet.com site claim that upwards of 80 percent of all comments are spam, and that they have caught and marked more than 14 billion spam comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6281-dealing-with-comment-spam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Guide to WordPress Load Managment</title>
		<link>http://zachbrowne.com/6279-guide-to-wordpress-load-managment/</link>
		<comments>http://zachbrowne.com/6279-guide-to-wordpress-load-managment/#comments</comments>
		<pubDate>Mon, 30 May 2011 07:15:51 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[content delivery networks]]></category>
		<category><![CDATA[database server]]></category>
		<category><![CDATA[failover]]></category>
		<category><![CDATA[front-end web servers]]></category>
		<category><![CDATA[generated site]]></category>
		<category><![CDATA[hardware solution]]></category>
		<category><![CDATA[Load]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[physical server]]></category>
		<category><![CDATA[public Internet]]></category>
		<category><![CDATA[secon]]></category>
		<category><![CDATA[similar tool]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[software stack]]></category>
		<category><![CDATA[web front]]></category>
		<category><![CDATA[web front end]]></category>

		<guid isPermaLink="false">http://localhost/wp/?p=6279</guid>
		<description><![CDATA[At some point, you (hopefully) hit the performance limit of a single software stack on one physical server. That’s when you may want to load balance your WordPress site with one or more additional servers. It could be for scalability to handle more requests, or as a failover precaution to increase the availability of your...]]></description>
			<content:encoded><![CDATA[<p></p><p><span class="drop_cap">A</span>t some point, you (hopefully) hit the performance limit of a single software stack on one physical server. That’s when you may want to load balance your WordPress site with one or more additional servers. It could be for scalability to handle more requests, or as a failover precaution to increase the availability of your site. Whatever the reason, load balancing your site gets you both of these features, but it is a complex issue. I&#8217;m going to discuss some of the challenges you will encounter when attempting to load balance a dynamically generated site.</p>
<p>First and foremost, you need a means to load balance. Simply, you can use round-robin DNS and bounce between your servers as needed. This will cause problems, especially with session cookies. You will need a legitimate load balancer to handle this. The load balancer could be a software package like <a rel="nofollow" href="http://www.apsis.ch/pound/">Pound</a> or a full hardware solution like an <a title="F5 BIG-IP" rel="nofollow" href="http://www.f5.com/products/big-ip/">F5 BIG-IP</a>. Both will handle the session information and load balancing for you.</p>
<p>The second challenge is keeping your dynamic data in synchronization between your two (or more) web front ends. Consider that your site administrator could effectively log in to either web front end, post new content, and upload a graphic asset to the uploads directory. However, the next request could be load balanced to the other server, where this content may not exist.</p>
<p>Let’s look at the uploads directory first. This content is uploaded from the WordPress Dashboard to the uploads directory of that WordPress installation. By default content is uploaded into <tt>/wp-content/uploads/</tt>. However, you can change the uploads directory in your Settings -&gt; Miscellaneous Dashboard. Depending on where you set your uploads folder, you could also reap the benefit of having shorter asset URLs.</p>
<p>At this point you have options. One option is to have a shared folder that both web servers can access. Most likely this would be an NFS/Samba share on your third server, which serves as your MySQL server. A second option is to use rsync or a similar tool to coordinate uploads between the two servers and make sure each has the same assets in place.</p>
<p>The second challenge is your dynamic data that is stored in the database. Assuming your database is not the bottleneck and the reason for load balancing, you could use a third server as your database server. Both web servers can then read and write from the same source. This can be a more secure deployment architecture when your database server is not directly addressable on the public Internet, but it also creates a potential single point of failure. Technically, you are only load balancing the front-end web servers in this situation.</p>
<p>Adding a second database server increases the redundancy but introduces the problem of keeping two MySQL database tables in synchronization. MySQL servers can be configured for replication in a master-slave set up. Technically, this again, is not load balancing, because only one server is being accessed at a time, but this type of configuration does provide additional redundancy. Changes to the master MySQL database are replicated to the slave database in near real time via a journaling log. Should the master database fail, the slave has a full set of data for a manual cut over.</p>
<p>Finally, there is also a special WordPress-specific solution for multiple database servers. <a title="HyperDB" rel="nofollow" href="http://codex.wordpress.org/HyperDB">HyperDB</a> was created by Automattic to handle the requirements of WordPress.com traffic. HyberDB is a full replacement for the built-in WordPress database access layer and includes functionality for using multiple databases, shadowing or partitioning your database across multiple servers, and also replication and tiered failover. Unfortunately, the documentation is far from complete.</p>
<p>As you can see, load balancing for performance and high availability is an extremely complex topic. There are countless variations of systems in place to handle a vast expanse of needs and requirements.</p>
<p>This short overview of the topic certainly glances over many nuances and challenges being faced when deploying WordPress into a high-availability environment. Cloud computing and content delivery networks are hot topics right now, and  WordPress is starting to be able to utilize these services for critical aspects and redundancy as the technologies and services mature.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6279-guide-to-wordpress-load-managment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Guide to WordPress Cache Management</title>
		<link>http://zachbrowne.com/6277-guide-to-wordpress-cache-management/</link>
		<comments>http://zachbrowne.com/6277-guide-to-wordpress-cache-management/#comments</comments>
		<pubDate>Mon, 30 May 2011 07:15:25 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[content management]]></category>
		<category><![CDATA[content management system]]></category>
		<category><![CDATA[content management systems]]></category>
		<category><![CDATA[driven site]]></category>
		<category><![CDATA[low-memory server]]></category>
		<category><![CDATA[low-memory shared server]]></category>
		<category><![CDATA[low-traffic site]]></category>
		<category><![CDATA[open source content]]></category>
		<category><![CDATA[open source content management]]></category>
		<category><![CDATA[open source content management systems]]></category>
		<category><![CDATA[runtime]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[technology environment]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[Web Server Caching]]></category>
		<category><![CDATA[web server configuration files]]></category>

		<guid isPermaLink="false">http://localhost/wp/?p=6277</guid>
		<description><![CDATA[If you’ve ever seen a Slashdotted, Dugg, or Fireballed site suddenly fail to respond, you’ve witnessed the consequences of insufficient caching. A dynamic site has to query the database several times to assemble each page a visitor requests. Queries for a typical WordPress page include the bloginfo() options (site title, description, language, theme stylesheet URL),...]]></description>
			<content:encoded><![CDATA[<p></p><p><span class="drop_cap">I</span>f you’ve ever seen a Slashdotted, Dugg, or Fireballed site suddenly fail to respond, you’ve witnessed the consequences of insufficient caching. A dynamic site has to query the database several times to assemble each page a visitor requests. Queries for a typical WordPress page include the <tt>bloginfo()</tt> options (site title, description, language, theme stylesheet URL), the post or page title and contents, the comments, and the sidebar widgets. If you’re using multiple Loops, you’re using even more queries. Servers can generally handle all those MySQL queries and PHP page-building functions for sites with low traffic, but when your site gets its fifteen minutes of fame—or gets hit with a denial of service attack—your server will probably buckle under the sudden demand.</p>
<p>The solution is to cache the assembled pages—that is, to store copies as static files in a hidden directory and to redirect incoming visitors to those copies rather than allow them to continually hammer your dynamic site. Not only does this speed things up for your visitors, but if you’re on a shared hosting server, it will prevent you from exceeding your allotted CPU usage. Some hosts are nice about helping you keep the site up and running when that happens; others will just shut down your site to protect the other users on the server. WordPress does not come with built-in caching. (This is perhaps the biggest criticism leveled at the WordPress project by users of other open-source content management systems). It does come with support for a number of different caching options, and it’s up to you to decide which plugin best suits your needs and your hosting environment.</p>
<p>Cache plugins available at WordPress Extend include:</p>
<ul>
<li><a title="W3-Total-Cache" rel="nofollow" href="http://wordpress.org/extend/plugins/w3-total-cache/">W3-Total-Cache</a></li>
<li><a title="WP-Cache" rel="nofollow" href="http://wordpress.org/extend/plugins/wp-cache/">WP-Cache</a></li>
<li><a title="WP-Super-Cache" rel="nofollow" href="http://wordpress.org/extend/plugins/wp-super-cache/">WP-Super-Cache</a></li>
<li><a title="Batcache" rel="nofollow" href="http://wordpress.org/extend/plugins/batcache/">Batcache</a></li>
<li><a title="Hyper Cache" rel="nofollow" href="http://wordpress.org/extend/plugins/hyper-cache/">Hyper Cache</a></li>
<li><a title="WP-Widget-Cache" rel="nofollow" href="http://wordpress.org/extend/plugins/wp-widget-cache/">WP Widget Cache</a></li>
</ul>
<p>WordPress is a Content Management System, which by its very definition means it creates a dynamically driven site. In today’s technology environment that essentially means that the managed content and all of its meta data is stored in a database. Every page request has to access the database to determine which content to be displayed, versus simply fetching HTML files from the web server’s local directory. The trade-off in handing over content management to a database is that you are going to take a speed hit in the individual page access in exchange for more powerful persistence, selection and organization tools – those features used within the WordPress Core. Basic computer science comes into play here: when you introduce a new abstraction layer that’s slower than the layer above it, you typically introduce a caching mechanism as well to improve average access times.</p>
<p>It helps to think of caching in a sequence of access methods, starting closest to the user and working back to the MySQL database. Each point in the sequence has some caching and tuning that can be done; however, like all performance tuning work, your mileage varies depending upon the access patterns, content types, and actual workload moving through that point in the system. Here is our view of the WordPress caching hierarchy that I&#8217;ll walk through:</p>
<ul>
<li> <strong>Browser Caching</strong>: Most of your end users’ browser performance is going to come from optimized CSS, graphics, and JavaScript libraries because they affect the single-page load times.</li>
<li><strong>WordPress Web Server Caching &amp; Optimization</strong>: WordPress and its plugins are largely written in PHP, an interpreted language that relies on the web server for an execution container. Improving the web server’s PHP caching will speed up some portions of the WordPress user-to-database path.</li>
<li><strong>WordPress Core Caching</strong>: Caching objects used by WordPress effectively builds a database results<br />
cache, the same approach taken by highly scalable, MySQL-based sites like Facebook. Changing some dynamic page generation to static HTML rendering speeds up page access at the expense of possible small windows of update inconsistency.</li>
<li><strong>MySQL Caching</strong>: Caching objects at the database layer prevents an eventual disk access, turning a query into a memory reference where possible. These options are independent of, and frequently complementary to, enabling a caching plugin within the WordPress Core.</li>
</ul>
<p>Again, the actual benefit provided by each or any of these approaches depends on many factors, including your hosting provider’s database layer, whether you can configure web and database servers yourself, the size, frequency and complexity of database queries, and the overall load on your WordPress installation.</p>
<h3>WordPress System Complexity</h3>
<p>First and foremost, WordPress is a complex system, and honorably so. WordPress simplifies the process of content management and broadens its core feature set through the plugin system. But providing these various hooks and flexibility comes at the cost of database accesses, PHP processing, handling each plugin’s unique requirements, and any special theme prerequisites. Each plugin adds additional overhead to the page rendering, and the quality of code in plugins varies from author to author. Using an execution path analyzer like WinCacheGrind or KCacheGrind, which profiles your application to determine where bottlenecks in the code may occur, you can create a graphic representation of the complexity of a web application.</p>
<p>Take, for instance, a plain vanilla WordPress installation using the default theme. Running a simple page load through this profiler and view the resulting execution graph. There&#8217;s an inherent complexity of WordPress, and each box from the render represents a function or action in the WordPress Core, including action hooks for linking in plugin and theme functionality. It&#8217;s fairly complex.</p>
<p>Each and every thing you add to your site, including that fancy theme control panel that lets you set particular runtime characteristics of your site and plugins that parse your content for related posts, create overhead and more boxes on the execution graph.</p>
<p>Do not get alarmist here and disable plugins and choose overly simple themes. This challenge is not unique to WordPress. The flexibility enabled through WordPress, especially the configurable runtime flexibility of WordPress, which is so powerful, is an expensive operation. The alternative is a statically fixed set of features that require new built-in code to accomplish new features, rather than the versatile plugin architecture of WordPress. Each of those plugins and theme hooks adds functionality and features to your WordPress installation. That is why you enabled them in the first place. Just accept that it is a trade-off in features versus performance, some negligible and some larger.</p>
<p>In practice, your site does not really change that often. You are probably not running the next Twitter through a WordPress installation (though you can build a reasonable facsimile with the p2 theme) and the content does not change every 30 seconds. Leveraging the ideal situation in which your content is viewed significantly more frequently than it’s updated, and allowing for minor windows of inconsistent updates, let’s look at caching layers from the web server back to the MySQL installation.</p>
<h3>WordPress Web Server Caching &amp; Optimization</h3>
<p><em>Improving</em> WordPress page load times through your web server involves PHP optimization and web server (Apache, Nginx, etc.) configuration changes. In both cases, you’ll need admin level access to your web server configuration files. In other words, you probably need to be running your website on a Virtual Private Server (VPS) or dedicated server.</p>
<p>We can work our way back to MySQL queries and object caching, but no matter how you end up with a list of pages, WordPress relies on PHP to put the displayed page together and generate your HTML. PHP is an interpreted language, for every execution of the code, the code must be interpreted and compiled to machine code that a computer can use. This programming methodology has its pros and cons, and you&#8217;d need an entire forum dedicated to the arguments. However, you can cache at the PHP execution level with an <strong>opcode cache</strong>.</p>
<p>An opcode cache bridges the gap between runtime interpreting and full-on compiled code. APC (Alternative PHP Cache) is an implementation that works to cache and then optimize the intermediate code. It happens outside of WordPress and works on the underlying PHP layer of your server. Setting up opcode cache for your web server is not very difficult if you have basic technical knowlege and know how to follow directions.</p>
<p>In order to get APC up and running you will need full access permissions on your server, preferably root. Once APC is set up it will cache the compiled PHP files that make up your WordPress website&#8217;s core. The biggest downside is that you have to restart the server every time you change a PHP page, specifically the template files in this case. For now you can find more information about APC at <a rel="nofollow" href="http://us3.php.net/manual/en/book.apc.php">http://us3.php.net/manual/en/book.apc.php</a> , soon there will be more information here. Again, the ability to enable APC and start/stop the web server depends on you having sufficient administrator privilieges.</p>
<p><strong>Caching </strong>can be further augmented by using memcache and memcached, also requiring server administration level of implementation. Memcache uses your server’s RAM to cache frequently used objects. RAM is significantly faster than file-based operations, and because memcached runs as a local daemon, it is also completely outside of your web server. You can find more information about memcache at <a rel="nofollow" href="http://us3.php.net/manual/en/book.memcache.php">http://us3.php.net/manual/en/book.memcache.php</a> and <a rel="nofollow" href="http://memcached.org/">http://memcached.org/</a>.</p>
<p>While we are talking about the PHP level of the WordPress stack, you should also optimize (and secure) your <tt>php.ini</tt> configuration. PHP has prospered by having so much built-in functionality that it lowers the barriers of entry and empowers developers to just get the task done. This has been the boon and the bane for PHP. Take a look at your php.ini file and disable extensions you are not using. You can always turn them back on.</p>
<p>Also take this opportunity to secure your PHP execution container and help it run faster. Here are some simple settings. There probably are more depending on your setup, which you can likely turn off to improve security and performance:</p>
<pre>;Hide PHP for security
expose_php = Off
;Turn off for performance
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off</pre>
<p>Finally, on the system administration level, optimize your web server. In most cases the stock configuration for your web server is designed to handle the most common basic use cases. Certainly, it has not been tweaked to match your specific server’s capabilities. Apache, for example, comes with tons of extra modules to handle general-case situations. If you do not use those modules, disable them. This will reduce the overall memory footprint of Apache.</p>
<p>In practice, we have been able to tweak Apache to perform better under restricted resources (like low-memory virtual private servers) by adjusting the Apache PreFork configuration. The default configuration is pretty generous, and depending on your site’s traffic and system configuration you can usually pare this down. For example, on a low-traffic site hosted on a low-memory shared server, you could edit your Apache2 configuration file to the following, assuming you are using Apache2:</p>
<pre>StartServers  3
MinSpareServers  3
MaxSpareServers  3
ServerLimit  50
MaxClients  50
MaxRequestsPerChild  1000</pre>
<p>These settings are for a relatively low-traffic site on a low-memory server. Your results will vary, but these changes anecdotally affected the web server’s response time for our WordPress installation. Of course you will have to adjust these settings to meet your own requirements.</p>
<p>Tuning the individual components of the LAMP stack could have a manual of its own. Like WordPress, the LAMP development stack is very popular because of its flexibility and capability to handle multitudes of different tasks. The management and administration of LAMP components is a required skill for the full stack solution developer. Invest some time learning your tools and how to deploy them effectively.</p>
<h3>WordPress Object Caching</h3>
<p>The goal of web server caching is to keep frequently accessed files and popular chunks of code in memory and ready to serve or execute. Within WordPress, caching has to deliver a request for a page without going through additional code or database accesses, which really boils down to short circuiting the PHP WordPress core and serving up a static representation of your page directly.</p>
<p>If you search for ‘‘WordPress caching,’’ you will find countless results about the built-in object cache. Initially, object caching was WordPress’s solution to repeatedly serving up frequently used data, and you will find many references to setting a specific flag, the ENABLE_CACHE flag to be precise, in your configuration file to enable this functionality. Unfortunately, this information is all out of date. It was true for older versions of WordPress, but has been removed in favor of plugins that handle object caching more effectively. Not that WordPress has completely done away with all internal caching, but it only keeps the cache for the current request.</p>
<p>Object caching keeps certain frequently used and expensive data sets in memory. The flexibility of object caching means that when certain information does change, that does not affect the entire cache, but only the objects in cache that actually changed. However, object caching still requires the plugin to execute PHP to determine which aspects of the cache are still valid and also for WordPress to execute the PHP to pull the parts of the page together for rendering. Optimizing your web server’s PHP environment and enabling WordPress level object caching are quasi-independent as a consequence.</p>
<p>There may be times when your content is static enough or being served so frequently, that you need to short-circuit the whole PHP and object cache overhead; for example, when your page is being listed in the top echelons of Digg, Reddit, and Slashdot. A good way to do this is to have your page rendered to static HTML and served directly by the web server. After all, this is what the web server was designed to do in the first place.</p>
<p>In my opinion, the best plugin for this is W3-Total-Cache. W3-Total-Cache has tons of invaluable functions combined<br />
in various modes including options for Memcache, APC, CDN, CloudFlare, HTML Caching, Browser Caching, and many more. However, it does require mod_rewrite for the static HTML files, so this plugin will only work on Apache servers.</p>
<p>W3-Total-Cache has an extensive control panel that allows the site administrator to adjust the settings to meet specific needs. It even includes a full lockdown mode that prepares for a heavy traffic spike. The only fault with WP-Super Cache is that it does its job too well sometimes. On certain occasions we have been frustrated that new content sections were not being added to a site being worked on only to realize later that caching was not disabled before forcing the updates. Another time, we were deploying new mobile themes to a WordPress installation but for some reason the browser was not auto-detecting the mobile browser and displaying the correct theme. After too long troubleshooting user-agents and other issues, it turned out to be the cached files were being served and shortcutting the mobile theme<br />
code. This was easily remedied in the W3-Total-Cache control panel.</p>
<p>Other caching plugins such as WP-Super-Cache &amp; HyperCache are available, with many building on the basic theme of<br />
generating HTML for a page and caching it with the URL used to access the page as a key. Each plugin will have variations on cache invalidation and page lifetime policies, and all of them disrupt the general dynamic nature of WordPress page generation. If you’re going to change your theme, add new plugins, or otherwise alter the flow of data from MySQL to user browser, either disable WordPress caching until you’re sure all of your changes work, or frequently invalidate and flush the cache so that you can see the freshly generated pages as you test.</p>
<h3>MySQL Query Cache</h3>
<p>Just rendering the index page on a fresh install of WordPress uses 14 MySQL queries. You have to evaluate your site, but odds are the database-persisted content is not changing quickly enough that you need to make all these database calls for every page load. The volume of database traffic required for the basic index page shouldn’t be <em>too</em> surprising considering it is a content management system, but it could definately stand for some improvements.</p>
<p>WordPress caching improves access times to content extracted from MySQL. If you want to further improve MySQL performance, and make it more responsive to queries from the WordPress core, you’ll want to explore the MySQL query cache. The MySQL query cache stores the results of select statements, so that if an identical query is submitted, the already retrieved results can be immediately pulled from the system RAM and returned. This will significantly increase your response time, as long as your data is not changing that much. If your content is changing you may not see the updates immediately.</p>
<p>To enable MySQL query cache you will have to edit your MySQL configuration file on the server, assuming you have adequate permissions at your hosting company to do so. If you edit your MySQL configuration file, you can raise the memory limit. For example:</p>
<pre># enable 16 MB cache
query_cache_size  = 16M</pre>
<p>Be careful not to go overboard here. Allocating too much RAM to MySQL caching will adversely affect other subsystems on your server. It is always a balance. Even just enabling this cache creates a management overhead in MySQL, but generally speaking this trade-off works in your favor.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6277-guide-to-wordpress-cache-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>List of Rejected User Agents for W3-Total-Cache and WP-Super-Cache</title>
		<link>http://zachbrowne.com/6239-list-of-rejected-user-agents-for-w3-total-cache-and-wp-super-cache/</link>
		<comments>http://zachbrowne.com/6239-list-of-rejected-user-agents-for-w3-total-cache-and-wp-super-cache/#comments</comments>
		<pubDate>Sun, 29 May 2011 20:31:40 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[crawl]]></category>
		<category><![CDATA[hp ipaq]]></category>
		<category><![CDATA[j phone]]></category>
		<category><![CDATA[midp 2]]></category>
		<category><![CDATA[nintendo wii]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[novarra]]></category>
		<category><![CDATA[slurp]]></category>
		<category><![CDATA[user]]></category>
		<category><![CDATA[WP-Super-Cache]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=6239</guid>
		<description><![CDATA[bot ia_archive slurp crawl spider 2.0 MMP 240x320 ASUS AU-MIC Alcatel Amoi Android Audiovox AvantGo BenQ Bird BlackBerry Blazer CDM Cellphone DDIPOCKET Danger DoCoMo Elaine/3.0 Ericsson EudoraWeb Fly HP.iPAQ Haier Huawei IEMobile J-PHONE KDDI KONKA KWC KYOCERA/WX310K LG LG/U990 Lenovo MIDP-2.0 MMEF20 MOT-V MobilePhone Motorola NEWGEN NetFront Newt Nintendo Wii Nitro Nokia Novarra O2 Opera...]]></description>
			<content:encoded><![CDATA[<p></p><pre>
bot
ia_archive
slurp
crawl
spider
2.0 MMP
240x320
ASUS
AU-MIC
Alcatel
Amoi
Android
Audiovox
AvantGo
BenQ
Bird
BlackBerry
Blazer
CDM
Cellphone
DDIPOCKET
Danger
DoCoMo
Elaine/3.0
Ericsson
EudoraWeb
Fly
HP.iPAQ
Haier
Huawei
IEMobile
J-PHONE
KDDI
KONKA
KWC
KYOCERA/WX310K
LG
LG/U990
Lenovo
MIDP-2.0
MMEF20
MOT-V
MobilePhone
Motorola
NEWGEN
NetFront
Newt
Nintendo Wii
Nitro
Nokia
Novarra
O2
Opera Mini
Opera.Mobi
PANTECH
PDXGW
PG
PPC
PT
Palm
Panasonic
Philips
Playstation Portable
ProxiNet
Proxinet
Qtek
SCH
SEC
SGH
SHARP-TQ-GX10
SIE
SPH
Sagem
Samsung
Sanyo
Sendo
Sharp
Small
Smartphone
SoftBank
SonyEricsson
Symbian
Symbian OS
SymbianOS
TS21i-10
Toshiba
Treo
UP.Browser
UP.Link
UTS
Vertu
WILLCOME
WinWAP
Windows CE
Windows.CE
Xda
ZTE
dopod
hiptop
htc
i-mobile
iPhone
iPod
nokia
portalmmm
vodafone</pre>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6239-list-of-rejected-user-agents-for-w3-total-cache-and-wp-super-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Install memcached and libmemcache on Debian</title>
		<link>http://zachbrowne.com/6199-how-to-install-memcached-and-libmemcache-on-debian/</link>
		<comments>http://zachbrowne.com/6199-how-to-install-memcached-and-libmemcache-on-debian/#comments</comments>
		<pubDate>Mon, 23 May 2011 02:26:34 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[access to server]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[caching system]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[database load]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[dynamic web applications]]></category>
		<category><![CDATA[libmemcache]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[performance object]]></category>
		<category><![CDATA[source code cd]]></category>
		<category><![CDATA[tar zxf]]></category>
		<category><![CDATA[The easiest way]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=6199</guid>
		<description><![CDATA[memcached is a very high-performance, object caching system with distributed memory intended to speed up dynamic web applications by alleviating database load. To use it with C++ apps you also need libmemcached which is client library to the memcached server. It has been designed to be light on memory usage, thread safe, and provide full...]]></description>
			<content:encoded><![CDATA[<p></p><p><tt>memcached</tt> is a very high-performance, object caching system with distributed memory intended to speed up dynamic web applications by alleviating database load.</p>
<p>To use it with C++ apps you also need <tt>libmemcached</tt> which is client library to the <tt>memcached</tt> server. It has been designed to be light on memory usage, thread safe, and provide full access to server side methods.</p>
<p>As far as I know there is no Debian package for <tt>libmmemcached</tt> (could be wrong) but there is one for <tt>memcached</tt>.</p>
<h2>Installing memcache</h2>
<p>The easiest way is to install it via <tt>apt-get</tt>:</p>
<pre>apt-get install memcached</pre>
<h2>Installing libmemcached</h2>
<p>You&#8217;ll have to compile it yourself using source code</p>
<pre>cd /usr/local/src/
wget http://download.tangent.org/libmemcached-0.39.tar.gz
tar -zxf libmemcached-0.39.tar.gz
cd libmemcached-0.39
./configure –prefix=/usr
make
make install</pre>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6199-how-to-install-memcached-and-libmemcache-on-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guide to WordPress Performance</title>
		<link>http://zachbrowne.com/6245-guide-to-wordpress-performance/</link>
		<comments>http://zachbrowne.com/6245-guide-to-wordpress-performance/#comments</comments>
		<pubDate>Sun, 22 May 2011 03:46:27 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[alpha]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[css sprites]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[ETag]]></category>
		<category><![CDATA[gif]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[image maps]]></category>
		<category><![CDATA[image requests]]></category>
		<category><![CDATA[image segment]]></category>
		<category><![CDATA[ISP]]></category>
		<category><![CDATA[JPEG]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[position properties]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=6114</guid>
		<description><![CDATA[Here are the best ways for speeding up your WordPress. Minimize HTTP Requests 80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of...]]></description>
			<content:encoded><![CDATA[<p></p><p>Here are the best ways for speeding up your WordPress.</p>
<h2>Minimize HTTP Requests</h2>
<p>80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of HTTP requests required to render the page. This is the key to faster pages.</p>
<p>One way to reduce the number of components in the page is to simplify the page&#8217;s design. But is there a way to build pages with richer content while also achieving fast response times? Here are some techniques for reducing the number of HTTP requests, while still supporting rich page designs.<br />
Combined files are a way to reduce the number of HTTP requests by combining all scripts into a single script, and similarly combining all CSS into a single stylesheet. Combining files is more challenging when the scripts and stylesheets vary from page to page, but making this part of your release process improves response times.</p>
<p>CSS Sprites are the preferred method for reducing the number of image requests. Combine your background images into a single image and use the CSS background-image and background-position properties to display the desired image segment.</p>
<p>Image maps combine multiple images into a single image. The overall size is about the same, but reducing the number of HTTP requests speeds up the page. Image maps only work if the images are contiguous in the page, such as a navigation bar. Defining the coordinates of image maps can be tedious and error prone. Using image maps for navigation is not accessible too, so it&#8217;s not recommended.</p>
<p>Inline images use the data: URL scheme to embed the image data in the actual page. This can increase the size of your HTML document. Combining inline images into your (cached) stylesheets is a way to reduce HTTP requests and avoid increasing the size of your pages. Inline images are not yet supported across all major browsers.</p>
<p>Reducing the number of HTTP requests in your page is the place to start. This is the most important guideline for improving performance for first time visitors. As described in Tenni Theurer&#8217;s blog post Browser Cache Usage &#8211; Exposed!, 40-60% of daily visitors to your site come in with an empty cache. Making your page fast for these first time visitors is key to a better user experience.</p>
<h2>Use a Content Delivery Network</h2>
<p>The user&#8217;s proximity to your web server has an impact on response times. Deploying your content across multiple, geographically dispersed servers will make your pages load faster from the user&#8217;s perspective. But where should you start?</p>
<p>As a first step to implementing geographically dispersed content, don&#8217;t attempt to redesign your web application to work in a distributed architecture. Depending on the application, changing the architecture could include daunting tasks such as synchronizing session state and replicating database transactions across server locations. Attempts to reduce the distance between users and your content could be delayed by, or never pass, this application architecture step.</p>
<p>Remember that 80-90% of the end-user response time is spent downloading all the components in the page: images, stylesheets, scripts, Flash, etc. This is the Performance Golden Rule. Rather than starting with the difficult task of redesigning your application architecture, it&#8217;s better to first disperse your static content. This not only achieves a bigger reduction in response times, but it&#8217;s easier thanks to content delivery networks.</p>
<p>A content delivery network (CDN) is a collection of web servers distributed across multiple locations to deliver content more efficiently to users. The server selected for delivering content to a specific user is typically based on a measure of network proximity. For example, the server with the fewest network hops or the server with the quickest response time is chosen.</p>
<p>Some large Internet companies own their own CDN, but it&#8217;s cost-effective to use a CDN service provider, such as Akamai Technologies, EdgeCast, or level3. A CDN is necessary to achieve fast response times. Switching to a CDN is a relatively easy code change that will dramatically improve the speed of your web site.</p>
<h2>Add an Expires or a Cache-Control Header</h2>
<p><strong>There are two aspects to this rule: </strong></p>
<ol>
<li>For static components: implement &#8220;Never expire&#8221; policy by setting far future Expires header</li>
<li>For dynamic components: use an appropriate Cache-Control header to help the browser with conditional requests</li>
</ol>
<p>Web page designs are getting richer and richer, which means more scripts, stylesheets, images, and Flash in the page. A first-time visitor to your page may have to make several HTTP requests, but by using the Expires header you make those components cacheable. This avoids unnecessary HTTP requests on subsequent page views. Expires headers are most often used with images, but they should be used on all components including scripts, stylesheets, and Flash components.</p>
<p>Browsers (and proxies) use a cache to reduce the number and size of HTTP requests, making web pages load faster. A web server uses the Expires header in the HTTP response to tell the client how long a component can be cached. This is a far future Expires header, telling the browser that this response won&#8217;t be stale until April 15, 2010.</p>
<p><tt>Expires: Thu, 15 Apr 2010 20:00:00 GMT</tt></p>
<p>If your server is Apache, use the ExpiresDefault directive to set an expiration date relative to the current date. This example of the ExpiresDefault directive sets the Expires date 10 years out from the time of the request.</p>
<p><tt>ExpiresDefault "access plus 10 years"</tt></p>
<p>Keep in mind, if you use a far future Expires header you have to change the component&#8217;s filename whenever the component changes. At zachbrowne! we often make this step part of the build process: a version number is embedded in the component&#8217;s filename, for example, zachbrowne_2.0.6.js.<br />
Using a far future Expires header affects page views only after a user has already visited your site. It has no effect on the number of HTTP requests when a user visits your site for the first time and the browser&#8217;s cache is empty. Therefore the impact of this performance improvement depends on how often users hit your pages with a primed cache. (A &#8220;primed cache&#8221; already contains all of the components in the page.) We measured this at zachbrowne! and found the number of page views with a primed cache is 75-85%. By using a far future Expires header, you increase the number of components that are cached by the browser and re-used on subsequent page views without sending a single byte over the user&#8217;s Internet connection.</p>
<h2>Gzip Components</h2>
<p>The time it takes to transfer an HTTP request and response across the network can be significantly reduced by decisions made by front-end engineers. It&#8217;s true that the end-user&#8217;s bandwidth speed, Internet service provider, proximity to peering exchange points, etc. are beyond the control of the development team. But there are other variables that affect response times. Compression reduces response times by reducing the size of the HTTP response.</p>
<p>Starting with HTTP/1.1, web clients indicate support for compression with the Accept-Encoding header in the HTTP request.</p>
<p><tt>Accept-Encoding: gzip, deflate</tt></p>
<p>If the web server sees this header in the request, it may compress the response using one of the methods listed by the client. The web server notifies the web client of this via the Content-Encoding header in the response.</p>
<p><tt>Content-Encoding: gzip</tt></p>
<p>Gzip is the most popular and effective compression method at this time. It was developed by the GNU project and standardized by RFC 1952. The only other compression format you&#8217;re likely to see is deflate, but it&#8217;s less effective and less popular.</p>
<p>Gzipping generally reduces the response size by about 70%. Approximately 90% of today&#8217;s Internet traffic travels through browsers that claim to support gzip. If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.<br />
There are known issues with browsers and proxies that may cause a mismatch in what the browser expects and what it receives with regard to compressed content. Fortunately, these edge cases are dwindling as the use of older browsers drops off. The Apache modules help out by adding appropriate Vary response headers automatically.</p>
<p>Servers choose what to gzip based on file type, but are typically too limited in what they decide to compress. Most web sites gzip their HTML documents. It&#8217;s also worthwhile to gzip your scripts and stylesheets, but many web sites miss this opportunity. In fact, it&#8217;s worthwhile to compress any text response including XML and JSON. Image and PDF files should not be gzipped because they are already compressed. Trying to gzip them not only wastes CPU but can potentially increase file sizes.</p>
<p>Gzipping as many file types as possible is an easy way to reduce page weight and accelerate the user experience.</p>
<h2>Put Stylesheets at the Top</h2>
<p>While researching performance at zachbrowne!, we discovered that moving stylesheets to the document HEAD makes pages appear to be loading faster. This is because putting stylesheets in the HEAD allows the page to render progressively.</p>
<p>Front-end engineers that care about performance want a page to load progressively; that is, we want the browser to display whatever content it has as soon as possible. This is especially important for pages with a lot of content and for users on slower Internet connections. The importance of giving users visual feedback, such as progress indicators, has been well researched and documented. In our case the HTML page is the progress indicator! When the browser loads the page progressively the header, the navigation bar, the logo at the top, etc. all serve as visual feedback for the user who is waiting for the page. This improves the overall user experience.</p>
<p>The problem with putting stylesheets near the bottom of the document is that it prohibits progressive rendering in many browsers, including Internet Explorer. These browsers block rendering to avoid having to redraw elements of the page if their styles change. The user is stuck viewing a blank white page.</p>
<p>The HTML specification clearly states that stylesheets are to be included in the HEAD of the page: &#8220;Unlike A, [LINK] may only appear in the HEAD section of a document, although it may appear any number of times.&#8221; Neither of the alternatives, the blank white screen or flash of unstyled content, are worth the risk. The optimal solution is to follow the HTML specification and load your stylesheets in the document HEAD.</p>
<h2>Put Scripts at the Bottom</h2>
<p>The problem caused by scripts is that they block parallel downloads. The HTTP/1.1 specification suggests that browsers download no more than two components in parallel per hostname. If you serve your images from multiple hostnames, you can get more than two downloads to occur in parallel. While a script is downloading, however, the browser won&#8217;t start any other downloads, even on different hostnames.</p>
<p>In some situations it&#8217;s not easy to move scripts to the bottom. If, for example, the script uses document.write to insert part of the page&#8217;s content, it can&#8217;t be moved lower in the page. There might also be scoping issues. In many cases, there are ways to workaround these situations.<br />
An alternative suggestion that often comes up is to use deferred scripts. The DEFER attribute indicates that the script does not contain document.write, and is a clue to browsers that they can continue rendering. Unfortunately, Firefox doesn&#8217;t support the DEFER attribute. In Internet Explorer, the script may be deferred, but not as much as desired. If a script can be deferred, it can also be moved to the bottom of the page. That will make your web pages load faster.</p>
<h2>Avoid CSS Expressions</h2>
<p>CSS expressions are a powerful (and dangerous) way to set CSS properties dynamically. They were supported in Internet Explorer starting with version 5, but were deprecated starting with IE8. As an example, the background color could be set to alternate every hour using CSS expressions:</p>
<p><tt>background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );</tt></p>
<p>As shown here, the expression method accepts a JavaScript expression. The CSS property is set to the result of evaluating the JavaScript expression. The expression method is ignored by other browsers, so it is useful for setting properties in Internet Explorer needed to create a consistent experience across browsers.</p>
<p>The problem with expressions is that they are evaluated more frequently than most people expect. Not only are they evaluated when the page is rendered and resized, but also when the page is scrolled and even when the user moves the mouse over the page. Adding a counter to the CSS expression allows us to keep track of when and how often a CSS expression is evaluated. Moving the mouse around the page can easily generate more than 10,000 evaluations.</p>
<p>One way to reduce the number of times your CSS expression is evaluated is to use one-time expressions, where the first time the expression is evaluated it sets the style property to an explicit value, which replaces the CSS expression. If the style property must be set dynamically throughout the life of the page, using event handlers instead of CSS expressions is an alternative approach. If you must use CSS expressions, remember that they may be evaluated thousands of times and could affect the performance of your page.</p>
<h2>Make JavaScript and CSS External</h2>
<p>Many of these performance rules deal with how external components are managed. However, before these considerations arise you should ask a more basic question: Should JavaScript and CSS be contained in external files, or inlined in the page itself?</p>
<p>Using external files in the real world generally produces faster pages because the JavaScript and CSS files are cached by the browser. JavaScript and CSS that are inlined in HTML documents get downloaded every time the HTML document is requested. This reduces the number of HTTP requests that are needed, but increases the size of the HTML document. On the other hand, if the JavaScript and CSS are in external files cached by the browser, the size of the HTML document is reduced without increasing the number of HTTP requests.</p>
<p>The key factor, then, is the frequency with which external JavaScript and CSS components are cached relative to the number of HTML documents requested. This factor, although difficult to quantify, can be gauged using various metrics. If users on your site have multiple page views per session and many of your pages re-use the same scripts and stylesheets, there is a greater potential benefit from cached external files.</p>
<p>Many web sites fall in the middle of these metrics. For these sites, the best solution generally is to deploy the JavaScript and CSS as external files. The only exception where inlining is preferable is with home pages. Home pages that have few (perhaps only one) page view per session may find that inlining JavaScript and CSS results in faster end-user response times.</p>
<p>For front pages that are typically the first of many page views, there are techniques that leverage the reduction of HTTP requests that inlining provides, as well as the caching benefits achieved through using external files. One such technique is to inline JavaScript and CSS in the front page, but dynamically download the external files after the page has finished loading. Subsequent pages would reference the external files that should already be in the browser&#8217;s cache.</p>
<h2>Reduce DNS Lookups</h2>
<p>The Domain Name System (DNS) maps hostnames to IP addresses, just as phonebooks map people&#8217;s names to their phone numbers. When you type www.zachbrowne.com into your browser, a DNS resolver contacted by the browser returns that server&#8217;s IP address. DNS has a cost. It typically takes 20-120 milliseconds for DNS to lookup the IP address for a given hostname. The browser can&#8217;t download anything from this hostname until the DNS lookup is completed.</p>
<p>DNS lookups are cached for better performance. This caching can occur on a special caching server, maintained by the user&#8217;s ISP or local area network, but there is also caching that occurs on the individual user&#8217;s computer. The DNS information remains in the operating system&#8217;s DNS cache (the &#8220;DNS Client service&#8221; on Microsoft Windows). Most browsers have their own caches, separate from the operating system&#8217;s cache. As long as the browser keeps a DNS record in its own cache, it doesn&#8217;t bother the operating system with a request for the record.</p>
<p>Internet Explorer caches DNS lookups for 30 minutes by default, as specified by the DnsCacheTimeout registry setting. Firefox caches DNS lookups for 1 minute, controlled by the network.dnsCacheExpiration configuration setting. (Fasterfox changes this to 1 hour.)</p>
<p>When the client&#8217;s DNS cache is empty (for both the browser and the operating system), the number of DNS lookups is equal to the number of unique hostnames in the web page. This includes the hostnames used in the page&#8217;s URL, images, script files, stylesheets, Flash objects, etc. Reducing the number of unique hostnames reduces the number of DNS lookups.</p>
<p>Reducing the number of unique hostnames has the potential to reduce the amount of parallel downloading that takes place in the page. Avoiding DNS lookups cuts response times, but reducing parallel downloads may increase response times. My guideline is to split these components across at least two but no more than four hostnames. This results in a good compromise between reducing DNS lookups and allowing a high degree of parallel downloads.</p>
<h2>Minify JavaScript and CSS</h2>
<p>Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are JSMin and YUI Compressor. The YUI compressor can also minify CSS.</p>
<p>Obfuscation is an alternative optimization that can be applied to source code. It&#8217;s more complex than minification and thus more likely to generate bugs as a result of the obfuscation step itself. In a survey of ten top U.S. web sites, minification achieved a 21% size reduction versus 25% for obfuscation. Although obfuscation has a higher size reduction, minifying JavaScript is less risky.</p>
<p>In addition to minifying external scripts and styles, inlined <tt><script type="text/javascript">// < ![CDATA[
</tt> and <tt></tt></script></tt></p>
<style></style>
<p> blocks can and should also be minified. Even if you gzip your scripts and styles, minifying them will still reduce the size by 5% or more. As the use and size of JavaScript and CSS increases, so will the savings gained by minifying your code.</p>
<h2>Avoid Redirects</h2>
<p>Redirects are accomplished using the 301 and 302 status codes. Here&#8217;s an example of the HTTP headers in a 301 response:</p>
<pre>HTTP/1.1 301 Moved Permanently
      Location: http://example.com/newuri
      Content-Type: text/html</pre>
<p>The browser automatically takes the user to the URL specified in the Location field. All the information necessary for a redirect is in the headers. The body of the response is typically empty. Despite their names, neither a 301 nor a 302 response is cached in practice unless additional headers, such as Expires or Cache-Control, indicate it should be. The meta refresh tag and JavaScript are other ways to direct users to a different URL, but if you must do a redirect, the preferred technique is to use the standard 3xx HTTP status codes, primarily to ensure the back button works correctly.</p>
<p>The main thing to remember is that redirects slow down the user experience. Inserting a redirect between the user and the HTML document delays everything in the page since nothing in the page can be rendered and no components can start being downloaded until the HTML document has arrived.<br />
One of the most wasteful redirects happens frequently and web developers are generally not aware of it. It occurs when a trailing slash (/) is missing from a URL that should otherwise have one.</p>
<p>Connecting an old web site to a new one is another common use for redirects. Others include connecting different parts of a website and directing the user based on certain conditions (type of browser, type of user account, etc.). Using a redirect to connect two web sites is simple and requires little additional coding. Although using redirects in these situations reduces the complexity for developers, it degrades the user experience. Alternatives for this use of redirects include using Alias and mod_rewrite if the two code paths are hosted on the same server. If a domain name change is the cause of using redirects, an alternative is to create a CNAME (a DNS record that creates an alias pointing from one domain name to another) in combination with Alias or <tt>mod_rewrite.</tt></p>
<h2>Remove Duplicate Scripts</h2>
<p>It hurts performance to include the same JavaScript file twice in one page. This isn&#8217;t as unusual as you might think. A review of the ten top U.S. web sites shows that two of them contain a duplicated script. Two main factors increase the odds of a script being duplicated in a single web page: team size and number of scripts. When it does happen, duplicate scripts hurt performance by creating unnecessary HTTP requests and wasted JavaScript execution.</p>
<p>Unnecessary HTTP requests happen in Internet Explorer, but not in Firefox. In Internet Explorer, if an external script is included twice and is not cacheable, it generates two HTTP requests during page loading. Even if the script is cacheable, extra HTTP requests occur when the user reloads the page.</p>
<p>In addition to generating wasteful HTTP requests, time is wasted evaluating the script multiple times. This redundant JavaScript execution happens in both Firefox and Internet Explorer, regardless of whether the script is cacheable.</p>
<p>One way to avoid accidentally including the same script twice is to implement a script management module in your templating system. The typical way to include a script is to use the SCRIPT tag in your HTML page.</p>
<p>      <tt><script type="text/javascript" src="menu_1.0.17.js">
// ]]&gt;</script></tt></p>
<p>An alternative in PHP would be to create a function called insertScript.</p>
<p><tt><!--?php insertScript("menu.js") ?--></tt></p>
<p>In addition to preventing the same script from being inserted multiple times, this function could handle other issues with scripts, such as dependency checking and adding version numbers to script filenames to support far future Expires headers.</p>
<h2>Configure ETags</h2>
<p>Entity tags (ETags) are a mechanism that web servers and browsers use to determine whether the component in the browser&#8217;s cache matches the one on the origin server. (An &#8220;entity&#8221; is another word a &#8220;component&#8221;: images, scripts, stylesheets, etc.) ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date. An ETag is a string that uniquely identifies a specific version of a component. The only format constraints are that the string be quoted. The origin server specifies the component&#8217;s ETag using the ETag response header.</p>
<pre>HTTP/1.1 200 OK
      Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
      ETag: "10c24bc-4ab-457e1c1f"
      Content-Length: 12195</pre>
<p>Later, if the browser has to validate a component, it uses the If-None-Match header to pass the ETag back to the origin server. If the ETags match, a 304 status code is returned reducing the response by 12195 bytes for this example.</p>
<pre>GET /i/zachbrowne.gif HTTP/1.1
      Host: us.yimg.com
      If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
      If-None-Match: "10c24bc-4ab-457e1c1f"
      HTTP/1.1 304 Not Modified</pre>
<p>The problem with ETags is that they typically are constructed using attributes that make them unique to a specific server hosting a site. ETags won&#8217;t match when a browser gets the original component from one server and later tries to validate that component on a different server, a situation that is all too common on Web sites that use a cluster of servers to handle requests. By default, both Apache and IIS embed data in the ETag that dramatically reduces the odds of the validity test succeeding on web sites with multiple servers.</p>
<p>The ETag format for Apache 1.3 and 2.x is inode-size-timestamp. Although a given file may reside in the same directory across multiple servers, and have the same file size, permissions, timestamp, etc., its inode is different from one server to the next.</p>
<p>IIS 5.0 and 6.0 have a similar issue with ETags. The format for ETags on IIS is Filetimestamp:ChangeNumber. A ChangeNumber is a counter used to track configuration changes to IIS. It&#8217;s unlikely that the ChangeNumber is the same across all IIS servers behind a web site.</p>
<p>The end result is ETags generated by Apache and IIS for the exact same component won&#8217;t match from one server to another. If the ETags don&#8217;t match, the user doesn&#8217;t receive the small, fast 304 response that ETags were designed for; instead, they&#8217;ll get a normal 200 response along with all the data for the component. If you host your web site on just one server, this isn&#8217;t a problem. But if you have multiple servers hosting your web site, and you&#8217;re using Apache or IIS with the default ETag configuration, your users are getting slower pages, your servers have a higher load, you&#8217;re consuming greater bandwidth, and proxies aren&#8217;t caching your content efficiently. Even if your components have a far future Expires header, a conditional GET request is still made whenever the user hits Reload or Refresh.</p>
<p>If you&#8217;re not taking advantage of the flexible validation model that ETags provide, it&#8217;s better to just remove the ETag altogether. The Last-Modified header validates based on the component&#8217;s timestamp. And removing the ETag reduces the size of the HTTP headers in both the response and subsequent requests. This Microsoft Support article describes how to remove ETags. In Apache, this is done by simply adding the following line to your Apache configuration file:</p>
<p><tt>FileETag none</tt></p>
<h2>Make Ajax Cacheable</h2>
<p>One of the cited benefits of Ajax is that it provides instantaneous feedback to the user because it requests information asynchronously from the backend web server. However, using Ajax is no guarantee that the user won&#8217;t be twiddling his thumbs waiting for those asynchronous JavaScript and XML responses to return. In many applications, whether or not the user is kept waiting depends on how Ajax is used. For example, in a web-based email client the user will be kept waiting for the results of an Ajax request to find all the email messages that match their search criteria. It&#8217;s important to remember that &#8220;asynchronous&#8221; does not imply &#8220;instantaneous&#8221;.</p>
<p>To improve performance, it&#8217;s important to optimize these Ajax responses. The most important way to improve the performance of Ajax is to make the responses cacheable, as discussed in Add an Expires or a Cache-Control Header. Some of the other rules also apply to Ajax:</p>
<pre>Gzip Components
Reduce DNS Lookups
Minify JavaScript
Avoid Redirects
Configure ETags</pre>
<p>Let&#8217;s look at an example. A Web 2.0 email client might use Ajax to download the user&#8217;s address book for autocompletion. If the user hasn&#8217;t modified her address book since the last time she used the email web app, the previous address book response could be read from cache if that Ajax response was made cacheable with a future Expires or Cache-Control header. The browser must be informed when to use a previously cached address book response versus requesting a new one. This could be done by adding a timestamp to the address book Ajax URL indicating the last time the user modified her address book, for example, &amp;t=1190241612. If the address book hasn&#8217;t been modified since the last download, the timestamp will be the same and the address book will be read from the browser&#8217;s cache eliminating an extra HTTP roundtrip. If the user has modified her address book, the timestamp ensures the new URL doesn&#8217;t match the cached response, and the browser will request the updated address book entries.</p>
<p>Even though your Ajax responses are created dynamically, and might only be applicable to a single user, they can still be cached. Doing so will make your Web 2.0 apps faster.</p>
<h2>Flush the Buffer Early</h2>
<p>When users request a page, it can take anywhere from 200 to 500ms for the backend server to stitch together the HTML page. During this time, the browser is idle as it waits for the data to arrive. In PHP you have the function flush(). It allows you to send your partially ready HTML response to the browser so that the browser can start fetching components while your backend is busy with the rest of the HTML page. The benefit is mainly seen on busy backends or light frontends.</p>
<p>A good place to consider flushing is right after the HEAD because the HTML for the head is usually easier to produce and it allows you to include any CSS and JavaScript files for the browser to start fetching in parallel while the backend is still processing.</p>
<p><strong>Example:</strong></p>
<pre>... <!-- css, js -->

    <!--?php flush(); ?-->

      ... <!-- content --></pre>
<h2>Use GET for AJAX Requests</h2>
<p>When using XMLHttpRequest, POST is implemented in the browsers as a two-step process: sending the headers first, then sending data. So it&#8217;s best to use GET, which only takes one TCP packet to send (unless you have a lot of cookies). The maximum URL length in IE is 2K, so if you send more than 2K data you might not be able to use GET.</p>
<p>An interesting side affect is that POST without actually posting any data behaves like GET. Based on the HTTP specs, GET is meant for retrieving information, so it makes sense (semantically) to use GET when you&#8217;re only requesting data, as opposed to sending data to be stored server-side.</p>
<h2>Post-load Components</h2>
<p>You can take a closer look at your page and ask yourself: &#8220;What&#8217;s absolutely required in order to render the page initially?&#8221;. The rest of the content and components can wait.</p>
<p>JavaScript is an ideal candidate for splitting before and after the onload event. For example if you have JavaScript code and libraries that do drag and drop and animations, those can wait, because dragging elements on the page comes after the initial rendering. Other places to look for candidates for post-loading include hidden content (content that appears after a user action) and images below the fold.</p>
<p>Tools to help you out in your effort: YUI Image Loader allows you to delay images below the fold and the YUI Get utility is an easy way to include JS and CSS on the fly. For an example in the wild take a look at zachbrowne! Home Page with Firebug&#8217;s Net Panel turned on.</p>
<p>It&#8217;s good when the performance goals are inline with other web development best practices. In this case, the idea of progressive enhancement tells us that JavaScript, when supported, can improve the user experience but you have to make sure the page works even without JavaScript. So after you&#8217;ve made sure the page works fine, you can enhance it with some post-loaded scripts that give you more bells and whistles such as drag and drop and animations.</p>
<h2>Preload Components</h2>
<p>Preload may look like the opposite of post-load, but it actually has a different goal. By preloading components you can take advantage of the time the browser is idle and request components (like images, styles and scripts) you&#8217;ll need in the future. This way when the user visits the next page, you could have most of the components already in the cache and your page will load much faster for the user.<br />
There are actually several types of preloading:</p>
<p>Unconditional preload &#8211; as soon as onload fires, you go ahead and fetch some extra components. Check google.com for an example of how a sprite image is requested onload. This sprite image is not needed on the google.com homepage, but it is needed on the consecutive search result page.</p>
<p>Conditional preload &#8211; based on a user action you make an educated guess where the user is headed next and preload accordingly. On search.zachbrowne.com you can see how some extra components are requested after you start typing in the input box.</p>
<p>Anticipated preload &#8211; preload in advance before launching a redesign. It often happens after a redesign that you hear: &#8220;The new site is cool, but it&#8217;s slower than before&#8221;. Part of the problem could be that the users were visiting your old site with a full cache, but the new one is always an empty cache experience. You can mitigate this side effect by preloading some components before you even launched the redesign. Your old site can use the time the browser is idle and request images and scripts that will be used by the new site.</p>
<h2>Reduce the Number of DOM Elements</h2>
<p>A complex page means more bytes to download and it also means slower DOM access in JavaScript. It makes a difference if you loop through 500 or 5000 DOM elements on the page when you want to add an event handler for example.</p>
<p>A high number of DOM elements can be a symptom that there&#8217;s something that should be improved with the markup of the page without necessarily removing content. Are you using nested tables for layout purposes? Are you throwing in more &lt; div &gt;s only to fix layout issues? Maybe there&#8217;s a better and more semantically correct way to do your markup.</p>
<p>A great help with layouts are the YUI CSS utilities: grids.css can help you with the overall layout, fonts.css and reset.css can help you strip away the browser&#8217;s defaults formatting. This is a chance to start fresh and think about your markup, for example use</p>
<div>
<p>s only when it makes sense semantically, and not because it renders a new line.</p>
<p>The number of DOM elements is easy to test, just type in Firebug&#8217;s console:</p>
<p><tt>document.getElementsByTagName('*').length</tt></p>
<p>And how many DOM elements are too many? Check other similar pages that have good markup. For example the zachbrowne.com Home Page is a pretty busy page and still under 700 elements (HTML tags).</p>
<h2>Split Components Across Domains</h2>
<p>Splitting components allows you to maximize parallel downloads. Make sure you&#8217;re using not more than 2-4 domains because of the DNS lookup penalty. For example, you can host your HTML and dynamic content on www.example.org and split static components between static1.example.org and static2.example.org.</p>
<h2>Minimize the Number of iframes</h2>
<p>Iframes allow an HTML document to be inserted in the parent document. It&#8217;s important to understand how iframes work so they can be used effectively.<br />
<tt>&lt; i frame &gt;</tt> pros:</p>
<ul>
<li>Helps with slow third-party content like badges and ads</li>
<li>Security sandbox</li>
<li>Download scripts in parallel</li>
<li><tt>&lt; i frame &gt;</tt> cons:</li>
<li>Costly even if blank</li>
<li>Blocks page onload</li>
<li>Non-semantic</li>
</ul>
<h2>No 404s</h2>
<p>HTTP requests are expensive so making an HTTP request and getting a useless response (i.e. 404 Not Found) is totally unnecessary and will slow down the user experience without any benefit.</p>
<p>Some sites have helpful 404s &#8220;Did you mean X?&#8221;, which is great for the user experience but also wastes server resources (like database, etc). Particularly bad is when the link to an external JavaScript is wrong and the result is a 404. First, this download will block parallel downloads. Next the browser may try to parse the 404 response body as if it were JavaScript code, trying to find something usable in it.</p>
<h2>Reduce Cookie Size</h2>
<p>HTTP cookies are used for a variety of reasons such as authentication and personalization. Information about cookies is exchanged in the HTTP headers between web servers and browsers. It&#8217;s important to keep the size of cookies as low as possible to minimize the impact on the user&#8217;s response time.</p>
<h2>Eliminate unnecessary cookies</h2>
<p>Keep cookie sizes as low as possible to minimize the impact on the user response time<br />
Be mindful of setting cookies at the appropriate domain level so other sub-domains are not affected<br />
Set an Expires date appropriately. An earlier Expires date or none removes the cookie sooner, improving the user response time</p>
<h2>Use Cookie-free Domains for Components</h2>
<p>When the browser makes a request for a static image and sends cookies together with the request, the server doesn&#8217;t have any use for those cookies. So they only create network traffic for no good reason. You should make sure static components are requested with cookie-free requests. Create a subdomain and host all your static components there.</p>
<p>If your domain is www.example.org, you can host your static components on static.example.org. However, if you&#8217;ve already set cookies on the top-level domain example.org as opposed to www.example.org, then all the requests to static.example.org will include those cookies. In this case, you can buy a whole new domain, host your static components there, and keep this domain cookie-free. Yahoo! uses yimg.com, YouTube uses ytimg.com, Amazon uses images-amazon.com and so on.</p>
<p>Another benefit of hosting static components on a cookie-free domain is that some proxies might refuse to cache the components that are requested with cookies. On a related note, if you wonder if you should use example.org or www.example.org for your home page, consider the cookie impact. Omitting www leaves you no choice but to write cookies to *.example.org, so for performance reasons it&#8217;s best to use the www subdomain and write the cookies to that subdomain.</p>
<h2>Minimize DOM Access</h2>
<ul>
<li>Accessing DOM elements with JavaScript is slow so in order to have a more responsive page, you should:</li>
<li>Cache references to accessed elements</li>
<li>Update nodes &#8220;offline&#8221; and then add them to the tree</li>
<li>Avoid fixing layout with JavaScript</li>
</ul>
<h2>Develop Smart Event Handlers</h2>
<p>Sometimes pages feel less responsive because of too many event handlers attached to different elements of the DOM tree which are then executed too often. That&#8217;s why using event delegation is a good approach. If you have 10 buttons inside a div, attach only one event handler to the div wrapper, instead of one handler for each button. Events bubble up so you&#8217;ll be able to catch the event and figure out which button it originated from.</p>
<p>You also don&#8217;t need to wait for the onload event in order to start doing something with the DOM tree. Often all you need is the element you want to access to be available in the tree. You don&#8217;t have to wait for all images to be downloaded. DOMContentLoaded is the event you might consider using instead of onload, but until it&#8217;s available in all browsers, you can use the YUI Event utility, which has an onAvailable method.</p>
<p><tt>Choose  over @import</tt></p>
<p>One of the previous best practices states that CSS should be at the top in order to allow for progressive rendering.<br />
In IE @import behaves the same as using  at the bottom of the page, so it&#8217;s best not to use it.</p>
<h2>Avoid Filters</h2>
<p>The IE-proprietary AlphaImageLoader filter aims to fix a problem with semi-transparent true color PNGs in IE versions &lt; 7. The problem with this filter is that it blocks rendering and freezes the browser while the image is being downloaded. It also increases memory consumption and is applied per element, not per image, so the problem is multiplied.<br />
The best approach is to avoid AlphaImageLoader completely and use gracefully degrading PNG8 instead, which are fine in IE. If you absolutely need AlphaImageLoader, use the underscore hack _filter as to not penalize your IE7+ users.</p>
<h2>Optimize Images</h2>
<p>After a designer is done with creating the images for your web page, there are still some things you can try before you FTP those images to your web server.</p>
<p>You can check the GIFs and see if they are using a palette size corresponding to the number of colors in the image. Using imagemagick it&#8217;s easy to check using</p>
<p><tt>identify -verbose image.gif</tt></p>
<p>When you see an image using 4 colors and a 256 color &#8220;slots&#8221; in the palette, there is room for improvement.</p>
<p>Try converting GIFs to PNGs and see if there is a saving. More often than not, there is. Developers often hesitate to use PNGs due to the limited support in browsers, but this is now a thing of the past. The only real problem is alpha-transparency in true color PNGs, but then again, GIFs are not true color and don&#8217;t support variable transparency either. So anything a GIF can do, a palette PNG (PNG8) can do too (except for animations). This simple imagemagick command results in totally safe-to-use PNGs:</p>
<p><tt>convert image.gif image.png</tt></p>
<p>&#8220;All we are saying is: Give PiNG a Chance!&#8221;</p>
<p>Run pngcrush (or any other PNG optimizer tool) on all your PNGs. Example:</p>
<p><tt>pngcrush image.png -rem alla -reduce -brute result.png</tt></p>
<p>Run jpegtran on all your JPEGs. This tool does lossless JPEG operations such as rotation and can also be used to optimize and remove comments and other useless information (such as EXIF information) from your images.</p>
<p><tt>jpegtran -copy none -optimize -perfect src.jpg dest.jpg</tt></p>
<h2>Optimize CSS Sprites</h2>
<p>Arranging the images in the sprite horizontally as opposed to vertically usually results in a smaller file size.</p>
<p>Combining similar colors in a sprite helps you keep the color count low, ideally under 256 colors so to fit in a PNG8.</p>
<p>&#8220;Be mobile-friendly&#8221; and don&#8217;t leave big gaps between the images in a sprite. This doesn&#8217;t affect the file size as much but requires less memory for the user agent to decompress the image into a pixel map. 100&#215;100 image is 10 thousand pixels, where 1000&#215;1000 is 1 million pixels</p>
<h2>Don&#8217;t Scale Images in HTML</h2>
<p>Don&#8217;t use a bigger image than you need just because you can set the width and height in HTML. If you need</p>
<p><tt><img src="myhumps.jpg" alt="My Lovely Lady Bumps" width="50" height="50" /></tt></p>
<p>then your image (myhumps.jpg) should be 50x50px rather than a scaled down 500x500px image.</p>
<h2>Make favicon.ico Small and Cacheable</h2>
<p>The favicon.ico is an image that stays in the root of your server. It&#8217;s a necessary evil because even if you don&#8217;t care about it the browser will still request it, so it&#8217;s better not to respond with a 404 Not Found. Also since it&#8217;s on the same server, cookies are sent every time it&#8217;s requested. This image also interferes with the download sequence, for example in IE when you request extra components in the onload, the favicon will be downloaded before these extra components.</p>
<p>So to mitigate the drawbacks of having a favicon.ico make sure:</p>
<p>It&#8217;s small, preferably under 1K.</p>
<p>Set Expires header with what you feel comfortable (since you cannot rename it if you decide to change it). You can probably safely set the Expires header a few months in the future. You can check the last modified date of your current favicon.ico to make an informed decision.</p>
<p>Imagemagick can help you create small favicons</p>
<h2>Keep Components under 25K</h2>
<p>This restriction is related to the fact that iPhone won&#8217;t cache components bigger than 25K. Note that this is the uncompressed size. This is where minification is important because gzip alone may not be sufficient.</p>
<p>For more information check &#8220;Performance Research, Part 5: iPhone Cacheability &#8211; Making it Stick&#8221; by Wayne Shea and Tenni Theurer.</p>
<h2>Pack Components into a Multipart Document</h2>
<p>Packing components into a multipart document is like an email with attachments, it helps you fetch several components with one HTTP request (remember: HTTP requests are expensive). When you use this technique, first check if the user agent supports it (iPhone does not).</p>
<h2>Avoid Empty Image src</h2>
<p>Image with empty string src attribute occurs more than one will expect. It appears in two form:</p>
<p><strong>straight HTML:</strong><br />
<tt><img alt="" /></tt></p>
<p><strong>JavaScript:</strong></p>
<pre>var img = new Image();
img.src = "";</pre>
<ul>
<li>Both forms cause the same effect: browser makes another request to your server.</li>
<li>Internet Explorer makes a request to the directory in which the page is located.</li>
<li>Safari and Chrome make a request to the actual page itself.</li>
<li>Firefox 3 and earlier versions behave the same as Safari and Chrome, but version 3.5 addressed this issue[bug 444931] and no longer sends a request.</li>
<li>Opera does not do anything when an empty image src is encountered.</li>
</ul>
<p><strong>Why is this behavior bad? </strong></p>
<p>Cripple your servers by sending a large amount of unexpected traffic, especially for pages that get millions of page views per day.<br />
Waste server computing cycles generating a page that will never be viewed.</p>
<p>Possibly corrupt user data. If you are tracking state in the request, either by cookies or in another way, you have the possibility of destroying data. Even though the image request does not return an image, all of the headers are read and accepted by the browser, including all cookies. While the rest of the response is thrown away, the damage may already be done.</p>
<p>The root cause of this behavior is the way that URI resolution is performed in browsers. This behavior is defined in RFC 3986 &#8211; Uniform Resource Identifiers. When an empty string is encountered as a URI, it is considered a relative URI and is resolved according to the algorithm defined in section 5.2. This specific example, an empty string, is listed in section 5.4. Firefox, Safari, and Chrome are all resolving an empty string correctly per the specification, while Internet Explorer is resolving it incorrectly, apparently in line with an earlier version of the specification, RFC 2396 &#8211; Uniform Resource Identifiers (this was obsoleted by RFC 3986). So technically, the browsers are doing what they are supposed to do to resolve relative URIs. The problem is that in this context, the empty string is clearly unintentional.</p>
<p>HTML5 adds to the description of the  tag&#8217;s src attribute to instruct browsers not to make an additional request in section 4.8.2:<br />
The src attribute must be present, and must contain a valid URL referencing a non-interactive, optionally animated, image resource that is neither paged nor scripted. If the base URI of the element is the same as the document&#8217;s address, then the src attribute&#8217;s value must not be the empty string.<br />
Hopefully, browsers will not have this problem in the future. Unfortunately, there is no such clause for <tt><script type="text/javascript">// < ![CDATA[
</tt> and <tt>	</tt></script></tt></p>
<link href="" _mce_href=""></link>. Maybe there is still time to make that adjustment to ensure browsers don&#8217;t accidentally implement this behavior.
<p>Thanks to <a rel="nofollow" href="http://developer.yahoo.com/performance/rules.html" _mce_rel="nofollow" href="http://developer.yahoo.com/performance/rules.html">Yahoo!</a> for making this possible for my readers.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6245-guide-to-wordpress-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thorough List of Factors That Help Speed Up Your Website</title>
		<link>http://zachbrowne.com/6114-thorough-list-of-factors-that-help-speed-up-your-website/</link>
		<comments>http://zachbrowne.com/6114-thorough-list-of-factors-that-help-speed-up-your-website/#comments</comments>
		<pubDate>Sun, 22 May 2011 03:46:27 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[css sprites]]></category>
		<category><![CDATA[ETag]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[image maps]]></category>
		<category><![CDATA[image requests]]></category>
		<category><![CDATA[image segment]]></category>
		<category><![CDATA[position properties]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/?p=6114</guid>
		<description><![CDATA[Here are the best ways for speeding up your WordPress. Minimize HTTP Requests 80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of...]]></description>
			<content:encoded><![CDATA[<p></p><p>Here are the best ways for speeding up your WordPress.</p>
<h2>Minimize HTTP Requests</h2>
<p>80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of HTTP requests required to render the page. This is the key to faster pages.</p>
<p>One way to reduce the number of components in the page is to simplify the page&#8217;s design. But is there a way to build pages with richer content while also achieving fast response times? Here are some techniques for reducing the number of HTTP requests, while still supporting rich page designs.<br />
Combined files are a way to reduce the number of HTTP requests by combining all scripts into a single script, and similarly combining all CSS into a single stylesheet. Combining files is more challenging when the scripts and stylesheets vary from page to page, but making this part of your release process improves response times.</p>
<p>CSS Sprites are the preferred method for reducing the number of image requests. Combine your background images into a single image and use the CSS background-image and background-position properties to display the desired image segment.</p>
<p>Image maps combine multiple images into a single image. The overall size is about the same, but reducing the number of HTTP requests speeds up the page. Image maps only work if the images are contiguous in the page, such as a navigation bar. Defining the coordinates of image maps can be tedious and error prone. Using image maps for navigation is not accessible too, so it&#8217;s not recommended.</p>
<p>Inline images use the data: URL scheme to embed the image data in the actual page. This can increase the size of your HTML document. Combining inline images into your (cached) stylesheets is a way to reduce HTTP requests and avoid increasing the size of your pages. Inline images are not yet supported across all major browsers.</p>
<p>Reducing the number of HTTP requests in your page is the place to start. This is the most important guideline for improving performance for first time visitors. As described in Tenni Theurer&#8217;s blog post Browser Cache Usage &#8211; Exposed!, 40-60% of daily visitors to your site come in with an empty cache. Making your page fast for these first time visitors is key to a better user experience.</p>
<h2>Use a Content Delivery Network</h2>
<p>The user&#8217;s proximity to your web server has an impact on response times. Deploying your content across multiple, geographically dispersed servers will make your pages load faster from the user&#8217;s perspective. But where should you start?</p>
<p>As a first step to implementing geographically dispersed content, don&#8217;t attempt to redesign your web application to work in a distributed architecture. Depending on the application, changing the architecture could include daunting tasks such as synchronizing session state and replicating database transactions across server locations. Attempts to reduce the distance between users and your content could be delayed by, or never pass, this application architecture step.</p>
<p>Remember that 80-90% of the end-user response time is spent downloading all the components in the page: images, stylesheets, scripts, Flash, etc. This is the Performance Golden Rule. Rather than starting with the difficult task of redesigning your application architecture, it&#8217;s better to first disperse your static content. This not only achieves a bigger reduction in response times, but it&#8217;s easier thanks to content delivery networks.</p>
<p>A content delivery network (CDN) is a collection of web servers distributed across multiple locations to deliver content more efficiently to users. The server selected for delivering content to a specific user is typically based on a measure of network proximity. For example, the server with the fewest network hops or the server with the quickest response time is chosen.</p>
<p>Some large Internet companies own their own CDN, but it&#8217;s cost-effective to use a CDN service provider, such as Akamai Technologies, EdgeCast, or level3. A CDN is necessary to achieve fast response times. Switching to a CDN is a relatively easy code change that will dramatically improve the speed of your web site.</p>
<h2>Add an Expires or a Cache-Control Header</h2>
<p><strong>There are two aspects to this rule: </strong></p>
<ol>
<li>For static components: implement &#8220;Never expire&#8221; policy by setting far future Expires header</li>
<li>For dynamic components: use an appropriate Cache-Control header to help the browser with conditional requests</li>
</ol>
<p>Web page designs are getting richer and richer, which means more scripts, stylesheets, images, and Flash in the page. A first-time visitor to your page may have to make several HTTP requests, but by using the Expires header you make those components cacheable. This avoids unnecessary HTTP requests on subsequent page views. Expires headers are most often used with images, but they should be used on all components including scripts, stylesheets, and Flash components.</p>
<p>Browsers (and proxies) use a cache to reduce the number and size of HTTP requests, making web pages load faster. A web server uses the Expires header in the HTTP response to tell the client how long a component can be cached. This is a far future Expires header, telling the browser that this response won&#8217;t be stale until April 15, 2010.</p>
<p><tt>Expires: Thu, 15 Apr 2010 20:00:00 GMT</tt></p>
<p>If your server is Apache, use the ExpiresDefault directive to set an expiration date relative to the current date. This example of the ExpiresDefault directive sets the Expires date 10 years out from the time of the request.</p>
<p><tt>ExpiresDefault "access plus 10 years"</tt></p>
<p>Keep in mind, if you use a far future Expires header you have to change the component&#8217;s filename whenever the component changes. At zachbrowne! we often make this step part of the build process: a version number is embedded in the component&#8217;s filename, for example, zachbrowne_2.0.6.js.<br />
Using a far future Expires header affects page views only after a user has already visited your site. It has no effect on the number of HTTP requests when a user visits your site for the first time and the browser&#8217;s cache is empty. Therefore the impact of this performance improvement depends on how often users hit your pages with a primed cache. (A &#8220;primed cache&#8221; already contains all of the components in the page.) We measured this at zachbrowne! and found the number of page views with a primed cache is 75-85%. By using a far future Expires header, you increase the number of components that are cached by the browser and re-used on subsequent page views without sending a single byte over the user&#8217;s Internet connection.</p>
<h2>Gzip Components</h2>
<p>The time it takes to transfer an HTTP request and response across the network can be significantly reduced by decisions made by front-end engineers. It&#8217;s true that the end-user&#8217;s bandwidth speed, Internet service provider, proximity to peering exchange points, etc. are beyond the control of the development team. But there are other variables that affect response times. Compression reduces response times by reducing the size of the HTTP response.</p>
<p>Starting with HTTP/1.1, web clients indicate support for compression with the Accept-Encoding header in the HTTP request.</p>
<p><tt>Accept-Encoding: gzip, deflate</tt></p>
<p>If the web server sees this header in the request, it may compress the response using one of the methods listed by the client. The web server notifies the web client of this via the Content-Encoding header in the response.</p>
<p><tt>Content-Encoding: gzip</tt></p>
<p>Gzip is the most popular and effective compression method at this time. It was developed by the GNU project and standardized by RFC 1952. The only other compression format you&#8217;re likely to see is deflate, but it&#8217;s less effective and less popular.</p>
<p>Gzipping generally reduces the response size by about 70%. Approximately 90% of today&#8217;s Internet traffic travels through browsers that claim to support gzip. If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.<br />
There are known issues with browsers and proxies that may cause a mismatch in what the browser expects and what it receives with regard to compressed content. Fortunately, these edge cases are dwindling as the use of older browsers drops off. The Apache modules help out by adding appropriate Vary response headers automatically.</p>
<p>Servers choose what to gzip based on file type, but are typically too limited in what they decide to compress. Most web sites gzip their HTML documents. It&#8217;s also worthwhile to gzip your scripts and stylesheets, but many web sites miss this opportunity. In fact, it&#8217;s worthwhile to compress any text response including XML and JSON. Image and PDF files should not be gzipped because they are already compressed. Trying to gzip them not only wastes CPU but can potentially increase file sizes.</p>
<p>Gzipping as many file types as possible is an easy way to reduce page weight and accelerate the user experience.</p>
<h2>Put Stylesheets at the Top</h2>
<p>While researching performance at zachbrowne!, we discovered that moving stylesheets to the document HEAD makes pages appear to be loading faster. This is because putting stylesheets in the HEAD allows the page to render progressively.</p>
<p>Front-end engineers that care about performance want a page to load progressively; that is, we want the browser to display whatever content it has as soon as possible. This is especially important for pages with a lot of content and for users on slower Internet connections. The importance of giving users visual feedback, such as progress indicators, has been well researched and documented. In our case the HTML page is the progress indicator! When the browser loads the page progressively the header, the navigation bar, the logo at the top, etc. all serve as visual feedback for the user who is waiting for the page. This improves the overall user experience.</p>
<p>The problem with putting stylesheets near the bottom of the document is that it prohibits progressive rendering in many browsers, including Internet Explorer. These browsers block rendering to avoid having to redraw elements of the page if their styles change. The user is stuck viewing a blank white page.</p>
<p>The HTML specification clearly states that stylesheets are to be included in the HEAD of the page: &#8220;Unlike A, [LINK] may only appear in the HEAD section of a document, although it may appear any number of times.&#8221; Neither of the alternatives, the blank white screen or flash of unstyled content, are worth the risk. The optimal solution is to follow the HTML specification and load your stylesheets in the document HEAD.</p>
<h2>Put Scripts at the Bottom</h2>
<p>The problem caused by scripts is that they block parallel downloads. The HTTP/1.1 specification suggests that browsers download no more than two components in parallel per hostname. If you serve your images from multiple hostnames, you can get more than two downloads to occur in parallel. While a script is downloading, however, the browser won&#8217;t start any other downloads, even on different hostnames.</p>
<p>In some situations it&#8217;s not easy to move scripts to the bottom. If, for example, the script uses document.write to insert part of the page&#8217;s content, it can&#8217;t be moved lower in the page. There might also be scoping issues. In many cases, there are ways to workaround these situations.<br />
An alternative suggestion that often comes up is to use deferred scripts. The DEFER attribute indicates that the script does not contain document.write, and is a clue to browsers that they can continue rendering. Unfortunately, Firefox doesn&#8217;t support the DEFER attribute. In Internet Explorer, the script may be deferred, but not as much as desired. If a script can be deferred, it can also be moved to the bottom of the page. That will make your web pages load faster.</p>
<h2>Avoid CSS Expressions</h2>
<p>CSS expressions are a powerful (and dangerous) way to set CSS properties dynamically. They were supported in Internet Explorer starting with version 5, but were deprecated starting with IE8. As an example, the background color could be set to alternate every hour using CSS expressions:</p>
<p><tt>background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );</tt></p>
<p>As shown here, the expression method accepts a JavaScript expression. The CSS property is set to the result of evaluating the JavaScript expression. The expression method is ignored by other browsers, so it is useful for setting properties in Internet Explorer needed to create a consistent experience across browsers.</p>
<p>The problem with expressions is that they are evaluated more frequently than most people expect. Not only are they evaluated when the page is rendered and resized, but also when the page is scrolled and even when the user moves the mouse over the page. Adding a counter to the CSS expression allows us to keep track of when and how often a CSS expression is evaluated. Moving the mouse around the page can easily generate more than 10,000 evaluations.</p>
<p>One way to reduce the number of times your CSS expression is evaluated is to use one-time expressions, where the first time the expression is evaluated it sets the style property to an explicit value, which replaces the CSS expression. If the style property must be set dynamically throughout the life of the page, using event handlers instead of CSS expressions is an alternative approach. If you must use CSS expressions, remember that they may be evaluated thousands of times and could affect the performance of your page.</p>
<h2>Make JavaScript and CSS External</h2>
<p>Many of these performance rules deal with how external components are managed. However, before these considerations arise you should ask a more basic question: Should JavaScript and CSS be contained in external files, or inlined in the page itself?</p>
<p>Using external files in the real world generally produces faster pages because the JavaScript and CSS files are cached by the browser. JavaScript and CSS that are inlined in HTML documents get downloaded every time the HTML document is requested. This reduces the number of HTTP requests that are needed, but increases the size of the HTML document. On the other hand, if the JavaScript and CSS are in external files cached by the browser, the size of the HTML document is reduced without increasing the number of HTTP requests.</p>
<p>The key factor, then, is the frequency with which external JavaScript and CSS components are cached relative to the number of HTML documents requested. This factor, although difficult to quantify, can be gauged using various metrics. If users on your site have multiple page views per session and many of your pages re-use the same scripts and stylesheets, there is a greater potential benefit from cached external files.</p>
<p>Many web sites fall in the middle of these metrics. For these sites, the best solution generally is to deploy the JavaScript and CSS as external files. The only exception where inlining is preferable is with home pages. Home pages that have few (perhaps only one) page view per session may find that inlining JavaScript and CSS results in faster end-user response times.</p>
<p>For front pages that are typically the first of many page views, there are techniques that leverage the reduction of HTTP requests that inlining provides, as well as the caching benefits achieved through using external files. One such technique is to inline JavaScript and CSS in the front page, but dynamically download the external files after the page has finished loading. Subsequent pages would reference the external files that should already be in the browser&#8217;s cache.</p>
<h2>Reduce DNS Lookups</h2>
<p>The Domain Name System (DNS) maps hostnames to IP addresses, just as phonebooks map people&#8217;s names to their phone numbers. When you type www.zachbrowne.com into your browser, a DNS resolver contacted by the browser returns that server&#8217;s IP address. DNS has a cost. It typically takes 20-120 milliseconds for DNS to lookup the IP address for a given hostname. The browser can&#8217;t download anything from this hostname until the DNS lookup is completed.</p>
<p>DNS lookups are cached for better performance. This caching can occur on a special caching server, maintained by the user&#8217;s ISP or local area network, but there is also caching that occurs on the individual user&#8217;s computer. The DNS information remains in the operating system&#8217;s DNS cache (the &#8220;DNS Client service&#8221; on Microsoft Windows). Most browsers have their own caches, separate from the operating system&#8217;s cache. As long as the browser keeps a DNS record in its own cache, it doesn&#8217;t bother the operating system with a request for the record.</p>
<p>Internet Explorer caches DNS lookups for 30 minutes by default, as specified by the DnsCacheTimeout registry setting. Firefox caches DNS lookups for 1 minute, controlled by the network.dnsCacheExpiration configuration setting. (Fasterfox changes this to 1 hour.)</p>
<p>When the client&#8217;s DNS cache is empty (for both the browser and the operating system), the number of DNS lookups is equal to the number of unique hostnames in the web page. This includes the hostnames used in the page&#8217;s URL, images, script files, stylesheets, Flash objects, etc. Reducing the number of unique hostnames reduces the number of DNS lookups.</p>
<p>Reducing the number of unique hostnames has the potential to reduce the amount of parallel downloading that takes place in the page. Avoiding DNS lookups cuts response times, but reducing parallel downloads may increase response times. My guideline is to split these components across at least two but no more than four hostnames. This results in a good compromise between reducing DNS lookups and allowing a high degree of parallel downloads.</p>
<h2>Minify JavaScript and CSS</h2>
<p>Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are JSMin and YUI Compressor. The YUI compressor can also minify CSS.</p>
<p>Obfuscation is an alternative optimization that can be applied to source code. It&#8217;s more complex than minification and thus more likely to generate bugs as a result of the obfuscation step itself. In a survey of ten top U.S. web sites, minification achieved a 21% size reduction versus 25% for obfuscation. Although obfuscation has a higher size reduction, minifying JavaScript is less risky.</p>
<p>In addition to minifying external scripts and styles, inlined <tt><script type="text/javascript">// < ![CDATA[
</tt> and <tt></tt></script></tt></p>
<style></style>
<p> blocks can and should also be minified. Even if you gzip your scripts and styles, minifying them will still reduce the size by 5% or more. As the use and size of JavaScript and CSS increases, so will the savings gained by minifying your code.</p>
<h2>Avoid Redirects</h2>
<p>Redirects are accomplished using the 301 and 302 status codes. Here&#8217;s an example of the HTTP headers in a 301 response:</p>
<pre>HTTP/1.1 301 Moved Permanently
      Location: http://example.com/newuri
      Content-Type: text/html</pre>
<p>The browser automatically takes the user to the URL specified in the Location field. All the information necessary for a redirect is in the headers. The body of the response is typically empty. Despite their names, neither a 301 nor a 302 response is cached in practice unless additional headers, such as Expires or Cache-Control, indicate it should be. The meta refresh tag and JavaScript are other ways to direct users to a different URL, but if you must do a redirect, the preferred technique is to use the standard 3xx HTTP status codes, primarily to ensure the back button works correctly.</p>
<p>The main thing to remember is that redirects slow down the user experience. Inserting a redirect between the user and the HTML document delays everything in the page since nothing in the page can be rendered and no components can start being downloaded until the HTML document has arrived.<br />
One of the most wasteful redirects happens frequently and web developers are generally not aware of it. It occurs when a trailing slash (/) is missing from a URL that should otherwise have one.</p>
<p>Connecting an old web site to a new one is another common use for redirects. Others include connecting different parts of a website and directing the user based on certain conditions (type of browser, type of user account, etc.). Using a redirect to connect two web sites is simple and requires little additional coding. Although using redirects in these situations reduces the complexity for developers, it degrades the user experience. Alternatives for this use of redirects include using Alias and mod_rewrite if the two code paths are hosted on the same server. If a domain name change is the cause of using redirects, an alternative is to create a CNAME (a DNS record that creates an alias pointing from one domain name to another) in combination with Alias or <tt>mod_rewrite.</tt></p>
<h2>Remove Duplicate Scripts</h2>
<p>It hurts performance to include the same JavaScript file twice in one page. This isn&#8217;t as unusual as you might think. A review of the ten top U.S. web sites shows that two of them contain a duplicated script. Two main factors increase the odds of a script being duplicated in a single web page: team size and number of scripts. When it does happen, duplicate scripts hurt performance by creating unnecessary HTTP requests and wasted JavaScript execution.</p>
<p>Unnecessary HTTP requests happen in Internet Explorer, but not in Firefox. In Internet Explorer, if an external script is included twice and is not cacheable, it generates two HTTP requests during page loading. Even if the script is cacheable, extra HTTP requests occur when the user reloads the page.</p>
<p>In addition to generating wasteful HTTP requests, time is wasted evaluating the script multiple times. This redundant JavaScript execution happens in both Firefox and Internet Explorer, regardless of whether the script is cacheable.</p>
<p>One way to avoid accidentally including the same script twice is to implement a script management module in your templating system. The typical way to include a script is to use the SCRIPT tag in your HTML page.</p>
<p>      <tt><script type="text/javascript" src="menu_1.0.17.js">
// ]]&gt;</script></tt></p>
<p>An alternative in PHP would be to create a function called insertScript.</p>
<p><tt><!--?php insertScript("menu.js") ?--></tt></p>
<p>In addition to preventing the same script from being inserted multiple times, this function could handle other issues with scripts, such as dependency checking and adding version numbers to script filenames to support far future Expires headers.</p>
<h2>Configure ETags</h2>
<p>Entity tags (ETags) are a mechanism that web servers and browsers use to determine whether the component in the browser&#8217;s cache matches the one on the origin server. (An &#8220;entity&#8221; is another word a &#8220;component&#8221;: images, scripts, stylesheets, etc.) ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date. An ETag is a string that uniquely identifies a specific version of a component. The only format constraints are that the string be quoted. The origin server specifies the component&#8217;s ETag using the ETag response header.</p>
<pre>HTTP/1.1 200 OK
      Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
      ETag: "10c24bc-4ab-457e1c1f"
      Content-Length: 12195</pre>
<p>Later, if the browser has to validate a component, it uses the If-None-Match header to pass the ETag back to the origin server. If the ETags match, a 304 status code is returned reducing the response by 12195 bytes for this example.</p>
<pre>GET /i/zachbrowne.gif HTTP/1.1
      Host: us.yimg.com
      If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
      If-None-Match: "10c24bc-4ab-457e1c1f"
      HTTP/1.1 304 Not Modified</pre>
<p>The problem with ETags is that they typically are constructed using attributes that make them unique to a specific server hosting a site. ETags won&#8217;t match when a browser gets the original component from one server and later tries to validate that component on a different server, a situation that is all too common on Web sites that use a cluster of servers to handle requests. By default, both Apache and IIS embed data in the ETag that dramatically reduces the odds of the validity test succeeding on web sites with multiple servers.</p>
<p>The ETag format for Apache 1.3 and 2.x is inode-size-timestamp. Although a given file may reside in the same directory across multiple servers, and have the same file size, permissions, timestamp, etc., its inode is different from one server to the next.</p>
<p>IIS 5.0 and 6.0 have a similar issue with ETags. The format for ETags on IIS is Filetimestamp:ChangeNumber. A ChangeNumber is a counter used to track configuration changes to IIS. It&#8217;s unlikely that the ChangeNumber is the same across all IIS servers behind a web site.</p>
<p>The end result is ETags generated by Apache and IIS for the exact same component won&#8217;t match from one server to another. If the ETags don&#8217;t match, the user doesn&#8217;t receive the small, fast 304 response that ETags were designed for; instead, they&#8217;ll get a normal 200 response along with all the data for the component. If you host your web site on just one server, this isn&#8217;t a problem. But if you have multiple servers hosting your web site, and you&#8217;re using Apache or IIS with the default ETag configuration, your users are getting slower pages, your servers have a higher load, you&#8217;re consuming greater bandwidth, and proxies aren&#8217;t caching your content efficiently. Even if your components have a far future Expires header, a conditional GET request is still made whenever the user hits Reload or Refresh.</p>
<p>If you&#8217;re not taking advantage of the flexible validation model that ETags provide, it&#8217;s better to just remove the ETag altogether. The Last-Modified header validates based on the component&#8217;s timestamp. And removing the ETag reduces the size of the HTTP headers in both the response and subsequent requests. This Microsoft Support article describes how to remove ETags. In Apache, this is done by simply adding the following line to your Apache configuration file:</p>
<p><tt>FileETag none</tt></p>
<h2>Make Ajax Cacheable</h2>
<p>One of the cited benefits of Ajax is that it provides instantaneous feedback to the user because it requests information asynchronously from the backend web server. However, using Ajax is no guarantee that the user won&#8217;t be twiddling his thumbs waiting for those asynchronous JavaScript and XML responses to return. In many applications, whether or not the user is kept waiting depends on how Ajax is used. For example, in a web-based email client the user will be kept waiting for the results of an Ajax request to find all the email messages that match their search criteria. It&#8217;s important to remember that &#8220;asynchronous&#8221; does not imply &#8220;instantaneous&#8221;.</p>
<p>To improve performance, it&#8217;s important to optimize these Ajax responses. The most important way to improve the performance of Ajax is to make the responses cacheable, as discussed in Add an Expires or a Cache-Control Header. Some of the other rules also apply to Ajax:</p>
<pre>Gzip Components
Reduce DNS Lookups
Minify JavaScript
Avoid Redirects
Configure ETags</pre>
<p>Let&#8217;s look at an example. A Web 2.0 email client might use Ajax to download the user&#8217;s address book for autocompletion. If the user hasn&#8217;t modified her address book since the last time she used the email web app, the previous address book response could be read from cache if that Ajax response was made cacheable with a future Expires or Cache-Control header. The browser must be informed when to use a previously cached address book response versus requesting a new one. This could be done by adding a timestamp to the address book Ajax URL indicating the last time the user modified her address book, for example, &amp;t=1190241612. If the address book hasn&#8217;t been modified since the last download, the timestamp will be the same and the address book will be read from the browser&#8217;s cache eliminating an extra HTTP roundtrip. If the user has modified her address book, the timestamp ensures the new URL doesn&#8217;t match the cached response, and the browser will request the updated address book entries.</p>
<p>Even though your Ajax responses are created dynamically, and might only be applicable to a single user, they can still be cached. Doing so will make your Web 2.0 apps faster.</p>
<h2>Flush the Buffer Early</h2>
<p>When users request a page, it can take anywhere from 200 to 500ms for the backend server to stitch together the HTML page. During this time, the browser is idle as it waits for the data to arrive. In PHP you have the function flush(). It allows you to send your partially ready HTML response to the browser so that the browser can start fetching components while your backend is busy with the rest of the HTML page. The benefit is mainly seen on busy backends or light frontends.</p>
<p>A good place to consider flushing is right after the HEAD because the HTML for the head is usually easier to produce and it allows you to include any CSS and JavaScript files for the browser to start fetching in parallel while the backend is still processing.</p>
<p><strong>Example:</strong></p>
<pre>... <!-- css, js -->

    <!--?php flush(); ?-->

      ... <!-- content --></pre>
<h2>Use GET for AJAX Requests</h2>
<p>When using XMLHttpRequest, POST is implemented in the browsers as a two-step process: sending the headers first, then sending data. So it&#8217;s best to use GET, which only takes one TCP packet to send (unless you have a lot of cookies). The maximum URL length in IE is 2K, so if you send more than 2K data you might not be able to use GET.</p>
<p>An interesting side affect is that POST without actually posting any data behaves like GET. Based on the HTTP specs, GET is meant for retrieving information, so it makes sense (semantically) to use GET when you&#8217;re only requesting data, as opposed to sending data to be stored server-side.</p>
<h2>Post-load Components</h2>
<p>You can take a closer look at your page and ask yourself: &#8220;What&#8217;s absolutely required in order to render the page initially?&#8221;. The rest of the content and components can wait.</p>
<p>JavaScript is an ideal candidate for splitting before and after the onload event. For example if you have JavaScript code and libraries that do drag and drop and animations, those can wait, because dragging elements on the page comes after the initial rendering. Other places to look for candidates for post-loading include hidden content (content that appears after a user action) and images below the fold.</p>
<p>Tools to help you out in your effort: YUI Image Loader allows you to delay images below the fold and the YUI Get utility is an easy way to include JS and CSS on the fly. For an example in the wild take a look at zachbrowne! Home Page with Firebug&#8217;s Net Panel turned on.</p>
<p>It&#8217;s good when the performance goals are inline with other web development best practices. In this case, the idea of progressive enhancement tells us that JavaScript, when supported, can improve the user experience but you have to make sure the page works even without JavaScript. So after you&#8217;ve made sure the page works fine, you can enhance it with some post-loaded scripts that give you more bells and whistles such as drag and drop and animations.</p>
<h2>Preload Components</h2>
<p>Preload may look like the opposite of post-load, but it actually has a different goal. By preloading components you can take advantage of the time the browser is idle and request components (like images, styles and scripts) you&#8217;ll need in the future. This way when the user visits the next page, you could have most of the components already in the cache and your page will load much faster for the user.<br />
There are actually several types of preloading:</p>
<p>Unconditional preload &#8211; as soon as onload fires, you go ahead and fetch some extra components. Check google.com for an example of how a sprite image is requested onload. This sprite image is not needed on the google.com homepage, but it is needed on the consecutive search result page.</p>
<p>Conditional preload &#8211; based on a user action you make an educated guess where the user is headed next and preload accordingly. On search.zachbrowne.com you can see how some extra components are requested after you start typing in the input box.</p>
<p>Anticipated preload &#8211; preload in advance before launching a redesign. It often happens after a redesign that you hear: &#8220;The new site is cool, but it&#8217;s slower than before&#8221;. Part of the problem could be that the users were visiting your old site with a full cache, but the new one is always an empty cache experience. You can mitigate this side effect by preloading some components before you even launched the redesign. Your old site can use the time the browser is idle and request images and scripts that will be used by the new site.</p>
<h2>Reduce the Number of DOM Elements</h2>
<p>A complex page means more bytes to download and it also means slower DOM access in JavaScript. It makes a difference if you loop through 500 or 5000 DOM elements on the page when you want to add an event handler for example.</p>
<p>A high number of DOM elements can be a symptom that there&#8217;s something that should be improved with the markup of the page without necessarily removing content. Are you using nested tables for layout purposes? Are you throwing in more &lt; div &gt;s only to fix layout issues? Maybe there&#8217;s a better and more semantically correct way to do your markup.</p>
<p>A great help with layouts are the YUI CSS utilities: grids.css can help you with the overall layout, fonts.css and reset.css can help you strip away the browser&#8217;s defaults formatting. This is a chance to start fresh and think about your markup, for example use</p>
<div>
<p>s only when it makes sense semantically, and not because it renders a new line.</p>
<p>The number of DOM elements is easy to test, just type in Firebug&#8217;s console:</p>
<p><tt>document.getElementsByTagName('*').length</tt></p>
<p>And how many DOM elements are too many? Check other similar pages that have good markup. For example the zachbrowne.com Home Page is a pretty busy page and still under 700 elements (HTML tags).</p>
<h2>Split Components Across Domains</h2>
<p>Splitting components allows you to maximize parallel downloads. Make sure you&#8217;re using not more than 2-4 domains because of the DNS lookup penalty. For example, you can host your HTML and dynamic content on www.example.org and split static components between static1.example.org and static2.example.org.</p>
<h2>Minimize the Number of iframes</h2>
<p>Iframes allow an HTML document to be inserted in the parent document. It&#8217;s important to understand how iframes work so they can be used effectively.<br />
<tt>&lt; i frame &gt;</tt> pros:</p>
<ul>
<li>Helps with slow third-party content like badges and ads</li>
<li>Security sandbox</li>
<li>Download scripts in parallel</li>
<li><tt>&lt; i frame &gt;</tt> cons:</li>
<li>Costly even if blank</li>
<li>Blocks page onload</li>
<li>Non-semantic</li>
</ul>
<h2>No 404s</h2>
<p>HTTP requests are expensive so making an HTTP request and getting a useless response (i.e. 404 Not Found) is totally unnecessary and will slow down the user experience without any benefit.</p>
<p>Some sites have helpful 404s &#8220;Did you mean X?&#8221;, which is great for the user experience but also wastes server resources (like database, etc). Particularly bad is when the link to an external JavaScript is wrong and the result is a 404. First, this download will block parallel downloads. Next the browser may try to parse the 404 response body as if it were JavaScript code, trying to find something usable in it.</p>
<h2>Reduce Cookie Size</h2>
<p>HTTP cookies are used for a variety of reasons such as authentication and personalization. Information about cookies is exchanged in the HTTP headers between web servers and browsers. It&#8217;s important to keep the size of cookies as low as possible to minimize the impact on the user&#8217;s response time.</p>
<h2>Eliminate unnecessary cookies</h2>
<p>Keep cookie sizes as low as possible to minimize the impact on the user response time<br />
Be mindful of setting cookies at the appropriate domain level so other sub-domains are not affected<br />
Set an Expires date appropriately. An earlier Expires date or none removes the cookie sooner, improving the user response time</p>
<h2>Use Cookie-free Domains for Components</h2>
<p>When the browser makes a request for a static image and sends cookies together with the request, the server doesn&#8217;t have any use for those cookies. So they only create network traffic for no good reason. You should make sure static components are requested with cookie-free requests. Create a subdomain and host all your static components there.</p>
<p>If your domain is www.example.org, you can host your static components on static.example.org. However, if you&#8217;ve already set cookies on the top-level domain example.org as opposed to www.example.org, then all the requests to static.example.org will include those cookies. In this case, you can buy a whole new domain, host your static components there, and keep this domain cookie-free. Yahoo! uses yimg.com, YouTube uses ytimg.com, Amazon uses images-amazon.com and so on.</p>
<p>Another benefit of hosting static components on a cookie-free domain is that some proxies might refuse to cache the components that are requested with cookies. On a related note, if you wonder if you should use example.org or www.example.org for your home page, consider the cookie impact. Omitting www leaves you no choice but to write cookies to *.example.org, so for performance reasons it&#8217;s best to use the www subdomain and write the cookies to that subdomain.</p>
<h2>Minimize DOM Access</h2>
<ul>
<li>Accessing DOM elements with JavaScript is slow so in order to have a more responsive page, you should:</li>
<li>Cache references to accessed elements</li>
<li>Update nodes &#8220;offline&#8221; and then add them to the tree</li>
<li>Avoid fixing layout with JavaScript</li>
</ul>
<h2>Develop Smart Event Handlers</h2>
<p>Sometimes pages feel less responsive because of too many event handlers attached to different elements of the DOM tree which are then executed too often. That&#8217;s why using event delegation is a good approach. If you have 10 buttons inside a div, attach only one event handler to the div wrapper, instead of one handler for each button. Events bubble up so you&#8217;ll be able to catch the event and figure out which button it originated from.</p>
<p>You also don&#8217;t need to wait for the onload event in order to start doing something with the DOM tree. Often all you need is the element you want to access to be available in the tree. You don&#8217;t have to wait for all images to be downloaded. DOMContentLoaded is the event you might consider using instead of onload, but until it&#8217;s available in all browsers, you can use the YUI Event utility, which has an onAvailable method.</p>
<p><tt>Choose  over @import</tt></p>
<p>One of the previous best practices states that CSS should be at the top in order to allow for progressive rendering.<br />
In IE @import behaves the same as using  at the bottom of the page, so it&#8217;s best not to use it.</p>
<h2>Avoid Filters</h2>
<p>The IE-proprietary AlphaImageLoader filter aims to fix a problem with semi-transparent true color PNGs in IE versions &lt; 7. The problem with this filter is that it blocks rendering and freezes the browser while the image is being downloaded. It also increases memory consumption and is applied per element, not per image, so the problem is multiplied.<br />
The best approach is to avoid AlphaImageLoader completely and use gracefully degrading PNG8 instead, which are fine in IE. If you absolutely need AlphaImageLoader, use the underscore hack _filter as to not penalize your IE7+ users.</p>
<h2>Optimize Images</h2>
<p>After a designer is done with creating the images for your web page, there are still some things you can try before you FTP those images to your web server.</p>
<p>You can check the GIFs and see if they are using a palette size corresponding to the number of colors in the image. Using imagemagick it&#8217;s easy to check using</p>
<p><tt>identify -verbose image.gif</tt></p>
<p>When you see an image using 4 colors and a 256 color &#8220;slots&#8221; in the palette, there is room for improvement.</p>
<p>Try converting GIFs to PNGs and see if there is a saving. More often than not, there is. Developers often hesitate to use PNGs due to the limited support in browsers, but this is now a thing of the past. The only real problem is alpha-transparency in true color PNGs, but then again, GIFs are not true color and don&#8217;t support variable transparency either. So anything a GIF can do, a palette PNG (PNG8) can do too (except for animations). This simple imagemagick command results in totally safe-to-use PNGs:</p>
<p><tt>convert image.gif image.png</tt></p>
<p>&#8220;All we are saying is: Give PiNG a Chance!&#8221;</p>
<p>Run pngcrush (or any other PNG optimizer tool) on all your PNGs. Example:</p>
<p><tt>pngcrush image.png -rem alla -reduce -brute result.png</tt></p>
<p>Run jpegtran on all your JPEGs. This tool does lossless JPEG operations such as rotation and can also be used to optimize and remove comments and other useless information (such as EXIF information) from your images.</p>
<p><tt>jpegtran -copy none -optimize -perfect src.jpg dest.jpg</tt></p>
<h2>Optimize CSS Sprites</h2>
<p>Arranging the images in the sprite horizontally as opposed to vertically usually results in a smaller file size.</p>
<p>Combining similar colors in a sprite helps you keep the color count low, ideally under 256 colors so to fit in a PNG8.</p>
<p>&#8220;Be mobile-friendly&#8221; and don&#8217;t leave big gaps between the images in a sprite. This doesn&#8217;t affect the file size as much but requires less memory for the user agent to decompress the image into a pixel map. 100&#215;100 image is 10 thousand pixels, where 1000&#215;1000 is 1 million pixels</p>
<h2>Don&#8217;t Scale Images in HTML</h2>
<p>Don&#8217;t use a bigger image than you need just because you can set the width and height in HTML. If you need</p>
<p><tt><img src="myhumps.jpg" alt="My Lovely Lady Bumps" width="50" height="50" /></tt></p>
<p>then your image (myhumps.jpg) should be 50x50px rather than a scaled down 500x500px image.</p>
<h2>Make favicon.ico Small and Cacheable</h2>
<p>The favicon.ico is an image that stays in the root of your server. It&#8217;s a necessary evil because even if you don&#8217;t care about it the browser will still request it, so it&#8217;s better not to respond with a 404 Not Found. Also since it&#8217;s on the same server, cookies are sent every time it&#8217;s requested. This image also interferes with the download sequence, for example in IE when you request extra components in the onload, the favicon will be downloaded before these extra components.</p>
<p>So to mitigate the drawbacks of having a favicon.ico make sure:</p>
<p>It&#8217;s small, preferably under 1K.</p>
<p>Set Expires header with what you feel comfortable (since you cannot rename it if you decide to change it). You can probably safely set the Expires header a few months in the future. You can check the last modified date of your current favicon.ico to make an informed decision.</p>
<p>Imagemagick can help you create small favicons</p>
<h2>Keep Components under 25K</h2>
<p>This restriction is related to the fact that iPhone won&#8217;t cache components bigger than 25K. Note that this is the uncompressed size. This is where minification is important because gzip alone may not be sufficient.</p>
<p>For more information check &#8220;Performance Research, Part 5: iPhone Cacheability &#8211; Making it Stick&#8221; by Wayne Shea and Tenni Theurer.</p>
<h2>Pack Components into a Multipart Document</h2>
<p>Packing components into a multipart document is like an email with attachments, it helps you fetch several components with one HTTP request (remember: HTTP requests are expensive). When you use this technique, first check if the user agent supports it (iPhone does not).</p>
<h2>Avoid Empty Image src</h2>
<p>Image with empty string src attribute occurs more than one will expect. It appears in two form:</p>
<p><strong>straight HTML:</strong><br />
<tt><img alt="" /></tt></p>
<p><strong>JavaScript:</strong></p>
<pre>var img = new Image();
img.src = "";</pre>
<ul>
<li>Both forms cause the same effect: browser makes another request to your server.</li>
<li>Internet Explorer makes a request to the directory in which the page is located.</li>
<li>Safari and Chrome make a request to the actual page itself.</li>
<li>Firefox 3 and earlier versions behave the same as Safari and Chrome, but version 3.5 addressed this issue[bug 444931] and no longer sends a request.</li>
<li>Opera does not do anything when an empty image src is encountered.</li>
</ul>
<p><strong>Why is this behavior bad? </strong></p>
<p>Cripple your servers by sending a large amount of unexpected traffic, especially for pages that get millions of page views per day.<br />
Waste server computing cycles generating a page that will never be viewed.</p>
<p>Possibly corrupt user data. If you are tracking state in the request, either by cookies or in another way, you have the possibility of destroying data. Even though the image request does not return an image, all of the headers are read and accepted by the browser, including all cookies. While the rest of the response is thrown away, the damage may already be done.</p>
<p>The root cause of this behavior is the way that URI resolution is performed in browsers. This behavior is defined in RFC 3986 &#8211; Uniform Resource Identifiers. When an empty string is encountered as a URI, it is considered a relative URI and is resolved according to the algorithm defined in section 5.2. This specific example, an empty string, is listed in section 5.4. Firefox, Safari, and Chrome are all resolving an empty string correctly per the specification, while Internet Explorer is resolving it incorrectly, apparently in line with an earlier version of the specification, RFC 2396 &#8211; Uniform Resource Identifiers (this was obsoleted by RFC 3986). So technically, the browsers are doing what they are supposed to do to resolve relative URIs. The problem is that in this context, the empty string is clearly unintentional.</p>
<p>HTML5 adds to the description of the  tag&#8217;s src attribute to instruct browsers not to make an additional request in section 4.8.2:<br />
The src attribute must be present, and must contain a valid URL referencing a non-interactive, optionally animated, image resource that is neither paged nor scripted. If the base URI of the element is the same as the document&#8217;s address, then the src attribute&#8217;s value must not be the empty string.<br />
Hopefully, browsers will not have this problem in the future. Unfortunately, there is no such clause for <tt><script type="text/javascript">// < ![CDATA[
</tt> and <tt>	</tt></script></tt></p>
<link href="" _mce_href=""></link>. Maybe there is still time to make that adjustment to ensure browsers don&#8217;t accidentally implement this behavior.
<p>Thanks to <a rel="nofollow" href="http://developer.yahoo.com/performance/rules.html" _mce_rel="nofollow" href="http://developer.yahoo.com/performance/rules.html">Yahoo!</a> for making this possible for my readers.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6114-thorough-list-of-factors-that-help-speed-up-your-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Measuring Front End Website Performance</title>
		<link>http://zachbrowne.com/6065-measuring-front-end-website-performance/</link>
		<comments>http://zachbrowne.com/6065-measuring-front-end-website-performance/#comments</comments>
		<pubDate>Thu, 19 May 2011 05:15:03 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[example internet explorer]]></category>
		<category><![CDATA[hidden bits]]></category>
		<category><![CDATA[impatient users]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[page element]]></category>
		<category><![CDATA[pleasing website]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/2011/measuring-front-end-website-performance/</guid>
		<description><![CDATA[Speaking of optimization process is almost nonexistent among new age web designers. Even many web designers who have been in business a decade or longer do not fully understand the importance of site optimization. After a prolonged period of time a website will begin to bog down. The frontend files may contain exaggerated blocks of...]]></description>
			<content:encoded><![CDATA[<p></p><p><span class="drop_cap">S</span>peaking of optimization process is almost nonexistent among new age web designers. Even many web designers who have been in business a decade or longer do not fully understand the importance of site optimization.</p>
<p>After a prolonged period of time a website will begin to bog down. The frontend files may contain exaggerated blocks of code or locked, hidden bits. This is most commonly seen happening within JavaScript files or images. It may be important to create a pleasing website for the user experience but without an optimized website the design may not even have the chance to fully load on impatient users.</p>
<p>The tips below are for beginner-intermediate web developers interested in <strong>optimizing their pages</strong> to the fullest. There are many techniques available and each one will behave differently depending on what issues your website is suffering from. Try skimming a few areas and see if you can apply these techniques into your own marks.</p>
<h3>HTTP Requests</h3>
<p>Each time your website loads it sends an HTTP request to a remote server. This type of data transfer is called a <strong>network protocol</strong> used specifically for distributing and storing plaintext files. These often include your basic frontend code such as HTML, CSS, and JavaScript.</p>
<p>Once the request is sent your browser will parse each page element. Depending on the parsing engine each website will load differently and elements will appear in varying order based on transfer speeds. For example, Internet Explorer will render web pages different than Chrome or Safari, and all of these run slightly different parsing engines than Firefox or Opera.</p>
<p>What has to be considered is how long the request time is for each file takes and if this trend holds consistently. Consider receiving upwards of 100k or 1 million visitors in a month. It is the browser&#8217;s job to piece together each page element and load external files into memory.</p>
<p>Often the factors holding down a website&#8217;s optimized speed reference clunky JavaScript includes or large image files. With the popularization of Verizon FiOS it&#8217;s common for Internet speeds to hit 600kbps and keep climbing! Unfortunately this isn&#8217;t the norm and even with high-speed connections it&#8217;s possible to experience optimization faults.</p>
<h3>Remedies to Site Performance</h3>
<p>We are not alone in the field of web development and frontend optimization. For proper work to be completed there are certain tools required to handle the job.</p>
<p>Google has released a project titled <a href="http://code.google.com/speed/page-speed/" rel="nofollow">Page Speed</a> which was built to help developers optimize their websites and check for the best levels of performance. Originally the project started as an open-source Firebug add-on and is now accepted as a 3rd party reference for <a href="http://www.webpagetest.org/" rel="nofollow">website testing</a>.</p>
<p>Another option for Firebug users is <a href="http://developer.yahoo.com/yslow/" rel="nofollow">Yahoo!’s YSlow add-on</a>. The script analyzes each web page request and suggests the most common ways to improve performance. These suggestions are based on the Yahoo! Developers resource for <a href="http://developer.yahoo.com/performance/rules.html" rel="nofollow">best optimization practices</a> in web design.</p>
<p>The program may be a little abrasive at first since it contains so much information. Just stick to the basics and by following simple documentation the process should be a piece of cake.</p>
<p>Developers are always interested in jumping onto a project to break down code so this should be a no brainer. For a little help you could check out the <a href="http://developer.yahoo.com/yslow/help/" rel="nofollow">YSlow help guide</a>.</p>
<h3>Speed Techniques</h3>
<p>There are some simple tricks which you can apply to your website immediately to speed up performance. The first and easiest way is to separate your CSS and JavaScript files.</p>
<p>CSS code belongs in the header of your document. This is useful because CSS properties need to be parsed while the DOM is loading. Once a web browser recognizes your CSS styles in the heading it will wait to fully display the web page until all styles have been loaded. Also any images used for icons or background designs will take time to load and should do so first.</p>
<p>On the flip side moving all JavaScript files into your site footer may dramatically solve hangup times. Many browsers block parallel downloads which means before rendering the page a user’s web browser may stop for 4 seconds to fully load external JS includes.</p>
<p>This isn’t always possible nor is it always necessary for every website. If your pages load the same with equal response times regardless of include file placements then don’t bother maneuvering any plays.</p>
<p>Dynamic content is unable to load until the entire DOM is completed, but sometimes this will return errors. Test out CSS/JS includes to see if you can return any optimization benefits.</p>
<h3>File Size Compression</h3>
<p>Compressing large files has become very popular. It can now even be utilized in web pages to reduce load times and keep file sizes very low. Much of the work has already been done and with tools like <a href="http://developer.yahoo.com/yui/compressor/" rel="nofollow">YUI Compressor</a> mini-sized files are a no-energy process.</p>
<p>There are plenty of other free services on the web to help with this task as well. <strong>Minify CSS</strong> has an entire <a href="http://www.minifycss.com/css-compressor/" rel="nofollow">CSS compression interface</a> to make the process simple. The same website also has a custom <a href="http://www.minifyjs.com/javascript-compressor/" rel="nofollow">JavaScript compressor</a> which performs much of the same tasks but keeps the scripting organized.</p>
<p>You may also consider compressing the largest images in your web pages. This can be done with any photo editing software such as Adobe Photoshop or GIMP by simply resampling the image at a lower resolution. PNG images will export much smaller on average than jpg or TIFF formats. There are also plenty of online tools such as <a href="http://www.imageoptimizer.net/Pages/Home.aspx" rel="nofollow">Image Optimizer</a> to aid in the compression process.</p>
<h3>Source Checking and Metrics</h3>
<p>This is a routine not often practiced by web developers which can offer amazing results. By analyzing all of the page elements in your website you can see which took the longest to load and the order in which each piece was loaded.</p>
<p>The most popular tool <a href="https://addons.mozilla.org/en-US/firefox/addon/1843/" rel="nofollow">Mozilla Firebug</a> is a plug-in for the Firefox browser. This app installs a small toolbar at the bottom of your browser to check response times, header information, page elements, and scripts for each website. The script has also been ported into <a href="http://getfirebug.com/releases/lite/chrome/" rel="nofollow">Firebug Lite</a> as an extension for Google Chrome.</p>
<h3>Apache with mod_pagespeed</h3>
<p>Not all setups will be running an Apache web server, so this option isn’t always available. This module is directly related to <strong>Google’s Page Speed monitor</strong> mentioned earlier. In fact, the code for mod_pagespeed was originally based off many libraries from Google Code’s databases.</p>
<p>Apache allows server administrators to install small packages called modules to enhance the performance of their servers. <strong>mod_pagespeed</strong> is one of these modules which performs optimization techniques automatically at runtime. There are too many processes to list, although some of the main applications include on-the-fly HTML/CSS/JS compression and image caching.</p>
<p>The project is currently <a href="http://code.google.com/speed/page-speed/download.html" rel="nofollow">hosted at Google</a> and is open to developers. Google has been working with GoDaddy to implement mod_pagespeed into all hosting accounts running Apache HTTP server.</p>
<p>Although many other options are available frontend development work is some of the most intense, especially considering pre-optimization for crucial web pages. Optimizing for site headers and large images can be an extremely tedious yet rewarding task.</p>
<p>Consider some of the techniques introduced in this article and see how these could be applied into your web projects. Often developers do not take enough time to appreciate their work and clean out old bits of code.</p>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6065-measuring-front-end-website-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Website Performance Optimization Best Practices</title>
		<link>http://zachbrowne.com/6062-website-performance-optimization-best-practices/</link>
		<comments>http://zachbrowne.com/6062-website-performance-optimization-best-practices/#comments</comments>
		<pubDate>Thu, 19 May 2011 05:09:05 +0000</pubDate>
		<dc:creator>zachbrowne</dc:creator>
				<category><![CDATA[Hosting]]></category>
		<category><![CDATA[carpool lane]]></category>
		<category><![CDATA[cascading style sheets]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript images]]></category>
		<category><![CDATA[Online]]></category>
		<category><![CDATA[performance optimization]]></category>
		<category><![CDATA[web optimization]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://zachbrowne.com/2011/website-performance-optimization-best-practices/</guid>
		<description><![CDATA[Web optimization is a vital part of web development and maintenance but also something often overlooked by webmasters. Just think of the money you can save, and how it can potentially help increase your readership and traffic when they are properly done. If you have not done any optimization to your website (or blog) so...]]></description>
			<content:encoded><![CDATA[<p></p><p><span class="drop_cap">W</span>eb optimization is a vital part of web development and maintenance but also something often overlooked by webmasters. Just think of the money you can save, and how it can potentially help increase your readership and traffic when they are properly done.</p>
<p><img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/web-optimization.jpg" alt="web optimization Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" /></p>
<p>If you have not done any optimization to your website (or blog) so far or merely curious how it can help speed up your site, please take a look at this list of optimization tips we’ve put together.</p>
<p>We’ve split things up into 3 separate sections for better readability – respectively <em><strong>server-side optimization</strong></em>, <em><strong>assets optimization</strong></em> (which includes web components like CSS, Javascript, images, etc) and <em><strong>platform</strong></em>, where we’ll focus on <em>WordPress optimization</em>. At the last section, we throw in a couple of links we figured useful. Full list after jump.</p>
<p>&nbsp;</p>
<h3>Optimization: Server-side</h3>
<ol>
<li>
<h4>Choose a decent Web Host</h4>
<p>Your web hosting account has no direct relationship with the optimizations you are about to perform but we figured choosing the right web hosting account so important we decided to bring it to your attention first. <a onmouseover="self.status='http://www.hongkiat.com/blog/out/dreamhost';return true;" onmouseout="self.status=''" href="http://www.hongkiat.com/blog/out/dreamhost" rel="nofollow" target="_blank">Hosting</a> account is the foundation of your website/blog where it’s security, accessibility (cPanel, FTP, SSH), server stability, prices and customer supports all play important roles. You need to make sure you are in good hands.</p>
<p><strong>Recommended reading:<br />
<a rel="nofollow" href="http://www.wikihow.com/Choose-a-Web-Host">How to Choose a Web Host</a></strong> by <strong>wikiHow</strong> is a great article that gives you steps and tips you should know before purchasing any web hosting account.</li>
<li>
<h4>Host Assets Separately</h4>
<p>When we mention assets, we meant web components like <strong>images</strong> and <strong>static scripts</strong> that don’t require server-side processing. These includes any web graphics, images, Javascripts, Cascading Style Sheets (CSS), etc. Hosting assets separately is not a must, but we’ve seen tremendous result in terms of server stability with this implementation when the blog was having a traffic spike.</p>
<p><strong>Recommended reading</strong>: <strong><br />
<a rel="nofollow" href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/">Maximizing Parallel Downloads in the Carpool Lane.</a></strong></li>
<li>
<h4>Compression with GZip</h4>
<p>In short, contents travel from server side to client side (vicet versa) whenever a HTTP request is make. Compressing the content for sending greatly reduce the time needed to process each request.</p>
<p><strong><a rel="nofollow" href="http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/">GZip</a></strong> is one of the best ways to do this and it various according to the type of servers you are using. For instance, <strong>Apache 1.3</strong> uses <a rel="nofollow" href="http://sourceforge.net/projects/mod-gzip/">mod_zip</a>, <strong>Apache 2.x</strong> uses <a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a> and <a rel="nofollow" href="http://forum.slicehost.com/comments.php?DiscussionID=1861">here</a>‘s how you do it in <strong>Nginx</strong>. Here are some really good articles to get you familiar with server side compressions:</p>
<ul>
<li><a rel="nofollow" href="http://nadeausoftware.com/node/33"><strong>Speed up a web site by enabling Apache file compression</strong></a></li>
<li><a rel="nofollow" href="http://www.sitepoint.com/article/web-output-mod_gzip-apache/"><strong>Compress Web Output Using mod_gzip and Apache</strong></a></li>
<li><a rel="nofollow" href="http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/"><strong>How To Optimize Your Site With GZIP Compression</strong></a></li>
<li><a rel="nofollow" href="http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=4&amp;txtCodeId=6182"><strong>Server-side compression for ASP</strong></a></li>
</ul>
</li>
<li>
<h4>Minimize Redirects</h4>
<p>Webmasters do URL redirect (whether it’s Javascript or META redirects) all the time. Sometimes it’s purpose is to point users from an old page to new, or merely guide users to the correct page. Each redirect create an additional HTTP request and <a rel="nofollow" href="http://searchnetworking.techtarget.com/sDefinition/0,,sid7_gci1250602,00.html">RTT</a> (round-trip-time). The more redirection you have, the slower user will get to the destination page.</p>
<p><strong>Recommended reading</strong>: <a rel="nofollow" href="http://code.google.com/speed/page-speed/docs/rtt.html#AvoidRedirects"><br />
<strong>Avoid Redirects</strong></a> by Google Code gives you a good overview on the matter. The article also recommends some practical ways to minimize redirection to increase serving speed.</li>
<li>
<h4>Reduce DNS Lookups</h4>
<p>According to <strong>Yahoo! Developer Network Blog</strong>, it takes about 20-120 milliseconds for DNS (Domain Name System) to resolve IP address for a given hostname or domain name and the browser cannot do anything until the process is properly completed.</p>
<p>Author <em>Steve Souders</em> suggested that splitting these components across at least two but no more than four hostnames reduces DNS lookups and allow high degree parallel downloads. <a rel="nofollow" href="http://developer.yahoo.net/blog/archives/2007/07/high_performanc_7.html"><strong>Read more</strong></a> on the article.</li>
</ol>
<h3>Optimization: The Assets (CSS, Javascripts, Images)</h3>
<ol>
<li>
<h4>Merge Multiple Javascripts into One</h4>
<p>Folks at <strong>rakaz.nl</strong> shares how you can combine multiple Javascripts like:</p>
<pre class="html">

http://www.creatype.nl/javascript/prototype.js

http://www.creatype.nl/javascript/builder.js

http://www.creatype.nl/javascript/effects.js

http://www.creatype.nl/javascript/dragdrop.js

http://www.creatype.nl/javascript/slider.js</pre>
<p>Into a single file by changing the URL to:</p>
<pre class="html">http://www.creatype.nl/javascript/prototype.js,builder.js,effects.js,dragdrop.js,slider.js</pre>
<p>by manipulating the .htaccess and using PHP. <a rel="nofollow" href="http://rakaz.nl/2006/12/make-your-pages-load-faster-by-combining-and-compressing-javascript-and-css-files.html"><strong>Click here</strong></a> to read more.</li>
<li>
<h4>Compress Javascript &amp; CSS</h4>
<p><strong><a rel="nofollow" href="http://code.google.com/p/minify/">Minify</a></strong> is a PHP5 app that can combine multiple CSS and Javascript files, compress their contents (i.e. removal of unnecessary whitespace/comments), and serve the results with HTTP encoding (gzip/deflate) and headers that allow optimal client-side caching.</p>
<p><img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/minify.png" alt="minify Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" width="447" height="139" /></p>
<p><strong>Compress them online!</strong><br />
<img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/css-compress.jpg" alt="css compress Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" /><br />
There are also some web services that allow you to manually compress your Javascripts and CSS files online. Here are few we come to know:</p>
<ul>
<li><a rel="nofollow" href="http://compressor.ebiene.de/"><strong>compressor.ebiene</strong></a> (<em>Javascript</em>, <em>CSS</em>)</li>
<li><a rel="nofollow" href="http://javascriptcompressor.com/"><strong>javascriptcompressor.com</strong></a> (<em>Javascript</em>)</li>
<li><a rel="nofollow" href="http://jscompress.com/"><strong>jscompress.com</strong></a> (<em>Javascript</em>)</li>
<li><a rel="nofollow" href="http://www.cleancss.com/"><strong>CleanCSS</strong></a> (<em>CSS</em>)</li>
<li><a rel="nofollow" href="http://www.cssoptimiser.com/"><strong>CSS Optimizer</strong></a> (<em>CSS</em>)</li>
</ul>
</li>
<li>
<h4>Customize Header Expiry/Caching</h4>
<p><img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/header-expiry.jpg" alt="header expiry Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" /><br />
<span class="via">Credit: <a rel="nofollow" href="http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/">httpwatch</a></span></p>
<p>By using a customized Expiry header, your web components like images, static files, CSS, Javascript skipped unnecessary HTTP request when the same user reload the page for the second time. It reduces the bandwidth needed and definetely help in serving the page faster.</p>
<p><strong>Recommended readings:</strong></p>
<ul>
<li><a rel="nofollow" href="http://developer.yahoo.net/blog/archives/2007/05/high_performanc_2.html"><strong>Yahoo! Developer Network Blog – Add an Expires Header</strong></a></li>
<li><a rel="nofollow" href="http://jeremy.zawodny.com/blog/archives/009272.html"><strong>How To Add Good Expires Headers to Images in Apache 1.3</strong></a></li>
<li><a rel="nofollow" href="http://www.peej.co.uk/articles/http-caching.html"><strong>HTTP Caching</strong></a></li>
<li><a rel="nofollow" href="http://www.mnot.net/cache_docs/"><strong>Caching Tutorial for Web Authors and Webmasters</strong></a></li>
</ul>
</li>
<li>
<h4>Off-load The Assets</h4>
<p>By off-loading, we mean separating the Javascripts, images, CSS and static files from main server where the website is hosted and place them on another server or rely on other web services. We’ve seen significant improvement here in <strong>Hongkiat</strong> by off-loading assets to other web services available, leaving the server to mainly do the PHP processing. Here are some suggestions of online services for off-loading:</p>
<ul>
<li><strong>Images</strong>: <a rel="nofollow" href="http://www.flickr.com/">Flickr</a>, <a rel="nofollow" href="http://www.smugmug.com/">Smugmug</a>, Paid hostings*</li>
<li><strong>Javascripts</strong>: <a rel="nofollow" href="http://code.google.com/apis/ajaxlibs/">Google Ajax Library</a>, <a rel="nofollow" href="http://code.google.com/appengine/">Google App Engine</a>, Paid hostings*</li>
<li><strong>Web Form</strong>s: <a rel="nofollow" href="http://wufoo.com/">WuFoo</a>, <a rel="nofollow" href="http://www.formspring.com/">FormSpring</a></li>
<li><strong>RSS</strong>: <a rel="nofollow" href="http://feedburner.google.com/">Google Feedburner</a></li>
<li><strong>Survey and Polls</strong>: <a rel="nofollow" href="http://www.surveymonkey.com/">SurveyMonkey</a>, <a rel="nofollow" href="http://polldaddy.com/">PollDaddy</a></li>
</ul>
<p class="via"><strong>*Paid hostings</strong> – Paid services always have better reliability and stability. If your website is constantly requesting for the assets, you’ll need to make sure they are in good hands. We recommend <a rel="nofollow" href="http://aws.amazon.com/s3/">Amazon S3</a> and <a rel="nofollow" href="http://aws.amazon.com/cloudfront/">Cloud Front</a>.</p>
</li>
<li>
<h4>Handling Web Images</h4>
<p>Images are important part of your website. However if they are not properly optimize, they can become a burden and end up utilizing unpredictably large amount of bandwidths on daily basis. Here are some <strong>best practices to optimize your images</strong>:</p>
<ul>
<li><a rel="nofollow" href="http://www.smashingmagazine.com/2009/07/15/clever-png-optimization-techniques/"><strong>Optimize PNG Images</strong></a><br />
Folks at Smashing Magazine describes some clever techniques that may help you optimize your PNG-images.</li>
<li><strong><a rel="nofollow" href="http://inobscuro.com/tutorials/read/35/">Optimizing for Web</a></strong><a rel="nofollow" href="http://inobscuro.com/tutorials/read/35/"> – Things you need to know (the formats)</a><br />
Learn more about Jpeg, GIF, PNG and how you should save your images for web.</li>
<li><strong>Don’t Scale Images</strong><br />
Always practice inserting the <code>width</code> and <code>height</code> for each images. Also don’t scale down an image just because you need a smaller version on the web. <strong>For example</strong>: Do not force scale a 200×200 px image to 50×50 px for your website by altering the <code>width</code> and <code>height</code>. Get a 50×50 px instead.</li>
</ul>
<p><strong>Optimizing with Web Services and Tools</strong>. Good news is, you don’t need to be a Photoshop expert to optimize your images. There are plenty of web services and tools to help you do the job.</p>
<ul>
<li><strong><a rel="nofollow" href="http://developer.yahoo.com/yslow/smushit/">Smush.it</a></strong><br />
<img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/smushit.jpg" alt="smushit Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" /><br />
Probably one of the most efficient online tool to optimize images. There’s even a <a rel="nofollow" href="http://wordpress.org/extend/plugins/wp-smushit/">WordPress plugin</a> for it!</li>
<li><a rel="nofollow" href="http://www.steelbytes.com/?mid=30"><strong>JPEG &amp; PNG Stripper</strong></a><br />
A Windows tool for stripping/cleaning/removing unnecessary metadata (junk) from JPG/JPEG/JFIF &amp; PNG files.</li>
<li><strong><a rel="nofollow" href="http://tools.dynamicdrive.com/imageoptimizer/">Online Image Optimizer</a></strong><br />
Lets you easily optimize your gifs, animated gifs, jpgs, and pngs, so they load as fast as possible on your site, by Dynamic Drive</li>
<li><strong><a rel="nofollow" href="http://www.boxtopsoft.com/supergif.html">SuperGIF</a></strong><br />
Effortlessly make all your GIF images and animations smaller.</li>
<li><strong><a rel="nofollow" href="http://sixrevisions.com/tools/8-excellent-tools-for-optimizing-your-images/">Here’s more.</a></strong></li>
</ul>
</li>
<li>
<h4>Handling CSSh4&gt;</h4>
<p>Modern websites uses CSS as the foundation of the style, as well as the look and feel. Not only CSS gives great flexibility to changes, it is also lesser in terms of codes needed. However, if they are badly coded, it could be a backfire. Here are some checklists, or rather guides to you make sure your CSS are properly optimized:</p>
<ul>
<li><a rel="nofollow" href="http://www.alistapart.com/articles/keepelementskidsinlinewithoffspring/"><strong>Keeping Your Elements’ Kids in Line with Offspring</strong></a><br />
How to keep your markup clean with CSS Selectors.</li>
<li><strong><a rel="nofollow" href="http://www.dustindiaz.com/css-shorthand/">Keep CSS short</a></strong><br />
When they give the same style, the codes are better the shorter they are. Here’s a <strong>CSS Shorthand guide</strong> you’ll probably need.</li>
<li><strong><a rel="nofollow" href="http://www.alistapart.com/articles/sprites">Use CSS Sprite</a></strong><br />
<img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/css-sprite.jpg" alt="css sprite Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" /><br />
CSS Sprite technique reduce HTTP request each time a page is load by combining several (or all) images together on a single image file and control it’s output with CSS <code>background-position</code>attribute. Here are some useful guides and techniques to create CSS Sprites:</p>
<ul>
<li><a rel="nofollow" href="http://cssglobe.com/post/3028/creating-easy-and-useful-css-sprites"><strong>Creating easy and useful CSS Sprites</strong></a></li>
<li><a rel="nofollow" href="http://spritegen.website-performance.org/"><strong>Online CSS Sprite Generator</strong></a></li>
<li><a rel="nofollow" href="http://www.blogsdna.com/813/top-6-best-online-and-offline-css-sprites-generator.htm"><strong>Best Online And Offline CSS Sprites Generator</strong></a></li>
</ul>
</li>
<li><strong><a rel="nofollow" href="http://code.google.com/speed/articles/optimizing-css.html">Using every declaration just once</a></strong><br />
When looking to optimize your CSS files, one of the most powerful measures you can employ is to use every declaration just once.</li>
<li><strong>Reduce amount of CSS files</strong><br />
The reason is simple, the more CSS files you have the more HTTP request it’ll have to make when a webpage is being requested. For example, instead of having multiple CSS files like the following:</p>
<pre class="html">          &lt;link rel="stylesheet" type="text/css" href="main.css" /&gt;
          &lt;link rel="stylesheet" type="text/css" href="body.css" /&gt;
          &lt;link rel="stylesheet" type="text/css" href="footer.css" /&gt;</pre>
<p>You can combine them into the one single CSS:</p>
<pre class="html">          &lt;link rel="stylesheet" type="text/css" href="layout.css" /&gt;</pre>
</li>
</ul>
<p><strong>Recommended readings:</strong></p>
<ul>
<li><strong><a rel="nofollow" href="http://www.makeuseof.com/tag/useful-tools-to-check-clean-and-optimize-your-css-file/">Useful Tools To Check, Clean &amp; Optimize Your CSS File</a></strong><br />
Some of the useful tools that you can use to optimize your CSS code, even if you have completely no knowledge of CSS coding.</li>
<li><strong><a rel="nofollow" href="http://www.smashingmagazine.com/2008/08/18/7-principles-of-clean-and-optimized-css-code/">7 Principles Of Clean And Optimized CSS Code</a></strong><br />
Optimization isn’t just minimizing file size – it’s also about being organized, clutter-free, and efficient.</li>
<li><strong><a rel="nofollow" href="http://reinholdweber.com/css/best-practices-to-optimize-css-an-academic-exercise/">Best Practices to optimize CSS</a></strong><br />
Consider this article more like an academic exercise rather than real-life optimization tips.</li>
</ul>
</li>
</ol>
<h3>Optimization for WordPress</h3>
<p>From time to time, we monitor, benchmark and analyze the performance of our WordPress blog. If the site is running slow, we need to know why. Here are some basic changes we’ve done and we figured will significantly increase the speed of your WordPress blog.</p>
<ol>
<li>
<h4>Cache Your Worpress Blog</h4>
<p><a rel="nofollow" href="http://wordpress.org/extend/plugins/wp-cache/"><strong>WP-Cache</strong></a> is an extremely efficient WordPress page caching system to make you site much faster and responsive. We also recommend <a rel="nofollow" href="http://wordpress.org/extend/plugins/wp-super-cache/"><strong>WP Super Cache</strong></a> which enhances from the previous mentioned plugin and too does a great job.</li>
<li>
<h4>Deactivate and Delete Unused Plugins</h4>
<p>When you notice your blog is loading real slow, see if you have a lot of plugins installed. They might be the culprit.</li>
<li>
<h4>Remove unnecessary PHP Tags</h4>
<p>If you take a look into your theme’s source codes, you will find a lot tags like these:</p>
<pre class="php">        &lt;?php bloginfo('stylesheet_directory'); ?&gt;
        &lt;?php bloginfo('description'); ?&gt;</pre>
<p>They can be pretty much replaced with text content that don’t cause load to the server. Check out <em>Michael Martin</em>‘s <a rel="nofollow" href="http://www.problogdesign.com/general-tips/13-tags-to-delete-from-your-theme/"><strong>13 Tags to delete from your WordPress Blo</strong>g</a></li>
</ol>
<p><strong>Recommended Readings:</strong></p>
<ul>
<li><strong><a href="http://lorelle.wordpress.com/2007/09/22/the-3-easiest-ways-to-speed-up-wordpress/">3 Easiest Ways to Speed Up WordPress</a></strong><br />
John Pozadzides shares how his blog sails smoothly through a Digg traffic spike.</li>
<li><a rel="nofollow" href="http://www.noupe.com/wordpress/13-great-wordpress-speed-tips-tricks-for-max-performance.html"><strong>13 Great WordPress Speed Tips &amp; Tricks for MAX Performance</strong></a><br />
Here are a few things to try if you find that your WordPress site is not performing as well as it could be due to high traffic or hidden issues you don’t know about.</li>
<li><a rel="nofollow" href="http://yoast.com/40-wordpress-optimisation-tips/"><strong>40 WordPress Optimization Tips</strong></a><br />
Optimization tips in slides. 40 tips in 40 minutes.</li>
</ul>
<h3>Last but not least…</h3>
<p>Here are some useful web services and tools that gives you a broader perspective and better analyzation to help you in web optimization.</p>
<ul>
<li>
<h4><strong><a rel="nofollow" href="http://developer.yahoo.com/yslow/">Yahoo! YSlow</a></strong></h4>
<p><strong>YSlow</strong> analyzes web pages and suggests ways to improve their performance based on a set of <a rel="nofollow" href="http://developer.yahoo.com/performance/rules.html">rules for high performance web pages</a>. It gives you a good idea what needs to be done in order for the website to load faster.</p>
<p>(<a rel="nofollow" href="http://www.getfirebug.com/">Firebug</a> required)</p>
<p><a rel="nofollow" href="http://developer.yahoo.com/yslow/"><img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/yslow-report.jpg" alt="yslow report Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" width="500" height="293" /></a></li>
<li>
<h4><strong><a rel="nofollow" href="http://code.google.com/speed/page-speed/">PageSpeed</a></strong></h4>
<p>Similar to <strong>Yahoo! YSlow</strong>, Google <strong>Page Speed</strong> is an open-source Firebug add-on to evaluate the website performances and how to improve them. (<a rel="nofollow" href="http://www.getfirebug.com/">Firebug</a> required)</p>
<p><img title="Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" src="http://media02.hongkiat.com/optimization_ultimate_guide/page-speed.jpg" alt="page speed Ultimate Guide To Web Optimization (Tips &amp; Best Practices)" width="500" height="293" /></li>
<li>
<h4><strong><a rel="nofollow" href="http://tools.pingdom.com/">Pingdom Tools</a></strong></h4>
<p><strong>Pingdom Tools</strong> take a complete load of your website including all objects (images, CSS, JavaScripts, RSS, Flash and frames/iframes) and shows you general statistics about the loaded page such as the total number of objects, total load time, and size including all objects.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zachbrowne.com/6062-website-performance-optimization-best-practices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

