<?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>Gordon Choi&#039;s Blog</title>
	<atom:link href="http://www.gordonchoi.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gordonchoi.com</link>
	<description>Web Analytics Insights, SEO/PPC Analytics/Tools/Tips</description>
	<lastBuildDate>Mon, 14 May 2012 11:01:13 +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>Google Panda Algorithm</title>
		<link>http://www.gordonchoi.com/google-panda-algorithm-20120514?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-panda-algorithm</link>
		<comments>http://www.gordonchoi.com/google-panda-algorithm-20120514#comments</comments>
		<pubDate>Mon, 14 May 2012 11:01:13 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Google SEO]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7347</guid>
		<description><![CDATA[Google&#8217;s Panda Algorithm was first rolled out in February 2011 to hit large content farms by lowering the rankings of web pages with high bounce rates and low quality external links. Google Panda Algorithm to Affect Content Farm Sites When the Panda Algorithm lowers a website&#8217;s ranking in Google&#8217;s search engine results pages (SERP), the [...]]]></description>
			<content:encoded><![CDATA[<p>Google&#8217;s Panda Algorithm was first rolled out in February 2011 to hit large <a href="http://www.gordonchoi.com/content-farm-spams-google-search-algorithm-update-20110203">content farms</a> by lowering the rankings of web pages with high <a href="http://www.gordonchoi.com/web-analytics-bounce-rate-20100104">bounce rates</a> and low quality <a href="http://www.gordonchoi.com/cat/link-building">external links</a>.</p>
<p><strong>Google Panda Algorithm to Affect Content Farm Sites</strong></p>
<p>When the Panda Algorithm lowers a website&#8217;s ranking in Google&#8217;s search engine results pages (SERP), the website&#8217;s visits and page views from Google SEO will drop as a direct result. Sites / companies that suffered hard because of Google&#8217;s Panda Algorithm include:</p>
<ul>
<li>About.com</li>
<li>Some of Yahoo&#8217;s content pages</li>
<li>Demand Media</li>
</ul>
<p>People working on the following roles within the Internet industry should pay attention to Google&#8217;s Panda Algorithm updates:</p>
<ul>
<li>Professionals whose role is to manage search engine optimization (<a href="http://www.gordonchoi.com/cat/seo">SEO</a>) for websites that have large quantity of text content.</li>
<li>Webmasters who own and manage multiple websites with multilingual content.</li>
</ul>
<p><strong>Google Panda Algorithm Updates</strong></p>
<ul>
<li>Panda 1.0 &#8211; The first version of Google&#8217;s Panda Algorithm was rolled out in February 2011 that hit content farms which caused irrelevant organic search results to show up in Google and affected 12% of searches in the US.</li>
<li>Panda 2.0 &#8211; Released in April 2011 to all English language search queries worldwide including: British English (<code>google.co.uk</code>), Australian English (<code>google.com.au</code>) and English language search results (e.g. <code>google.fr</code>, <code>google.com.hk</code>).</li>
<li>Panda 2.1, 2.2, 2.3 &#8211; Several minor algorithm updates in May, June and July 2011.</li>
<li>Panda 2.4 &#8211; Released in August 2011 for English language search queries globally and non-English language search queries except for Chinese, Japanese, and Korean, and affected 6-9% of search queries.</li>
<li>Panda 2.5 and Panda Flux &#8211; Released from September to November 2011 and affected 2% of search queries.</li>
<li>Panda 3.1 &#8211; After Panda 2.5, it went straight to Panda 3.1 (released in November 2011) without an official Panda 3.0 algorithm update. Since Panda 3.1, algorithm updates have entered a period of Panda Flux where updates started to happen more frequently and were relatively minor.</li>
<li>Panda 3.2 &#8211; Released in January 2012 and this Panda data update was confirmed by Google.</li>
<li>Panda 3.3 &#8211; Released in February 2012 as a Panda Flux.</li>
<li>Panda 3.4 &#8211; Released in March 2012 and affected 1.6% of search queries.</li>
</ul>
<p>SEOmoz <a href="http://www.seomoz.org/google-algorithm-change#2012">provides</a> a list of all Google Algorithm changes that includes the incremental Panda Algorithm updates.</p>
<p><strong>SEO Experts&#8217; Suggestions for Google Panda Algorithm</strong></p>
<p><a href="http://searchengineland.com/why-google-panda-is-more-a-ranking-factor-than-algorithm-update-82564">Suggestions</a> from Danny Sullivan on Google&#8217;s Panda Algorithm updates:</p>
<ul>
<li>Google does make small algorithm updates from time to time to lower websites&#8217; rankings in Google&#8217;s SERP, but may be unrelated to the Panda algorithm.</li>
<li>Google may update a site&#8217;s PageRank from time to time that may have negative effect to a site&#8217;s ranking in Google&#8217;s SERP, but may be unrelated to the Panda algorithm.</li>
<li>Google confirmed it may be possible for some websites to be negatively affected by Panda updates to improve their SERP rankings, if the sites have made significant improvements to the quality of content.</li>
<li>Monitor your site&#8217;s Google organic traffic fluctuation, instead of focusing only on your web pages&#8217; SERP ranking.</li>
</ul>
<p>Six Revisions&#8217; <a href="http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/">suggestions</a> on creating websites that are optimized for Google&#8217;s Panda Algorithm:</p>
<ul>
<li>Design for Engagement and User Experience</li>
<li>Spelling and Grammar are Important</li>
<li>Focus on Content Quality</li>
<li>Avoid Too Many Ads</li>
<li>Avoid Duplicate Content</li>
<li>Less is More</li>
<li>Ensure High-Quality Code</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/google-panda-algorithm-20120514/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Analytics Essentials</title>
		<link>http://www.gordonchoi.com/web-analytics-essentials-20120502?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=web-analytics-essentials</link>
		<comments>http://www.gordonchoi.com/web-analytics-essentials-20120502#comments</comments>
		<pubDate>Wed, 02 May 2012 12:16:59 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Web Analytics]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7340</guid>
		<description><![CDATA[I talked about Web Analytics Essentials at Search Engine Strategies (SES) Shanghai 2012 through the recommendation from Eddie Choi (of SES Advisory Board) and Adaline Lau (of Clickz Asia&#8217;s Chief Editor): Web Analytics Principles and Scope Google Analytics Basic Setup Web Analytics Reports &#038; KPI Metrics for Web Analysts focusing on SEO and SEM Google [...]]]></description>
			<content:encoded><![CDATA[<p>I talked about Web Analytics Essentials at Search Engine Strategies (SES) Shanghai 2012 through the recommendation from Eddie Choi (of SES Advisory Board) and Adaline Lau (of Clickz Asia&#8217;s Chief Editor):</p>
<ul>
<li>Web Analytics Principles and Scope</li>
<li><a href="http://www.gordonchoi.com/google-analytics-setup-20101015">Google Analytics Basic Setup</a></li>
<li>Web Analytics Reports &#038; KPI Metrics for Web Analysts focusing on <a href="http://www.gordonchoi.com/cat/seo">SEO</a> and <a href="http://www.gordonchoi.com/cat/sem">SEM</a></li>
<li><a href="http://www.gordonchoi.com/cat/google-analytics">Google Analytics</a> Tips</li>
<li>Google Analytics Advanced Setup</li>
</ul>
<div style="width:425px" id="__ss_12715379"> <strong style="display:block;margin:12px 0 4px"></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/12715379" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> All slides by <a href="http://www.slideshare.net/gordonchoi" target="_blank">gordonchoi</a> on Slideshare.net</div>
</p></div>
<p><strong>Web Analytics Principles and Scope</strong></p>
<ul>
<li>What is and why Web Analytics?</li>
<li>Tracking methods: Web log files vs JavaScript tags</li>
<li>Benefits to JavaScript-based tags: URL and cookie-based, no data storage issue, easy to install</li>
<li>Disadvantages to JavaScript-based tags: URL structure planning, No <a href="http://www.gordonchoi.com/iis-log-files-format-search-engine-spider-in-internet-information-services-20120315">search engine spider, no page error data, JavaScript codes <a href="http://www.gordonchoi.com/optimize-website-page-load-time-20091212">slow down web page load</a></a> data</li>
<li>Web Analytics: Google Analytics, <a href="http://www.gordonchoi.com/yahoo-web-analytics-20100521">Yahoo Web Analytics</a>, <a href="http://www.gordonchoi.com/baidu-web-analytics-beta-20090905">Baidu Analytics</a>, 99Click, Site Catalyst, Piwik</li>
</ul>
<p><strong>Google Analytics Basic Setup</strong></p>
<ul>
<li>How does Google Analytics work?</li>
<li>Google Analytics account and profile setup</li>
<li>Google Analytics Tracking Code (GATC) setup: Standard, multiple sub-domains, multiple domains, Chinese search engines</li>
<li>Google Analytics profile filter setup: Lowercase URLs, full path URLs</li>
</ul>
<p><strong>Web Analytics Reports &#038; KPI Metrics for Web Analysts focusing on SEO and SEM</strong></p>
<ul>
<li>What is a web analyst?</li>
<li>Basic reports: Site Traffic (Visit) Trends, Direct vs. Search Engines vs. Referring Sites, New Visitors vs. Returning Visitors, Visitor Frequency (counts of visits) and Visitor Recency (days since last visit), Geography, Browsers, Languages, Mobile Devices, Top Landing Pages vs. Top Pages, SEO/SEM Visit Trends, Top SEO/SEM Keywords, Site Search, In-page Analytics</li>
<li>Metrics: Visits, Visitors, Page Views, <a href="http://www.gordonchoi.com/google-analytics-unique-page-views-20110215">Unique Page Views</a>, New Visitors, Returning Visitors, Bounce Rate, Exit Rate, Time on Site, Time on Page, Clicks</li>
<li>Goals: URL destination, visit duration, page / visit, event</li>
<li>Goal funnels</li>
<li>Segmentation: Advanced segments</li>
<li><a href="http://www.gordonchoi.com/google-analytics-direct-traffic-20101113">Direct Traffic</a></li>
<li><a href="http://www.gordonchoi.com/google-analytics-ppc-conversion-tracking-20100101">SEM Tracking</a></li>
<li>SEO reports: Traffic trends, spider behavior (pages indexed), page errors, keyword ranking</li>
<li><a href="http://www.gordonchoi.com/cat/google-webmaster-tools">Google Webmaster Tools</a></li>
</ul>
<p><strong>Google Analytics Tips</strong></p>
<ul>
<li><a href="http://www.gordonchoi.com/new-google-analytics-dashboard-real-time-report-custom-report-site-speed-multi-channel-funnel-premium-20111001">New Google Analytics</a>: Dashboard, Real-time, Visitors Flow, Multi-channel Funnels, Custom reports</li>
<li>Google Analytics Cookies: <code>__utma</code>, <code>__utmb</code>, <code>__utmz</code></li>
<li><a href="http://www.gordonchoi.com/google-analytics-sampled-data-20101205">Google Analytics Sampled Data</a></li>
</ul>
<p><strong>Google Analytics Advanced Setup</strong></p>
<ul>
<li>Social media tracking: Facebook Like/Share buttons, Twitter Tweet button, <a href="http://www.gordonchoi.com/add-google-1-button-to-websites-20110602">Google +1 button</a></li>
<li>URL Tracking</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/web-analytics-essentials-20120502/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Social Media Tracking, How Social Affects SEO</title>
		<link>http://www.gordonchoi.com/social-media-tracking-how-social-affects-seo-20120427?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=social-media-tracking-how-social-affects-seo</link>
		<comments>http://www.gordonchoi.com/social-media-tracking-how-social-affects-seo-20120427#comments</comments>
		<pubDate>Fri, 27 Apr 2012 13:33:28 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Web Analytics]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7330</guid>
		<description><![CDATA[I talked about some social media tracking tools at Search Engine Strategies (SES) Shanghai 2012 during the &#8220;How Social Affects SEO&#8221; panel with two other speakers, Bill Hunt (of Back Azimuth) and TR Harrington, with the help of panel moderator Mike Grehan. All slides by gordonchoi on Slideshare.net The social media tracking tools: Google Analytics [...]]]></description>
			<content:encoded><![CDATA[<p>I talked about some social media tracking tools at Search Engine Strategies (SES) Shanghai 2012 during the &#8220;How Social Affects <a href="http://www.gordonchoi.com/cat/seo">SEO</a>&#8221; panel with two other speakers, Bill Hunt (of Back Azimuth) and TR Harrington, with the help of panel moderator Mike Grehan.</p>
<div style="width:425px" id="__ss_12715313"> <strong style="display:block;margin:12px 0 4px"></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/12715313" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> All slides by <a href="http://www.slideshare.net/gordonchoi" target="_blank">gordonchoi</a> on Slideshare.net</div>
</p></div>
<p>The social media tracking tools:</p>
<ul>
<li><a href="http://www.gordonchoi.com/cat/google-analytics">Google Analytics</a></li>
<li>URL Shorteners: Bit.ly, Hootsuite, <a href="http://www.gordonchoi.com/google-url-shortener-20101107">Google URL Shortener</a></li>
<li>Social Influence Measurement tool: Klout</li>
</ul>
<p>Social influence metrics:</p>
<ul>
<li>True reach</li>
<li>Amplification</li>
<li>Network impact</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/social-media-tracking-how-social-affects-seo-20120427/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Adwords Conversions 1-per-click, Conversions Many-per-click, Conversion Rate Larger Than 100%</title>
		<link>http://www.gordonchoi.com/google-adwords-conversions-1-per-click-conversions-many-per-click-conversion-rate-larger-than-100-20120423?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-adwords-conversions-1-per-click-conversions-many-per-click-conversion-rate-larger-than-100</link>
		<comments>http://www.gordonchoi.com/google-adwords-conversions-1-per-click-conversions-many-per-click-conversion-rate-larger-than-100-20120423#comments</comments>
		<pubDate>Mon, 23 Apr 2012 12:23:42 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Adwords Tips]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=6778</guid>
		<description><![CDATA[If you have set up and enabled Adwords conversion tracking for your Google Adwords campaigns, you may occasionally see keywords with conversion rates that are larger than 100%. Why Adwords Conversion Rates Can Be Larger Than 100%? It is possible to have Adwords conversion rate that is larger than 100% and Google official explains how [...]]]></description>
			<content:encoded><![CDATA[<p>If you have set up and enabled <a href="http://www.gordonchoi.com/google-adwords-conversion-tracking-for-beginners-20090830">Adwords conversion tracking</a> for your <a href="http://www.gordonchoi.com/cat/adwords">Google Adwords</a> campaigns, you may occasionally see keywords with conversion rates that are larger than 100%.</p>
<p><strong>Why Adwords Conversion Rates Can Be Larger Than 100%?</strong></p>
<p>It is possible to have Adwords conversion rate that is larger than 100% and Google official <a href="http://adwords.google.com/support/aw/bin/answer.py?hl=en&#038;answer=145453">explains</a> how it can happen:</p>
<ul>
<li>A user clicked one of your Adwords ads, arrived at your site, completed a purchase on your site and reached the conversion confirmation page (or thank you page) of your site (the web page where you have Adwords conversion tracking code inserted). The user left your site and then came back directly to your site without clicking any of your Adwords ad again. This time, the user completed a second purchase and reached the conversion confirmation page again. The result is 2 Adwords conversions are counted, with 1 ad click.</li>
<li>A user clicked one of your Adwords ads, arrived at your site, completed a purchase on your site and reached the conversion confirmation page (or thank you page) of your site (the web page where you have Adwords conversion tracking code on). The user clicked away from the conversion confirmation page but then clicked on the browser&#8217;s back button to return to the conversion confirmation page (where Adwords conversion tracking code is placed). The result is 2 Adwords conversions are counted, with 1 ad click.</li>
</ul>
<p><strong>Conversions 1-per-click and Conversions Many-per-click</strong></p>
<p>Conversions 1-per-click and conversions many-per-click are <a href="http://adwords.google.com/support/aw/bin/answer.py?hl=en&#038;answer=107055">two of the metrics</a> in Google Adwords conversions.</p>
<ul>
<li><strong>Conversions 1-per-click</strong>: A conversion is counted for each Adwords ad click leading to a conversion within 30 days of the first ad click. Subsequent conversions that are the result of this first ad click will not be counted as conversion 1-per-click, as conversions 1-per-click will count at most one conversion per ad click. Conversions 1-per-click is most useful when measuring conversions approximating the number of unique customer acquisitions.</li>
<li><strong>Conversions Many-per-click</strong>: A conversion is counted for each Adwords ad click leading to a conversion within 30 days of the first ad click, and conversions many-per-click will count multiple conversions per click. Conversions Many-per-click is most useful when measuring conversions that happen every time which is actually <a href="http://www.gordonchoi.com/cat/b2c-websites">B2C website</a> transactions.</li>
</ul>
<p>Metrics related to conversion 1-per-click:</p>
<ul>
<li><code>Conversion Rate 1-per-click = Conversions 1-per-click / clicks</code></li>
<li><code>Cost-per-conversion 1-per-click = Cost / conversions 1-per-click</code></li>
</ul>
<p>Metrics related to conversion many-per-click:</p>
<ul>
<li><code>Conversion Rate Many-per-click = Conversions Many-per-click / clicks</code></li>
<li><code>Cost-per-conversion Many-per-click = Cost / conversions Many-per-click</code></li>
</ul>
<p>Conversion Rate Many-per-click may be larger than 100% as you may receive more than one conversion per click.</p>
<p><strong>PPC Metrics</strong></p>
<p><a href="http://www.gordonchoi.com/ppc-metrics-20101101">PPC metrics</a> explains conversion, conversion rate and other metrics including <a href="http://www.gordonchoi.com/google-adwords-quality-score-for-beginners-20090518">Google Adwords Quality Score</a>, <a href="http://www.gordonchoi.com/google-adwords-impression-share-metric-explained-20070509">impression share</a> and clickthrough rate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/google-adwords-conversions-1-per-click-conversions-many-per-click-conversion-rate-larger-than-100-20120423/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tech, Internet Books Collection</title>
		<link>http://www.gordonchoi.com/tech-internet-books-collection-20120422?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tech-internet-books-collection</link>
		<comments>http://www.gordonchoi.com/tech-internet-books-collection-20120422#comments</comments>
		<pubDate>Sun, 22 Apr 2012 05:37:27 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[B2C Websites]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7312</guid>
		<description><![CDATA[When in the business of creating and managing websites and when heading down the road of a webmaster, a search marketer, an online marketer, a social media marketer, a web analyst, a web user interface developer, a web engineer and/or a data warehouse administrator, books written by Avinash Kaushik, Bill Hunt, Steve Krug, Brian Clifton, [...]]]></description>
			<content:encoded><![CDATA[<p>When in the business of creating and managing websites and when heading down the road of a webmaster, a search marketer, an online marketer, a social media marketer, a web analyst, a web user interface developer, a web engineer and/or a data warehouse administrator, books written by Avinash Kaushik, Bill Hunt, Steve Krug, Brian Clifton, Malcolm Gladwell, Seth Godin, Steven Levitt, Thomas Friedman, Bill Tancer, Steve McConnell and Ralph Kimball would definitely help you:</p>
<ul>
<li>Search Engine Marketing, Inc.</li>
<li>Don&#8217;t Make Me Think</li>
<li>Rocket Surgery Made Easy</li>
<li>Advanced Web Metrics with Google Analytics</li>
<li>Web Analytics &#8211; An hour a day</li>
<li>Web Analytics 2.0</li>
<li>Landing Page Optimization</li>
<li>Always Be Testing</li>
<li>Freakonomics</li>
<li>Super Freakonomics</li>
<li>Small is the New Big</li>
<li>Meatball Sundae</li>
<li>Linchpin</li>
<li>Outliers</li>
<li>Blink</li>
<li>The Tipping Point</li>
<li>The World is Flat</li>
<li>The Google Story</li>
<li>Online Marketing Heroes</li>
<li>Click</li>
<li>Code Complete</li>
<li>Rapid Development</li>
<li>The Data Warehouse Lifecycle Toolkit</li>
</ul>
<p>How many books can you recognize?</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/tech-internet-books-collection.jpg" alt="Tech, Internet Books Collection" />
</ul>
<p>While books provide solid background and/or knowledge of a field (i.e. <a href="http://www.gordonchoi.com/cat/web-analytics">Web Analytics</a>, <a href="http://www.gordonchoi.com/cat/seo">SEO</a>, <a href="http://www.gordonchoi.com/cat/landing-page-optimization">landing page optimization</a>, etc) the list of <a href="http://www.gordonchoi.com/blogroll">SEM blogs</a> offer similar topics that are updated more often.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/tech-internet-books-collection-20120422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adwords Not Set Keywords in Google Analytics</title>
		<link>http://www.gordonchoi.com/adwords-not-set-keywords-in-google-analytics-20120404?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=adwords-not-set-keywords-in-google-analytics</link>
		<comments>http://www.gordonchoi.com/adwords-not-set-keywords-in-google-analytics-20120404#comments</comments>
		<pubDate>Wed, 04 Apr 2012 10:29:08 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Google Analytics]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7296</guid>
		<description><![CDATA[When advertising with keyword search campaigns through Google Adwords and tracking traffic and/or goal conversions through Google Analytics for your website, you want Adwords PPC keywords showing up in Google Analytics keyword report as one of the traffic sources: google / cpc However, Google Adwords clicks can show up in the Google Analytics keyword report [...]]]></description>
			<content:encoded><![CDATA[<p>When advertising with keyword search campaigns through Google Adwords and tracking traffic and/or goal conversions through Google Analytics for your website, you want <a href="http://www.gordonchoi.com/google-analytics-ppc-conversion-tracking-20100101">Adwords PPC keywords showing up in Google Analytics keyword report</a> as one of the traffic sources:</p>
<p><code>google / cpc</code></p>
<p>However, <a href="http://www.gordonchoi.com/cat/adwords">Google Adwords</a> clicks can <a href="http://analytics.blogspot.com/2009/08/back-to-basics-not-set-entries.html">show up</a> in the Google Analytics keyword report as &#8220;<code>(not set)</code>&#8221; entry, because Google Analytics couldn&#8217;t associate a keyword or any search campaign information with the visits (i.e. Google Adwords clicks).</p>
<p><strong>Link Adwords to Google Analytics</strong></p>
<p>Make sure your Adwords account is always linked to your Google Analytics account. If you run search campaigns on multiple Adwords accounts for your website, then <a href="http://analytics.blogspot.com/2011/08/linking-all-of-your-adwords-accounts-to.html">link all multiple Adwords accounts to the Google Analytics account</a>.</p>
<p><strong>Auto-tagging Google Adwords Destination URLs</strong></p>
<p>Turn on auto-tagging and <a href="http://support.google.com/googleanalytics/bin/answer.py?hl=en&#038;answer=55590">test</a> if auto-tagging works on your site (in case some of the web pages on your website have URL redirection enabled):</p>
<ul>
<li>Append <code>?gclid=test</code> or <code>&#038;gclid=test</code> parameter to the end of one of your Adwords destination URLs.</li>
<li>Put the URL with the appended <code>?gclid=test</code> or <code>&#038;gclid=test</code> parameter into a web browser address bar.</li>
<li>If the web page shows up correctly and the appended <code>?gclid=test</code> or <code>&#038;gclid=test</code> parameter are still in the web browser address bar, then auto-tagging works and keywords will properly show up in Google Analytics keyword report (within being attributed to the &#8220;<code>(not set)</code>&#8221; entry).</li>
</ul>
<p><strong>Manually Tag Google Adwords Destination URLs</strong></p>
<p>In some cases when you have auto-tagging enabled, the amount of &#8220;<code>(not set)</code>&#8221; entry can become significantly large in the Google Analytics keyword report. You should:</p>
<ul>
<li>Disable auto-tagging in your Google Adwords account.</li>
<li>Tag all the destination URLs manually or through <a href="http://support.google.com/googleanalytics/bin/answer.py?hl=en&#038;answer=55578">Google&#8217;s URL Builder</a>, with source (e.g. google), medium (e.g. cpc), campaign, keyword/term and ad/content.</li>
</ul>
<p><strong>Google Adwords Cost Data in Google Analytics Campaigns Report</strong></p>
<p>For Adwords cost data to show up in Google Analytics campaigns report, when linking Adwords account(s) to Google Analytics account, you should select to <a href="http://support.google.com/googleanalytics/bin/answer.py?hl=en&#038;answer=57167">apply</a> Adwords cost data.</p>
<ul>
<li>If Adwords cost data is applied and auto-tagging is enabled, then both Adwords cost data and visits data will appear in Google Analytics campaigns report.</li>
<li>If Adwords cost data is applied and manual-tagging is used, then both Adwords cost data and visits data will appear in Google Analytics campaigns report.</li>
<li>If Adwords cost data is not applied and auto-tagging is enabled, then Adwords cost data will not appear and Adwords dimensions (i.e. campaign name, ad group, keyword) will appear as &#8220;<code>(not set)</code>&#8221; in Google Analytics campaigns report.</li>
<li>If Adwords cost data is not applied and manual-tagging is used, then Adwords visits data without cost data will appear in Google Analytics campaigns report.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/adwords-not-set-keywords-in-google-analytics-20120404/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Underwater Web Search</title>
		<link>http://www.gordonchoi.com/google-underwater-web-search-20120401?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-underwater-web-search</link>
		<comments>http://www.gordonchoi.com/google-underwater-web-search-20120401#comments</comments>
		<pubDate>Sun, 01 Apr 2012 12:15:42 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7302</guid>
		<description><![CDATA[Today Google has this Underwater Search which can be found under the www.google.cn domain. In Chinese, this Google Underwater search is called &#8220;Shui Xia Sou Suo&#8221;. http://www.google.cn/landing/shuixia/ Start Google Underwater Search A search for &#8220;Google Analytics&#8221; followed by &#8220;Barack Obama&#8221; and &#8220;China&#8221; on Underwater Search. Google&#8217;s Underwater Web Search doesn&#8217;t actually return any real search [...]]]></description>
			<content:encoded><![CDATA[<p>Today Google has this Underwater Search which can be found under the <a href="http://www.gordonchoi.com/google-china-redirects-web-search-to-google-com-hk-google-cn-closes-20100323">www.google.cn domain</a>. In Chinese, this Google Underwater search is called &#8220;Shui Xia Sou Suo&#8221;.</p>
<p><code><a href="http://www.google.cn/landing/shuixia/">http://www.google.cn/landing/shuixia/</a></code></p>
<p>Start Google Underwater Search</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/google-underwater-web-search.png" alt="Google Underwater Search" />
</ul>
<p>A search for &#8220;Google Analytics&#8221; followed by &#8220;Barack Obama&#8221; and &#8220;China&#8221; on Underwater Search.</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/google-underwater-search-results.png" alt="Google Underwater Search Results" />
</ul>
<p>Google&#8217;s Underwater Web Search doesn&#8217;t actually return any real search results, but it is rather a joke for April&#8217;s Fool Day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/google-underwater-web-search-20120401/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Performance Optimization, Web Page Load Speed Optimization</title>
		<link>http://www.gordonchoi.com/web-performance-optimization-web-page-load-speed-optimization-20120326?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=web-performance-optimization-web-page-load-speed-optimization</link>
		<comments>http://www.gordonchoi.com/web-performance-optimization-web-page-load-speed-optimization-20120326#comments</comments>
		<pubDate>Mon, 26 Mar 2012 13:18:29 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Landing Page Optimization]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7267</guid>
		<description><![CDATA[Speeding up your site helps: Serving web page content faster to your site&#8217;s visitors and improving conversion rates Improving Google SEO &#8211; Refer to Optimize website page load time Google has even made site load speed data available through Google Webmaster Tools and Google Analytics. Yahoo Developer Network has compiled this document on web performance [...]]]></description>
			<content:encoded><![CDATA[<p>Speeding up your site helps:</p>
<ul>
<li>Serving web page content faster to your site&#8217;s visitors and improving conversion rates</li>
<li>Improving <a href="http://www.gordonchoi.com/cat/google-seo">Google SEO</a> &#8211; Refer to <a href="http://www.gordonchoi.com/optimize-website-page-load-time-20091212">Optimize website page load time</a></li>
</ul>
<p>Google has even made site load speed data available through <a href="http://www.gordonchoi.com/cat/google-webmaster-tools">Google Webmaster Tools</a> and <a href="http://www.gordonchoi.com/new-google-analytics-dashboard-real-time-report-custom-report-site-speed-multi-channel-funnel-premium-20111001">Google Analytics</a>.</p>
<p>Yahoo Developer Network has compiled <a href="http://developer.yahoo.com/performance/rules.html">this document</a> on web performance optimization &#8211; 35 best practices for speeding up load time of your website and/or web pages.</p>
<ul>
<li>Minimize HTTP Requests</li>
<li>Use a Content Delivery Network</li>
<li>Add an Expires or a Cache-Control Header</li>
<li>Gzip Components</li>
<li>Put Stylesheets at the Top</li>
<li>Put Scripts at the Bottom</li>
<li>Avoid CSS Expressions</li>
<li>Make JavaScript and CSS External</li>
<li>Reduce DNS Lookups</li>
<li>Minify JavaScript and CSS</li>
<li>Avoid Redirects</li>
<li>Remove Duplicate Scripts</li>
<li>Configure ETags</li>
<li>Make Ajax Cacheable</li>
<li>Flush the Buffer Early</li>
<li>Use GET for AJAX Requests</li>
<li>Post-load Components</li>
<li>Preload Components</li>
<li>Reduce the Number of DOM Elements</li>
<li>Split Components Across Domains</li>
<li>Minimize the Number of iframes</li>
<li>No 404s</li>
<li>Reduce Cookie Size</li>
<li>Use Cookie-free Domains for Components</li>
<li>Minimize DOM Access</li>
<li>Develop Smart Event Handlers</li>
<li>Choose &lt;link&gt; over @import</li>
<li>Avoid Filters</li>
<li>Optimize Images</li>
<li>Optimize CSS Sprites</li>
<li>Don&#8217;t Scale Images in HTML</li>
<li>Make favicon.ico Small and Cacheable</li>
<li>Keep Components under 25K</li>
<li>Pack Components into a Multipart Document</li>
<li>Avoid Empty Image src</li>
</ul>
<p><strong>Minimize HTTP Requests</strong></p>
<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.</p>
<p>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><a href="http://alistapart.com/articles/sprites">CSS Sprites</a> 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><a href="http://www.w3.org/TR/html401/struct/objects.html#h-13.6">Image maps</a> 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 <a href="http://tools.ietf.org/html/rfc2397">data: URL scheme</a> 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 <a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/">Browser Cache Usage &#8211; Exposed!</a>, 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>
<p><strong>Use a Content Delivery Network</strong></p>
<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 <a href="http://www.akamai.com/">Akamai</a> Technologies, <a href="http://www.edgecast.com/">EdgeCast</a>, or <a href="http://www.level3.com/index.cfm?pageID=36">level3</a>. For start-up companies and private web sites, the cost of a CDN service can be prohibitive, but as your target audience grows larger and becomes more global, a CDN is necessary to achieve fast response times. At Yahoo!, properties that moved static content off their application web servers to a CDN (both 3rd party as mentioned above as well as Yahoo’s own <a href="https://cwiki.apache.org/TS/traffic-server.html">CDN</a>) improved end-user response times by 20% or more. Switching to a CDN is a relatively easy code change that will dramatically improve the speed of your web site.</p>
<p><strong>Add an Expires or a Cache-Control Header</strong></p>
<p>There are two aspects to this rule:</p>
<ul>
<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>
</ul>
<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><code>Expires: Thu, 15 Apr 2010 20:00:00 GMT</code></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><code>ExpiresDefault "access plus 10 years"</code></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 Yahoo! we often make this step part of the build process: a version number is embedded in the component&#8217;s filename, for example, yahoo_2.0.6.js.</p>
<p>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 <a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/">measured this at Yahoo!</a> 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>
<p><strong>Gzip Components</strong></p>
<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><code>Accept-Encoding: gzip, deflate</code></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><code>Content-Encoding: gzip</code></p>
<p>Gzip is the most popular and effective compression method at this time. It was developed by the GNU project and standardized by <a href="http://www.ietf.org/rfc/rfc1952.txt">RFC 1952</a>. 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 <a href="http://sourceforge.net/projects/mod-gzip/">mod_gzip</a> while Apache 2.x uses <a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a>.</p>
<p>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>
<p><strong>Put Stylesheets at the Top</strong></p>
<p>While researching performance at Yahoo!, 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 <a href="http://www.useit.com/papers/responsetime.html">documented</a>. 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 <a href="http://www.w3.org/TR/html4/struct/links.html#h-12.3">HTML specification</a> 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>
<p><strong>Put Scripts at the Bottom</strong></p>
<p>The problem caused by scripts is that they block parallel downloads. The <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4">HTTP/1.1 specification</a> 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.</p>
<p>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>
<p><strong>Avoid CSS Expressions</strong></p>
<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 <a href="http://msdn.microsoft.com/en-us/library/ms537634%28VS.85%29.aspx">deprecated starting with IE8</a>. As an example, the background color could be set to alternate every hour using CSS expressions:</p>
<p><code>background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );</code></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>
<p><strong>Make JavaScript and CSS External</strong></p>
<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, such as Yahoo!&#8217;s front page and My Yahoo!. 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>
<p><strong>Reduce DNS Lookups</strong></p>
<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.yahoo.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>
<p><strong>Minify JavaScript and CSS</strong></p>
<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 <a href="http://crockford.com/javascript/jsmin">JSMin</a> and <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>. 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 &lt;script&gt; and &lt;style&gt; 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>
<p><strong>Avoid Redirects</strong></p>
<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>
<p><code>HTTP/1.1 301 Moved Permanently</code><br />
<code>Location: http://example.com/newuri</code><br />
<code>Content-Type: text/html</code></p>
<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.</p>
<p>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. For example, going to http://astrology.yahoo.com/astrology results in a 301 response containing a redirect to http://astrology.yahoo.com/astrology/ (notice the added trailing slash). This is fixed in Apache by using Alias or mod_rewrite, or the DirectorySlash directive if you&#8217;re using Apache handlers.</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 mod_rewrite.</p>
<p><strong>Remove Duplicate Scripts</strong></p>
<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><code>&lt;script type="text/javascript" src="menu_1.0.17.js"&gt;&lt;/script&gt;</code></p>
<p>An alternative in PHP would be to create a function called insertScript.</p>
<p><code>&lt;?php insertScript("menu.js") ?&gt;</code></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>
<p><strong>Configure ETags</strong></p>
<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>
<p><code>HTTP/1.1 200 OK</code><br />
<code>Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT</code><br />
<code>ETag: "10c24bc-4ab-457e1c1f"</code><br />
<code>Content-Length: 12195</code></p>
<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>
<p><code>GET /i/yahoo.gif HTTP/1.1</code><br />
<code>Host: us.yimg.com</code><br />
<code>If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT</code><br />
<code>If-None-Match: "10c24bc-4ab-457e1c1f"</code><br />
<code>HTTP/1.1 304 Not Modified</code></p>
<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 <a href="http://support.microsoft.com/?id=922733">Microsoft Support article</a> describes how to remove ETags. In Apache, this is done by simply adding the following line to your Apache configuration file:</p>
<p><code>FileETag none</code></p>
<p><strong>Make Ajax Cacheable</strong></p>
<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>
<ul>
<li>Gzip Components</li>
<li>Reduce DNS Lookups</li>
<li>Minify JavaScript</li>
<li>Avoid Redirects</li>
<li>Configure ETags</li>
</ul>
<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, &#038;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>
<p><strong>Flush the Buffer Early</strong></p>
<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. Example:</p>
<p><code>... &lt;!-- css, js --&gt;</code><br />
<code>&lt;/head&gt;</code><br />
<code>&lt;?php flush(); ?&gt;</code><br />
<code>&lt;body&gt;</code><br />
<code>... &lt;!-- content --&gt;</code></p>
<p>Yahoo! search pioneered research and real user testing to prove the benefits of using this technique.</p>
<p><strong>Use GET for AJAX Requests</strong></p>
<p>The Yahoo! Mail team found that 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 <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html">HTTP specs</a>, 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>
<p><strong>Post-load Components</strong></p>
<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: <a href="http://developer.yahoo.com/yui/imageloader/">YUI Image Loader</a> allows you to delay images below the fold and the <a href="http://developer.yahoo.com/yui/get/">YUI Get utility</a> is an easy way to include JS and CSS on the fly. For an example in the wild take a look at Yahoo! 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>
<p><strong>Preload Components</strong></p>
<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.</p>
<p>There are actually several types of preloading:</p>
<ul>
<li>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.</li>
<li>Conditional preload &#8211; based on a user action you make an educated guess where the user is headed next and preload accordingly. On search.yahoo.com you can see how some extra components are requested after you start typing in the input box.</li>
<li>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.</li>
</ul>
<p><strong>Reduce the Number of DOM Elements</strong></p>
<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 <a href="http://developer.yahoo.com/yui/">YUI CSS utilities</a>: 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 &lt;div&gt;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><code>document.getElementsByTagName('*').length</code></p>
<p>And how many DOM elements are too many? Check other similar pages that have good markup. For example the Yahoo! Home Page is a pretty busy page and still under 700 elements (HTML tags).</p>
<p><strong>Split Components Across Domains</strong></p>
<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>
<p>For more information check &#8220;<a href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/">Maximizing Parallel Downloads in the Carpool Lane</a>&#8221; by Tenni Theurer and Patty Chi.</p>
<p><strong>Minimize the Number of iframes</strong></p>
<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.</p>
<p>iframe 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>
</ul>
<p>iframe cons:</p>
<ul>
<li>Costly even if blank</li>
<li>Blocks page onload</li>
<li>Non-semantic</li>
</ul>
<p><strong>No 404s</strong></p>
<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>
<p><strong>Reduce Cookie Size</strong></p>
<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>
<p>For more information check &#8220;<a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/">When the Cookie Crumbles</a>&#8221; by Tenni Theurer and Patty Chi. The take-home of this research:</p>
<ul>
<li>Eliminate unnecessary cookies</li>
<li>Keep cookie sizes as low as possible to minimize the impact on the user response time</li>
<li>Be mindful of setting cookies at the appropriate domain level so other sub-domains are not affected</li>
<li>Set an Expires date appropriately. An earlier Expires date or none removes the cookie sooner, improving the user response time</li>
</ul>
<p><strong>Use Cookie-free Domains for Components</strong></p>
<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>
<p><strong>Minimize DOM Access</strong></p>
<p>Accessing DOM elements with JavaScript is slow so in order to have a more responsive page, you should:<br />
Cache references to accessed elements</p>
<ul>
<li>Update nodes &#8220;offline&#8221; and then add them to the tree</li>
<li>Avoid fixing layout with JavaScript</li>
<li>For more information check the YUI theatre&#8217;s &#8220;<a href="http://yuiblog.com/blog/2007/12/20/video-lecomte/">High Performance Ajax Applications</a>&#8221; by Julien Lecomte.</li>
</ul>
<p><strong>Develop Smart Event Handlers</strong></p>
<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 <a href="http://developer.yahoo.com/yui/event/">YUI Event</a> utility, which has an <a href="http://developer.yahoo.com/yui/event/#onavailable">onAvailable</a> method.</p>
<p>For more information check the YUI theatre&#8217;s &#8220;<a href="http://yuiblog.com/blog/2007/12/20/video-lecomte/">High Performance Ajax Applications</a>&#8221; by Julien Lecomte.</p>
<p><strong>Choose &lt;link&gt; over @import</strong></p>
<p>One of the previous best practices states that CSS should be at the top in order to allow for progressive rendering.</p>
<p>In IE @import behaves the same as using &lt;link&gt; at the bottom of the page, so it&#8217;s best not to use it.</p>
<p><strong>Avoid Filters</strong></p>
<p>The IE-proprietary AlphaImageLoader filter aims to fix a problem with semi-transparent true color PNGs in IE versions below 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.</p>
<p>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>
<p><strong>Optimize Images</strong></p>
<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 <a href="http://www.imagemagick.org/">imagemagick</a> it&#8217;s easy to check using</p>
<p><code>identify -verbose image.gif</code></p>
<p>When you see an image useing 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><code>convert image.gif image.png </code><br />
<code>"All we are saying is: Give PiNG a Chance!"</code></p>
<p>Run <a href="http://pmt.sourceforge.net/pngcrush/">pngcrush</a> (or any other PNG optimizer tool) on all your PNGs. Example: </p>
<p><code>pngcrush image.png -rem alla -reduce -brute result.png</code></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><code>jpegtran -copy none -optimize -perfect src.jpg dest.jpg</code></p>
<p><strong>Optimize CSS Sprites</strong></p>
<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>
<p><strong>Don&#8217;t Scale Images in HTML</strong></p>
<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><code>&lt;img width="100" height="100" src="mycat.jpg" alt="My Cat" /&gt;</code></p>
<p>then your image (mycat.jpg) should be 100x100px rather than a scaled down 500x500px image.</p>
<p><strong>Make favicon.ico Small and Cacheable</strong></p>
<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>
<ul>
<li>It&#8217;s small, preferably under 1K.</li>
<li>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.</li>
</ul>
<p><a href="http://www.imagemagick.org/">Imagemagick</a> can help you create small favicons.</p>
<p><strong>Keep Components under 25K</strong></p>
<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;<a href="http://yuiblog.com/blog/2008/02/06/iphone-cacheability/">Performance Research, Part 5: iPhone Cacheability &#8211; Making it Stick</a>&#8221; by Wayne Shea and Tenni Theurer.</p>
<p><strong>Pack Components into a Multipart Document</strong></p>
<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>
<p><strong>Avoid Empty Image src</strong></p>
<p>Image with empty string src attribute occurs more than one will expect. It appears in two form:</p>
<p>1. straight HTML<br />
<code>&lt;img src=""&gt;</code></p>
<p>2. JavaScript<br />
<code>var img = new Image();</code><br />
<code>img.src = "";</code></p>
<p>Both forms cause the same effect: browser makes another request to your server.</p>
<ul>
<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>Why is this behavior bad?</p>
<ul>
<li>Cripple your servers by sending a large amount of unexpected traffic, especially for pages that get millions of page views per day.</li>
<li>Waste server computing cycles generating a page that will never be viewed.</li>
<li>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.</li>
</ul>
<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:</p>
<ul>
<li>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.</li>
</ul>
<p>Hopefully, browsers will not have this problem in the future. Unfortunately, there is no such clause for &lt;script src=&#8221;"&gt; and &lt;link href=&#8221;"&gt;. Maybe there is still time to make that adjustment to ensure browsers don&#8217;t accidentally implement this behavior.</p>
<p>This rule was inspired by Yahoo!&#8217;s JavaScript guru Nicolas C. Zakas. For more information check out his article &#8220;<a href="http://www.nczonline.net/blog/2009/11/30/empty-image-src-can-destroy-your-site/">Empty image src can destroy your site</a>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/web-performance-optimization-web-page-load-speed-optimization-20120326/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IIS Log Files Format, Search Engine Spider in Internet Information Services</title>
		<link>http://www.gordonchoi.com/iis-log-files-format-search-engine-spider-in-internet-information-services-20120315?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iis-log-files-format-search-engine-spider-in-internet-information-services</link>
		<comments>http://www.gordonchoi.com/iis-log-files-format-search-engine-spider-in-internet-information-services-20120315#comments</comments>
		<pubDate>Thu, 15 Mar 2012 12:43:12 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=6975</guid>
		<description><![CDATA[Websites&#8217; log files contain both user and search engine spider information for webmasters and SEO professionals to analyze. Log files also have information that web analytics tools (e.g. Google Analytics) isn&#8217;t able to provide. SEO Glossary has a short description of log file: A Log file (or web server log) records all information about a [...]]]></description>
			<content:encoded><![CDATA[<p>Websites&#8217; log files contain both user and search engine spider information for webmasters and SEO professionals to analyze. Log files also have information that <a href="http://www.gordonchoi.com/cat/web-analytics">web analytics</a> tools (e.g. <a href="http://www.gordonchoi.com/cat/google-analytics">Google Analytics</a>) isn&#8217;t able to provide.</p>
<p><a href="http://www.gordonchoi.com/seo-glossary-20101114">SEO Glossary</a> has a short description of log file:</p>
<blockquote><p>A Log file (or web server log) records all information about a website&#8217;s incoming and outgoing traffic, including search engine spider activities, that can be analyzed by webmasters to improve a site&#8217;s SEO.</p></blockquote>
<p><strong>What is IIS?</strong></p>
<p>Wikipedia <a href="http://en.wikipedia.org/wiki/Internet_Information_Services">defines</a> &#8220;Internet Information Services&#8221;:</p>
<blockquote><p>Internet Information Services (IIS) – formerly called Internet Information Server – is a web server application and set of feature extension modules created by Microsoft for use with Microsoft Windows. It is the most used web server after Apache HTTP Server.</p></blockquote>
<p>If your website is hosted on a Microsoft Internet Information Services (IIS), you should:</p>
<ul>
<li>Log (record) all the requests to your site</li>
<li>Extract the information from the log files</li>
<li>Review and analyze the log files on a regular basis</li>
</ul>
<p><strong>IIS Log Format, IIS Log Field Definitions</strong></p>
<p>An IIS log file can have 22 fields. Microsoft&#8217;s official IIS log site <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/676400bc-8969-4aa7-851a-9319490a9bbb.mspx?mfr=true">provides</a> definitions for all the IIS log fields:</p>
<p>==============</p>
<p>EXAMPLE</p>
<p><strong>FIELD</strong> &#8211; [<code>Field Name</code>]</p>
<p>Definition.</p>
<p>==============</p>
<p><strong>Date</strong> &#8211; [<code>date</code>]</p>
<p>Date when the request occurs.</p>
<p><strong>Time</strong> &#8211; [<code>time</code>]</p>
<p>Time (Coordinated Universal Time, UTC) when the request occurs.</p>
<p><strong>Service Name and Instance Number</strong> &#8211; [<code>s-sitename</code>]</p>
<p>Internet service name and instance number that is running on the client.</p>
<p><strong>Server Name</strong> &#8211; [<code>s-computername</code>]</p>
<p>Name of the server where the log file entry is generated.</p>
<p><strong>Server IP Address</strong> &#8211; [<code>s-ip</code>]</p>
<p>Server&#8217;s IP.</p>
<p><strong>Method</strong> &#8211; [<code>cs-method</code>]</p>
<p>The method used when the web page is requested, e.g. Get method or Post method.</p>
<p><strong>URI Stem</strong> &#8211; [<code>cs-uri-stem</code>]</p>
<p>A target (e.g. a file) on your site is requested, e.g. If the home page of your site is requested: <code>index.asp</code>.</p>
<p><strong>URI Query</strong> &#8211; [<code>cs-uri-query</code>]</p>
<p>A Universal Resource Identifier (URI) query is needs only when the client requests dynamic web pages. The URL Query (<code>cs-uri-query</code>) contains the the portion after the &#8220;?&#8221; symbol of the URL.</p>
<p><strong>Server Port</strong> &#8211; [<code>s-port</code>]</p>
<p>Server port number configured for the service.</p>
<p><strong>User Name</strong> &#8211; [<code>cs-username</code>]</p>
<p>Name of the authenticated user who accesses the server. Anonymous users are indicated by a hyphen (-).</p>
<p><strong>Client IP Address</strong> &#8211; [<code>c-ip</code>]</p>
<p>Client&#8217;s IP.</p>
<p><strong>Protocol Version</strong> &#8211; [<code>cs-version</code>]</p>
<p>Protocol version used when the request is made by the client. Protocol can either be HTTP or FTP, e.g. <code>HTTP/1.1</code></p>
<p><strong>User Agent</strong> &#8211; [<code>cs(User-Agent)</code>]</p>
<p>User agent is the browser type that the client used.</p>
<ul>
<li>When a human user requests a specific web page (URL) of your site through a browser, the name and version of the browser are recorded.</li>
<li>When a search engine spider (e.g. Googlebot) requests a specific web page (URL) of your site, the search engine spider information/name is recorded.</li>
</ul>
<p><strong>Cookie</strong> &#8211; [<code>cs(Cookie)</code>]</p>
<p>Content of the cookie sent or received.</p>
<p><strong>Referrer</strong> &#8211; [<code>cs(Referer)</code>]</p>
<p>Referrer is the website that referred the visit to your site.</p>
<ul>
<li>The IIS log captures the referrer as a referral URL.</li>
<li>Web analytics tools (e.g. Google Analytics) also provide referral site / referral URL information.</li>
<li>If a user is referred through a search engine&#8217;s organic results (e.g. Google&#8217;s organic SERP), then the user&#8217;s search query will be included in the referrer. <a href="http://www.gordonchoi.com/cat/google-webmaster-tools">Google Webmaster Tools</a> does provide Google users&#8217; <a href="http://www.gordonchoi.com/google-webmaster-tools-search-queries-20100513">search query report</a>.</li>
</ul>
<p><strong>Host</strong> &#8211; [<code>cs-host</code>]</p>
<p>The host&#8217;s header name, e.g. <code>www.gordonchoi.com</code></p>
<p><strong>HTTP Status</strong> &#8211; [<code>sc-status</code>]</p>
<p>HTTP status code.</p>
<ul>
<li>Microsoft <a href="http://support.microsoft.com/kb/318380">provides</a> this official list of HTTP Status Codes on <code>1xx</code>, <code>2xx</code>, <code>3xx</code>, <code>4xx</code>, and <code>5xx</code>.</li>
</ul>
<p><strong>Protocol Substatus</strong> &#8211; [<code>sc-substatus</code>]</p>
<p>Substatus error code.</p>
<p><strong>Win32 Status</strong> &#8211; [<code>sc-win32-status</code>]</p>
<p>Windows status code.</p>
<p><strong>Bytes Sent</strong> &#8211; [<code>sc-bytes</code>]</p>
<p>Number of bytes the server sends to the client during the request, in bytes.</p>
<p><strong>Bytes Received</strong> &#8211; [<code>cs-bytes</code>]</p>
<p>Number of bytes the server receives from the client during the request, in bytes.</p>
<p><strong>Time Taken</strong> &#8211; [<code>time-taken</code>]</p>
<p>Length of time the request takes, in milliseconds (ms).</p>
<ul>
<li>Google has confirmed <a href="http://www.gordonchoi.com/optimize-website-page-load-time-20091212">website&#8217;s page load time</a> is a factor in Google&#8217;s ranking algorithm.</li>
</ul>
<p><strong>Log File Analysis</strong></p>
<p>Through the IIS log files:</p>
<ul>
<li>Webmasters can review site and/or web page errors through errors that show up in <a href="http://www.gordonchoi.com/http-status-codes-2xx-3xx-4xx-5xx-20120116">HTTP Status Codes</a> (<code>sc-status</code>). Actions should be taken depending on the HTTP status code errors (e.g. 302, 404, 500, 503).</li>
<li>Webmasters / SEO professionals can review different search engine spiders&#8217; behavior to the site through the <code>cs(User-Agent)</code> field. After analyzing the search engine spider information, actions may be taken to optimize how Googlebot or other spiders access/crawl your site.</li>
</ul>
<p>Tools to analyze IIS log files:</p>
<ul>
<li><a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&#038;id=24659">Log Parser</a> &#8211; You will need to apply some specific <a href="http://blogs.iis.net/carlosag/archive/2010/03/25/analyze-your-iis-log-files-favorite-log-parser-queries.aspx">SQL queries</a> when Log Parser.</li>
<li>Most of the programming languages (e.g. C, PHP, Python) allow you to apply customized queries to IIS logs, but coding skills/experience is required to the programming languages you choose to use.</li>
<li><a href="http://www.nihuo.com/">Nihuo Weblog Analyzer</a> &#8211; Allows you to generate a wide range of website statistics from your IIS log file and present in over 80 different reports, without SQL query writing skills or programming language experience.</li>
</ul>
<p><strong>Search Engine Spiders in IIS</strong></p>
<p>The behavior of search engine spiders to your Internet Information Services (IIS) hosted website can be found in your site&#8217;s IIS log files. In the IIS logs, the <code>cs(User-Agent)</code> field records the search engine spiders.</p>
<ul>
<li>Google&#8217;s spider: <code>Googlebot</code></li>
<li>Bing&#8217;s spider: <code>msnbot</code> or <code>Bingbot</code></li>
<li>Yahoo&#8217;s spider: <code>Slurp</code></li>
<li>Yandex&#8217;s spider: <code>YandexBot</code></li>
<li>Baidu&#8217;s spider: <code>Baiduspider</code></li>
<li>Sogou&#8217;s spider: <code>Sogou+web+spider</code> or <code>New-Sogou-Spider</code></li>
<li>Soso&#8217;s spider: <code>Sosospider</code></li>
<li>Youdao&#8217;s spider: <code>YoudaoBot</code></li>
<li>Naver&#8217;s spider: <code>Yeti</code></li>
<li>Daum&#8217;s spider: <code>Daumoa</code></li>
</ul>
<p>Search engine spiders of each of the search engines look like the below in IIS log&#8217;s <code>cs(User-Agent)</code> field.</p>
<p><strong>Google&#8217;s Search Engine Spiders</strong></p>
<p><a href="http://www.gordonchoi.com/cat/google">Google</a> Web	 Search:</p>
<ul>
<li><code>Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html)</code></li>
</ul>
<p>Google Image:</p>
<ul>
<li><code>Googlebot-Image/1.0</code></li>
</ul>
<p>Google Feed:</p>
<ul>
<li><code>Feedfetcher-Google;+(+http://www.google.com/feedfetcher.html;+feed-id=xxxxx)</code></li>
</ul>
<p>Google Ads:</p>
<ul>
<li><code>AdsBot-Google+(+http://www.google.com/adsbot.html)</code></li>
<li><code>Mediapartners-Google</code></li>
</ul>
<p>Google Ads for Mobile:</p>
<ul>
<li><code>AdsBot-Google-Mobile+(+http://www.google.com/mobile/adsbot.html)+Mozilla+(iPhone;+U;+CPU+iPhone+OS+3+0+like+Mac+OS+X)+AppleWebKit+(KHTML,+like+Gecko)+Mobile+Safari</code></li>
</ul>
<p><strong>Bing Search Engine Spiders</strong></p>
<p><a href="http://www.gordonchoi.com/cat/bing">Bing</a> Web Search:</p>
<ul>
<li><code>Mozilla/5.0+(compatible;+bingbot/2.0;++http://www.bing.com/bingbot.htm)</code></li>
<li><code>msnbot/2.0b+(+http://search.msn.com/msnbot.htm)</code></li>
</ul>
<p>Bing Ads:</p>
<ul>
<li><code>msnbot-media/1.1+(+http://search.msn.com/msnbot.htm)</code></li>
</ul>
<p><strong>Yahoo Search Engine Spider</strong></p>
<p><a href="http://www.gordonchoi.com/cat/yahoo">Yahoo</a> Slurp Web Search:</p>
<ul>
<li><code>Mozilla/5.0+(compatible;+Yahoo!+Slurp/3.0;+http://help.yahoo.com/help/us/ysearch/slurp)</code></li>
<li><code>Mozilla/5.0+(compatible;+Yahoo!+Slurp;+http://help.yahoo.com/help/us/ysearch/slurp)</code></li>
</ul>
<p><strong>Baidu Search Engine Spiders</strong></p>
<p><a href="http://www.gordonchoi.com/cat/baidu">Baidu</a> Web Search:</p>
<ul>
<li><code>Baiduspider+(+http://www.baidu.com/search/spider.htm)</code></li>
<li><code>Mozilla/5.0+(compatible;+Baiduspider/2.0;++http://www.baidu.com/search/spider.html)</code></li>
</ul>
<p>Baidu Video Search:</p>
<ul>
<li><code>Baiduspider-video+(+http://www.baidu.com/search/spider.htm)</code></li>
</ul>
<p>You can block Baiduspider&#8217;s access to your web pages by writing instructions in <a href="http://www.gordonchoi.com/baidu-robots-txt-20100420">Baidu robots.txt</a>.</p>
<p><strong>Sogou&#8217;s Search Engine Spider</strong></p>
<p><a href="http://www.gordonchoi.com/sogou-chinese-search-engine-www-sogou-com-20110327">Sogou</a> Web Search:</p>
<ul>
<li><code>New-Sogou-Spider/1.0+(compatible;+MSIE+5.5;+Windows+98)</code></li>
<li><code>Sogou+web+spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)</code></li>
</ul>
<p><strong>Soso&#8217;s Search Engine Spider</strong></p>
<p>Soso Web Search:</p>
<ul>
<li><code>Sosospider+(+http://help.soso.com/webspider.htm)</code></li>
</ul>
<p><strong>Yahoo China&#8217;s Search Engine Spider</strong></p>
<p>Yahoo Slurp China:</p>
<ul>
<li><code>Yahoo!+Slurp+China</code></li>
</ul>
<p><strong><a href="http://www.gordonchoi.com/www-youdao-com-youdao-chinese-search-engine-20110520">Youdao</a> Search Engine Spider</strong></p>
<p>Youdao Web Search:</p>
<ul>
<li><code>Mozilla/5.0+(compatible;+YoudaoBot/1.0;+http://www.youdao.com/help/webmaster/spider/;+)</code></li>
</ul>
<p><strong>Yandex&#8217;s Search Engine Spider</strong></p>
<p><a href="http://www.gordonchoi.com/yandex-russian-search-engine-20101201">Yandex</a> Web Search:</p>
<ul>
<li><code>Mozilla/5.0+(compatible;+YandexBot/3.0;++http://yandex.com/bots)</code></li>
</ul>
<p><strong>Naver&#8217;s Search Engine Spider</strong></p>
<p>Naver Web Search:</p>
<ul>
<li><code>Yeti/1.0+(NHN+Corp.;+http://help.naver.com/robots/)</code></li>
</ul>
<p><strong>Daum&#8217;s Search Engine Spider</strong></p>
<p>Daum Web Search:</p>
<ul>
<li><code>Mozilla/5.0+(compatible;+MSIE+or+Firefox+mutant;+not+on+Windows+server;++http://ws.daum.net/aboutWebSearch.html)+Daumoa/2.0</code></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/iis-log-files-format-search-engine-spider-in-internet-information-services-20120315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Plus SEO Tips, Google Search Plus Your World Ranking Algorithm</title>
		<link>http://www.gordonchoi.com/google-plus-seo-tips-google-search-plus-your-world-ranking-algorithm-20120302?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-plus-seo-tips-google-search-plus-your-world-ranking-algorithm</link>
		<comments>http://www.gordonchoi.com/google-plus-seo-tips-google-search-plus-your-world-ranking-algorithm-20120302#comments</comments>
		<pubDate>Fri, 02 Mar 2012 13:12:28 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Google+]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7238</guid>
		<description><![CDATA[Google Plus Social Network allows you to build brand visibility and traffic to your site, when your brand and/or links to your site show up on: Google+ posts Google Search Plus Your World Google Search Plus Your World Google Search Plus Your World was launched with official explanation from Google. Three new features are to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gordonchoi.com/google-plus-social-network-new-google-web-search-interface-20110702">Google Plus Social Network</a> allows you to build brand visibility and traffic to your site, when your brand and/or links to your site show up on:</p>
<ul>
<li>Google+ posts</li>
<li>Google Search Plus Your World</li>
</ul>
<p><strong>Google Search Plus Your World</strong></p>
<p>Google Search Plus Your World was launched with <a href="http://googleblog.blogspot.com/2012/01/search-plus-your-world.html">official explanation</a> from Google. Three new features are to show up on Google&#8217;s search results pages:</p>
<ul>
<li><strong>Personal Results</strong> &#8211; Which enable you to find information just for you, such as Google+ photos and posts—both your own and those shared specifically with you, that only you will be able to see on your results page.</li>
<li><strong>Profiles in Search</strong> &#8211; Both in autocomplete and results, which enable you to immediately find people you’re close to or might be interested in following.</li>
<li><strong>People and Pages</strong> &#8211; Which help you find people profiles and Google+ pages related to a specific topic or area of interest, and enable you to follow them with just a few clicks. Because behind most every query is a community.</li>
</ul>
<p><strong>Google Search Plus Box Ranking Factors</strong></p>
<p><a href="http://www.conversationmarketing.com/2012/02/google-plus-box-ranking-factors-report.htm">Conversation Marketing</a> explains the ranking factors for your <a href="http://www.gordonchoi.com/google-plus-social-network-profile-url-shortener-gplus-to-20110707">Google Plus Profiles</a> to show up on Google Search Plus Your World&#8217;s &#8220;Plus Boxes&#8221;. The ranking factors from the most important to least important:</p>
<ul>
<li>Reach</li>
<li>Circle membership &#8211; Circle influential people with big circle membership.</li>
<li>Freshness</li>
<li>Post frequency &#8211; At least a few times a day. Remember, these posts can be re-shares or links to other interesting stuff you found on the web. It doesn’t have to all be original. Try to gain relevance for the non-commodity term that fits your industry. &#8220;Design&#8221;, not &#8220;Designer&#8221;. &#8220;Fashion&#8221;, not &#8220;Jeans&#8221;.</li>
<li>Average plus ones per post</li>
<li>Re-shares and replies (comments) per post &#8211; Comment on and re-share their stuffs that will get your followers to respond to them, and get you noticed. It&#8217;ll also help your own reach, as your re-shares are more likely to get passed around.</li>
</ul>
<p>Factors that have little or no effect to Google+ SEO:</p>
<ul>
<li>Keyword relevance of your &#8216;about&#8217; tab: Four profiles get consistent plus box placement for &#8216;seo&#8217;. Only two of them shows &#8216;SEO&#8217; as the #1 topic in their about tab. Every profile has SEO as a topic, according to the content analysis API. But in two cases, it&#8217;s the third-ranking topic or lower.</li>
<li>Topical relevance of your &#8216;about&#8217; tab: That said, all plus box profiles for every test query had about tabs relevant to the overall &#8216;space&#8217;. All ranking &#8216;seo&#8217; profiles, for example, cluster around search, search marketing, the industry and related topics. All &#8216;movies&#8217; profiles cluster around show business. Meh. That could mean anything. But at least a bike shorts manufacturer won&#8217;t start showing up in SEO rankings (we hope).</li>
<li>Keyword relevance of your posts: Totally meaningless. Write whatever you want. Seriously. Just make it good.</li>
</ul>
<p><strong>Google Plus SEO Best Practices</strong></p>
<p>Blind Five Year Old has listed the 9 items of Google+ <a href="http://www.gordonchoi.com/cat/seo">SEO</a> Best Practices:</p>
<ul>
<li><strong>Optimize your Google+ Profile</strong> &#8211; Fill out your Introduction, Employment, Education and Places lived understanding that the text in these sections is used for Google+ search. If you want to be returned for the term &#8216;SEO&#8217; you need to have that term in one of these fields. Placing the term in two or more fields seems to deliver some added benefit. Do it if it makes sense but don&#8217;t go overboard.</li>
<li><strong>Get Verified</strong> &#8211; A verified name with that small checkmark icon seems to have some influence on Google+ search. When I figure out exactly how to make this happen I&#8217;ll let you know.</li>
<li><strong>Confirm Authorship</strong> &#8211; Google+ is an identity platform that allows you to claim Authorship of your content. Doing so delivers a type of rich snippet in search results that will increase the visibility and click-through rate on your content today and may put you in the catbird&#8217;s seat when Google implements AuthorRank.</li>
<li><strong>Use the +1 Button</strong> &#8211; Put the +1 button on your site prominently so users can deliver your content to Google+. Not only will this result in traffic to your site, it allows Google to understand how people are engaging with your content.</li>
<li><strong>Optimize Social Snippets</strong> &#8211; It&#8217;s not enough to just create content and have the +1 button on your site. Optimize your social snippet to ensure you&#8217;re getting the most engagement out of your content.</li>
<li><strong>Create Great Content</strong> &#8211; Put this in the &#8216;no duh&#8217; category, but really, create great content. It&#8217;s not enough on its own but everything gets easier if you do this.</li>
<li><strong>Share Great Content</strong> &#8211; Great content takes time so you won&#8217;t always be sharing your content. Instead, share the great content of others. Make your Google+ feed valuable and interesting and you&#8217;ll be rewarded.</li>
<li><strong>Format Google+ Posts</strong> &#8211; Just putting a URL as your Google+ post won&#8217;t cut it. Create a bold title for each of your (longer) posts. Not only is this easier to read it&#8217;s what Google will use as the browser Title on Search+. You should also start to use hashtags, sparingly, to ensure your posts are aggregated appropriately.</li>
<li><strong>Use Google+</strong> &#8211; Really use Google+. Using it for the express purpose of SEO won&#8217;t be successful. Do or do not. There is no try.</li>
</ul>
<p>Search Engine Land has <a href="http://searchengineland.com/two-google-seo-guides-you-should-read-111703">summarized</a> Blind Five Year Old&#8217;s investigation on the possible ranking considerations when searching inside Google+ itself &#8211; Factors that influence Google&#8217;s search results when you type &#8220;SEO&#8221; into the Google+ search box and look for relevant other Google Plus users:</p>
<ul>
<li>The search term must appear in one of these sections of your profile: Introduction, Employment, Education or Places. For example, Danny Sullivan didn&#8217;t show up in Google+ searches for &#8220;SEO&#8221; until he added that keyword into the Introduction section of his Google+ profile.</li>
<li>Using the keyword in more than one of those fields helps.</li>
<li>The &#8220;Occupation&#8221; field isn&#8217;t used.</li>
<li>There&#8217;s already a fair amount of spamming of these profile fields happening.</li>
</ul>
<p><strong>Google Plus SEO Example</strong></p>
<p>Smart Insights <a href="http://www.smartinsights.com/search-engine-optimisation-seo/seo-strategy/google-plus-seo/">demonstrates</a> a Google Plus example on H&#038;M in which the brand has managed to hijack a large portion of the search engine results page for &#8216;David Beckham&#8217;. If you count up the individual items, there are more than ten individual links through to H&#038;M&#8217;s Google+ content when logged in, zero when not logged in.</p>
<p>H&#038;M has achieved 2 things at the most basic level:</p>
<ul>
<li>Grown a large Google+ following – Big enough that they affect more than 500,000 peoples&#8217; search results when they are logged into G+.</li>
<li>Shared a lot of content related to David Beckham on Google+.</li>
</ul>
<p>And when H&#038;M&#8217;s followers reshare their Google+ content, and you&#8217;re following their sharers, the effect spreads much further.</p>
<p><strong>Google Plus Growth Data (from Compete.com)</strong></p>
<p>Compete.com <a href="http://blog.compete.com/2012/02/08/google-social-is-exploding-online/">reported</a> on Google Plus data:</p>
<ul>
<li>Unique visits in December 2011: Google Plus (20 million) vs Twitter (40.4 million)</li>
<li>Google+&#8217;s December unique visits have increased 4 times from July&#8217;s 5 million</li>
<li>The plusone.google.com sub-domain had 60 million unique visits in December 2011</li>
</ul>
<p><strong>Google Plus for Social Media Marketing</strong></p>
<p>For Google+ social media marketers to get the most out of Google Plus:</p>
<ul>
<li><a href="http://www.gordonchoi.com/add-google-1-button-to-websites-20110602">Add Google +1 Buttons to Websites</a> &#8211; Add +1 buttons to your site</li>
<li><a href="http://www.gordonchoi.com/google-plus-social-network-profile-url-shortener-gplus-to-20110707">Google Plus Profile URL Shorterner</a> &#8211; Make your Google+ Profile easy to remember</li>
<li><a href="http://www.gordonchoi.com/google-analytics-social-reports-track-facebook-likes-twitter-tweets-google-1-20110723">Google Analytics Social Reports for Google +1</a> &#8211; Review the performance of the +1 social engagement, social actions and social pages in <a href="http://www.gordonchoi.com/cat/google-analytics">Google Analytics</a></li>
<li><a href="http://www.gordonchoi.com/google-plus-keyboard-shortcuts-20111121">Google Plus Keyboard Shortcuts</a> &#8211; Learn the keyboard shortcuts</li>
<li><a href="http://www.gordonchoi.com/google-plus-invitations-20110813">Google Plus Invitations</a> &#8211; Invite more people to join Google+</li>
<li><a href="http://www.gordonchoi.com/google-plus-experts-on-google-plus-social-network-20111114">Google Plus Experts on Google Plus Social Network</a> &#8211; Follow the Google Plus Experts</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/google-plus-seo-tips-google-search-plus-your-world-ranking-algorithm-20120302/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Online Travel Industry Blogs, Sites</title>
		<link>http://www.gordonchoi.com/online-travel-industry-blogs-sites-20120223?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=online-travel-industry-blogs-sites</link>
		<comments>http://www.gordonchoi.com/online-travel-industry-blogs-sites-20120223#comments</comments>
		<pubDate>Thu, 23 Feb 2012 14:36:54 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Blogging]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7036</guid>
		<description><![CDATA[In the travel industry, travel search engines and travel websites allow travelers to search and book flight tickets, hotel rooms, vacation packages and other travel packages. Travel industry blogs and sites offer travel industry news on hotels, air flights, cruises and car rentals, and information on travel technologies, travel marketing and online travel agencies. Tnooz [...]]]></description>
			<content:encoded><![CDATA[<p>In the travel industry, <a href="http://www.gordonchoi.com/travel-search-engines-travel-websites-20110916">travel search engines and travel websites</a> allow travelers to search and book flight tickets, hotel rooms, vacation packages and other travel packages. Travel industry blogs and sites offer travel industry news on hotels, air flights, cruises and car rentals, and information on travel technologies, travel marketing and online travel agencies.</p>
<p><strong>Tnooz</strong></p>
<p><a href="http://www.tnooz.com/">Tnooz</a> &#8211; Global provider of news, analysis, commentary, data and business services to the travel, tourism and hospitality industry, focusing on travel technology, web strategy, social media and marketing.</p>
<p><strong>Hotel Marketing</strong></p>
<p><a href="http://www.hotelmarketing.com/">Hotel Marketing</a> &#8211; Curated online travel and online marketing news for hotel marketers and hoteliers since 1997.</p>
<p><strong>Travel Weekly</strong></p>
<p><a href="http://www.travelweekly.com/">Travel Weekly</a> &#8211; Travel trade weekly publication for the travel industry, covering topics in hotels, aviation, cruise, ground transportation, travel technology, online travel, and corporate travel.</p>
<p><strong>Gadling</strong></p>
<p><a href="http://www.gadling.com/">Gadling</a> &#8211; Interesting, relevant travel stories, from travel tips to travel technology, and from budget to adventure travel.</p>
<p><strong>Travel Rants</strong></p>
<p><a href="http://www.travel-rants.com/">Travel Rants</a> &#8211; Deals with travel problems and holiday complaints.</p>
<p><strong>Space Travel</strong></p>
<p><a href="http://space.travel/">Space Travel</a> &#8211; Space tourism destination website with resource for space adventurers seeking a personal perspective in space travel, allowing travelers to share space experience and trip reviews.</p>
<p><strong>Airline Trends</strong></p>
<p><a href="http://www.airlinetrends.com/">Airline Trends</a> &#8211; Commercial innovations and developments in the global aviation industry for marketers, product developers, managers, researchers, and suppliers.</p>
<p><strong>eHotelier</strong></p>
<p><a href="http://ehotelier.com/">eHotelier</a> &#8211; Hospitality industry news for hoteliers, executives, travel companies, research firms, marketing groups, technology/service providers, publishers and hotel schools/universities, since 1999.</p>
<p><strong>Rezgo T4 Blog</strong></p>
<p><a href="http://tourismtechnology.rezgo.com/">Rezgo T4 Blog</a> &#8211; T4 stands for travel and tourism technology trends, created by Stephen Joyce. T4 is a blog sponsored by Rezgo, a next generation web 2.0 tour and activity booking engine for SME travel suppliers and tour operators.</p>
<p><strong>Lonely Planet Blog</strong></p>
<p><a href="http://www.lonelyplanet.com/blog/">Lonely Planet Blog</a> &#8211; Travel advice, information and inspiration from Lonely Planet&#8217;s online community.</p>
<p><strong>United States Travel Association</strong></p>
<p><a href="http://www.ustravel.org/sites/default/files/page/2009/11/USTravelAnswerSheet.pdf">US Travel Answer Sheet (PDF)</a> &#8211; Facts about a leading American industry that&#8217;s more than just fun, created by <a href="http://www.ustravel.org/">US Travel Association</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/online-travel-industry-blogs-sites-20120223/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Ends Flash Technology, Steve Jobs Thoughts on Flash, HTML5 vs Flash</title>
		<link>http://www.gordonchoi.com/adobe-ends-flash-technology-steve-jobs-thoughts-on-flash-html5-vs-flash-20120220?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=adobe-ends-flash-technology-steve-jobs-thoughts-on-flash-html5-vs-flash</link>
		<comments>http://www.gordonchoi.com/adobe-ends-flash-technology-steve-jobs-thoughts-on-flash-html5-vs-flash-20120220#comments</comments>
		<pubDate>Mon, 20 Feb 2012 13:40:24 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[B2C Websites]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7157</guid>
		<description><![CDATA[Adobe officially announced in November 2011 that Adobe&#8217;s technology focus for the future is to give up on the development of Flash and adopt more on HTML5. Definitions of Adobe&#8217;s Flash and HTML5 on Wikipedia: Adobe Flash (formerly Macromedia Flash) is a multimedia platform used to add animation, video, and interactivity to web pages. Flash [...]]]></description>
			<content:encoded><![CDATA[<p>Adobe officially announced in November 2011 that Adobe&#8217;s technology focus for the future is to give up on the development of Flash and adopt more on HTML5.</p>
<p>Definitions of <a href="http://en.wikipedia.org/wiki/Adobe_Flash">Adobe&#8217;s Flash</a> and <a href="http://en.wikipedia.org/wiki/HTML5">HTML5</a> on Wikipedia:</p>
<blockquote><p>
<strong>Adobe Flash</strong> (formerly Macromedia Flash) is a multimedia platform used to add animation, video, and interactivity to web pages. Flash is frequently used for advertisements, games and flash animations for broadcast. More recently, it has been positioned as a tool for &#8220;Rich Internet Applications&#8221; (&#8220;RIAs&#8221;).</p>
<p><strong>HTML5</strong> is a language for structuring and presenting content for the World Wide Web, and is a core technology of the Internet originally proposed by Opera Software. It is the fifth revision of the HTML standard (created in 1990 and standardized as HTML4 as of 1997) and as of December 2011 is still under development. Its core aims have been to improve the language with support for the latest multimedia while keeping it easily readable by humans and consistently understood by computers and devices (web browsers, parsers, etc.).
</p></blockquote>
<p><strong>Adobe&#8217;s Chief Engineer Mike Chamber Clarifies Future of Flash</strong></p>
<p>Adobe&#8217;s Chief Engineer Mike Chamber <a href="http://www.mikechambers.com/blog/2011/11/11/clarifications-on-flash-player-for-mobile-browsers-the-flash-platform-and-the-future-of-flash/">says</a>:</p>
<ul>
<li>We are focusing work around the Flash Platform on mobile applications created with Adobe AIR and expressive content (particularly games and video) in the browser on the desktop via the Flash Player.</li>
<li>We are further increasing the amount of resources (both money and engineer) toward HTML5 tools, solutions and browsers.</li>
<li>We are no longer going to be actively developing the Flash Player for mobile browsers.</li>
</ul>
<p><strong>Why did Adobe decide to no longer develop the Flash Player for mobile browsers?</strong></p>
<p><em>The Flash Player was not going to achieve the same ubiquity on mobile as it has on the desktop</em></p>
<p>This one should be pretty apparent, but given the fragmentation of the mobile market, and the fact that one of the leading mobile platforms (Apple’s iOS) was not going to allow the Flash Player in the browser, the Flash Player was not on track to reach anywhere near the ubiquity of the Flash Player on desktops.</p>
<p>This effectively meant that if you wanted to use Flash to deliver a rich web experience in the browser on mobile devices you would have to provide both a Flash based, as well as HTML5 based solution. Given the strong support for HTML5 across modern mobile devices, it simply made more sense to create an HTML5 based solution. Now, there are some exceptions to this, especially around advanced video content, but it is very clear that HTML5 is the solution to turn to if you want to provide a richer browser based experience that works across browsers on mobile devices.</p>
<p>Just to be very clear on this. No matter what we did, the Flash Player was not going to be available on Apple’s iOS anytime in the foreseeable future.</p>
<p><em>Ubiquity of HTML5 on mobile browsers</em></p>
<p>Related to the point above, HTML5 has very strong support on modern mobile devices and tablets. Indeed, on mobile devices, it has a level of ubiquity similar to what the Flash Player has on the desktop. While performance and implementations haven’t always been great or consistent across devices, they have continued to improve at a pretty dramatic rate (just look at the insane Canvas performance increases between iOS 4 and 5).</p>
<p>This new generation of smart phones and tablets (ushered in by the original Apple iPhone) are only a couple of years old. Because of this, the rendering engines deployed on these devices (most WebKit based) were all also relatively new and modern. The end result is that when developing for mobile devices and tablets today, you don’t have to deal with legacy browsers as you do on the desktop.</p>
<p>On mobile devices HTML5 provides a similar level of ubiquity that the Flash Player provides on the desktop. It is the best technology for creating and deploying rich content to the browser across mobile platforms.</p>
<p>Our goal has always been to obtain the same level of ubiquity for the Flash Player on mobile browsers, but, at the end of the day, it is something that did not, and was not going to happen.</p>
<p><em>Differences in how users consume rich content on mobile devices compared to the desktop</em></p>
<p>On the desktop, users are used to consuming rich content (such as games and applications) via both the browser and native applications. However, on mobile devices users are much more likely to look exclusively toward applications for consuming rich content. The mobile platforms make it very easy to discover new content and applications by providing tight integration between the app stores (Apple App Store, Android Marketplace, etc..) and the mobile operating system. In general, users do not look to the web on mobile devices for finding and consuming rich content (such as games and applications).</p>
<p>There are a number of reasons for this, including:</p>
<ul>
<li>Differences in screen sizes, resolution and interaction models between mobile devices and desktop PCs.</li>
<li>Generally slower, and higher latency network connections (which is often metered) on mobile devices, which makes it cumbersome, sometimes expensive, and sometimes impossible to repeatedly load rich content from the web on demand.</li>
<li>The tight integration with the underlying operating systems that native applications provide.</li>
<li>The tight integration between mobile app stores and the mobile operating systems, which removes most of the friction for discovering new content.</li>
</ul>
<p>When a user wants to play a game on a mobile device they turn to the app store for their platform. This makes it very easy for them to discover and install new content. This content can then be quickly accessed regardless of their network connectivity.</p>
<p>Essentially, users’ preferences to consume rich content on mobile devices via applications means that there is not as much need or demand for the Flash Player on mobile devices as there is on the desktop.</p>
<p><em>Scalability of developing plugins for mobile browsers</em></p>
<p>Developing the Flash Player for mobile browsers has proven to require much more resources than we anticipated. When building the player for desktop browsers, we can target well defined plugin APIs provided by the browsers. While we do have close relationships will all of the browser vendors (including Google, Apple, Firefox, Microsoft), as a general rule we can do most of our development using the existing APIs.</p>
<p>However, in the mobile ecosystem, we have to work very closely with other companies engineers on a number of levels:</p>
<ul>
<li>Mobile Operating System Vendors (such as Google and RIM)</li>
<li>Hardware Device Manufacturers (such as Motorola and Samsung)</li>
<li>Component Manufacturers (such as NVIDIA)</li>
</ul>
<p>While we have good relationships on all levels of this ecosystem, having to do specific work for different combinations of OS, Hardware and event components has taken a significant amount of resources. For each new device, browser and operating system released, the resources required to develop, test and maintain the Flash Player also increases. This is something that we realized is simply not scalable or sustainable.</p>
<p>I have seen a couple of questions asking how Adobe AIR is different. There are a couple of differences which make AIR development significantly less resource intensive, including a more well defined API that we can target, as well as not needing to worry about differences in browsers or new browser versions. Ultimately though, developers are building successful applications with Adobe AIR, and thus it makes sense for us to continue to invest in it.</p>
<p><em>Shifting some Resources from Flash to HTML5</em></p>
<p>Finally, given the growth of HTML5 on both mobile and desktop browsers, we decided to more evenly balance our resources dedicate between Flash and HTML5.</p>
<p>Halting development on the Flash Player for mobile devices frees up resources for HTML5 development (tooling, frameworks, browsers).</p>
<p>I understand that not everyone may not agree with all of the conclusions drawn above. However, given these points, along with the increasing complexity and costs of developing the Flash Player for mobile browsers, we decided that further development was not the best use of our engineering resources.</p>
<p><strong>Steve Jobs&#8217; Thoughts on Flash</strong></p>
<p>Apple&#8217;s <a href="http://www.gordonchoi.com/steve-jobs-1955-2011-20111006">Steve Jobs</a> has <a href="http://www.apple.com/hotnews/thoughts-on-flash/">expressed</a> his thoughts on flash in May 2010:</p>
<p>I wanted to jot down some of our thoughts on Adobe’s Flash products so that customers and critics may better understand why we do not allow Flash on iPhones, iPods and iPads. Adobe has characterized our decision as being primarily business driven – they say we want to protect our App Store – but in reality it is based on technology issues. Adobe claims that we are a closed system, and that Flash is open, but in fact the opposite is true. Let me explain.</p>
<p><em>Open:</em></p>
<p>Adobe&#8217;s Flash products are 100% proprietary. They are only available from Adobe, and Adobe has sole authority as to their future enhancement, pricing, etc. While Adobe’s Flash products are widely available, this does not mean they are open, since they are controlled entirely by Adobe and available only from Adobe. By almost any definition, Flash is a closed system.</p>
<p>Apple has many proprietary products too. Though the operating system for the iPhone, iPod and iPad is proprietary, we strongly believe that all standards pertaining to the web should be open. Rather than use Flash, Apple has adopted HTML5, CSS and JavaScript – all open standards. Apple&#8217;s mobile devices all ship with high performance, low power implementations of these open standards. HTML5, the new web standard that has been adopted by Apple, Google and many others, lets web developers create advanced graphics, typography, animations and transitions without relying on third party browser plug-ins (like Flash). HTML5 is completely open and controlled by a standards committee, of which Apple is a member.</p>
<p>Apple even creates open standards for the web. For example, Apple began with a small open source project and created WebKit, a complete open-source HTML5 rendering engine that is the heart of the Safari web browser used in all our products. WebKit has been widely adopted. Google uses it for Android&#8217;s browser, Palm uses it, Nokia uses it, and RIM (Blackberry) has announced they will use it too. Almost every smartphone web browser other than Microsoft&#8217;s uses WebKit. By making its WebKit technology open, Apple has set the standard for mobile web browsers.</p>
<p><em>Full Web:</em></p>
<p>Adobe has repeatedly said that Apple mobile devices cannot access &#8220;the full web&#8221; because 75% of video on the web is in Flash. What they don&#8217;t say is that almost all this video is also available in a more modern format, H.264, and viewable on iPhones, iPods and iPads. YouTube, with an estimated 40% of the web&#8217;s video, shines in an app bundled on all Apple mobile devices, with the iPad offering perhaps the best YouTube discovery and viewing experience ever. Add to this video from Vimeo, Netflix, Facebook, ABC, CBS, CNN, MSNBC, Fox News, ESPN, NPR, Time, The New York Times, The Wall Street Journal, Sports Illustrated, People, National Geographic, and many, many others. iPhone, iPod and iPad users aren’t missing much video.</p>
<p>Another Adobe claim is that Apple devices cannot play Flash games. This is true. Fortunately, there are over 50,000 games and entertainment titles on the App Store, and many of them are free. There are more games and entertainment titles available for iPhone, iPod and iPad than for any other platform in the world.</p>
<p><em>Reliability, Security and Performance:</em></p>
<p>Symantec recently highlighted Flash for having one of the worst security records in 2009. We also know first hand that Flash is the number one reason Macs crash. We have been working with Adobe to fix these problems, but they have persisted for several years now. We don’t want to reduce the reliability and security of our iPhones, iPods and iPads by adding Flash.</p>
<p>In addition, Flash has not performed well on mobile devices. We have routinely asked Adobe to show us Flash performing well on a mobile device, any mobile device, for a few years now. We have never seen it. Adobe publicly said that Flash would ship on a smartphone in early 2009, then the second half of 2009, then the first half of 2010, and now they say the second half of 2010. We think it will eventually ship, but we&#8217;re glad we didn&#8217;t hold our breath. Who knows how it will perform?</p>
<p><em>Battery&#8217;s Life:</em></p>
<p>To achieve long battery life when playing video, mobile devices must decode the video in hardware; decoding it in software uses too much power. Many of the chips used in modern mobile devices contain a decoder called H.264 – an industry standard that is used in every Blu-ray DVD player and has been adopted by Apple, Google (YouTube), Vimeo, Netflix and many other companies.</p>
<p>Although Flash has recently added support for H.264, the video on almost all Flash websites currently requires an older generation decoder that is not implemented in mobile chips and must be run in software. The difference is striking: on an iPhone, for example, H.264 videos play for up to 10 hours, while videos decoded in software play for less than 5 hours before the battery is fully drained.</p>
<p>When websites re-encode their videos using H.264, they can offer them without using Flash at all. They play perfectly in browsers like Apple&#8217;s Safari and Google&#8217;s Chrome without any plugins whatsoever, and look great on iPhones, iPods and iPads.</p>
<p><em>Touch:</em></p>
<p>Flash was designed for PCs using mice, not for touch screens using fingers. For example, many Flash websites rely on &#8220;rollovers&#8221;, which pop up menus or other elements when the mouse arrow hovers over a specific spot. Apple&#8217;s revolutionary multi-touch interface doesn&#8217;t use a mouse, and there is no concept of a rollover. Most Flash websites will need to be rewritten to support touch-based devices. If developers need to rewrite their Flash websites, why not use modern technologies like HTML5, CSS and JavaScript?</p>
<p>Even if iPhones, iPods and iPads ran Flash, it would not solve the problem that most Flash websites need to be rewritten to support touch-based devices.</p>
<p><em>Most Importantly:</em></p>
<p>Besides the fact that Flash is closed and proprietary, has major technical drawbacks, and doesn&#8217;t support touch based devices, there is an even more important reason we do not allow Flash on iPhones, iPods and iPads. We have discussed the downsides of using Flash to play video and interactive content from websites, but Adobe also wants developers to adopt Flash to create apps that run on our mobile devices.</p>
<p>We know from painful experience that letting a third party layer of software come between the platform and the developer ultimately results in sub-standard apps and hinders the enhancement and progress of the platform. If developers grow dependent on third party development libraries and tools, they can only take advantage of platform enhancements if and when the third party chooses to adopt the new features. We cannot be at the mercy of a third party deciding if and when they will make our enhancements available to our developers.</p>
<p>This becomes even worse if the third party is supplying a cross platform development tool. The third party may not adopt enhancements from one platform unless they are available on all of their supported platforms. Hence developers only have access to the lowest common denominator set of features. Again, we cannot accept an outcome where developers are blocked from using our innovations and enhancements because they are not available on our competitor’s platforms.</p>
<p>Flash is a cross platform development tool. It is not Adobe&#8217;s goal to help developers write the best iPhone, iPod and iPad apps. It is their goal to help developers write cross platform apps. And Adobe has been painfully slow to adopt enhancements to Apple’s platforms. For example, although Mac OS X has been shipping for almost 10 years now, Adobe just adopted it fully (Cocoa) two weeks ago when they shipped CS5. Adobe was the last major third party developer to fully adopt Mac OS X.</p>
<p>Our motivation is simple – we want to provide the most advanced and innovative platform to our developers, and we want them to stand directly on the shoulders of this platform and create the best apps the world has ever seen. We want to continually enhance the platform so developers can create even more amazing, powerful, fun and useful applications. Everyone wins – we sell more devices because we have the best apps, developers reach a wider and wider audience and customer base, and users are continually delighted by the best and broadest selection of apps on any platform.</p>
<p><em>Conclusion:</em></p>
<p>Flash was created during the PC era – for PCs and mice. Flash is a successful business for Adobe, and we can understand why they want to push it beyond PCs. But the mobile era is about low power devices, touch interfaces and open web standards – all areas where Flash falls short.</p>
<p>The avalanche of media outlets offering their content for Apple’s mobile devices demonstrates that Flash is no longer necessary to watch video or consume any kind of web content. And the 250,000 apps on Apple&#8217;s App Store proves that Flash isn’t necessary for tens of thousands of developers to create graphically rich applications, including games.</p>
<p>New open standards created in the mobile era, such as HTML5, will win on mobile devices (and PCs too). Perhaps Adobe should focus more on creating great HTML5 tools for the future, and less on criticizing Apple for leaving the past behind.</p>
<p><strong>Periscopic &#8211; Flash vs HTML5 vs Apple iOS</strong></p>
<p>Periscopic has this <a href="http://now.periscopic.com/2011/05/our-research-into-flash-and-html5-which-one-is-right-for-your-project/">comparison</a> among Flash, HTML5 and iOS.</p>
<p><em>Flash:</em></p>
<p>Flash is an established and unified platform that reaches 99% of desktop and laptop browsers with a broad and consistent feature set matched with solid performance. Applications can be developed for Flash with fewer technical restrictions and greater speed than is currently possible in HTML5. Currently, 85% of the most-visited web sites use Flash, and 75% of web video is published for Flash Player.</p>
<p>Perhaps the most significant drawback to developing with Flash is that some mobile browsers, specifically iOS Safari, lack support for the technology. However, while the mobile iOS market is growing, it currently only accounts for approximately 1% of the total browser market.</p>
<p><em>HTML5:</em></p>
<p>HTML5 is a synthesis of several new and existing technologies (primarily JavaScript, CSS3, Canvas, and SVG), and as such, has a broad potential developer base. It allows for the deployment of an immersive application in modern browsers that either do not, or cannot, have the Flash Plugin installed – most notably Safari for the iPad which has a screen size large enough to interact with an immersive application.</p>
<p>The HTML5 development landscape is still somewhat lawless, and there are known inconsistencies between browser implementations of core features. Being an aggregate of technologies, it lacks an established and unified methodology, which can increase the development needed for cross-browser compatibility.</p>
<p><em>Apple iOS: </em></p>
<p>Among mobile devices and tablets, Apple&#8217;s iPod Touch, iPhone, and iPad account for a large and growing market. The default web browser on these devices, iOS Safari, accounts for about 20% of the total mobile browser market. To date, Apple has sold over 100 million iPhones and nearly 20 million iPads.</p>
<p>Immersive content intended to target these devices must be developed in HTML5, or as a downloadable app. Unfortunately, the support of HTML5 on iOS Safari is incomplete, specifically in the realm of communication and animation protocols.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/adobe-ends-flash-technology-steve-jobs-thoughts-on-flash-html5-vs-flash-20120220/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Computer Programming High-level Snippets</title>
		<link>http://www.gordonchoi.com/computer-programming-high-level-snippets-20120213?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=computer-programming-high-level-snippets</link>
		<comments>http://www.gordonchoi.com/computer-programming-high-level-snippets-20120213#comments</comments>
		<pubDate>Mon, 13 Feb 2012 10:29:39 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7132</guid>
		<description><![CDATA[Computer programming (or coding) is a very broad topic, but fortunately the &#8220;high-level&#8221; information can be found in hundreds of thousands of places from the Internet. I have created a compilation on coding (or computer programming) related topics from multiple online sources which I am: Giving credits to the original writers/bloggers by linking to the [...]]]></description>
			<content:encoded><![CDATA[<p>Computer programming (or coding) is a very broad topic, but fortunately the &#8220;high-level&#8221; information can be found in hundreds of thousands of places from the Internet. I have created a compilation on coding (or computer programming) related topics from multiple online sources which I am:</p>
<ul>
<li>Giving credits to the original writers/bloggers by linking to the web pages.</li>
<li>Including part of their writings in this blog post as snippets.</li>
</ul>
<p><strong>Best Software Engineering Books</strong></p>
<p><a href="http://www.noop.nl/2008/06/top-100-best-software-engineering-books-ever.html">Noop.nl</a> has this best software engineering books ever (the top 10):</p>
<ul>
<li>1. Code Complete: A Practical Handbook of Software Construction &#8211; Steve McConnell</li>
<li>2. Head First Design Patterns &#8211; Elisabeth Freeman</li>
<li>3. Rapid Development &#8211; Steve McConnell</li>
<li>4. Design Patterns: Elements of Reusable Object-Oriented Software &#8211; Erich Gamma</li>
<li>5. Applied Cryptography: Protocols, Algorithms, and Source Code (2nd Edition) &#8211; Bruce Schneier</li>
<li>6. Agile Software Development: Principles, Patterns and Practices &#8211; Robert C. Martin</li>
<li>7. Joel on Software &#8211; Joel Spolsky</li>
<li>8. Peopleware: Productive Projects and Teams (2nd Edition) &#8211; Tom DeMarco and Timothy Lister</li>
<li>9. The Mythical Man-Month, Anniversary Edition (2nd Edition) &#8211; Frederick P. Brooks</li>
<li>10. Refactoring: Improving the Design of Existing Code &#8211; Martin Fowler</li>
</ul>
<p><strong>Popular Programming Languages for Software Engineers</strong></p>
<p><a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Tiobe Index</a> reveals/updates a list of the most popular programming languages for programmers / software engineers as well as this <a href="http://www.quora.com/Programming-Languages/What-programming-languages-should-a-modern-day-programmer-have-in-his-her-arsenal">answer</a> to the question &#8220;What programming languages should a modern day programmer have in his/her arsenal?&#8221; by Joshua Levy on <a href="http://www.gordonchoi.com/cat/quora">Quora</a>.</p>
<ul>
<li>C for general familiarity with systems programming, and understanding how compilers, memory management, and the stack work.</li>
<li>C++ because any programmer who works with C should also, as a practical matter, know C++, and the values and drawbacks of its features relative to C. Performance-sensitive or large-scale data processing (such as code at Google, Facebook, or most other serious tech companies) is still often best written in (a subset of) C++. It also teaches some useful facts about messy topics like code generation (templates) and multiple inheritance.</li>
<li>Python or Ruby for familiarity with mainstream, modern scripting languages. Dynamic typing, metaprogramming, rapid prototyping, and Web-oriented development are all easily learned with either of these languages. (Avoid debates on which is better. They are both good to know, and more similar than they are different.)</li>
<li>JavaScript because you can&#8217;t be a well-rounded developer without knowing basic Web development. It&#8217;s an interesting language in itself, albeit with numerous flaws, and not all that different from Python or Ruby. It can also be used server side.</li>
<li>Java or C# for mainstream, modern, imperative, garbage-collected languages. Development in a higher-level, more modern language like these is not just popular, but stylistically different enough from C++ that you probably shouldn&#8217;t avoid learning it. Java especially can introduce you to heavyweight, enterprise-style development (for better and for worse). They acquaint you with extensive sets of libraries that are good to know about, so you don&#8217;t waste time building things that already exist.</li>
<li>Bash, at least at a basic level. This includes use of common Unix/Linux command-line tools like ls, grep, and sort. This is needed to be proficient in general problem-solving, debugging, and quick data processing on any Linux system. Without this, you may find yourself taking hours or more on something a hacker familiar with Bash could do in minutes.</li>
<li>At least one or two other languages of a different family. It doesn&#8217;t matter if they are popular or esoteric, but you should have familiarity with functional languages (Lisp, Scheme, Clojure, etc.) and with type inference (ML, OCaml, Haskell, Scala), and ideally with more specialized languages (Prolog, Erlang, XSLT, etc.). Mathematical and statistical tools like Mathematica, Matlab, R, or Maple are also good. Some might say this isn&#8217;t important since industry doesn&#8217;t use these languages broadly, but it improves your understanding of programming enough that it can make a big difference in the long run.</li>
</ul>
<p>You should also know one or two of the languages above at a deeper level. This would mean you have read and written a large amount of code in that language, know its subtleties, and have worked with or read the code of people who have expert-level proficiency in it. This also means knowing something of how the language internals work &#8212; at least look at code for the language&#8217;s compilers or interpreters, for its built-in libraries, and (if applicable) its native bytecode or assembly output.</p>
<p>Also, athough these are not usually called programming languages, a good programmer should also know database/query languages, formatting languages, and data formats. Minimally: SQL, HTML, CSS, XML, XPath, and regular expressions.</p>
<p>A couple other languages are important but less essential:</p>
<ul>
<li>PHP is the most popular server-side Web development language. However, it&#8217;s not in the essential list above, simply because it&#8217;s not a good first language due to its poor design and shortcomings, and because once you know Python or Ruby, it is not too difficult to pick up.</li>
<li>Perl has a venerable history and in some cases is still the quickest tool for a job. It&#8217;s also fast. However, it is a poor choice in most situations due to its age and poor readability and maintainability.</li>
</ul>
<p>Solid experience in all of this takes a while, but it&#8217;s one of those situations where being ahead keeps you ahead. Once you have breadth and depth, you&#8217;ll be stronger and more flexible than most professional programmers, which will help you find better and more challenging programming jobs, which will allow you to learn from the work and from others and keep improving your skills quickly.</p>
<p><strong>Python vs Ruby</strong></p>
<p>What are the advantages of Python over Ruby? <a href="http://www.quora.com/What-are-the-advantages-of-Python-over-Ruby">Robert Cezar Matei&#8217;s answer</a> on Quora:</p>
<ul>
<li>The two are more similar than they are different, in everything from design to disadvantages to common uses &#8211; you can&#8217;t really go wrong either way, and shouldn&#8217;t base your decision on syntactical differences. </li>
<li>As a Rubyist, Python&#8217;s main advantage has nothing to do with the languages&#8217; features. It&#8217;s more subjective: it seems to me that Python has more momentum amongst serious computer scientists. It&#8217;s increasingly popular in academic and scientific applications, and a lot of the technologists I respect the most seem to prefer it. By comparison, the Ruby community feels more designer-y and relatively more novice. </li>
<li>What this means is that while the Ruby world has very slick out-of-the-box product solutions, the Python world seems to produce more exceptionally well-written components like Tornado (web framework). Combined with it being used at Google and the potential for stuff like LiveNode to be released as open-source, I&#8217;d cast my lot with Python if I were starting today.</li>
</ul>
<p>What are the advantages of Ruby over Python? <a href="http://www.quora.com/What-are-the-advantages-of-Ruby-over-Python">Jonathan Ragan-Kelley&#8217;s answer</a> on Quora:</p>
<ul>
<li>Broadly, Ruby and Python implement very similar models, and have similarly powerful libraries and communities. The biggest distinction is in syntax.</li>
<li>Ruby includes several syntactic features which make dynamic extension of and higher-order interaction with external (library) code more straightforward.</li>
<li>Blocks allow arbitrary, multi-line closures to be cleanly passed in-line nearly anywhere. (Closures are anonymous functions which are lexically scoped inside the point at which they are defined, so they can access enclosing stack variables.) Python allows two syntaxes for in-line closure declaration: lambdas and nested def statements. Lambdas are equivalent to Ruby blocks, in that they are expressions which evaluate to a closure (and so can be used in-line), but syntactically they can only easy express a single expression, not multiple nested statements. Nested definitions have the full syntax of any other function definitions, and so easily support multiple statements and control flow within themselves, but they are statements not expressions, so they cannot be used in-line.</li>
<li>Mix-ins allow imported classes and modules to be extended and overridden by user code after it is imported. Python&#8217;s runtime model is sufficiently dynamic to inject new or altered methods and fields into an external class or object, but its syntax is procedural (assigning values to fields of an object), rather than declarative and identical to the standard class definition syntax.</li>
</ul>
<p><strong>Python vs PHP</strong></p>
<p>Why is Python better than PHP? <a href="http://www.quora.com/Why-is-Python-better-than-PHP">Owen Yamauchi&#8217;s answer</a> on Quora considers both technical reasons and cultural reasons.</p>
<p>Technical reasons:</p>
<ul>
<li>Python has a real module system.</li>
<li>Python distinguishes indexed arrays from associative arrays.</li>
<li>Python is stricter about dumb error conditions; e.g. undefined variables.</li>
<li>Python&#8217;s philosophy is more general-purpose than PHP&#8217;s originally was and thus it does not have weird artifacts like magic global variables $_GET and $_POST.</li>
<li>Python has functional-like features that are distinctive among mostly-imperative scripting languages, like list comprehensions. PHP has no such things.</li>
<li>Python has fewer easily abusable ways to write shitty code like extract().</li>
<li>Python does not exhibit as many head-scratchingly strange behavioral oddities as PHP, for example the fact that in PHP, you cannot use the array-index operator on a function call expression.</li>
<li>Python generally has a nicer standard library.</li>
<li>Python ships with a REPL, which includes an interactive documentation viewer. Facebook had to write their own for PHP.</li>
<li>Python has passable Unicode support. PHP (5.2 anyway) is no better than C in this regard.</li>
</ul>
<p>Cultural reasons:</p>
<ul>
<li>Python was not developed by a man who has publicly stated that he does not enjoy programming, and who clearly does not understand how to properly design a programming language.</li>
<li>Python does not suffer from the &#8220;hobbyist&#8221; problem to the same extent that PHP does. This is the problem wherein someone with no real training in programming works through a PHP tutorial on the Internet (many of which were written by hobbyists who do not really understand programming) and then thinks they understand programming.</li>
<li>On the flip side of this, Python is generally more popular in the open-source community, so there are more cool open-source Python projects than PHP.</li>
</ul>
<p>Why would someone choose PHP over Python? <a href="http://www.quora.com/Why-would-someone-choose-PHP-over-Python">Allen Cheung&#8217;s answer</a> on Quora:</p>
<ul>
<li>More familiarity/comfort with C/C++ syntax</li>
<li>Rapid prototyping, knowing the code probably won&#8217;t survive for long</li>
<li>Writing against an API that has a mature PHP API and an immature Python one (e.g. the Facebook developer API in its early days)</li>
<li>Choice of multiple mature web frameworks</li>
</ul>
<p><strong>Java, Shortcomings</strong></p>
<p>Why do some people hate Java? <a href="http://www.quora.com/Java-programming-language/Why-do-some-people-hate-Java">Sergei Turin&#8217;s answer</a> on Quora:</p>
<ul>
<li>Sometimes, the elegant implementation is just a function. Not a method. Not a class. Not a framework. Just a function. &#8212; John Carmack</li>
<li>Back when I was starting out in computer science I thought by today we’d be writing a few lines of code to accomplish much. Instead, we write hundreds of thousands of lines of code to accomplish little. &#8212; Lispian</li>
<li>Such is modern computing: everything simple is made too complicated because it&#8217;s easy to fiddle with; everything complicated stays complicated because it&#8217;s hard to fix. &#8212; Rob Pike</li>
<li>Java is like a variant of the game of Tetris in which none of the pieces can fill gaps created by the other pieces, so all you can do is pile them up endlessly. &#8212; Steve Yegge</li>
<li>Languages that try to disallow idiocy become themselves idiotic. &#8212; Rob Pike</li>
<li>The problem with object-oriented languages is they&#8217;ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle. &#8212; Joe Armstrong</li>
<li>So much complexity in software comes from trying to make one thing do two things. &#8212; Ryan Singer</li>
<li>The purpose of software engineering is to control complexity, not to create it. &#8212; Dr. Pamela Zave</li>
<li>&#8220;Design patterns&#8221; are concepts used by people who can&#8217;t learn by any method except memorization, so in place of actual programming ability, they memorize &#8220;patterns&#8221; and throw each one in sequence at a problem until it works. &#8212; Jason Garrett-Glaser (aka Dark_Shikari)</li>
<li>Under the doubtful disguise of the holy &#8220;code reuse&#8221; an insane amount of gratuitous complexity is added to our environment, which makes necessary industrial quantities of syntactical sugar to make the ensuing mess minimally manageable. &#8212; Uriel</li>
<li>It is not that uncommon for the cost of an abstraction to outweigh the benefit it delivers. &#8212; John Carmack</li>
<li>The beauty of small and simple code is that you can bend or break the rules as long it stays small and simple. Rules allow people to write code without thinking. [And when] you dont think [...] you get bloated code that just concatenates stupid patterns. People stop thinking and questioning [and] then its just worshipping some rules without any pruporse. &#8212; Cinap Lenrek</li>
<li>The object-oriented model makes it easy to build up programs by accretion. What this often means, in practice, is that it provides a structured way to write spaghetti code. &#8212; Paul Graham</li>
<li>We ignore the real problems and instead invent problems for which we know how to solve–and create a spaghetti tangled mess instead, thinking that our ‘invented’ problem is more interesting. We then even go on to congratulate ourselves for solving the “fake” problem, leaving the real problem alone. &#8212; William Woody</li>
<li>The notion of OOP was that you could leverage other people’s code and get those advantages. But that’s not the case. Instead you find code that &#8220;almost&#8221; does what you want, and then tweak and adjust it. And most of the time, it’d have been faster to simply rewrite it — and the code base would have been smaller. &#8212; Lispian</li>
</ul>
<p><strong>C Programming Language &#8211; Building Blocks</strong></p>
<p>What programming language has the maximum credibility today? <a href="http://www.quora.com/Computer-Programming/What-programming-language-has-the-maximum-credibility-today">Kevin Ernest Long&#8217;s answer</a> on Quora:</p>
<ul>
<li>It&#8217;s still C. Assuming you mean the credibility of the language and not the credibility its use might confer upon the user.</li>
<li>If I told you I was going to write the most efficient web server ever or a faster 3d shader algorithm and I was going to write in the &#8220;X&#8221; programming language. The most credible programming language would be C. This of course will vary based on your goals and constraints.</li>
<li>My answer assumes that you are looking to solve hard problems rather than common problems.</li>
<li>C is the most general purpose of all computer languages and is commonly used to create the operating systems and core system libraries that are the building blocks that more specialized languages, niche languages and DSLs (Domain Specific Languages) rely upon.</li>
<li>If the task is unknown and the constraints unknown then C has the most credibility when it comes to the odds of success.</li>
<li>Even more often than other languages; programming in C is a lot like creating your own mini-language to solve the problem at hand. I&#8217;ve programmed in over thirty languages and dialects most of which are derived from C in some way.</li>
<li>I mostly program in languages and against libraries that are more specific to my problem domain (these days Python and JavaScript) as these are a more efficient way to solve the common problems most of us face.</li>
</ul>
<p><strong>Google&#8217;s C++ Crawler</strong></p>
<p>Why did <a href="http://www.gordonchoi.com/cat/google">Google</a> move from Python to C++ for use in its crawler? <a href="http://www.quora.com/Why-did-Google-move-from-Python-to-C++-for-use-in-its-crawler">Benjy Weinberger and Eisar Lipkovitz</a> both have answers on Quora:</p>
<p>Software Engineer at Foursquare, formerly at Twitter and Google, Benjy Weinberger:</p>
<ul>
<li>Google has very robust, state-of-the art C++ libraries that handle a great many of the concerns of large-scale distributed systems: networking, monitoring, logging and so on.</li>
<li>The best-maintained versions of the client libraries for the internal systems the crawler interacts with are in C++.</li>
<li>Even small performance gains add up to a lot of money when you multiply them by many thousands of machines.</li>
<li>Google does not optimize for speed of development. Code is written once, read many times and run many, many, many times. The time it takes to write code is rarely the limiting factor.</li>
</ul>
<p>Engineering VP at Google, Eisar Lipkovitz:</p>
<ul>
<li>Crawling is relatively small part of the &#8220;building an index&#8221; process.</li>
<li>Python was &#8220;abandoned&#8221; from the core search stack around 2000.</li>
<li>Crawling main bottleneck is concurrency. We crawl MANY pages per second and each one of them might take minutes to successfully crawl [they are server bound]. It&#8217;s entirely possible modern Python allows for massive parallelism per machine/process, but certainly wasn&#8217;t the case a decade ago.</li>
<li>HTTP and other related protocols didn&#8217;t change much in over a decade so the lower level crawling code doesn&#8217;t benefit from the supposed faster development cycle of Python.</li>
</ul>
<p><strong>No Better Programming Language to Replace C++</strong></p>
<p>Why hasn&#8217;t a fast, practical, and reasonable language supplanted C++? <a href="http://www.quora.com/Why-hasnt-a-fast-practical-and-reasonable-language-supplanted-C">Joshua Levy&#8217;s answer</a> on Quora:</p>
<ul>
<li>Massive investment is required. Bringing a new programming language into widespread use requires a large amount of effort and time. Usually about a decade, typically with the support of either a large company or community. This must include the design and development of the language, the development of (or integration with) standard libraries, the building of a solid compiler/interpreter, and &#8212; last but not least &#8212; the community development needed to popularize the language. Look at the languages in widespread use now &#8212; C, C++, Java, Python, Ruby, PHP, C#, JavaScript, Perl &#8212; and this is quite clear.</li>
<li>Language superiority rarely drives adoption. Again, look historically. Lisp had garbage collection and the dynamic capabilities now appreciated in Ruby or Python, with better performance, yet failed to maintain traction. Hardly anyone thinks PHP is a well designed language, yet it&#8217;s still going strong (with the support of giants like Facebook), even when similar alternatives like Python or Ruby are by most assessments preferable. In fact, when it comes to adoption, practically every big factor is more important than the fundamental design of a language, including backing by businesses or communities (Sun, Microsoft, the Python community), tools (Eclipse, Visual Studio), library support (C++, PHP, Java, etc.), killer apps (Rails), platform (Mac/iPhone, .NET), and historic niche expertise (physicists with Fortran).</li>
<li>Lack of expertise. Surprisingly, considering the number of people making their living programming, broad knowledge of programming languages is remarkably rare. Most developers know at most two or three of them well, and often they are from the same family (C++ and Java, for example). Partly this is due to the large investment needed to learn languages, and partly it is cultural insularism. (As an illustration, see how many Java programmers you can find who use REPL-style exploratory development, such as with BeanShell, Rhino, or whatever.) It&#8217;s harder to promote the importance of first-class functions, type inference, closures, metaprogramming, continuations, or around methods, for example, when they are unfamiliar concepts. Even worse, the designers of successful programming languages themselves often seem not to have seriously surveyed other languages for ideas. (There are of course exceptions here.) The consequence is, features that seem &#8220;reasonable&#8221; in retrospect were ignored at the time they could have been added.</li>
<li>Difficulty of design. Even if you have brilliant and informed designers with plenty of support, it&#8217;s still hard to make good choices when designing a language, because it takes so long to learn your mistakes, both of omission and commission. Fundamentally, language design is a case where tiny details compound to have giant effects. It&#8217;s hard to predict what a half million-line codebase in a new language will look like, and what the problems will be. And by the time you know, it&#8217;s usually too late to change anything substantial.</li>
<li>Difficulty of implementation. Writing a good compiler or interpreter and platform is hard. And without a full-featured and solid platform, the language will go nowhere. It&#8217;s easy to start, and run a few toy programs, but the expertise required to build, say, an optimizing compiler that competes with gcc on optimization, or a virtual machine that competes with Sun&#8217;s JVM, is immense. And it needs to be built solid enough, or at least have enough support, that people will trust it enough to use it.</li>
<li>Rapid software business cycle. In the software industry, perhaps because it is so volatile, businesses often avoid long-term investments of this sort. Although there are almost certainly massive productivity gains to be had by  improving the state of programming languages, the investment is on such a long scale relative to other factors (such as evolving use of the Web, or mobile technologies, or consumer products) that such investments usually seem expensive and risky.</li>
</ul>
<p>It&#8217;s all too easy to forget just how large these barriers are when excited by a new programming language (or frustrated with the obvious shortcomings of an old one). Really, unlike many situations in software engineering or programming, where quick hacks can have big payoff, getting widespread adoption of a new langauge may be more akin to building a large company, with the same challenges of having a good solution, a strong organizational leader, an angle for breaking into the market and then maintaining and growing user base, and so on.</p>
<p><strong>.Net Programmers</strong></p>
<p>Why we don&#8217;t hire .NET programmers from <a href="http://blog.expensify.com/2011/03/25/ceo-friday-why-we-dont-hire-net-programmers/">Expensify Blog</a> explains why .Net programming don&#8217;t fit with tech start-ups:</p>
<ul>
<li>If you ever want to work in a startup, avoid .NET. It does you no favors. If you are a start-up looking to hire really excellent people, take notice of .NET on a resume, and ask why it&#8217;s there.</li>
<li>Yes, .NET developers are great at what they do. It&#8217;s the most modern platform for application development on the planet. Microsoft has always produced the best tools for building internal business applications, and .NET is their masterpiece. There&#8217;s a reason why they own that space; they earned it. That space employs millions of people, and those people are unquestionably the masters at what they do.</li>
<li>But what they do is very, very rarely start-ups. I&#8217;m sorry if that sounds offensive, but that&#8217;s a simple fact. You can measure this yourself: go to any list of startups, maybe look at YCombinator&#8217;s recent graduate class, or Scoble&#8217;s list of picks for 2010, or Sequoia&#8217;s list of seed companies &#8211; or  go find a list you like better. Do a curl (or your .NET equivalent) on each domain, and see how many are running a Windows server: I think you&#8217;ll find the fraction very small. Don&#8217;t get me wrong: there are a lot of people who aren&#8217;t interested in working at a startup, for a lot of very valid reasons. But if you are the odd person who is interested, it&#8217;s worth asking: why do so few use .NET?</li>
<li>Because .NET is designed to extend, not disrupt. The same could largely be said about J2EE, but in general anybody who &#8220;grows up&#8221; with these self-contained, highly-automated platforms can&#8217;t help but view computers in a different way than those who start from a lower, less automated, more difficult level.  As one of the coherent commentators says below, Joel Spolsky himself laments schools teaching Java with the same basic reasoning of my article above, albeit more diplomatically stated. .NET is designed to tightly integrate with and seamlessly extend the Microsoft stack in extremely powerful but ultimately incremental ways. Again, there&#8217;s nothing wrong about that if that&#8217;s what you want to do.  But if that&#8217;s not what you want to do, then .NET probably isn&#8217;t the right choice, as evidenced by how few people in the startup world choose it.</li>
</ul>
<p><strong>Getting into Programming</strong></p>
<p>Software engineers / programmers all have stories on how they got into programming in the first place.</p>
<p><a href="http://www.jeanhsu.com/2011/10/16/not-too-late-to-learn-how-to-code/">Jean Hsu&#8217;s</a> &#8220;It&#8217;s not too late to learn how to code&#8221;:</p>
<ul>
<li>It is difficult! Things that take awhile at first will come naturally to you later on. Of course some people are more naturally disposed toward the type of logical thinking that programming demands, but I believe that in the majority of cases, people assume they aren’t cut out for it before giving it a fair shot. Though of course, having people believe that programming is &#8220;too difficult&#8221; and that the average person is “not smart enough” strokes our egos and makes us feel like we’re part of some super-elite hyper-intelligent group.</li>
<li>Mentally prepare yourself for roadblocks. I used to think I was cursed, because every time I tried to setup something new (new development environment, tool, library, etc), something would always go wrong. It took many years for me to realize that with all the different combinations of user operating systems, software versions, etc, the documentation was often outdated or not comprehensive.</li>
<li>Do you like it? Forget about if you think it&#8217;s too hard; do you think it&#8217;s fun? When you struggle for hours debugging something, and finally, it runs as expected, do you feel a rush of excitement? Do you look forward to having a few hours to figure something out? Those are the things that attracted to me to software–I just didn’t worry too much about if I could make it or not.</li>
</ul>
<p><a href="http://mattdeboard.net/2011/11/23/how-i-became-a-programmer/">Matt DeBoard&#8217;s</a> &#8220;How I became a programmer&#8221;:</p>
<ul>
<li>How did you learn Django in 11 weeks? I want to make it clear that I didn&#8217;t set out to learn Django per se. Django is just a very nice toolkit of abstractions that makes creating web applications easy using Python. As far as I&#8217;m concerned learning Django was incidental to learning to program. I did not &#8211; and still don&#8217;t &#8211; want to be considered a &#8220;Django developer.&#8221; I&#8217;m not even sure I want to refer to myself as &#8220;a Python programmer.&#8221;</li>
<li>In other words, I do not feel that I would be as modestly competent as I am today if I had spent an inordinate time becoming an expert at the abstraction layer of Django, instead of learning the concepts that make Django work.</li>
<li>How did you show the company your skills? Did you show them the projects you&#8217;ve made? Github, Github, Github. I can&#8217;t emphasize it enough. Make stuff, put it on github, show people you&#8217;re passionate and smart and curious.</li>
<li>If I had to summarize the big overview of how I did what I did, I&#8217;d say: Ask questions, be curious, be passionate.<br />
Learn a language, not a web framework for god&#8217;s sake. Work hard. Network, attend meetups, tweet, blog, be social and show people you&#8217;d be fun to work with, and a credit to team. (Optional) Put yourself in a position of desperation, so there is no choice but to succeed.</li>
</ul>
<p><strong>Older Software Engineers/Developers</strong></p>
<p>Lessons of Failure&#8217;s Five Pervasive Myths About Older Software Developers <a href="http://www.lessonsoffailure.com/developers/pervasive-myths-older-software-developers/">shows</a> why older software engineers are invaluable for a tech company:</p>
<ul>
<li>Yes, older software developers have higher salaries than younger ones. But what exactly are you paying for here? With an experienced software developer, you’re paying for all the experience that comes with past project successes and failures. Those are expensive lessons if you want to pay for them directly during your tenure as a manager. But if you buy into an experienced worker, that’s like getting insurance against some of those classic mistakes in project management and software development that you don’t have to repeat. Meaning you look better on your annual review because you hired smart people that know how to get the job done.</li>
<li>It&#8217;s actually because of their past experience, that more experienced software developers can migrate to new technologies, frameworks, and systems more quickly and in greater depth. For example, if you learn a GUI framework in C/C++, you have a mental model about message passing, event handling, MVC patterns used to design the system and separate presentation from back-end logic. The very first time you learn a GUI framework, in addition to the syntax, the examples, and the quirks of the library, you also need to learn all the conceptual stuff. And after two, three or more GUI frameworks, you notice that they all have very deep similarities outside of the syntax. You might even notice newer frameworks have overcome substantial limitations that you used to have to work around with complicated hacks. Those insights are lost on someone new to the framework. And those insights can really boost productivity in ways you’re not able to directly measure.</li>
<li>I think it would be fair to state that experienced software developers are less willing to work those long, painful hours because they’ve learned the hard way that there are productive limits to pushing yourself 80 hours a week for months on end. It&#8217;s called burnout, and I’m willing to bet that anyone who has already experienced it in the past simply isn&#8217;t as eager to go there again. But with that said, the supposed reason of &#8220;family commitments&#8221; is bogus. High-quality, experienced software engineers are ruthless time managers, and those with families are even more motivated to get things done in allotted times. They may have dance recitals and soccer games to attend to, but they also make up that time in off hours and highly focused work during the 40 hours they’re given in a week. Good software engineers with families must become highly efficient with personal time management or they quickly get buried with the deluge of work coming their way.</li>
<li>Lost mental agility is a poor excuse to not hire an older software engineer in light of the fact they&#8217;ve seen, done, and lived many more successes and failures than a younger developer. Experienced developers have tons of past projects to draw from and assist in avoiding bad decisions today. Younger developers have new ideas which are important, but often untested and unproven. Having both perspectives on your team is of great value.</li>
<li>Anyone who believes this is probably someone who doesn’t like their ideas criticized by those who&#8217;ve been around long enough to see really stupid decisions put into practice again and again. Experienced software developers smell crap a mile away. They don&#8217;t buy your stories about how the product isn’t well received in the marketplace because they&#8217;ve been interacting with the customers for years and know you&#8217;re trying to cover up a future layoff in the company. They won&#8217;t put up with managers asking them to work 80 hours a week because the customer wants the software next month and they already told you it will take 3 more months to complete with the features agreed upon.</li>
</ul>
<p><strong>Non-Technical Founders for Tech Start-ups</strong></p>
<p><a href="http://news.ycombinator.com/item?id=1820495">YCombinator.com&#8217;s advice</a> for founders of tech start-ups who initially had no technical / coding experience at all:</p>
<ul>
<li>If you have a startup idea and you don&#8217;t know how to code, learning how to code enough to implement the idea all on your own is probably not cost-effective from a time standpoint and you&#8217;re more likely to end up with a mess of non-functioning code than anything else.</li>
<li>That being said, at least to me, knowing even a layman&#8217;s amount about programming will gain major points with the potential technical co-founders you do meet.</li>
<li>I get approached by friends/acquaintances on a weekly basis with some startup idea. And I mostly think, &#8220;So basically you&#8217;re suggesting I spend 10 hours a week of my free time for six months to build Facebook For Cats, while you make some half-assed attempt to do some marketing or whatever, and if there are any technical issues I can&#8217;t even discuss them with you because it&#8217;ll go over your head, and if there are any tedious technical issues you can&#8217;t even help with those.&#8221; It&#8217;s pretty much a non-starter right there.</li>
<li>But knowing even a little bit about programming could go a long way. It means your idea is probably a little bit better than &#8220;Facebook For Cats,&#8221; because maybe in programming you learned about some company&#8217;s API and how to leverage it. It means I can split up work and give you some of the easier programming tasks and feel like we&#8217;re putting in close to the same effort. And it means I can tell you things like, &#8220;the service doesn&#8217;t always return well-formed XML so we should find a validator and then run it on the response before we insert it into the database,&#8221; and you&#8217;ll know what I&#8217;m talking about.</li>
<li>It all starts with the product, and the product usually means code, and having one and a half heads coding will usually be more productive than just one. Learn enough to be that half a head and you&#8217;ll go far.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/computer-programming-high-level-snippets-20120213/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Analytics Real Time Traffic Data Reports</title>
		<link>http://www.gordonchoi.com/google-analytics-real-time-traffic-data-reports-20120202?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-analytics-real-time-traffic-data-reports</link>
		<comments>http://www.gordonchoi.com/google-analytics-real-time-traffic-data-reports-20120202#comments</comments>
		<pubDate>Thu, 02 Feb 2012 11:29:25 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Google Analytics]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7167</guid>
		<description><![CDATA[Google Analytics Real-time reports are available in the new Google Analytics. Google Analytics Real-time reports are updated instantaneously and show visitors&#8217; activities (e.g. pageviews) within seconds when they happen on your site. The real-time data is available in 4 major reports: Overview &#8211; Includes active visitors on site, pageviews per minute and per second, top [...]]]></description>
			<content:encoded><![CDATA[<p>Google Analytics Real-time reports are available in the <a href="http://www.gordonchoi.com/new-google-analytics-dashboard-real-time-report-custom-report-site-speed-multi-channel-funnel-premium-20111001">new Google Analytics</a>. Google Analytics Real-time reports are updated instantaneously and show visitors&#8217; activities (e.g. pageviews) within seconds when they happen on your site.</p>
<p>The real-time data is available in 4 major reports:</p>
<ul>
<li>Overview &#8211; Includes active visitors on site, pageviews per minute and per second, top referrals, top active pages, top keywords, and top locations</li>
<li>Locations &#8211; Includes active visitors on site by geographical location (e.g. country)</li>
<li>Traffic Sources &#8211; Includes active visitors on site by traffic source (e.g. Organic &#8211; Google)</li>
<li>Content &#8211; Includes active visitors on site by active page</li>
</ul>
<p>Google provides official <a href="http://support.google.com/analytics/bin/answer.py?hl=en&#038;answer=1638635">introduction</a> and <a href="http://support.google.com/analytics/bin/answer.py?hl=en&#038;answer=1638637">interpretation</a> to Google Analytics Real-time Reports.</p>
<p><strong>Google Analytics Real-time Reports in Screenshots</strong></p>
<p>Google Analytics Real-time Overview Report:</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/ga-real-time-overview.png" alt="Real-time Overview Report" />
</ul>
<p>Google Analytics Real-time Overview Report (Top Locations Map):</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/ga-real-time-top-locations.png" alt="Real-time Top Locations Map" />
</ul>
<p>Google Analytics Real-time Locations Report:</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/ga-real-time-locations.png" alt="Real-time Locations Report" />
</ul>
<p>Google Analytics Real-time Locations Report (Google Earth):</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/ga-real-time-google-earth.png" alt="Real-time Google Earth" />
</ul>
<p>Google Analytics Real-time Traffic Sources Report:</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/ga-real-time-traffic-sources.png" alt="Real-time Traffic Sources Report" />
</ul>
<p>Google Analytics Real-time Content Report:</p>
<ul>
<img src="http://www.gordonchoi.com/blog/images/ga-real-time-content.png" alt="Real-time Content Report" />
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/google-analytics-real-time-traffic-data-reports-20120202/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bing Webmaster Tools Review 2011</title>
		<link>http://www.gordonchoi.com/bing-webmaster-tools-review-2011-20120123?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bing-webmaster-tools-review-2011</link>
		<comments>http://www.gordonchoi.com/bing-webmaster-tools-review-2011-20120123#comments</comments>
		<pubDate>Mon, 23 Jan 2012 12:00:49 +0000</pubDate>
		<dc:creator>Gordon Choi</dc:creator>
				<category><![CDATA[Bing SEO]]></category>

		<guid isPermaLink="false">http://www.gordonchoi.com/?p=7002</guid>
		<description><![CDATA[Ever since the launch of Microsoft&#8217;s Bing search engine, Bing has been integrating Yahoo&#8217;s search (i.e. Yahoo SEO and Yahoo Search Marketing) into Bing SEO and Bing Adcenter through Bing-Yahoo Search Alliance. Bing has been offering SEO data to webmasters through Bing Webmaster Tools long before Yahoo Site Explorer got shut down. With Bing&#8217;s SEO [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since the launch of <a href="http://www.gordonchoi.com/microsoft-launches-new-search-engine-bing-20090529">Microsoft&#8217;s Bing search engine</a>, <a href="http://www.gordonchoi.com/cat/bing">Bing</a> has been integrating Yahoo&#8217;s search (i.e. <a href="http://www.gordonchoi.com/cat/yahoo-seo">Yahoo SEO</a> and <a href="http://www.gordonchoi.com/cat/yahoo-search-marketing">Yahoo Search Marketing</a>) into Bing SEO and Bing Adcenter through <a href="http://www.gordonchoi.com/bing-yahoo-search-alliance-update-20100720">Bing-Yahoo Search Alliance</a>.</p>
<p>Bing has been offering SEO data to webmasters through <a href="http://www.gordonchoi.com/bing-webmaster-tools-20090712">Bing Webmaster Tools</a> long before <a href="http://www.gordonchoi.com/yahoo-site-explorer-20091013">Yahoo Site Explorer</a> got <a href="http://www.gordonchoi.com/yahoo-site-explorer-shuts-down-replaced-by-bing-webmaster-tools-20111122">shut down</a>. With Bing&#8217;s SEO data, webmasters can understand more about:</p>
<ul>
<li>Bing&#8217;s search algorithm for ranking sites (and/or web pages) &#8211; Compare <a href="http://www.gordonchoi.com/google-vs-bing-search-algorithms-20110203">Google and Bing search algorithms</a></li>
<li>Bing&#8217;s organic search query &#8211; One alternative in keyword research is through <a href="http://www.gordonchoi.com/bing-keyword-tools-20100731">Bing&#8217;s keyword tool</a></li>
</ul>
<p>Bing&#8217;s Webmaster Center Blog <a href="http://www.bing.com/community/site_blogs/b/webmaster/archive/2011/12/09/looking-back-on-2011.aspx">has</a> listed 2011&#8242;s updates of Bing Webmaster Tools regarding:</p>
<ul>
<li>Traffic Reports Depth</li>
<li>HTML5</li>
<li>Crawler Control</li>
<li>Index Tracker</li>
<li>User Permissions</li>
<li>Sitemaps</li>
<li>User Experience and Communications</li>
<li>Block URLs</li>
<li>Improved Speed</li>
<li>Know More, Faster</li>
<li>Expanded Crawl Details</li>
<li>URL Normalization</li>
<li>Webmaster Account Verification</li>
<li>Adcenter CPC Integration</li>
</ul>
<blockquote><p>
<strong>Traffic Reports Depth</strong></p>
<p>Early in the year saw us adding more information in the Traffic reports. This includes the new detailed traffic stats feature. We are showing much more information to the webmasters including:</p>
<ul>
<li>Average impression and click positions for their top 100 queries.</li>
<li>The specific pages showing up for a particular query, including their impressions, clicks, CTR, average impression and click positions, and position details.</li>
<li>Their top 100 pages including their impressions, clicks, CTR, and average impression and click positions.</li>
<li>The specific queries showing up for a particular page, including their impressions, clicks, CTR, average impression and click positions, and position details.</li>
<li>Trending over time for their top 100 queries.</li>
</ul>
<p>These additions made it easier for Webmasters to see which phrases were driving traffic, and to which pages on their websites that traffic was going.</p>
<p><strong>HTML5</strong></p>
<p>Around this same time, maybe a little earlier, we addressed the need to install Silverlight to view the reports by moving the tools to HTML5. With this move, we made it easier for users to interact with our reports and saw report load times slightly improve as well. This move meant our reports were now viewable in all modern browsers and on smart phones as well.</p>
<p><strong>Crawler Control</strong></p>
<p>Users asked loud and clear for ways to control the crawler, so in addition to the usual avenue open via your robots.txt, we built a tool that allows you to easily drag and drop a graph to set the crawl rate specific to your website. It&#8217;s as simple as creating the crawl patter you want. This means it’s easy to tailor our crawling efforts to times when your bandwidth is least affected. Telling us to stay away during peak business hours, and visit when everyone is asleep is as easy as clicking your mouse. We added a checkbox for you to let us know if we’d encounter AJAX URLs along the way, and there is an option to simply let us figure it all out for you.</p>
<p>The times shown were all GMT, so we added a layer to display your server time relative to GMT, hopefully making it easier to understand when your peak business hours hit, and allowing you to build a control graph around those hours.</p>
<p><strong>Index Tracker</strong></p>
<p>Our Index Tracker tool received a thorough backend rewrite, improving coverage, performance, depth and latency. When these improvements released, even brand new websites saw all of their data as the Bing index held it. No longer having to wait 48+ hours meant Webmasters could understand what Bing was actually indexing and how it was performing much faster.</p>
<p><strong>User Permissions</strong></p>
<p>We introduced user controls and permissions. Site owners could now grant admin, read / write, or read-only access to other users for their site using their existing verification code. This made it much easier for businesses to manage their accounts, share access and control who could turn the knobs and pull the levers. This layer of control allowed businesses to manage account ownership and access at a new level, ensuring, as employees moved around, access and control of these tools remained in hand.</p>
<p><strong>Sitemaps</strong></p>
<p>We enhanced the Sitemap UX by showing not only user submitted sitemaps, but all sitemaps we know of. We also expanded the types of feeds we accept enabling folks to submit Atom, RSS and xml.</p>
<p><strong>User Experience and Communications</strong></p>
<p>Working to make it easier to navigate inside the tools, we added a second layer to the tabbed navigation, which you see when logged in.</p>
<p>In an effort to improve communications, we enabled the ability to tell us where to email you and what to email you. If there was an alert appearing inside your account for malware, as an example, you can now opt to receive an email alert to the address of your choice. This made it much easier to know when something was happening.</p>
<p><strong>Block URLs</strong></p>
<p>Our &#8220;Block URLs&#8221; feature got a backend overhaul to include more built-in safeguards, helping to protect webmasters from accidently blocking large numbers of URLs. While the control is still in your hands, there are added layers of checks on our end that prompt confirmations before actions take place.</p>
<p><strong>Improved Speed</strong></p>
<p>We did some work on how we cache all of your website data, as well, resulting in a dramatic drop in latency from, in some cases 5 seconds for a report to load, to 400 milliseconds for the same report now. That dramatically improved the performance of reporting.</p>
<p><strong>Know More, Faster</strong></p>
<p>Later in the year, we expanded user email communication preferences and controls. It&#8217;s easy to stay up to date on the latest announcements and alerts applied to your account. You can set frequency preferences, select options on which alerts you want notifications for and set a dedicated email and contact number.</p>
<p><strong>Expanded Crawl Details</strong></p>
<p>The expansion of Crawl Details meant you would now see all URLs attributed to header codes and notations made. This was a great step forward to understanding which URLs Bing was having issues accessing, and makes it much easier to understand if any high value URLs are being seen by us in ways you’d like to change.</p>
<p><strong>URL Normalization</strong></p>
<p>To help you manage parameters in a more in depth manner, we expanded the number of parameters you could assign us to manage from 25 items to 50. This made it easier for larger and older sites to manage legacy URLs.</p>
<p><strong>Webmaster Account Verification</strong></p>
<p>This was one folks were asking for all year, and we managed to get it in with one of our Fall releases. Being able to verify a website via a DNS change.  Past choices included adding a snippet to your &lt;head&gt; code or uploading a dedicated XML file to the root of your site, and both options remain as valid ways to verify your domains. This third option will allowed you to place a discrete CNAME record to your DNS to validate a domain as well.</p>
<p><strong>Adcenter CPC Integration</strong></p>
<p>In an effort to help businesses understand how they can easily expand their inbound traffic, we began showing CPC data from <a href="http://www.gordonchoi.com/cat/adcenter">Adcenter</a> inside your Webmaster accounts. When looking at Traffic data, to the left of the keywords you now see CPC amounts associated with those keywords in Adcenter. This is an excellent way to understand the practical cost of driving more traffic through paid search, and can help in targeting keywords you perform well for in organic search, thereby increasing your business’s footprint on the search results page.
</p></blockquote>
<p>When building a website, focus and review the <a href="http://www.bing.com/community/site_blogs/b/webmaster/archive/2011/08/19/18-things-you-need-to-know-about-seo.aspx">items</a> <a href="http://www.bing.com/community/site_blogs/b/webmaster/archive/2011/11/29/nine-things-you-need-to-control.aspx">below</a> that will improve the quality of your site to visitors and SEO for Bing.</p>
<blockquote><p>
<strong>Crawlability</strong></p>
<p>If a crawler can&#8217;t access your content, the content won’t be indexed by search engines, nor will it be ranked. Enable and use XML sitemaps with a low error rate to build trust with search engines. Make sure your website navigation is clean and strive for a simple, search-friendly URL structure. This means the URL is keyword rich and avoids session variables or docIDs. We suggest you use robots.txt files to instruct the crawlers on how to interact with your webpage and more easily find your content.</p>
<p><strong>Site Structure</strong></p>
<p>Provide a site structure with strong functionality, which helps encourage link building. Linking to both trusted outside sources and internal content shows a search engine you care about users getting the best data around their query. In addition, HTML sitemaps ensure a good user experience and help search engines discover all your pages and content.</p>
<p><strong>Content Hierarchy</strong></p>
<p>When you plan your website&#8217;s content hierarchy, take care in aligning your content with what searchers are looking for and their intent during their journey on your URL. Basic keyword research can also help you understand how searchers are interacting with search engines, and can help craft your content strategy. Also avoid placing links and content inside rich media applications, such as Flash and Silverlight, which make it almost impossible for crawlers to find and read the content.  Just gotta have your rich media?  Not to worry. Make sure a solid downlevel experience exists and we&#8217;ll still find your content.</p>
<p><strong>RSS Feeds</strong></p>
<p>Get them up and running and keep them clean. By following your feeds, it&#8217;s easier for the engine to get your latest content. This means we see it faster, so indexing, ranking and showing in the SERPs can happen faster. Want to really impress Bing? Get into your Bing Webmaster account and insert your RSS feed URL into the sitemap submission flow.</p>
<p><strong>Rel=canonical</strong></p>
<p>Being able to tell the engine which version of your URL you&#8217;d like to have attributed as the original is pretty useful. This handy command can help you build value on the version of the URL that matters most to you, and help combine value attributed to many version of the URL into one location, helping boost the rank of that one, original version of the URL.</p>
<p>The tough part here is usually getting the code installed on each page, and of course, each instance needs to point to one selected URL for this to work. We&#8217;d rather you didn’t use the <code>rel=canonical</code> to cover issues where your CMS needs work. If the CMS is causing instances of duplicate URLs to occur, you should fix the problem. We see increasing usage of the <code>rel=canonical</code> across huge numbers of pages on large websites. While we don&#8217;t really like this, either, we can work with it, as we understand the need to balance the workload and the returns.</p>
<p>The bottom line, though, remains that you need to be able to manage the <code>rel=canonical</code>, and if you don&#8217;t have control over when its deployed, which URLs they point to and when it is used, you need to work it out.</p>
<p><strong>Robots.txt</strong></p>
<p>Seems like a no-brainer, this one, but so many websites remain without a <a href="http://www.gordonchoi.com/baidu-robots-txt-20100420">robots.txt</a> file. In some cases it&#8217;s a purely missed opportunity, or the site owner is unaware of what a robots.txt file is. In other cases, though, it&#8217;s the inability to place a file on the root of your domain.</p>
<p>Regardless of the blocker, the robots.txt file is one of the most important files you can place on a web-server. Given it is the location search crawlers reference to understand how to interact with the website, it&#8217;s a pretty powerful document.  If you do not have access to place your robots.txt in the correct location, you need to understand why this control is lacking. Then solve the problem.</p>
<p><strong>Sitemap.xml</strong></p>
<p>This is another file missing from a huge number of websites today. Another important file the search crawlers look for. One that is referenced inside the robots.txt mentioned above, and one which can help get more of your pages into the search index. Overall, it&#8217;s almost as important as the robots.txt file, and if you cannot place these files in a location the crawlers can find, you need to fix this issue.</p>
<p>This file typically lives on the root of the domain, but for larger websites, where multiple files may exist to capture all of the URLs present, maybe only a sitemap directory file is on the root. Whichever your case, it&#8217;s important he crawlers can find it, and if you cannot access the root on your server to place files there, it&#8217;s a missed opportunity.</p>
<p><strong>Rich Snippets</strong></p>
<p>Marking up your content has been around for a few years now, and with the launch earlier this year of <code><a href="http://www.gordonchoi.com/schema-org-microdata-markup-standards-for-webmasters-20110608">www.schema.org</a></code>, the major engines have made a clear statement there is value in marking up your content. By embedding these elements in your page code, we can extract information more accurately and use that information to provide increasingly richer search results.  You are credited as the source for the data used. This is important work for sites seeking to differentiate themselves from the pack as we move into 2012.</p>
<p>Websites need to balance the future value versus the workload to implement, and still need to keep in mind that implementing these elements won&#8217;t immediately increase rankings. This works helps us better understand relevancy.</p>
<p>What&#8217;s important here is planning for the work and ensuring you have buy in across your organization.</p>
<p><strong>Title, Description, Alt Tags, etc.</strong></p>
<p>Managing your title tags, meta descriptions, alt tags, etc. is still important. All these basic, on page/technical SEO factors add up to help us understand what your content is relevant for. The bottom line with these items is you need to be able to manage them. If you cannot change these elements on a per-page basis, you lack needed control. We only mention three here, but you can think of all of them.</p>
<p>That meta description you don’t care to alert and let appear across all you pages? While writing unique ones for each page won&#8217;t suddenly vault your pages to number 1 in the rankings, it can make the difference between a searcher clicking on your result in the search results or not. Think of the meta description as the &#8220;call to action&#8221; then, when read by a searcher, tells them why they should click your result. Better to have your words appearing in our search results than random text we take from the page because your meta description was low quality.</p>
<p>We use the meta description as an example, but the same level of thought should be applied to all of your on page optimization efforts.</p>
<p><strong>Content</strong></p>
<p>This might seem pretty obvious, but with so many website still aggregating content or using article services to build out pages, its worth mentioning. We talked about <a href="http://www.bing.com/community/site_blogs/b/webmaster/archive/2011/08/02/how-to-build-quality-content.aspx">how to build good content</a> a little while back and the value of &#8220;<a href="http://www.bing.com/community/site_blogs/b/webmaster/archive/2011/10/14/articles-and-syndicated-content-help-or-hindrance.aspx">article-site content</a>&#8220;, but we still see websites trying to get ahead in the rankings by basing their websites on a thin content model. Such sites are often very polished looking, and while may provide value in aggregating a lot of items in one location, they still aren&#8217;t adding anything new and unique to the conversation. A website designed primarily to hold affiliate links that get the user off the website quickly and into a shopping cart on another website is an example of a thin content website, though not the only example. Affiliate links on a website can be completely useful, but when the content on the site is duplicating that from the original website, there&#8217;s simply no reason why that thin content site should outrank the real deal.</p>
<p>Control as applied to content means you can influence the creation of quality content on the website. If the website is not producing unique, quality content, it won’t last long in the search results.</p>
<p><strong>Verification Access</strong></p>
<p>This is pretty straight forward. You need to be able to place the verification code in place to use webmaster tools. This could be in the form of embedding a tag in the &lt;head&gt; code of your webpage, or by a notation added in the DNS for the website.  No matter the option used, you need to have access to make this happen, and if you do not have that access, you lack the control needed to then be able to access some of the richest data about your website online – our webmaster tools data.</p>
<p><strong>UX Improvements</strong></p>
<p>If you don&#8217;t have a website your visitors love, you’re missing an opportunity. Get cracking on a user experience review and see where you&#8217;re bleeding users. By staying tuned in to what users like and dislike about your website, you can make the myriad small changes needed to field a UX-winning site. And if you keep visitors happy, they share you more often with friends, netting you more links. Visitors are also more likely to come back to you again in the future if they like the site and find it easy to get what they’re after.</p>
<p>It might seem like a small thing, to focus on the user experience, but that UX directly influences the happiness of visitors and the engines can see that in how they reach to your site when they see it ranked in search results. If you don&#8217;t have input on UX improvements, you need to push. This is an important aspect of optimizing any website.</p>
<p><strong>Social Sharing Integration</strong></p>
<p>This almost goes without saying, but we still see so many websites not involved socially with their visitors. Social isn&#8217;t going away folks, and while it does take work, skipping social integration is a missed opportunity. People share what they like with friends. If you have social sharing icons embedded in your pages, you are much more likely to get shared by visitors. At the very least, you need to cover this angle. Get the buttons embedded into your pages so your visitors can share you content with their friends and followers.
</p></blockquote>
<p>One of the major SEO issues to any large websites is duplicate content/URLs. Bing Webmaster Central Blog <a href="http://www.bing.com/community/site_blogs/b/webmaster/archive/2011/10/06/managing-redirects-301s-302s-and-canonicals.aspx">reveals</a> how to handle duplicate content URLs and how canonical URLs, 301 permanent redirects and 302 temporary redirects work:</p>
<blockquote><p>
<strong>301 redirect</strong></p>
<p>The 301 redirect defines a redirect which tells the search engine the content has moved permanently to a new location. This is preferred as it clearly states the intent to move and instructs the engine to transfer any value the URL has accrued from the old URL to the new location. It&#8217;s important to know that the 301 redirect does not pass all of the value from an old URL to a new one. The new URL does need to build its own level of trust with the engines, which is why we won’t simply transfer full value to new URLs.</p>
<p><strong>302 redirect</strong></p>
<p>The 302 redirect defines a redirect which states the content has moved temporarily and will return to its original URL shortly. This redirect will still move people to your content, but the engines are essentially being told to hold their assigned values on the original URLs and wait for the content to return to the original URL. This is not what you want. Be careful when requesting redirects be implemented, and clearly define that you need to have a 301 in place.  Otherwise, you can lose value from your original URLs, leaving your new ones to struggle on their own.</p>
<p><strong>rel=canonical</strong></p>
<p>It&#8217;s important to understand that a rel=canonical is not a true redirect. There has been a lot written that it&#8217;s &#8220;basically like a 301 redirect&#8221;, which can be misleading. The purpose of the <code>rel=canonical</code> is to help the engines understand when an individual URL is essentially a duplicate of another. The <code>rel=canonical</code> element does suggest to the engine that any value assigned to the duplicate URL be assigned to the original URL, though. This is similar to how the 301 functions, which is the origin of the over-simplification noted above.</p>
<p>The biggest difference between the two is that while a 301 redirect physically moves a visitor to the new URL, the <code>rel=canonical</code> does not physically move anyone anywhere.</p>
<p>Something else you need to keep in mind when using the <code>rel=canonical</code> is that it was never intended to appear across large numbers of pages. We&#8217;re already seeing a lot of implementations where the command is being used incorrectly. To be clear, using the <code>rel=canonical</code> doesn&#8217;t really hurt you. But, it doesn&#8217;t help us trust the signal when you use it incorrectly across thousands of pages, yet correctly across a few others on your website.</p>
<p>A lot of websites have <code>rel=canonicals</code> in place as placeholders within their page code. Its best to leave them blank rather than point them at themselves. Pointing a <code>rel=canonical</code> at the page it is installed in essentially tells us &#8220;this page is a copy of itself. Please pass any value from itself to itself.&#8221; No need for that.</p>
<p>We do understand that doing work at scale requires some compromises, as it&#8217;s not easy to implement anything on a large site page by page. In such cases, leave the rel=canonical blank until needed.
</p></blockquote>
<p>Review the definitions of 301/302 redirects in <a href="http://www.gordonchoi.com/http-status-codes-2xx-3xx-4xx-5xx-20120116">HTTP status codes 2xx, 3xx, 4xx, 5xx</a>.</p>
<p><strong>Other Search Engines&#8217; Webmaster Tools</strong></p>
<p>Besides Bing, other search engines also offer webmaster tools to webmasters:</p>
<ul>
<li>Google, World&#8217;s largest search engine (with multiple languages): <a href="http://www.gordonchoi.com/cat/google-webmaster-tools">Google Webmaster Tools</a></li>
<li>Yandex, Russian&#8217;s number one search engine: <a href="http://www.gordonchoi.com/yandex-webmaster-tool-in-english-20110720">Yandex Webmaster Tool</a> (English)</li>
<li>Baidu, Chinese&#8217;s leading search engine: <a href="http://www.gordonchoi.com/cat/baidu-webmaster-tools">Baidu Webmaster Tools</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gordonchoi.com/bing-webmaster-tools-review-2011-20120123/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

