<?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>D90 Tools &#38; Techniques &#187; Sysadmin Tools</title>
	<atom:link href="http://www.d90.us/toolbox/category/sysadmin-tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.d90.us/toolbox</link>
	<description>So I can remember how I did stuff in the future...</description>
	<lastBuildDate>Fri, 26 Nov 2010 20:08:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Custom 404 for Apache (using PHP!)</title>
		<link>http://www.d90.us/toolbox/2010/11/04/custom-404-for-apache-using-php/</link>
		<comments>http://www.d90.us/toolbox/2010/11/04/custom-404-for-apache-using-php/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 23:03:44 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>
		<category><![CDATA[Web Hosting Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/?p=210</guid>
		<description><![CDATA[Images, css, js just get a simple 404 Not Found page. Everything not in the list of items we&#8217;re checking get redirected to the homepage. So a simple typo will get the redirect, but a missing PNG file that&#8217;s called by one of our pages won&#8217;t send a copy of the homepage to the client [...]]]></description>
			<content:encoded><![CDATA[<p>Images, css, js just get a simple 404 Not Found page.</p>
<p>Everything not in the list of items we&#8217;re checking get redirected to the homepage.  So a simple typo will get the redirect, but a missing PNG file that&#8217;s called by one of our pages won&#8217;t send a copy of the homepage to the client telling it it is an image file!</p>
<p><code><?php<br />
/*<br />
This is a custom 404 handler.</p>
<p>It does makes a decision -- if it's a small, auxiliary file like an image, code sheet, etc<br />
that is being requested and not found then we'll send a standard Apache 404 page.</p>
<p>However, anything that looks like a website request (i.e. everything NOT in the list)<br />
will be given a 301 redirect to our homepage.</p>
<p>Invoke by:<br />
ErrorDocument 404 /404.php</p>
<p>4 November 2010<br />
Matt Kivela<br />
*/</p>
<p>/* Currently set to filter:<br />
   aspx<br />
   asp<br />
   cgi<br />
   css<br />
   gif<br />
   ico<br />
   jpg<br />
   ogg<br />
   png<br />
*/</p>
<p>if (preg_match('/\.[Aa][Ss][Hh][Xx]|[Aa][Ss][Pp]|[Cc][Gg][Ii]|[Cc][Ss][Ss]|[Gg][Ii][Ff]|[Ii][Cc][Oo]|[Jj][Pp][Gg]|[Jj][Ss]|[Oo][Gg][Gg]|[Pp][Nn][Gg]$/', $_SERVER[REQUEST_URI], $foo))<br />
  {<br />
     echo Header("HTTP/1.1 404 Not Found");<br />
     echo Header("Status: 404 Not Found");<br />
     echo "<html><body>404 Error:</br>File: http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI] not found.</br>";<br />
     echo "If this is causing a problem, you may contact <a href=\"mailto:admin@yourdomain.org\">admin@yourdomain.org</a> or</br>";<br />
     echo "submit a ticket at <a href=\"http://bugzilla.yourdomain.org/\">http://bugzilla.yourdomain.org/</a></body></html>";<br />
   }<br />
else<br />
  {<br />
    $new_url = "http://$_SERVER[SERVER_NAME]/";<br />
    echo Header( "HTTP/1.1 301 Moved Permanently" );<br />
    echo Header( "Location: $new_url" );<br />
  }<br />
?></p>
<p>~<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2010/11/04/custom-404-for-apache-using-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rootkit Hunters</title>
		<link>http://www.d90.us/toolbox/2010/02/10/rootkit-hunters/</link>
		<comments>http://www.d90.us/toolbox/2010/02/10/rootkit-hunters/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 18:53:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[General Security]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/?p=182</guid>
		<description><![CDATA[A few resources for finding rootkits: Linux: Rootkit Hunter Chkrootkit Windows: RootkitRevealer]]></description>
			<content:encoded><![CDATA[<p>A few resources for finding rootkits:</p>
<p>Linux:<br />
<a href="www.rootkit.nl" target="_blank">Rootkit Hunter</a><br />
<a href="http://www.chkrootkit.org/" target="_self">Chkrootkit</a></p>
<p>Windows:<br />
<a href="http://technet.microsoft.com/en-us/sysinternals/bb897445.aspx" target="_blank">RootkitRevealer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2010/02/10/rootkit-hunters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Squid handling http &#8211;&gt; https redirects</title>
		<link>http://www.d90.us/toolbox/2009/05/29/squid-handling-http-https-redirects/</link>
		<comments>http://www.d90.us/toolbox/2009/05/29/squid-handling-http-https-redirects/#comments</comments>
		<pubDate>Sat, 30 May 2009 01:35:48 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/?p=95</guid>
		<description><![CDATA[In configuring Squid to handle both our port 80 and 443 traffic, we have the issue that we can use redirects at the webserver level to redirect certain pages to https:// . So this is handled in Squid. First, make a simple script.  There&#8217;s a possibility another redirector like Squirm might do a better job, [...]]]></description>
			<content:encoded><![CDATA[<p>In configuring Squid to handle both our port 80 and 443 traffic, we have the issue that we can use redirects at the webserver level to redirect certain pages to https:// .</p>
<p>So this is handled in Squid.</p>
<p>First, make a simple script.  There&#8217;s a possibility another redirector like Squirm might do a better job, but I haven&#8217;t played with them.</p>
<blockquote><p>!/usr/bin/perl<br />
$|=1;<br />
while (&lt;&gt;) {<br />
s@http://www7.getmiro.(com|net|org)/adopt(.*)$@301:https://www7.getmiro.com/adopt$2@;<br />
print;<br />
}</p></blockquote>
<p>Saved at /etc/squid3/squid_redirector.pl and chown/chmod so the user &#8220;proxy&#8221; that squid runs under can run it.  Your path, of course, may vary.</p>
<p>The key part for what we need is that we pre-pend &#8220;301&#8243; before https:  in the rewrite.  When this is returned to the user&#8217;s browser it redirects them to the secure page.  This script also takes anything at com, net, or org and forces them to a tld of .com as well.</p>
<p>It&#8217;s easy to test this perl script.  Simply type ./squid_redirector.pl which launches it interactively.</p>
<blockquote><p><span style="color: #000000;"># ./squid_redirector.pl<br />
</span><span style="color: #ff0000;"><span style="color: #000000;">http://www7.getmiro.com/foo</span></p>
<p>http://www7.getmiro.com/foo</p>
<p><span style="color: #000000;">http://www7.getmiro.com/adopt/test</span><br />
301:https://www7.getmiro.com/adopt/test<br />
<span style="color: #000000;">http://www7.getmiro.<strong>net</strong>/adopt/matt/is/an/evil/genius </span><br />
301:https://www7.getmiro.<strong>com</strong>/adopt/matt/is/an/evil/genius</span></p></blockquote>
<p>Next, tell Squid to use it.  We need to enable these lines in the squid.conf file:</p>
<p style="padding-left: 30px;">url_rewrite_program /etc/squid3/squid_redirector.pl<br />
url_rewrite_children 10<br />
url_rewrite_host_header off<br />
url_rewrite_bypass on</p>
<p>The first line tells Squid what to use to rewrite URLs, the second tells it to spawn 10 instances on startup.  I&#8217;m not sure, in the end, if host_header needs to be off.  url_rewrite_bypass on allows Squid to skip the re-writing step if all the redirectors are busy.  That&#8217;s a decision knowing our security risks, users, and needs &#8212; and I&#8217;m going with more reliability over absolute security.  We&#8217;ll should see skips showing up in the logs and adjust settings from there if necessary.</p>
<p>Restart Squid, give it a test.  Famous last words &#8212; it should work now.</p>
<p>References:</p>
<p>http://wiki.squid-cache.org/Features/Redirectors</p>
<p>http://brainextender.blogspot.com/2009/01/simple-squid-redirector-perl-script.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2009/05/29/squid-handling-http-https-redirects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lighttpd, virtual hosts, alternative ports</title>
		<link>http://www.d90.us/toolbox/2009/05/29/lighttpd-virtual-hosts-alternative-ports/</link>
		<comments>http://www.d90.us/toolbox/2009/05/29/lighttpd-virtual-hosts-alternative-ports/#comments</comments>
		<pubDate>Fri, 29 May 2009 20:25:50 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Lighttpd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/?p=92</guid>
		<description><![CDATA[In the configuration of our new server, all ports 80 and 443 traffic is handled by Squid as a reverse proxy.  8080 is the &#8220;backdoor&#8221; that bypasses Squid and hits Lighttpd directly. But the standard format of a Lighttpd virtual host entry doesn&#8217;t recognize alternate ports appended after the tld.  Not a big deal, this [...]]]></description>
			<content:encoded><![CDATA[<p>In the configuration of our new server, all ports 80 and 443 traffic is handled by Squid as a reverse proxy.  8080 is the &#8220;backdoor&#8221; that bypasses Squid and hits Lighttpd directly.</p>
<p>But the standard format of a Lighttpd virtual host entry doesn&#8217;t recognize alternate ports appended after the tld.  Not a big deal, this does the trick:</p>
<blockquote><p>$HTTP["host"] =~ &#8220;(^|\.)getmiro\.(com|net|org)($|:8080$)&#8221; {</p></blockquote>
<p>Translated:<br />
<em>(^|\.)</em> Any hostname<br />
<em>getmiro\</em> Going to the gemtiro domain<br />
<em>.(com|net|org)</em> with a top level domain of com, net, or org<br />
<em>($|:8080$){</em> and ending with the tld or :8080 will be processed by the rules that follow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2009/05/29/lighttpd-virtual-hosts-alternative-ports/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lighttpd, virtual hosts, and wildcard domains</title>
		<link>http://www.d90.us/toolbox/2009/05/29/lighttpd-virtual-hosts-and-wildcard-domains/</link>
		<comments>http://www.d90.us/toolbox/2009/05/29/lighttpd-virtual-hosts-and-wildcard-domains/#comments</comments>
		<pubDate>Fri, 29 May 2009 20:01:53 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>
		<category><![CDATA[Web Hosting Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/?p=86</guid>
		<description><![CDATA[So we&#8217;re setting up mirocommunity.com, and I don&#8217;t want to be hassled continously to create new hostnames in DNS. To avoid that, it&#8217;s a simple wildcard entry like this in the appropriate named database: *.mirocommunity.com.    IN      CNAME   mirocommunity.com. Which directs everything to our server. Now our server hosts multiple sites via host entries, so we [...]]]></description>
			<content:encoded><![CDATA[<p>So we&#8217;re setting up mirocommunity.com, and I don&#8217;t want to be hassled continously to create new hostnames in DNS.</p>
<p>To avoid that, it&#8217;s a simple wildcard entry like this in the appropriate named database:</p>
<blockquote><p>*.mirocommunity.com.    IN      CNAME   mirocommunity.com.</p></blockquote>
<p>Which directs everything to our server.</p>
<p>Now our server hosts multiple sites via host entries, so we can&#8217;t use a simple negation like this:</p>
<blockquote><p>$HTTP["host"] !~ &#8220;^(www|medfield)\.mirocommunity\.(com|net|org)($|:8080$)&#8221; {<br />
url.redirect = (<br />
&#8220;^(.*)$&#8221; =&gt; &#8220;http://www.mirocommunity.com$1&#8243;,<br />
)<br />
}</p></blockquote>
<p>Note the negation by using !~ instead of =~.  That would work if all we had was mirocommunity sites to host, but when hitting another site on the server like www7.getmiro.com it would read it as not being www or medfield dot mirocommunity, and thus drop you to www.mirocommunity.com.  For the curious, the 8080 part of the url parsing is a bypass of the Squid proxies on ports 80 and 443.</p>
<p>Anything that doesn&#8217;t match a virtual host or alias on our server gets dropped by default to /var/www.</p>
<p>There lies the simple solution &#8212; put an index.php file there that does the redirect work:</p>
<blockquote><p>&lt;?php<br />
// Hostnames that aren&#8217;t matched in Lighttpd get dropped here<br />
// by default.<br />
// This script removes the hostname(s) and drops them to<br />
// www.[domain].[tld]<br />
// 29 May 2009 MRK<br />
$split_host = split(&#8220;\.&#8221;, $_SERVER[HTTP_HOST]);<br />
$domain = count($split_host) &#8211; 2;<br />
$tld = count($split_host) &#8211; 1;<br />
$new_host = &#8220;http://www.$split_host[$domain].$split_host[$tld]&#8220;;<br />
// echo &#8220;$new_host&#8221;;<br />
header(&#8220;Location: $new_host&#8221;);<br />
exit;<br />
?&gt;</p></blockquote>
<p>The <em>split</em> command splits the $_SERVER[HTTP_HOST] variable at each period, and put it&#8217;s contents less the periods into an array called $split_host.</p>
<p>The <em>count($split_host)</em> determines how many members we have in the $split_host array.  We know we always want the last (the top level domain &#8212; .com, etc) and second to last (the domain &#8212; mirocommunity, etc).  Since arrays start at 0, we simply count -1 for the tld and -2 for the domain.</p>
<p>By adding the <em>count</em> logic, we can handle domains like brooklyn.newyork.mirocommunity.com which have more then one hostname before the domain and tld.</p>
<p>$new_host then forms the URL we want to catch wildcard hostnames that haven&#8217;t been configured yet.  It&#8217;s simply the www.domain.tld form.  That&#8217;s fed to a http<em> header</em> which causes the user&#8217;s browser to redirect to the default website we want.</p>
<p>So as of today, while newyork.mirocommunity.com and brooklyn.newyork.mirocommunity.com have no virtual hosts, you do arrive successfully at www.mirocommunity.com.</p>
<p>Our developers can activate those hostnames simply by adding an entry in the appropriate lighttpd conf file and reload lighttpd &#8212; no need to contact the sysadmin to go make an entry in our DNS system for each new city added.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2009/05/29/lighttpd-virtual-hosts-and-wildcard-domains/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimizing Website integration with Amazon&#8217;s S3 Service</title>
		<link>http://www.d90.us/toolbox/2009/02/28/optimizing-website-integration-with-amazons-s3-service/</link>
		<comments>http://www.d90.us/toolbox/2009/02/28/optimizing-website-integration-with-amazons-s3-service/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 06:15:26 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>
		<category><![CDATA[Web Hosting Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/?p=48</guid>
		<description><![CDATA[At Participatory Culture Foundation we use Amazon&#8217;s S3 Service to host our static content &#8212; css, js, and images. This accomplishes two things &#8212; it improves the performance for our visitors since Amazon has faster performance and reliability then we can afford on our own servers, and it does so at a lower cost. In [...]]]></description>
			<content:encoded><![CDATA[<p>At Participatory Culture Foundation we use Amazon&#8217;s S3 Service to host our static content &#8212; css, js, and images.</p>
<p>This accomplishes two things &#8212; it improves the performance for our visitors since Amazon has faster performance and reliability then we can afford on our own servers, and it does so at a lower cost.</p>
<p>In this post we&#8217;ll look at how much bandwidth and files/redirect we use without S3, then with various combination of local and redirected files, up to code as optimized as I have been able to make it &#8212; fully optimized we our servers only transfer 6.7% of the bytes that the &#8220;unoptimized&#8221; site would.  Optimizing this single popular page to use S3 efficiently saves PCF about $1,000 a year in hosting costs.</p>
<h4>1)<br />
Let&#8217;s look at a redacted Squid log after the February, 2009 redesign of www.getmiro.com when not using S3 at all:</h4>
<pre><em>"GET http://www.getmiro.com/ HTTP/1.1" 200 21781 "-" "Mozilla/5.0
 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6"
"GET http://www.getmiro.com//css/nav.css HTTP/1.1" 200 5004 "http://www.getmiro.com/" "Mozilla/5.0
"GET http://www.getmiro.com//css/styles.css HTTP/1.1" 200 21515 "http://www.getmiro.com/" "Mozilla/5.0
"GET http://www.getmiro.com/css/index.css HTTP/1.1" 200 7709 "http://www.getmiro.com/" "Mozilla/5.0
"GET http://www.getmiro.com//i/blue_bg.png HTTP/1.1" 200 1198 "http://www.getmiro.com//css/styles.css" "Mozilla/5.0
"GET http://www.getmiro.com//i/nav_back.gif HTTP/1.1" 200 530 "http://www.getmiro.com//css/nav.css" "Mozilla/5.0
[blah blah blah...]</em></pre>
<p>That&#8217;s 37 files, for a total of 338,359 Bytes.</p>
<h4>2)<br />
Now let&#8217;s look if we load CSS from our server, but use Apache to re-write images and js to the S3 service:</h4>
<pre><em>"GET http://www.getmiro.com/ HTTP/1.1" 200 21781 "http://www.getmiro.com/" "Mozilla/5.0
 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6"
"GET http://www.getmiro.com//css/nav.css HTTP/1.1" 200 5004 "http://www.getmiro.com/" "Mozilla/5.0
"GET http://www.getmiro.com//css/styles.css HTTP/1.1" 200 21515 "http://www.getmiro.com/" "Mozilla/5.0
"GET http://www.getmiro.com/css/index.css HTTP/1.1" 200 7709 "http://www.getmiro.com/" "Mozilla/5.0
"GET http://www.getmiro.com//i/blue_bg.png HTTP/1.1" 302 688 "http://www.getmiro.com//css/styles.css" "Mozilla/5.0
"GET http://www.getmiro.com//i/nav_back.gif HTTP/1.1" 302 690 "http://www.getmiro.com//css/nav.css" "Mozilla/5.0
[blah blah blah...]</em></pre>
<p>Now it&#8217;s four files, plus 33 redirects &#8212; and only 78,705 bytes.</p>
<h4>3)<br />
Now let&#8217;s use Apache to redirect the CSS to be pulled from Amazon S3.</h4>
<pre><em>"GET http://www.getmiro.com/ HTTP/1.1" 200 21781 "-" "Mozilla/4.0
 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
"GET http://www.getmiro.com//css/nav.css HTTP/1.1" 302 684 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com//css/styles.css HTTP/1.1" 302 690 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com/css/index.css HTTP/1.1" 302 688 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com//i/blue_bg.png HTTP/1.1" 302 687 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com//i/nav_back.gif HTTP/1.1" 302 689 "http://www.getmiro.com/" "Mozilla/4.0
[blah blah blah...]</em></pre>
<p>Still four files and 33 redirects, but down to 46,506 bytes.</p>
<p>So far it&#8217;s all been pretty standard stuff in Apache using mod_rewrite redirects.  Apache sees a CSS sheet being called, it redirects it to S3.</p>
<pre><em>RewriteRule ^/css/(.*) http://s3.getmiro.3.0.com.s3.amazonaws.com/css/$1</em></pre>
<p>And then a css sheet may have a line like this:</p>
<p><em>background: url(../i/screen_dropshadow.png) -20px -36px no-repeat;</em></p>
<p>Now an observant user may note in the logs above that I switched from using Firefox to IE.  Why?  The browsers interpret the CSS differently.</p>
<p>Firefox interprets &#8220;../i/&#8221; relative to where the CSS style sheet is LOADED from &#8212; in our case  http://s3.getmiro.3.0.com.s3.amazonaws.com/css/.<br />
Internet Explorer interprets &#8220;../i/&#8221; relative to where the CSS style sheet is CALLED from &#8212; in our case http://www.getmiro.com/css/.</p>
<p>Those familiar with unix notation know that &#8220;../i/&#8221; from &#8220;getmiro.com/css/&#8221; gets you to &#8220;getmiro.com/i/&#8221;.</p>
<h4>4)<br />
Now we get fancy.</h4>
<p>In implementing S3, we have a bash script which handles the synchronization between our servers and S3.  So in that script, let&#8217;s intercept the CSS sheets, do a simple SED, and upload the modified files to a special location:</p>
<pre><em># getmiro css
# This substitutes ../i with http://s3.getmiro.3.0.com.s3.amazonaws.com/ in the getmiro css code
# and uploads them to a special directory in amazon.  This is in turn re-written by Apache to point there.
# Having the full url hard coded saves tens of thousands of redirects and gigs of bandwidth.
# It's also more efficient then "php-ifying" css to do the url substitution.

  # First, copy they css to a working directory:
    cp /data/getmiro/css/*.css /scripts/getmiro_css

  # It's safer to just modify files we know about, rather then automate finding and modifying without foreknowledge:
    sed -i 's/\.\.\/i/http:\/\/s3.getmiro.3.0.com.s3.amazonaws.com\/i/g' /scripts/getmiro_css/download-features.css
    sed -i 's/\.\.\/i/http:\/\/s3.getmiro.3.0.com.s3.amazonaws.com\/i/g' /scripts/getmiro_css/index.css
    sed -i 's/\.\.\/i/http:\/\/s3.getmiro.3.0.com.s3.amazonaws.com\/i/g' /scripts/getmiro_css/nav.css
    sed -i 's/\.\.\/i/http:\/\/s3.getmiro.3.0.com.s3.amazonaws.com\/i/g' /scripts/getmiro_css/styles.css

  # And let's upload them:
    /usr/local/s3sync/s3sync.rb -r -p -v /scripts/getmiro_css/ s3.getmiro.3.0.com:css/s3_coded/</em></pre>
<p>In the background so the web developers don&#8217;t have to worry about modifying the CSS sheets to include the hard link, transforming lines like:</p>
<pre><em>background: url(../i/screen_dropshadow.png) -20px -36px no-repeat;
</em></pre>
<p>into</p>
<pre><em>background: url(</em><em><em>s3.getmiro.3.0.com.s3.amazonaws.com</em>/i/screen_dropshadow.png) -20px -36px no-repeat;</em></pre>
<p>It&#8217;s necessary to use the pattern \.\./i/ in sed in case a developer does hard code the amazon link.  The \. means literally a period; regexes like this otherwise use a . as a wildcard to match one character, and just ../i/ would match any two characters before /i/.</p>
<p>In Apache, we change the redirect to this:</p>
<pre><em>RewriteRule ^/css/(.*) http://s3.getmiro.3.0.com.s3.amazonaws.com/css/S3_coded/$1</em></pre>
<p>With this change implemented:</p>
<pre><em>"GET http://www.getmiro.com/ HTTP/1.1" 200 21781 "-" "Mozilla/4.0
 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
"GET http://www.getmiro.com//css/styles.css HTTP/1.1" 302 708 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com//css/nav.css HTTP/1.1" 302 702 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com/css/index.css HTTP/1.1" 302 706 "http://www.getmiro.com/" "Mozilla/4.0</em></pre>
<p>Much better!  One file, three redirects for 23,897 bytes.  That one change represents nearly a 50% reduction in bandwidth usage on our physical servers from just the example above, and only about 1/3rd the bandwidth if we used CSS sheets being served locally even if they had the hard links to S3 on them.</p>
<h4>5)<br />
Finally one more tweak.</h4>
<p>The default Apache redirect includes HTML code saying where a file has moved.  But this isn&#8217;t necessary &#8212; a web browser just needs the correct headers to tell it where to go.</p>
<p>So replacing the redirect to S3 we used before, we use this:</p>
<pre><em>RewriteRule ^/css/(.*) /custom_messages/css_rewrite.php</em></pre>
<p>This is css_rewrite.php:</p>
<pre><em>&lt;?php
/*
This rewrites css just using headers.  This saves about 300bytes per
redirect -- which saves a heck of a lot of bandwidth over time when we're doing 3
css rewrites for every page view...works out to 30+ MB / day!</em></pre>
<pre><em>Invoke by:
RewriteRule ^/css/(.*) /custom_messages/css_rewrite.php
*/</em></pre>
<pre><em>$new_server = "http://s3.getmiro.3.0.com.s3.amazonaws.com/css/s3_coded/";
$new_url = preg_replace('/^.*\//', $new_server, $_SERVER[REQUEST_URI]);</em></pre>
<pre><em>echo Header( "HTTP/1.1 301 Moved Permanently" );
echo Header( "Location: $new_url" );
?&gt;</em></pre>
<p>This produces a very minimal redirect &#8212; under 400 bytes rather then over 700 bytes.</p>
<p>I haven&#8217;t done a complete analysis to know if this significantly slower then a native Apache redirect; initial review shows it is not slower for any given page load.  This step would need a very, very busy site however to make a meaningful performance or cost impact.  It&#8217;s something I&#8217;m noting though, because there could be other situations this type of optimization could be useful.  Most importantly the variables Apache (or IIS) can pass to other programs like PHP.  See this <a href="http://koivi.com/apache-iis-php-server-array.php" target="_blank">link</a> for a list of them.</p>
<pre><em>"GET http://www.getmiro.com/ HTTP/1.1" 200 21781 "-" "Mozilla/4.0
 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
"GET http://www.getmiro.com//css/styles.css HTTP/1.1" 301 397 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com//css/nav.css HTTP/1.1" 301 394 "http://www.getmiro.com/" "Mozilla/4.0
"GET http://www.getmiro.com/css/index.css HTTP/1.1" 301 396 "http://www.getmiro.com/" "Mozilla/4.0</em></pre>
<p>Now just one file, three redirects and 22,968.</p>
<h4>Bottom line?</h4>
<p>Let&#8217;s take a typical day when the getmiro.com homepage is called 20,000 times.</p>
<pre>Scenario    Size     Total Daily      Estimated
                       Bandwidth     Daily Cost**
1           338,359        6.5GB          $4.73
2            78,705        1.5GB           1.09
3            46,506        887MB*           .65
4            23,897        455MB            .33
5            22,968        438MB            .32
* Unadjusted for Firefox's interpretation of CSS paths
** This estimate is based on purchasing enough fixed bandwidth (Mbps)
to cover our peak daily usage.  Our communication costs for our
physical servers is approximately times as much as Amazon S3 based on
actual transfers.</pre>
<p>So without S3 or any optimization, we&#8217;d be looking at a monthly cost around $142.00.</p>
<p>With S3 and with all our optimization, we&#8217;re looking at a monthly cost around $54.00.</p>
<p>For a small non-profit, that&#8217;s a nice savings over time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2009/02/28/optimizing-website-integration-with-amazons-s3-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NTP Configuration</title>
		<link>http://www.d90.us/toolbox/2008/01/24/ntp-configuration/</link>
		<comments>http://www.d90.us/toolbox/2008/01/24/ntp-configuration/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 19:10:46 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/2008/01/24/ntp-configuration/</guid>
		<description><![CDATA[1) Install ntpd if not already there.  Link it to your default startup directory. ln -s /etc/init.d/ntpd /etc/rc3.d/S99ntpd 2) /etc/ntp/step-tickers:  time.nist.gov  pool.ntp.org 3) In /etc/sysconfig/iptables open up the port: # NTP is only accessible via the Gig Backbone: -A RH-Firewall-1-INPUT -m state &#8211;state NEW -m udp -p udp &#8211;dport 123 -s 192.168.1.0/0 -j ACCEPT 4) [...]]]></description>
			<content:encoded><![CDATA[<p>1) Install ntpd if not already there.  Link it to your default startup directory.</p>
<blockquote><p>ln -s /etc/init.d/ntpd /etc/rc3.d/S99ntpd</p></blockquote>
<p>2) /etc/ntp/step-tickers: </p>
<blockquote><p>time.nist.gov <br />
pool.ntp.org</p></blockquote>
<p>3) In /etc/sysconfig/iptables open up the port:</p>
<blockquote><p># NTP is only accessible via the Gig Backbone:<br />
-A RH-Firewall-1-INPUT -m state &#8211;state NEW -m udp -p udp &#8211;dport 123 -s 192.168.1.0/0 -j ACCEPT</p></blockquote>
<p>4) Now (re)start iptables &amp; ntpd</p>
<p>5) On internal-only servers, install ntpd. </p>
<p>6) Set step-ticker to point to internal server.  If using hostname, verify /etc/hosts and/or  the /etc/resolv.conf is set properly to allow the hostname to resolve.</p>
<p>7) Link it to your default startup directory.</p>
<p> <img src='http://www.d90.us/toolbox/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Start it</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2008/01/24/ntp-configuration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rainbow Tables</title>
		<link>http://www.d90.us/toolbox/2007/12/05/rainbow-tables/</link>
		<comments>http://www.d90.us/toolbox/2007/12/05/rainbow-tables/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 05:44:27 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[General Security]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/2007/12/05/rainbow-tables/</guid>
		<description><![CDATA[Lovely   http://www.codinghorror.com/blog/archives/000949.html  Use a program like Ophcrack to launch a brute force attack using Rainbow Tables.  Rather then using bandwidth to download a Rainbow Table, and so you can customize the table with salts, extra characters, etc&#8230;get a RT Generator like the rtgen utility in the original RainbowCrack.  Ah, longing for the quaint old [...]]]></description>
			<content:encoded><![CDATA[<p>Lovely <img src='http://www.d90.us/toolbox/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   <a href="http://www.codinghorror.com/blog/archives/000949.html">http://www.codinghorror.com/blog/archives/000949.html</a></p>
<p> Use a program like <a target="_blank" href="httphttp://ophcrack.sourceforge.net/">Ophcrack</a> to launch a brute force attack using Rainbow Tables.  Rather then using bandwidth to download a Rainbow Table, and so you can customize the table with salts, extra characters, etc&#8230;get a RT Generator like the <a target="_blank" href="http://www.antsight.com/zsl/rainbowcrack/">rtgen</a> utility in the original RainbowCrack.</p>
<p> Ah, longing for the quaint old days when you&#8217;d run L0pht all weekend to recover an administer&#8217;s password on a server you inherited&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2007/12/05/rainbow-tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Center Naming</title>
		<link>http://www.d90.us/toolbox/2007/10/06/data-center-naming/</link>
		<comments>http://www.d90.us/toolbox/2007/10/06/data-center-naming/#comments</comments>
		<pubDate>Sat, 06 Oct 2007 19:20:04 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Sysadmin Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/2007/10/06/data-center-naming/</guid>
		<description><![CDATA[Consistent naming, along with good labelling, is a godsend in a crisis.  Not say I can be obsessive on labeling server rooms, but there normally is a label maker with me when I&#8217;m on client sites. For Data Centers, Sun offers a really good guide at: http://www.sun.com/blueprints/0501/Naming.pdf  Every data center should at least by XY gridded [...]]]></description>
			<content:encoded><![CDATA[<p>Consistent naming, along with good labelling, is a godsend in a crisis.  Not say I can be obsessive on labeling server rooms, but there normally is a label maker with me when I&#8217;m on client sites.</p>
<p>For Data Centers, Sun offers a really good guide at: <a href="http://www.sun.com/blueprints/0501/Naming.pdf">http://www.sun.com/blueprints/0501/Naming.pdf</a> <img src="http://www.d90.us/toolbox/wp-content/uploads/2007/10/server_room_naming.png" alt="Sun Server Room Naming Map" /></p>
<p>Every data center should at least by XY gridded &#8212; go by the floor tiles if it&#8217;s a raised floor.  When you are talking the new guy through a problem on the phone late one night, you can tell him to go to RACK B4 and look for the box labelled &#8220;SQLSRV21.&#8221;  If you have enough racks inventory becomes challenging, implement the Z axis as well.  2U = 3.5&#8243;, and if you start with &#8220;A&#8221; at the bottom, that gives you 7-1/2 feet of rack space to label A-Z for positions.</p>
<p><strong>Here&#8217;s the EIA-310-D Hole Pattern, by the way:</strong></p>
<p><a href="http://www.d90.us/toolbox/wp-content/uploads/2007/10/server-rack-rail-dimensions.gif" title="Rack Hole Spacing"><img width="175" src="http://www.d90.us/toolbox/wp-content/uploads/2007/10/server-rack-rail-dimensions.gif" alt="Rack Hole Spacing" height="523" /></a> </p>
<p>While on the subject of labelling, do not forget to label your utilities &#8212; work with your electricians to label each outlet back to the breaker which controls it.  That way if there is an after-hours outage, it is quick to know which circuit panel needs to be checked and which breaker needs to be reset.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2007/10/06/data-center-naming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terminology, Speeds, Etc</title>
		<link>http://www.d90.us/toolbox/2007/10/06/terminology-speeds-etc/</link>
		<comments>http://www.d90.us/toolbox/2007/10/06/terminology-speeds-etc/#comments</comments>
		<pubDate>Sat, 06 Oct 2007 13:15:05 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Sysadmin Tools]]></category>

		<guid isPermaLink="false">http://www.d90.us/toolbox/2007/10/06/terminology-speeds-etc/</guid>
		<description><![CDATA[Bits, Bytes, and Capitals&#8230;   Although these seem to get interchanged often, and (except for confusing bits and bytes) don&#8217;t make a huge difference&#8230;we should try and use the correct, precise language.   Bit is short for Binary digIT, and represents an on(1) or off(0).   A bit is abbreviated with a lowercase b.   [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Bits, Bytes, and Capitals&#8230;</strong><br />
  Although these seem to get interchanged often, and (except for confusing bits and bytes) don&#8217;t make a huge difference&#8230;we should try and use the correct, precise language.<br />
  <strong><em>Bit</em></strong> is short for Binary digIT, and represents an on(1) or off(0).<br />
  A bit is abbreviated with a lowercase b.<br />
  A <strong><em>Byte</em></strong> is 8 bits.<br />
  A byte is abbreviated with a uppercase B.<br />
  Lowercase prefixes, such as k and m, represent multiples of <strong><em>1000</em></strong><br />
  Uppercase prefixes, such as K, M, G, and T represent multiples of <strong><em>1024<br />
  </em></strong>The differentiation between k and K, etc, is effectively deprecated.  The proper replacements, still not as commonly used as capitalization, are to use and &#8220;i&#8221; &#8212; Ki, Mi, Gi, etc.  GiB is pronounced &#8220;gibibyte&#8221; and stands for gig binary bytes.  In such a nomenclature both lower case and capital letters without the &#8221;i&#8221; stand for powers of 10 and not mulitples of 1024.<br />
  This means, for example, a MB is not 1000 KB, but instead 1024 KB.<br />
  A common networking term is Mbps &#8212; which is 1024*1024 bits per second. This is 1,048,576 bits per second, or dividing by 8 yields a speed of 131,072 Bytes, or 128KBps.<br />
  Usually network speeds are expressed in bits per second, while file sizes are quoted in Kilo, Mega, or Giga bytes as appropriate for the file size.</p>
<p><span id="more-12"></span> <strong> Network Speed &amp; Files&#8230;</strong><br />
  The general rule with ethernet is you can utilize a maximum of 80% of the bandwidth. If you have plenty of bandwidth and files are still moving slowly, look for another issue such as disk contention.<br />
  The following calculations are done assuming the 80% efficiency factor and rounded off:<br />
  T-1 1.54Mbps = 154KB/s, 9.25MB/m, 540MB/h<br />
  10Mbps LAN = 1MB/s, 60MB/m, 3.5GB/h<br />
  T-3 45Mbps = 4.5MB/s, 270MB/m, 15.8GB/h<br />
  100Mbps = 10MB/s, 600MB/m, 35GB/h<br />
  1Gbps = 100MB/s, 6GB/m, 351GB/h<br />
  <a href="http://www.numion.com/Calculators/Time.html" target="_blank">A handy online File Transfer Speed calculator</a></p>
<p>  To achieveve 1Gbps performance, or anything really much over 400Mbps, you need to have network cards with &#8220;TOE&#8221; (TCP Offload Engine) capability which is enabled.  Otherwise too much CPU time is taken processing network stuff at those speeds.</p>
<p><strong>  USB Speed &amp; Files&#8230;<br />
</strong>  1.0 &#8212; 1.5Mbps<br />
  1.1 &#8212; 12Mbps<br />
  2.0 &#8212; 480Mbps<br />
  So unless you&#8217;re on a 10Mbps network&#8230;<br />
  It&#8217;s faster to use a USB 2.0 computer and transfer files via the network then suffer a USB 1.1 drive!</p>
<p><!--more--></p>
<p><strong>  Cat 3/5/6 Wiring:<br />
</strong>  A ton of pin-outs is available at:  <a href="http://www.hardwarebook.info/">http://www.hardwarebook.info/</a><br />
  <img src="http://www.d90.us/images/crossover_diagram.jpg" alt="X-over" width="350" height="450" /></p>
<p><!--more--><strong>IP Subnetting</strong><br />
  <span class="h3">Private Subnets:<br />
  10.0.0.0 &#8212; 10.255.255.255, mask 10.0.0.0/8<br />
  172.16.0.0 &#8212; 172.31.255.255 mask 172.16.0.0/12<br />
  192.168.0.0 &#8212; 192.168.255.255 mask 192.168.0.0/16<br />
  <span class="h3">CIDR &amp; Masks:</span></span><span class="h3"><span class="h3"> </span></span><span class="h3"><span class="h3"> </span></span><span class="h3"></span><span class="h3"></span><span class="h3"></span><span class="h3"></span></p>
<div><span class="h3"></span></div>
<table border="0">
<tbody>
<tr>
<th>CIDR</th>
<th>Class</th>
<th>Hosts</th>
<th>Mask</th>
</tr>
<tr>
<td>/32</td>
<td>1/256 C</td>
<td>1</td>
<td>255.255.255.255</td>
</tr>
<tr>
<td>/31</td>
<td>1/128 C</td>
<td>2</td>
<td>255.255.255.254</td>
</tr>
<tr>
<td>/30</td>
<td>1/64 C</td>
<td>4</td>
<td>255.255.255.252</td>
</tr>
<tr>
<td>/29</td>
<td>1/32 C</td>
<td>8</td>
<td>255.255.255.248</td>
</tr>
<tr>
<td>/28</td>
<td>1/16 C</td>
<td>16</td>
<td>255.255.255.240</td>
</tr>
<tr>
<td>/27</td>
<td>1/8 C</td>
<td>32</td>
<td>255.255.255.224</td>
</tr>
<tr>
<td>/26</td>
<td>1/4 C</td>
<td>64</td>
<td>255.255.255.192</td>
</tr>
<tr>
<td>/25</td>
<td>1/2 C</td>
<td>128</td>
<td>255.255.255.128</td>
</tr>
<tr>
<td>/24</td>
<td>1 C</td>
<td>256</td>
<td>255.255.255.000</td>
</tr>
<tr>
<td>/23</td>
<td>2 C</td>
<td>512</td>
<td>255.255.254.000</td>
</tr>
<tr>
<td>/22</td>
<td>4 C</td>
<td>1024</td>
<td>255.255.252.000</td>
</tr>
<tr>
<td>/21</td>
<td>8 C</td>
<td>2048</td>
<td>255.255.248.000</td>
</tr>
<tr>
<td>/20</td>
<td>16 C</td>
<td>4096</td>
<td>255.255.240.000</td>
</tr>
<tr>
<td>/19</td>
<td>32 C</td>
<td>8192</td>
<td>255.255.224.000</td>
</tr>
<tr>
<td>/18</td>
<td>64 C</td>
<td>16384</td>
<td>255.255.192.000</td>
</tr>
<tr>
<td>/17</td>
<td>128 C</td>
<td>32768</td>
<td>255.255.128.000</td>
</tr>
<tr>
<td>/16</td>
<td>256 C, 1 B</td>
<td>65536</td>
<td>255.255.000.000</td>
</tr>
<tr>
<td>/15</td>
<td>512 C, 2 B</td>
<td>131072</td>
<td>255.254.000.000</td>
</tr>
<tr>
<td>/14</td>
<td>1024 C, 4 B</td>
<td>262144</td>
<td>255.252.000.000</td>
</tr>
<tr>
<td>/13</td>
<td>2048 C, 8 B</td>
<td>524288</td>
<td>255.248.000.000</td>
</tr>
<tr>
<td>/12</td>
<td>4096 C, 16 B</td>
<td>1048576</td>
<td>255.240.000.000</td>
</tr>
<tr>
<td>/11</td>
<td>8192 C, 32 B</td>
<td>2097152</td>
<td>255.224.000.000</td>
</tr>
<tr>
<td>/10</td>
<td>16384 C, 64 B</td>
<td>4194304</td>
<td>255.192.000.000</td>
</tr>
<tr>
<td>/9</td>
<td>32768 C, 128B</td>
<td>8388608</td>
<td>255.128.000.000</td>
</tr>
<tr>
<td>/8</td>
<td>65536 C, 256B, 1 A</td>
<td>16777216</td>
<td>255.000.000.000</td>
</tr>
<tr>
<td>/7</td>
<td>131072 C, 512B, 2 A</td>
<td>33554432</td>
<td>254.000.000.000</td>
</tr>
<tr>
<td>/6</td>
<td>262144 C, 1024 B, 4 A</td>
<td>67108864</td>
<td>252.000.000.000</td>
</tr>
<tr>
<td>/5</td>
<td>524288 C, 2048 B, 8 A</td>
<td>134217728</td>
<td>248.000.000.000</td>
</tr>
<tr>
<td>/4</td>
<td>1048576 C, 4096 B, 16 A</td>
<td>268435456</td>
<td>240.000.000.000</td>
</tr>
<tr>
<td>/3</td>
<td>2097152 C, 8192 B, 32 A</td>
<td>536870912</td>
<td>224.000.000.000</td>
</tr>
<tr>
<td>/2</td>
<td>4194304 C, 16384 B, 64 A</td>
<td>1073741824</td>
<td>192.000.000.000</td>
</tr>
<tr>
<td>/1</td>
<td>8388608 C, 32768 B, 128 A</td>
<td>2147483648</td>
<td>128.000.000.000</td>
</tr>
</tbody>
</table>
<p><span class="h3"><span class="h3"></p>
<div><span class="h3"><span class="h3"><!--more--><strong>Tape Capacity &amp; Speed</strong><br />
  This is a guide&#8230;remember to factor in network &amp; computer speeds, compression, encryption when designing a solution.<br />
  Also, small files make a dramatically longer backup. Single, big files like Databases are most efficient streaming data.</span></span></div>
<p><span class="h3"></span></span></span></p>
<table border="0">
<tbody>
<tr>
<td>Tape Type</td>
<td>Native Capacity (GB)</td>
<td>Transfer Rate (GB/hr)</td>
</tr>
<tr>
<td>LTO 3</td>
<td>400</td>
<td>80</td>
</tr>
<tr>
<td>LTO 2</td>
<td>200</td>
<td>40</td>
</tr>
<tr>
<td>LTO 1</td>
<td>100</td>
<td>20</td>
</tr>
<tr>
<td>SDLT 160/320</td>
<td>160</td>
<td>57.6</td>
</tr>
<tr>
<td>SDLT 110/220</td>
<td>110</td>
<td>39.6</td>
</tr>
<tr>
<td>DLT 40/80</td>
<td>40</td>
<td>21.6</td>
</tr>
<tr>
<td>DLT 20/40</td>
<td>20</td>
<td>5.6</td>
</tr>
<tr>
<td>AIT 100/200</td>
<td>100</td>
<td>43.2</td>
</tr>
<tr>
<td>AIT 50/100</td>
<td>50</td>
<td>21.6</td>
</tr>
<tr>
<td>AIT 35/70</td>
<td>35</td>
<td>14.4</td>
</tr>
<tr>
<td>AIT 35/70 IDE</td>
<td>35</td>
<td>14</td>
</tr>
<tr>
<td>DAT 20/40 (DDS-4)</td>
<td>20</td>
<td>8.4</td>
</tr>
<tr>
<td>DAT 12/24 (DDS-3)</td>
<td>12</td>
<td>3.6</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.d90.us/toolbox/2007/10/06/terminology-speeds-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

