<?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>Chris Danford &#187; Web</title>
	<atom:link href="http://www.chrisdanford.com/blog/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chrisdanford.com/blog</link>
	<description>Games, Programming, Web</description>
	<lastBuildDate>Sat, 05 Jan 2013 21:18:06 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Essential JavaScript links</title>
		<link>http://www.chrisdanford.com/blog/2012/07/02/essential-javascript-links/</link>
		<comments>http://www.chrisdanford.com/blog/2012/07/02/essential-javascript-links/#comments</comments>
		<pubDate>Mon, 02 Jul 2012 04:00:17 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=113</guid>
		<description><![CDATA[This is a continuously updated list of JavaScript articles and resources that I recommend to other Amazon developers. MicroJS &#8211; a directory of JavaScript micro libraries PhantomJS &#8211; headless, scriptable WebKit for unit, integration, and load testing 10 things I learned from the jQuery source - a mini code walkthrough of jQuery When Automatic Semicolon Insertion goes&#8230;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chrisdanford.com/blog/wp-content/uploads/2012/07/javascript_logo.jpg"><img class="alignright size-thumbnail wp-image-116" title="javascript_logo" src="http://www.chrisdanford.com/blog/wp-content/uploads/2012/07/javascript_logo-150x150.jpg" alt="" width="150" height="150" /></a>This is a continuously updated list of JavaScript articles and resources that I recommend to other Amazon developers.</p>
<ul>
<li><a href="http://microjs.com/">MicroJS</a> &#8211; a directory of JavaScript micro libraries</li>
<li><a href="http://phantomjs.org/">PhantomJS</a> &#8211; headless, scriptable WebKit for unit, integration, and load testing</li>
<li><a href="http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/">10 things I learned from the jQuery source</a> - a mini code walkthrough of jQuery</li>
<li><a href="http://www.2ality.com/2011/05/semicolon-insertion.html">When Automatic Semicolon Insertion goes bad</a></li>
<li><a href="http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use">==, ===, and type coercion</a></li>
<li><a href="https://github.com/cowboy/talks/blob/master/jquery-plugin-authoring.js">Guide to authoring jQuery plugins</a> - good patterns and anti-patterns for jQuery plugins</li>
<li><a href="http://docs.jquery.com/JQuery_Core_Style_Guidelines">The JavaScript style guide used by jQuery Core</a> - a short and sweet style guide</li>
<li><a href="http://37signals.com/svn/posts/3137-using-event-capturing-to-improve-basecamp-page-load-times">Using event capturing to improve page load times</a> - delay initialization for as long as possible</li>
<li><a href="http://www.html5rocks.com/en/tutorials/async/deferred/">Async JS with Deferreds</a> &#8211; Express asynchronous logic concisely</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2012/07/02/essential-javascript-links/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Essential CSS links</title>
		<link>http://www.chrisdanford.com/blog/2012/06/13/essential-css-links/</link>
		<comments>http://www.chrisdanford.com/blog/2012/06/13/essential-css-links/#comments</comments>
		<pubDate>Wed, 13 Jun 2012 04:07:19 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=109</guid>
		<description><![CDATA[This is a continuously updated list of CSS articles that I recommend to other Amazon developers. CSS3 units and their uses CSS selector specificity - determines the order in which rules are applied to an element SASS vs LESS throwdown - how to choose a CSS preprocessor Sassy Mother Effing Text Shadow - behold the power of SASS&#8230;]]></description>
				<content:encoded><![CDATA[<p>This is a continuously updated list of CSS articles that I recommend to other Amazon developers.</p>
<p><a style="color: #ed1e24; text-decoration: none;" href="http://www.chrisdanford.com/blog/wp-content/uploads/2012/06/css31.jpg"><img class="alignright size-full wp-image-111" title="css3" src="http://www.chrisdanford.com/blog/wp-content/uploads/2012/06/css31.jpg" alt="" width="95" height="130" /></a></p>
<ul>
<li><a href="http://www.inserthtml.com/2012/04/guide-css3-units/">CSS3 units and their uses</a></li>
<li><a href="http://css-tricks.com/specifics-on-css-specificity/">CSS selector specificity</a> - determines the order in which rules are applied to an element</li>
<li><a href="http://css-tricks.com/sass-vs-less/">SASS vs LESS throwdown</a> - how to choose a CSS preprocessor</li>
<li><a href="http://sassymothereffingtextshadow.com/">Sassy Mother Effing Text Shadow</a> - behold the power of SASS</li>
<li><a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> &#8211; lightweight, full-featured, componentized CSS library with awesome documentation</li>
<li><a href="http://sass-lang.com/">SASS</a> - popular CSS preprocessor with great documentation</li>
<li><a href="http://compass-style.org/">Compass home</a> - a library full of reusable CSS best-practices, built on SASS</li>
<li><a href="http://css-tricks.com/when-using-important-is-the-right-choice/">When to use !important</a></li>
<li><a href="http://trac.webkit.org/wiki/Accelerated%20rendering%20and%20compositing">WebKit accelerated rendering and compositing</a> - an explanation of WebKit&#8217;s RenderLayer tree and z-index tree</li>
<li><a href="http://css-tricks.com/crazy-town-selectors/">Crazy Town</a> &#8211; avoiding overly-specific selectors</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2012/06/13/essential-css-links/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting started with Ruby on Rails</title>
		<link>http://www.chrisdanford.com/blog/2012/04/03/getting-started-with-ruby-on-rails/</link>
		<comments>http://www.chrisdanford.com/blog/2012/04/03/getting-started-with-ruby-on-rails/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 07:53:31 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=99</guid>
		<description><![CDATA[These are some of the tutorials and guides I&#8217;ve found most helpful while picking up Ruby on Rails 3. Ruby language: http://strugglingwithruby.blogspot.com/2008/11/contents-page.html http://www.zenspider.com/Languages/Ruby/QuickRef.html Installing Rails on Windows: http://railsinstaller.org/ Best &#8220;my first app&#8221; walk-through: http://guides.rubyonrails.org/getting_started.html Using &#8220;remote&#8221; to ajaxify links and forms: http://www.alfajango.com/blog/rails-3-remote-links-and-forms/ http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/ &#8220;Unobtrusive JS&#8221; library that ships with Rails 3: http://www.slideshare.net/philcrissman/ujs-in-rails-3-6775992 http://www.alfajango.com/blog/rails-jquery-ujs-now-interactive/ Use Twitter Bootstrap&#8230;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chrisdanford.com/blog/wp-content/uploads/2012/04/rails1.png"><img class="alignright size-full wp-image-104" title="rails" src="http://www.chrisdanford.com/blog/wp-content/uploads/2012/04/rails1.png" alt="" width="87" height="111" /></a>These are some of the tutorials and guides I&#8217;ve found most helpful while picking up Ruby on Rails 3.</p>
<p>Ruby language:</p>
<ul>
<li><a href="http://strugglingwithruby.blogspot.com/2008/11/contents-page.html">http://strugglingwithruby.blogspot.com/2008/11/contents-page.html</a></li>
<li><a href="http://www.zenspider.com/Languages/Ruby/QuickRef.html">http://www.zenspider.com/Languages/Ruby/QuickRef.html</a></li>
</ul>
<p>Installing Rails on Windows:</p>
<ul>
<li><a href="http://railsinstaller.org/">http://railsinstaller.org/</a></li>
</ul>
<p>Best &#8220;my first app&#8221; walk-through:</p>
<ul>
<li><a href="http://guides.rubyonrails.org/getting_started.html">http://guides.rubyonrails.org/getting_started.html</a></li>
</ul>
<p>Using &#8220;remote&#8221; to ajaxify links and forms:</p>
<ul>
<li><a href="http://www.alfajango.com/blog/rails-3-remote-links-and-forms/">http://www.alfajango.com/blog/rails-3-remote-links-and-forms/</a></li>
<li><a href="http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/">http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/</a></li>
</ul>
<p>&#8220;Unobtrusive JS&#8221; library that ships with Rails 3:</p>
<ul>
<li><a href="http://www.slideshare.net/philcrissman/ujs-in-rails-3-6775992">http://www.slideshare.net/philcrissman/ujs-in-rails-3-6775992</a></li>
<li><a href="http://www.alfajango.com/blog/rails-jquery-ujs-now-interactive/">http://www.alfajango.com/blog/rails-jquery-ujs-now-interactive/</a></li>
</ul>
<p>Use Twitter Bootstrap with Rails:</p>
<ul>
<li><a href="http://railscasts.com/episodes/328-twitter-bootstrap-basics">http://railscasts.com/episodes/328-twitter-bootstrap-basics</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2012/04/03/getting-started-with-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get Chrome &#8220;Side Tabs&#8221; back (kind of)</title>
		<link>http://www.chrisdanford.com/blog/2012/03/13/get-chrome-side-tabs-back-kind-of/</link>
		<comments>http://www.chrisdanford.com/blog/2012/03/13/get-chrome-side-tabs-back-kind-of/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 06:59:36 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=91</guid>
		<description><![CDATA[Thousands of people, including myself, cried out in terror when Google removed the &#8220;Side Tabs&#8221; from Chrome. I tried for one month to settle into Firefox + Firebug + Tree Style Tabs as my main browser, but that combination is nowhere near is snappy as Chrome for my workload. My workaround has been to use&#8230;]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-92" title="chrome side tabs" src="http://www.chrisdanford.com/blog/wp-content/uploads/2012/03/chrome-side-tabs.jpg" alt="" width="340" height="249" /> Thousands of people, including myself, <a href="http://code.google.com/p/chromium/issues/detail?id=99369">cried</a> <a href="http://code.google.com/p/chromium/issues/detail?id=99332">out</a> in <a href="http://groups.google.com/a/googleproductforums.com/forum/#!category-topic/chrome/discuss-chrome/rgv7_p9PJDQ">terror</a> when Google removed the &#8220;Side Tabs&#8221; from Chrome.  I tried for one month to settle into Firefox + Firebug + <a href="https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/">Tree Style Tabs</a> as my main browser, but that combination is nowhere near is snappy as Chrome for my workload.</p>
<p>My workaround has been to use the most recent build of Chromium (Chrome&#8217;s open-source alter ego) that still contained the Side Tabs feature.  Because there are no security updates available for this version, I use <a href="http://code.google.com/p/scriptno/downloads/list">NoScript</a> and whitelist scripting on sites as needed.</p>
<p><b>Chromium 15.0.862.0</b> &#8211; Windows: <a href="http://commondatastorage.googleapis.com/chromium-browser-snapshots/Win/98156/chrome-win32.zip">chrome-win32.zip</a>, Mac: <a href="http://commondatastorage.googleapis.com/chromium-browser-snapshots/Mac/98156/chrome-mac.zip">chrome-mac.zip</a></p>
<p>A major advantage of using Chromium instead of <a href="http://elementdesignllc.com/2012/01/re-enable-vertical-tabs-on-google-chrome-16/">an old version of Chrome that has Side Tabs</a> is that Chromium can be run side-by-side with the latest version of Chrome.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2012/03/13/get-chrome-side-tabs-back-kind-of/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Understanding WebKit composite layers and iOS Safari performance</title>
		<link>http://www.chrisdanford.com/blog/2011/07/24/understanding-hardware-compositing-css-transforms/</link>
		<comments>http://www.chrisdanford.com/blog/2011/07/24/understanding-hardware-compositing-css-transforms/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 12:45:48 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[iOS Safari]]></category>
		<category><![CDATA[transforms]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=82</guid>
		<description><![CDATA[I&#8217;ve made a video showing how Webkit handles animating of CSS3 transforms very differently from animating of CSS position (left, top) or margin. The are several different conditions that will trigger the browser to use a &#8220;composite layer&#8221; which minimizes repaints and allows for hardware-accelerated composting. The benefits are especially dramatic in iOS Safari. Try&#8230;]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve made a video showing how Webkit handles animating of CSS3 transforms very differently from animating of CSS position (left, top) or margin.  The are several different conditions that will trigger the browser to use a &#8220;composite layer&#8221; which minimizes repaints and allows for hardware-accelerated composting. The benefits are especially dramatic in iOS Safari.</p>
<p><iframe src="http://www.youtube.com/embed/GwVaB7GKZXo?hl=en&amp;fs=1" frameborder="0" width="425" height="349"></iframe></p>
<ul>
<li><a href="http://chrisdanford.com/public/transform/no-spin.html">Try the example</a> and compare the behavior in your browser&#8217;s inspection tools</li>
<li>A tweaked example for iOS that makes the performance difference very obvious: <a href="http://chrisdanford.com/public/transform/">chrisdanford.com/public/transform/</a></li>
</ul>
<p><iframe src="http://chrisdanford.com/public/transform/no-spin.html" width="425" height="349"></iframe><br />
<a href="http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome">This Chromium document explaining composite layers</a> says that the following conditions all trigger a separate composite layer:</p>
<ul>
<li>Layer has 3D or perspective transform CSS properties</li>
<li>Layer is used by video element using accelerated video decoding</li>
<li>Layer is used by a canvas element with a 3D context</li>
<li>Layer uses a CSS animation for its opacity or uses an animated webkit transform</li>
<li>Layer has a descendant that has a compositing layer</li>
<li>Layer has a sibling with a lower z-index which has a compositing layer (in other words the layer is rendered on top of a composited layer)</li>
</ul>
<p>See <a href="http://css3.bradshawenterprises.com/all/">Rich Bradshaw&#8217;s awesome CSS3/Transforms page</a> for some great examples.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2011/07/24/understanding-hardware-compositing-css-transforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 DOM and CSS3 performance</title>
		<link>http://www.chrisdanford.com/blog/2011/07/16/html5-dom-and-css3-performance/</link>
		<comments>http://www.chrisdanford.com/blog/2011/07/16/html5-dom-and-css3-performance/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 16:39:42 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[css3 dom html]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=76</guid>
		<description><![CDATA[I ran across an awesome presentation by Paul Irish discussing DOM and CSS3 performance issues: The video: http://www.youtube.com/watch?v=q_O9_C2ZjoA The slides: http://dl.dropbox.com/u/39519/talks/gperf/index.html The blog post: http://paulirish.com/2011/dom-html5-css3-performance/ The top tips that were new to me: how to not trigger unnecessary layout/reflow iOS Safari: get massive compositing performance improvement by using CSS3&#8242;s translate3d(0,0,0) instead of translate(0,0) jsperf.com to&#8230;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chrisdanford.com/blog/wp-content/uploads/2011/07/html5-badge-h-solo.png"><img class="alignright size-full wp-image-77" title="html5-badge-h-solo" src="http://www.chrisdanford.com/blog/wp-content/uploads/2011/07/html5-badge-h-solo.png" alt="" width="63" height="64" /></a>I ran across an awesome presentation by Paul Irish discussing DOM and CSS3 performance issues:</p>
<p>The video: <a href="http://www.youtube.com/watch?v=q_O9_C2ZjoA">http://www.youtube.com/watch?v=q_O9_C2ZjoA</a><br />
The slides: <a href="http://dl.dropbox.com/u/39519/talks/gperf/index.html">http://dl.dropbox.com/u/39519/talks/gperf/index.html</a><br />
The blog post: <a href="http://paulirish.com/2011/dom-html5-css3-performance/">http://paulirish.com/2011/dom-html5-css3-performance/</a></p>
<p>The top tips that were new to me:</p>
<ul>
<li><a href="http://gent.ilcore.com/2011/03/how-not-to-trigger-layout-in-webkit.html">how to not trigger unnecessary layout/reflow</a></li>
<li>iOS Safari: get massive compositing performance improvement by using CSS3&#8242;s translate3d(0,0,0) instead of translate(0,0)</li>
<li>jsperf.com to conduct JavaScript profiling experiments: <a href="http://jsperf.com/jquery-data-vs-jqueryselection-data">example</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2011/07/16/html5-dom-and-css3-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Firebug feature: console.timeStamp</title>
		<link>http://www.chrisdanford.com/blog/2011/07/14/new-firebug-feature-console-timestamp/</link>
		<comments>http://www.chrisdanford.com/blog/2011/07/14/new-firebug-feature-console-timestamp/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 03:28:03 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=74</guid>
		<description><![CDATA[Firebug recently added an awesome new API; console.timeStamp lets you to create named &#8220;events&#8221; in the Net panel: This technique requires manual instrumentation and isn&#8217;t as detailed as the Timeline panel in Chrome/Safari or a heavy-weight tool like dynaTrace, but it&#8217;s a nice, simple, uncluttered view compared to those other tools. I used it today&#8230;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chrisdanford.com/blog/wp-content/uploads/2011/07/timestamp.png"><img src="http://www.chrisdanford.com/blog/wp-content/uploads/2011/07/timestamp-150x150.png" alt="" title="timestamp" width="150" height="150" class="alignright size-thumbnail wp-image-75" /></a>Firebug recently added an awesome new API; <a href="http://blog.getfirebug.com/2011/06/17/firebug-1-8b3/">console.timeStamp</a> lets you to create named &#8220;events&#8221; in the Net panel:</p>
<p>This technique requires manual instrumentation and isn&#8217;t as detailed as <a href="http://code.google.com/chrome/devtools/docs/timeline.html">the Timeline panel in Chrome/Safari</a> or a heavy-weight tool like <a href="http://www.dynatrace.com/en/">dynaTrace</a>, but it&#8217;s a nice, simple, uncluttered view compared to those other tools.</p>
<p><code><script type="text/javascript">
if (console.timeStamp) {
    console.timeStamp("
}
</script></code></p>
<p>I used it today on a machine where I couldn&#8217;t install dynaTrace, I&#8217;ll surely be using it again.  Unfortunately it isn&#8217;t supported in Firefox 3.6 and older.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2011/07/14/new-firebug-feature-console-timestamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimal Apache compression and expire settings</title>
		<link>http://www.chrisdanford.com/blog/2011/03/20/optimal-apache-compression-and-expire-settings/</link>
		<comments>http://www.chrisdanford.com/blog/2011/03/20/optimal-apache-compression-and-expire-settings/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 22:20:37 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[expires]]></category>
		<category><![CDATA[HTTP headers]]></category>
		<category><![CDATA[mod_deflate]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=61</guid>
		<description><![CDATA[Below are compression and expiration settings for Apache that I&#8217;ve found optimal for StepMania.  You can paste them into your .htaccess file. Don&#8217;t mess with PHP&#8217;s ob_gzhandler.  The settings below enable compression at the Apache module level, are the cleanest way to handle compression of non-PHP types, and are better performing to boot. If your PHP application&#8230;]]></description>
				<content:encoded><![CDATA[<p>Below are compression and expiration settings for Apache that I&#8217;ve found optimal for <a href="http://www.stepmania.com">StepMania</a>.  You can paste them into your <a href="http://httpd.apache.org/docs/1.3/howto/htaccess.html">.htaccess</a> file.</p>
<ul>
<li>Don&#8217;t mess with PHP&#8217;s <a href="http://php.net/manual/en/function.ob-gzhandler.php">ob_gzhandler</a>.  The settings below enable compression at the Apache module level, are the cleanest way to handle compression of non-PHP types, and are <a href="http://www.highrankings.com/forum/index.php?showtopic=42531">better performing</a> to boot.</li>
<li>If your PHP application has a option for compression (it&#8217;ll be using ob_gzhander), turn that off in favor of these settings.</li>
<li><a href="http://web-sniffer.net/">Web-Sniffer</a> is useful for testing whether your compression and cache-control settings are taking effect.  It&#8217;s also useful for troubleshooting HTTP error responses that Firefox and Chrome hide with pretty error pages.</li>
</ul>
<pre>
&lt;IfModule mod_deflate.c&gt;
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
&lt;/IfModule&gt;

&lt;IfModule mod_expires.c&gt;
ExpiresActive On

ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType audio/x-wav "access plus 1 month"
ExpiresByType audio/mpeg "access plus 1 month"
ExpiresByType video/mpeg "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/quicktime "access plus 1 month"
ExpiresByType video/x-ms-wmv "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"

ExpiresByType text/css "access plus 1 hour"
ExpiresByType text/javascript "access plus 1 hour"
&lt;/IfModule&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2011/03/20/optimal-apache-compression-and-expire-settings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rules for optimal web site performance</title>
		<link>http://www.chrisdanford.com/blog/2010/11/13/rules-for-optimal-web-site-performance/</link>
		<comments>http://www.chrisdanford.com/blog/2010/11/13/rules-for-optimal-web-site-performance/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 18:13:24 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=33</guid>
		<description><![CDATA[I&#8217;ve been working to improve the performance a large site at Amazon.  Steve Souders has written two excellent books that explain browser/http best practices.  A few of the rules were new to me and very helpful (flushing/mod_deflate settings, different browser techniques to defer Javascript).  The important take-away is that only a small fraction of typical&#8230;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/0596529309?ie=UTF8&amp;tag=step0f-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0596529309"><img class="alignright size-full wp-image-34" title="high performance web sites cover" src="http://www.chrisdanford.com/blog/wp-content/uploads/2010/10/book-84x110.jpg" alt="" width="84" height="110" /></a>I&#8217;ve been working to improve the performance a large site at Amazon.  <a href="http://stevesouders.com/">Steve Souders</a> has written two excellent books that explain browser/http best practices.  A few of the rules were new to me and very helpful (flushing/mod_deflate settings, different browser techniques to defer Javascript).  The important take-away is that only a small fraction of typical page load time is bottlenecked by the server generation of a page.</p>
<table>
<tbody>
<tr>
<td><a href="http://www.amazon.com/gp/product/0596529309?ie=UTF8&amp;tag=step0f-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0596529309">High Performance Web Sites</a><br/>(<a href="http://stevesouders.com/hpws/">companion site</a>)</p>
<ol>
<li>Make Fewer HTTP Requests</li>
<li>Use a Content Delivery Network</li>
<li>Add an Expires 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</li>
<li>Avoid Redirects</li>
<li>Remove Duplicate Scripts</li>
<li>Configure ETags</li>
<li>Make AJAX Cacheable</li>
</ol>
</td>
<td><a href="http://www.amazon.com/gp/product/0596522304?ie=UTF8&amp;tag=step0f-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0596522304">Even Faster Web Sites</a><br/>(<a href="http://stevesouders.com/efws/">companion site</a>)</p>
<ol class="toc" style="margin-left: 20px; padding-left: 0pt;">
<li>Understanding Ajax Performance</li>
<li>Creating Responsive Web Applications</li>
<li>Splitting the Initial Payload</li>
<li>Loading Scripts Without Blocking</li>
<li>Coupling Asynchronous Scripts</li>
<li>Positioning Inline Scripts</li>
<li>Writing Efficient JavaScript</li>
<li>Scaling with Comet</li>
<li>Going Beyond Gzipping</li>
<li>Optimizing Images</li>
<li>Sharding Dominant Domains</li>
<li>Flushing the Document Early</li>
<li>Using Iframes Sparingly</li>
<li>Simplifying CSS Selectors</li>
</ol>
</td>
</tr>
</tbody>
</table>
<p>My first round of optimizations just went into production and our metric that measures &#8220;time from click until critical feature shows up in the browser&#8221;  dropped from 5.25s to 3.5s.  It&#8217;s neat to multiply the savings and see that many weeks of end-user browser load time are saved each day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2010/11/13/rules-for-optimal-web-site-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free year of EC2 hosting on AWS</title>
		<link>http://www.chrisdanford.com/blog/2010/10/22/aws-has-a-new-and-generous-free-tier/</link>
		<comments>http://www.chrisdanford.com/blog/2010/10/22/aws-has-a-new-and-generous-free-tier/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 03:58:10 +0000</pubDate>
		<dc:creator>chrisdanford</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chrisdanford.com/blog/?p=29</guid>
		<description><![CDATA[I put together my own co-located server for ChartPT, and I&#8217;ve been regretting it more and more each time AWS releases new features and drops prices.  They just announced a new Free tier today. 750 hours of Amazon EC2 Linux Micro Instance usage (613 MB of memory and 32-bit and 64-bit platform support) – enough&#8230;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.chrisdanford.com/blog/wp-content/uploads/2010/10/logo_aws.gif"><img class="alignright size-full wp-image-30" title="logo_aws" src="http://www.chrisdanford.com/blog/wp-content/uploads/2010/10/logo_aws.gif" alt="" width="164" height="60" /></a>I put together my own co-located server for <a href="http://www.chartpt.com">ChartPT</a>, and I&#8217;ve been regretting it more and more each time <a href="http://aws.amazon.com/">AWS</a> releases new features and drops prices.  They just announced <a href="http://aws.amazon.com/free/">a new Free tier</a> today.</p>
<ul>
<li>750 hours of Amazon EC2 Linux Micro Instance usage (613 MB of memory and 32-bit and 64-bit platform support) – enough hours to run continuously each month*</li>
<li>750 hours of an Elastic Load Balancer plus 15 GB data processing*</li>
<li>10 GB of Amazon Elastic Block Storage, plus 1 million I/Os, 1 GB of snapshot storage, 10,000 snapshot Get Requests and 1,000 snapshot Put Requests*</li>
<li>5 GB of Amazon S3 storage, 20,000 Get Requests, and 2,000 Put Requests*</li>
<li>30 GB per of internet data transfer (15 GB of data transfer “in” and 15 GB of data transfer “out” across all services except Amazon CloudFront)*</li>
<li>25 Amazon SimpleDB Machine Hours and 1 GB of Storage**</li>
<li>100,000 Requests of Amazon Simple Queue Service**</li>
<li>100,000 Requests, 100,000 HTTP notifications and 1,000 email notifications for Amazon Simple Notification Service**</li>
</ul>
<p>I use S3 and CloudFront as an edge cache for <a href="http://www.stepmania.com/">StepMania.com</a>.   I&#8217;m waiting just a little longer for the transfer costs to drop so that  I can move all of the file downloads to S3 (my current S3 bill would be  ~$500/mo according to the AWS calculator).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisdanford.com/blog/2010/10/22/aws-has-a-new-and-generous-free-tier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
