<?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>mm &#187; Technology</title>
	<atom:link href="http://markmaunder.com/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://markmaunder.com</link>
	<description></description>
	<lastBuildDate>Fri, 30 Jul 2010 05:56:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bandwidth providers: Please follow Google&#8217;s lead in helping startups, the environment and yourselves</title>
		<link>http://markmaunder.com/2010/bandwidth-providers-please-follow-googles-lead-in-helping-startups-the-environment-and-yourselves/</link>
		<comments>http://markmaunder.com/2010/bandwidth-providers-please-follow-googles-lead-in-helping-startups-the-environment-and-yourselves/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 22:57:44 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[networks]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Net]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=526</guid>
		<description><![CDATA[There&#8217;s a post on Hacker News today pointing to a few open source javascript libraries that Google is hosting on their content distribution network. ScriptSrc.net has a great UI that gives you an easy way to link to the libs from your web pages. Developers and companies can link to these scripts from their own websites and gain the following benefits:

Your visitor may have already cached the script on another website so your page will load faster
The script is hosted ...]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a <a href="http://news.ycombinator.com/item?id=1491795">post on Hacker News today</a> pointing to a few open source javascript libraries that Google is hosting on their content distribution network. <a href="http://scriptsrc.net/">ScriptSrc.net has a great UI</a> that gives you an easy way to link to the libs from your web pages. Developers and companies can link to these scripts from their own websites and gain the following benefits:</p>
<ul>
<li>Your visitor may have already cached the script on another website so your page will load faster</li>
<li>The script is hosted on a different domain which allows your browser to create more concurrent connections while fetching your content &#8211; another speed increase.</li>
<li>It saves you the bandwidth of having to serve that content up yourself which can result in massive cost savings if you&#8217;re a high traffic site.</li>
<li>Just like your visitor already cached the content, their workstation or local DNS server may also have the CDN&#8217;s IP address cached which further speeds load time.</li>
</ul>
<p>While providing a service like this does cost Google or the providing company more in hosting, it provides an overall efficiency gain. Less bandwidth and CPU is used on the Web as a whole by Google providing this service. That means less cooling is required in data centers, less networking hardware needs to be manufactured to support the traffic on the web and so on.</p>
<p>The environment benefits as a whole by Google or another large provider hosting these frequently loaded scripts for us.</p>
<p>The savings are passed on to lone developers and startups who are using the scripts. For smaller companies who are trying to minimize costs while dealing with massive growth this can result in a huge cost savings that helps them to continue to innovate.</p>
<p>The savings are also passed on to bandwidth providers like NTT, AT&amp;T, Comcast, Time Warner, Qwest and other bandwidth providers who&#8217;s customers consume less bandwidth as a result.</p>
<p>So my suggestion is that Google and bandwidth providers collaborate to come up with a package of the most used open source components online and keep the list up to date. Then provide local mirrors of each of these packages with a fallback mechanism if the package isn&#8217;t available. Google should define an IP address similar to their easy to remember DNS ip address 8.8.8.8 that hosts these scripts. Participating ISP&#8217;s route traffic destined for that IP address to a local mirror using a system similar to <a href="http://en.wikipedia.org/wiki/Anycast">IP Anycast</a>. An alternative URL is provided via a query string. e.g.</p>
<p>http://9.9.9.9/js/prototype.1.5.0.js?fallback=http://mysite.com/myjs/myprototype.1.5.0.js</p>
<p>If the local ISP isn&#8217;t participating the request is simply routed to Google&#8217;s 9.9.9.9 server as per normal.</p>
<p>If the local ISP (or Google) doesn&#8217;t have a copy of the script in their mirror it just returns a 302 redirect to the fallback URL which the webmaster has provided and which usually points to the webmaster&#8217;s own site. A mechanism for multiple fallbacks can easily be created e.g. fallback1, fallback2, etc.</p>
<p>Common scripts, icon libraries and flash components can be hosted this way. There may even be scenarios where a company (like Google) is used by such a large percentage of the Net population that it makes sense to put them on the 9.9.9.9 mirror system so that local bandwidth providers can serve up commonly used components rather than have to fetch them from via their upstream providers. Google&#8217;s logo for example.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2010/bandwidth-providers-please-follow-googles-lead-in-helping-startups-the-environment-and-yourselves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Coming Social Advertising Revolution</title>
		<link>http://markmaunder.com/2010/the-coming-social-advertising-revolution/</link>
		<comments>http://markmaunder.com/2010/the-coming-social-advertising-revolution/#comments</comments>
		<pubDate>Mon, 03 May 2010 23:03:13 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Social Advertising]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ad business]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=513</guid>
		<description><![CDATA[Facebook has over 400 million active users and members spend over 951 man-years on the site each month. Facebook is passing Google this year as the most visited site in the US and is going to earn somewhere between $710M and $1.1B in revenue this year.
Google on the other hand have a $27B revenue run rate for 2010 [based on Q1 2010 earnings]. With similar on-site traffic they are doing 25 times Facebook&#8217;s revenue. Google have had a long time to ...]]></description>
			<content:encoded><![CDATA[<p>Facebook has over <a href="http://www.facebook.com/press/info.php?statistics">400 million active users</a> and members spend over 951 man-years on the site each month. Facebook is passing Google this year as the <a href="http://money.cnn.com/2010/03/16/technology/facebook_most_visited/">most visited site in the US</a> and is going to earn somewhere between <a href="http://online.wsj.com/article/SB10001424052748704146904574579543239159268.html">$710M</a> and <a href="http://mashable.com/2010/03/02/facebook-could-surpass-1-billion-in-revenue-this-year/">$1.1B</a> in revenue this year.</p>
<p>Google on the other hand have a $27B revenue run rate for 2010 [based on <a href="http://investor.google.com/earnings/2010/Q1_google_earnings.html">Q1 2010 earnings</a>]. With similar on-site traffic they are doing 25 times Facebook&#8217;s revenue. Google have had a long time to learn about printing money efficiently, but even so that&#8217;s a blush-worthy statistic for the Facebook executive team. So why the difference in performance?</p>
<p>Facebook has a crisis of intent. When a visitor signs in to Facebook their intent is to socialize. They don&#8217;t want to buy anything and they certainly don&#8217;t want to click on ads that lead them to buying something. Facebook has the best data on the web about the people using their service. But all that wonderful data is useless without intent.</p>
<p>When a visitor hits Google their intent is to see something, learn something, do something etc and these can be cajoled into buying decisions. If Google guides the user to the right vendor, they make a vendor money and can share in some of the revenue. Google&#8217;s data on each visitor pales in comparison to Facebook. But Google catches each visitor at the moment they have intent. And that is the power of the search business.</p>
<p>Facebook needs to solve their crisis of intent. Intent is the missing ingredient that stands between Facebook and $27 Billion in revenue multiplied by the social graph and profile data that Google doesn&#8217;t have.</p>
<p>Changing Facebook.com to capture visitor attention when they have buying intent risks destroying a valuable asset. So instead Facebook have decided to take their data to the places where visitors have intent: The rest of the web.</p>
<p><strong>&#8220;If intent won&#8217;t come to Facebook, we&#8217;ll take Facebook to intent.&#8221; ~Mark Zuckerburg [may have said this]</strong></p>
<p>In the next 3 to 12 months Facebook are going to roll out their own ad network for publishers &#8211; a direct competitor to Google AdSense.</p>
<p>If Facebook can use my interests, sex, age, location, who I&#8217;m friends with and their age, location, interests etc. to infer that when I&#8217;m searching for a &#8216;bobbin&#8217; it&#8217;s probably because I want to tie steelhead flies with it, then it makes more sense for every publisher on the web to use Facebook&#8217;s ad network than Google or anyone else because they will simply make more money.</p>
<p><strong>Facebook&#8217;s Ad Network will make publishers more money and increase engagement.</strong></p>
<p><span style="color: #339966;">Facebook Connect was phase 1</span>: &#8220;Lets see if a distributed Facebook gets traction and doesn&#8217;t raise privacy flags.&#8221; It was a resounding success.</p>
<p><span style="color: #800080;">The Social Web and Open Graph is phase 2</span>: &#8220;Lets see if we can share some user data using an opt-out model.&#8221; <a href="http://blog.facebook.com/blog.php?post=383404517130">From the Facebook blog</a>: &#8220;For example, now if you&#8217;re logged into Facebook and go to Pandora for the first time, it can immediately start playing songs from bands you&#8217;ve liked across the web.&#8221;</p>
<p>There have been the usual privacy rumblings, but so far the Facebook community seems to be OK with an opt-out model of distributed data sharing.</p>
<p><strong><span style="color: #ff0000;">The significance of this is staggering: </span></strong>Facebook have positioned themselves for the perfect AdSense kill-shot. 6 to 12 months from now publishers will  be able to integrate Facebook&#8217;s applications and ad network on their blog or website and get:</p>
<ul>
<li>Better revenue than Google AdSense or any other ad network due to better targeting</li>
<li>Increased user engagement through social features</li>
<li>Increased virality through recruiting other Facebook members</li>
<li>Increased data on each visitor from their very first pageview reducing bounce.</li>
</ul>
<p>Advertisers will get:</p>
<ul>
<li>Less click fraud because you&#8217;re no longer just an IP address and a cookie.</li>
<li>Better targeting including the holy grail of demographics: Age, Sex, Location.</li>
<li>Ability to show your ad at the moment a user has buying intent on a search engine, a blog about visiting Egypt, etc.</li>
</ul>
<p>A significant portion of Google&#8217;s $27 Billion in revenue this year will come from their publisher ad network. Google knows what&#8217;s at stake. That is why they are willing to <a href="http://en.wikipedia.org/wiki/Google_Buzz#Reception">bet GMail on products like Google Buzz</a>.</p>
<p>Facebook is the most serious threat to Google&#8217;s business that they have faced. If Facebook plays this perfectly, they will kill the bear and 5 to 10 years from now will be the largest and most profitable ad network on Earth.</p>
<p>Anyone who plans to compete with them will have to do better than textual ad targeting.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2010/the-coming-social-advertising-revolution/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>How to limit website visitor bandwidth by country</title>
		<link>http://markmaunder.com/2010/how-to-limit-website-visitor-bandwidth-by-country/</link>
		<comments>http://markmaunder.com/2010/how-to-limit-website-visitor-bandwidth-by-country/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 19:13:15 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=484</guid>
		<description><![CDATA[This technique is great if you have no customers from countryX but are being targeted by a DoS, unwanted crawlers, bots, scrapers and other baddies. Please don&#8217;t use this to discriminate against less profitable countries. The web should be open for all. Thanks.
If you&#8217;re not already using Nginx, you should get it even if you already have a great web server. Put it in front and get it to act as a reverse proxy.
First grab this perl script which you ...]]></description>
			<content:encoded><![CDATA[<p>This technique is great if you have no customers from countryX but are being targeted by a DoS, unwanted crawlers, bots, scrapers and other baddies. Please don&#8217;t use this to discriminate against less profitable countries. The web should be open for all. Thanks.</p>
<p>If you&#8217;re not already using Nginx, <a href="http://wiki.nginx.org/Main">you should get it</a> even if you already have a great web server. Put it in front and get it to act as a reverse proxy.</p>
<p>First <a href="http://markmaunder.com/geo2nginx.pl">grab this perl script</a> which you will use to convert Maxmind&#8217;s geo IP database into a format usable by Nginx.</p>
<p>Then download <a href="http://www.maxmind.com/app/geoip_country">Maxmind&#8217;s latest GeoLite country database in CSV format on this page</a>.</p>
<p>Then run:</p>
<p>geo2nginx.pl &lt; maxmind.csv &gt; nginxGeo.txt</p>
<p>Copy nginxGeo.txt into your nginx config directory.</p>
<p>Then add the following text in the &#8216;http&#8217; section of your nginx.conf file:</p>
<p>geo $country {<br />
default no;<br />
include nginxGeo.txt;<br />
}</p>
<p>Then add the following in the &#8217;server&#8217; section of your nginx.conf file:</p>
<p>if ($country ~ ^(?:US|CA|ES)$ ){<br />
set $limit_rate 10k;<br />
}<br />
if ($country ~ ^(?:BR|ZA)$ ){<br />
set $limit_rate 20k;<br />
}</p>
<p>This <a href="http://wiki.nginx.org/NginxHttpCoreModule#limit_rate">limits</a> anyone from the USA, Canada and Spain to a maximum of 10 kilobits per second of bandwidth. It gives anyone from Brazil and South Africa 20 Kbps of bandwidth. Every other country gets the maximum.</p>
<p>You could use a exclamation character before the tilde (!~) to do the opposite. In other words, if you&#8217;re NOT from US, Canada or Spain, you get 10 Kbps, although I strongly advise against this policy.</p>
<p>Remember that $limit_rate only limits per connection, so the amount of bandwidth each visitor has is $limit_rate X number_of_connections. See below to limit connections.</p>
<p>Another interesting variable is limit_rate_after. The <a href="http://wiki.nginx.org/NginxHttpCoreModule#limit_rate_after">documentation on this is very very sparse</a>, but from what I&#8217;ve gathered it is time based. So the first 1 minute of a connection will get full bandwidth, and then after that the limiting starts. Great for streaming sites I would think.</p>
<p>There are two other great modules in Nginx but neither of them work inside &#8216;if&#8217; directives which means you can&#8217;t use them to limit by country. They are the <a href="http://wiki.nginx.org/NginxHttpLimitZoneModule">Limit Zone module</a> which lets you limit the number of concurrent connections and the <a href="http://wiki.nginx.org/NginxHttpLimitReqModule">Limit Requests module</a> which lets you limit the number of requests over a period of time. The Limit Requests module also has a burst variable which is very useful. Once again the documentation is sparse, but <a href="http://www.ruby-forum.com/topic/173021">this comment from Igor (Nginx author)</a> sheds some light on how bursting works.</p>
<p>I&#8217;ve enabled all three features on our site. Bandwidth limiting by country, limiting concurrent connections and limiting requests over a time period. I serve around 20 to 40 million requests a day on a single nginx box and I haven&#8217;t noticed much performance degradation with the new config. It has quadrupled the size of each nginx process though to about 46M per process, but that&#8217;s still a lot smaller than most web server processes.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2010/how-to-limit-website-visitor-bandwidth-by-country/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to handle 1000&#8217;s of concurrent users on a 360MB VPS</title>
		<link>http://markmaunder.com/2009/how-to-handle-1000s-of-concurrent-users-on-a-360mb-vps/</link>
		<comments>http://markmaunder.com/2009/how-to-handle-1000s-of-concurrent-users-on-a-360mb-vps/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 20:18:17 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Trash Talking]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[bitchin]]></category>
		<category><![CDATA[epoll]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=430</guid>
		<description><![CDATA[There has been some recent confusion about how much memory you need in a web server to handle a huge number of concurrent requests. I also made a performance claim on the STS list that got me an unusual number of private emails.
Here&#8217;s how you run a highly concurrent website on a shoe-string budget:
The first thing you&#8217;ll do is get a Linode server because they have the fastest CPU and disk.
Install Apache with your web application running under mod_php, mod_perl ...]]></description>
			<content:encoded><![CDATA[<p>There has been some recent <a href="http://plasticboy.com/archives/2009/11/30/memory-will-be-the-real-performance-bottleneck-on-your-vps/">confusion</a> about<a href="http://groups.google.com/group/seattletechstartups/msg/0105112902829547?hl=en"> </a>how much memory you need in a web server to handle a huge number of concurrent requests. I also <a href="http://groups.google.com/group/seattletechstartups/msg/312e381dbc811271?hl=en">made a performance claim on the STS list</a> that got me an unusual number of private emails.</p>
<p>Here&#8217;s how you run a highly concurrent website on a shoe-string budget:</p>
<p>The first thing you&#8217;ll do is <a href="http://linode.com/">get a Linode server</a> because <a href="http://journal.uggedal.com/vps-performance-comparison">they have the fastest CPU and disk</a>.</p>
<p>Install Apache with your web application running under mod_php, mod_perl or some other persistence engine for your language. Then you get famous and start getting emails about people not being able to access your website.</p>
<p>You increase the number of Apache threads or processes (depending on which Apache MPM you&#8217;re using) until you can&#8217;t anymore because you only have 360MB of memory in your server.</p>
<p>Then you&#8217;ll lower the KeepaliveTimeout and eventually disable Keepalive so that more users can access your website without tying up your Apache processes. Your users will slow down a little because they now have to re-establish a new connection for every piece of your website they want to fetch, but you&#8217;ll be able to serve more of them.</p>
<p>But as you scale up you will get a few more emails about your server being down. Even though  you&#8217;ve disabled keepalive it still takes time for each Apache child to send data to users, especially if they&#8217;re on slow connections or connections with high latency. Here&#8217;s what you do next:</p>
<p>Install <a href="http://nginx.net/">Nginx</a> on your new Linode box and get it to listen on Port 80. Then reconfigure Apache so that it listens on another port &#8211; say port 81 &#8211; and can only be accessed from the local machine. <a href="http://wiki.nginx.org/NginxHttpProxyModule">Configure Nginx as a reverse proxy</a> to Apache listening on port 81 so that it sits in front of Apache like so:</p>
<p>YourVisitor &lt;&#8212;&#8211;&gt; Nginx:Port80 &lt;&#8212;&#8211;&gt; Apache:Port81</p>
<p>Enable Keepalive on Nginx and set the Keepalive timeout as high as you&#8217;d like. Disable Keepalive on Apache &#8211; this is just-in-case because Nginx&#8217;s proxy engine doesn&#8217;t support Keepalive to the back-end servers anyway.</p>
<p>The 10 or so Apache children you&#8217;re running will be getting requests from a client (Nginx) that is running locally. Because there is zero latency and a huge amount of bandwidth (it&#8217;s a loopback request), the only time Apache takes to handle the request is the amount of CPU time it actually takes to handle the request. Apache children are no longer tied up with clients on slow connections. So each request is handled in a few microseconds, freeing up each child to do a hell of a lot more work.</p>
<p>Nginx will occupy about 5 to 10 Megs of Memory. You&#8217;ll see thousands of users concurrently connected to it. If you have Munin loaded on your server check out the netstat graph. Bitchin isn&#8217;t it? You&#8217;ll also notice that Nginx uses very little CPU &#8211; almost nothing in fact. That&#8217;s because Nginx is designed using a single threaded model where one thread handles a huge number of connections. It can do this with little CPU usage because it uses a feature in the Linux kernel called epoll().</p>
<p><strong>Footnotes:</strong></p>
<p>Lack of time forced me to leave out all explanations on how to install and configure Nginx (I&#8217;m assuming you know Apache already) &#8211; but the <a href="http://wiki.nginx.org/Main">Nginx Wiki is excellent</a>, even if the Russain translation is a little rough.</p>
<p>I&#8217;ve also purposely left out all references to solving disk bottlenecks (as I&#8217;ve left out a discussion about browser caching) because there has been a lot written about this and depending on what app or app-server you&#8217;re running, there are some very standard ways to solve IO problems already. e.g. Memcached, the InnoDB cache for MySQL, PHP&#8217;s Alternative PHP Cache, perstence engines that keep your compiled code in memory, etc..etc..</p>
<p>This technique works to speed up any back-end application server that uses a one-thread-per-connection model. It doesn&#8217;t matter if it&#8217;s Ruby via FastCGI, Mod_Perl on Apache or some crappy little Bash script spitting out data on a socket.</p>
<p>This is a very standard config for most high traffic websites today. It&#8217;s how they are able to leave keepalive enabled and handle a huge number of concurrent users with a relatively small app server cluster.  Lighttpd and Nginx are the two most popular free FSM/epoll web servers out there and Nginx is the fastest growing, best designed (IMHO) and the one I use to serve 400 requests per second on a small Apache cluster. It&#8217;s also what guys like <a href="http://wordpress.com/">Wordpress.com</a> use.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2009/how-to-handle-1000s-of-concurrent-users-on-a-360mb-vps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>No-latency SSH sessions on a 5Ghz WiFi router with 250mw radio</title>
		<link>http://markmaunder.com/2009/no-latency-ssh-on-5ghz-wifi-with-250mw-radio/</link>
		<comments>http://markmaunder.com/2009/no-latency-ssh-on-5ghz-wifi-with-250mw-radio/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 22:18:17 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[dd-wrt]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[routers]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=349</guid>
		<description><![CDATA[Disclaimer: You may brick your fancy new Linksys router by following the advice in this blog entry. A large number of folks have installed this software successfully including me. But consider yourself warned in case you&#8217;re the unlucky one.
I use SSH a lot. My wife and nephew love streaming video like Hulu instead of regular cable. For the last few years there&#8217;s been a cold war simmering. I&#8217;m working late, they start streaming, and my SSH session to my server ...]]></description>
			<content:encoded><![CDATA[<p><span style="color: #33cccc;">Disclaimer: You may brick your fancy new Linksys router by following the advice in this blog entry. A large number of folks have installed this software successfully including me. But consider yourself warned in case you&#8217;re the unlucky one.</span></p>
<p>I use SSH a lot. My wife and nephew love streaming video like Hulu instead of regular cable. For the last few years there&#8217;s been a cold war simmering. I&#8217;m working late, they start streaming, and my SSH session to my server gets higher latency. So every time I hit a keystroke it takes 0.3 seconds to appear instead of 0.01. Try hitting 10,000 keystrokes in an evening and you&#8217;ll begin to understand why this sucks.</p>
<p>I&#8217;ve tried screwing with the QoS settings on my Linksys routers but it doesn&#8217;t help at all. I ran across a bunch of articles explaining how it&#8217;s useless to try to use QoS because it only modifies your outgoing bandwidth and can&#8217;t change the speed at which routers on the Internet send you traffic.</p>
<p>Well that&#8217;s all bullshit. Here&#8217;s how you fix it:</p>
<p>Upgrade the firmware on your router to DD-WRT. Here&#8217;s the <a href="http://www.dd-wrt.com/wiki/index.php/Supported_Devices">list of supported devices</a>. I have a WRT320N Linksys router. It&#8217;s a newer router that has both a 2.4 Ghz and 5Ghz radio. Many routers that look new and claim to support &#8220;N&#8221; actually just have 2.4Ghz radios in them.</p>
<p>The DD-WRT firmware for the WRT320N router is very very new, but it works perfectly. Here&#8217;s how you upgrade:</p>
<p>Read Eko&#8217;s (DD-WRT author) <a href="http://www.dd-wrt.com/phpBB2/viewtopic.php?p=352325&amp;sid=bd6d64c35f742ba7ec0d8d965ffb918a">announcement about WRT320N support here</a>. The <a href="http://www.dd-wrt.com/wiki/index.php/Installation">standard DD-WRT installation instructions are here</a> so you may want to reference them too. Here&#8217;s how I upgraded without bricking my router:</p>
<ol>
<li>Download the<a href="http://www.dd-wrt.com/dd-wrtv2/downloads/others/eko/V24-K26/svn12982/dd-wrt.v24-12982_NEWD-2_K2.6_mini_wrt320n.bin"> &#8216;mini&#8217; DD-WRT here</a>.</li>
<li>Open all the links in this blog entry in other browser windows in case you need to refer to them for troubleshooting. You&#8217;re about to lose your Internet access.</li>
<li>Visit your router&#8217;s web interface and take not of all settings &#8211; not just your wireless SSID and keys but your current MAC address on your Internet interface too. I had to clone this once DD-WRT started up because my ISP hard-codes MAC addresses on their side and filters out any unauthorized MAC&#8217;s. I&#8217;d suggest printing the settings direct from your web browser.</li>
<li>Use the web interface (visit http://192.168.1.1/ usually) and reset your router to factory default settings.</li>
<li>You&#8217;ll need to log into your router again. For linksys the default login is a blank username and the password &#8216;admin&#8217;.</li>
<li>Use Internet Explorer to upgrade the firmware using your router&#8217;s web interface. Apparently Firefox has a bug on some Linksys routers so don&#8217;t use that.</li>
<li>Wait for the router to reboot.</li>
<li>Hit http://192.168.1.1/ with your web browser and change your router&#8217;s default username and password.</li>
<li>Go to the Clone MAC address option and set it to your old Internet MAC address</li>
<li>Set up your wireless with the old SSID and key</li>
<li>Confirm you can connect to the router via WiFi and have Internet Access.</li>
</ol>
<p>Now the fun part:</p>
<ol>
<li>Go to Wireless, Advanced settings, and scroll down to TX Power. You can boost your transmit signal all the way to 251mw. Boosting it by about 70mw should be safe according to the help. I&#8217;ve actually left mine as is to increase my radio&#8217;s life, but nice to know I have that.</li>
<li>Go to the NAT/QoS menu and hit the QoS tab on the right. Enable QoS. Add your machine&#8217;s MAC address. Set the priority to Premium (not Exempt because that does nothing). Hit Apply Settings. Every other machine now has a default priority of Standard and your traffic will be expedited.</li>
<li>For Linux Geeks: Click the services tab and enable SSHd. Then ssh to your router&#8217;s IP, usually 192.168.1.1. Log in as root and whatever password you chose for your router. I actually changed my username to &#8216;admin&#8217; but the username seems to stay root for ssh.</li>
</ol>
<p>You can use a lot of standard linux commands in SSH &#8211; it&#8217;s busybox linux. Type:</p>
<p>cat /proc/net/ip_conntrack | grep &lt;YourIPAddress&gt;</p>
<p>Close to the end of each line you&#8217;ll see a mark= field. For your IP address it should have mark=10 for all your connections. Everyone else should be mark=0. The values mean:</p>
<ul>
<li> Exempt: 100</li>
<li> Premium: 10</li>
<li> Express: 20</li>
<li> Standard: 30</li>
<li> Bulk: 40</li>
<li> (no QoS matched): 0</li>
</ul>
<p>Remember if no QoS rule is matched the traffic is Standard priority if you have QoS enabled on the router. So you are Premium and everyone else is standard. Much more detail is available on the <a href="http://www.dd-wrt.com/wiki/index.php/Quality_of_Service">QoS DD-WRT Wiki here</a>.</p>
<p>The Linux distro is quite amazing. There are <a href="http://www.dd-wrt.com/wiki/index.php/Quick_list_of_Optware_packages">over 1000 packages available for DD-WRT including Perl, PHP and MySQL</a> in case you&#8217;d like to write a blogging platform for your Linksys router. To use this you&#8217;re going to have to<a href="http://www.dd-wrt.com/dd-wrtv2/downloads/others/eko/V24-K26/svn12982/dd-wrt.v24-12982_NEWD-2_K2.6_big_wrt320n.bin"> upgrade your firmware to the &#8216;big&#8217; version of the WRT320N binary</a>. Don&#8217;t upgrade directly from Linksys firmware to the &#8216;big&#8217; DD-WRT &#8211; Ecko recommends upgrading to mini first and then upgrading to &#8216;big&#8217;. Also note I haven&#8217;t tried running &#8216;big&#8217; on the WRT320N because I&#8217;m quite happy with QoS and a more powerful radio.</p>
<p>There are detailed instructions on <a href="http://www.dd-wrt.com/wiki/index.php/Optware">how to get Optware up and running once you&#8217;re running &#8216;big&#8217; on the Wiki</a>. It includes info on how to install a throttling HTTP server, Samba2 for windows networking and a torrent client.</p>
<p>If you&#8217;d like to run your WRT320N at 5Ghz the DD-WRT forums suggest switching wireless network mode to &#8216;NA-only&#8217; but that didn&#8217;t work for my Snow Leopard OS X machine. When I was running Linksys I had to use 802.11A to make 5Ghz work for my macbook. And likewise for this router I run A-only. You can confirm you&#8217;re at 5Ghz by holding down the &#8216;option&#8217; key on your macbook and clicking the wifi icon on top right.</p>
<p>I prefer 5Ghz because the spectrum is quieter, but 5Ghz doesn&#8217;t have the distance through air that 2.4 Ghz does. So boosting your TX power will give you the same distance with a clear spectrum while all your neighbors fight over teh 2.4Ghz band.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2009/no-latency-ssh-on-5ghz-wifi-with-250mw-radio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What the Web Sockets Protocol means for web startups</title>
		<link>http://markmaunder.com/2009/web-sockets-protocol/</link>
		<comments>http://markmaunder.com/2009/web-sockets-protocol/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 18:18:28 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web sockets protocol]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=336</guid>
		<description><![CDATA[Ian Hickson&#8217;s latest draft of the Web Sockets Protocol (WSP) is up for your reading pleasure. It got me thinking about the tangible benefits the protocol is going to offer over the long polling that my company and others have been using for our real-time products.
The protocol works as follows:
Your browser accesses a web page and loads, lets say, a javascript application. Then the javascript application decides it needs a constant flow of data to and from it&#8217;s web server. ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.hixie.ch/">Ian</a> Hickson&#8217;s <a href="http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-54" target="_blank">latest draft of the Web Sockets Protocol</a> (WSP) is up for your reading pleasure. It got me thinking about the tangible benefits the protocol is going to offer over the long polling that my company and others have been using for <a href="http://live.feedjit.com/live/markmaunder.com/">our real-time products</a>.</p>
<p>The protocol works as follows:</p>
<p>Your browser accesses a web page and loads, lets say, a javascript application. Then the javascript application decides it needs a constant flow of data to and from it&#8217;s web server. So it sends an HTTP request that looks like this:</p>
<pre>
<pre>GET /demo HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
WebSocket-Protocol: sample</pre>
</pre>
<p>The server responds with an HTTP response that looks like this:</p>
<pre>
<pre>HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://example.com
WebSocket-Location: ws://example.com/demo
WebSocket-Protocol: sample</pre>
</pre>
<p>Now data can flow between the browser and server without having to send HTTP headers until the connection is broken down again.</p>
<p>Remember that at this point, the connection has been established on top of a standard TCP connection. The TCP protocol provides a reliable delivery mechanism so the WSP doesn&#8217;t have to worry about that. It can just send or receive data and rest assured the very best attempt will be made to deliver it &#8211; and if delivery fails it means the connection has broken and WSP will be notified accordingly. WSP is not limited to any frame size because TCP takes care of that by negotiating an MSS (maximum segment size) when it establishes the connection. WSP is just riding on top of TCP and can shove as much data in each frame as it likes and TCP will take care of breaking that up into packets that will fit on the network.</p>
<p>The WSP sends data using very lightweight frames. There are two ways the frames can be structured. The first frame type starts with a 0&#215;00 byte (zero byte), consists of UTF-8 text and ends with a 0xFF byte with the UTF-8 text in between.</p>
<p>The second WSP frame type starts with a byte that ranges from 0&#215;80 to 0xFF, meaning the byte has the high-bit (or left-most binary bit) set to 1. Then there is a series of bytes that all have the high-bit set and the 7 right most bits define the data length. Then there&#8217;s a final byte that doesn&#8217;t have the high-bit set and the data follows and is the length specified. This second WSP frame type is presumably for binary data and is designed to provide some future proofing.</p>
<p>If you&#8217;re still with me, here&#8217;s what this all means. Lets say you have a web application that has a real-time component. Perhaps it&#8217;s a chat application, perhaps it&#8217;s Google Wave, perhaps it&#8217;s something like <a href="http://live.feedjit.com/live/markmaunder.com/">my Feedjit Live</a> that is hopefully showing a lot of visitors arriving here in real-time. Lets say you have 100,000 people using your application concurrently.</p>
<p>The application has been built to be as efficient as possible using the current HTTP specification. So your browser connects and the server holds the connection open and doesn&#8217;t send the response until there is data available. That&#8217;s called<a href="http://en.wikipedia.org/wiki/Push_technology#Long_polling"> long-polling</a> and it avoids the old situation of your browser reconnecting every few seconds and getting told there&#8217;s no data yet along with a full load of HTTP headers moving back and forward.</p>
<p>Lets assume that every 10 seconds the server or client has some new data they need to send to each other. Each time a full set of client and server headers are exchanged. They look like this:</p>
<pre>GET / HTTP/1.1
User-Agent: ...some long user agent string...
Host: markmaunder.com
Accept: */*

HTTP/1.1 200 OK
Date: Sun, 25 Oct 2009 17:32:19 GMT
Server: Apache
X-Powered-By: PHP/5.2.3
X-Pingback: http://markmaunder.com/xmlrpc.php
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8</pre>
<p>That&#8217;s 373 bytes of data. Some simple math tells us that 100,000 people generating 373 bytes of data every 10 seconds gives us a network throughput of 29,840,000 bits per second or roughly 30 Megabits per second.</p>
<p>That&#8217;s 30 Mbps just for HTTP headers.</p>
<p>With the WSP every frame only has 2 bytes of packaging. 100,000 people X 2 bytes = 200,000 bytes per 10 seconds or 160 Kilobits per second.</p>
<p>So WSP takes 30 Mbps down to 160 Kbps for 100,000 concurrent users of your application. And that&#8217;s what <a style="outline-color: -moz-use-text-color; outline-style: dotted; outline-width: 1px; outline-offset: 0pt;" href="http://www.hixie.ch/">Hickson</a> and the WSP team and trying to do for us.</p>
<p>Google would be the single biggest winner if the WSP became standard in browsers and browser API&#8217;s like Javascript. Google&#8217;s goal is to turn the browser into an operating system and give their applications the ability to run on any machine that has a browser. Operating systems have two advantages over browsers: They have direct access to the network and they have local file system storage. If you solve the network problem you also solve the storage problem because you can store files over the network.</p>
<p><a href="http://www.hixie.ch/">Hickson</a> is also working on the HTML 5 specification for Google, but the <a href="http://blogs.techrepublic.com.com/programming-and-development/?p=718" target="_blank">current date the recommendation is expected to be ratified</a> is 2022. WSP is also going to take time to be ratified and then incorporated into Javascript (and other) API&#8217;s. But it is so strategically important for Google that I expect to see it in Chrome and in Google&#8217;s proprietary web servers in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2009/web-sockets-protocol/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Routers treat HTTPS and HTTP traffic differently</title>
		<link>http://markmaunder.com/2009/routers-treat-https-and-http-traffic-differently/</link>
		<comments>http://markmaunder.com/2009/routers-treat-https-and-http-traffic-differently/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 18:50:36 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[firewalls]]></category>
		<category><![CDATA[routers]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[web servers]]></category>

		<guid isPermaLink="false">http://markmaunder.com/?p=313</guid>
		<description><![CDATA[
Well the title says it all. Internet routers live at Layer 3 [the Network Layer] of the OSI model which I&#8217;ve included to the left. HTTP and HTTPS live at Layer 7 (Application layer) of the OSI model, although some may argue HTTPS lives at Layer 6.
So how is it that Layer 3 devices like routers treat HTTPS traffic differently?
Because HTTPS servers set the DF or Do Not Fragment IP flag on packets and regular HTTP servers do not.
This matters ...]]></description>
			<content:encoded><![CDATA[<p><a style="border-width: 0px;" href="http://markmaunder.com/wp-content/uploads/2009/10/Osi-model-jb1.png"><img class="alignleft size-full wp-image-314" style="border: 0pt none;" title="OSI Network Model" src="http://markmaunder.com/wp-content/uploads/2009/10/Osi-model-jb1.png" alt="OSI Network Model" width="404" height="467" /></a></p>
<p>Well the title says it all. Internet routers live at Layer 3 [the Network Layer] of the OSI model which I&#8217;ve included to the left. HTTP and HTTP<span style="color: #ff0000;">S</span> live at Layer 7 (Application layer) of the OSI model, although some may argue HTTP<span style="color: #ff0000;">S</span> lives at Layer 6.</p>
<p>So how is it that Layer 3 devices like routers treat HTTP<span style="color: #ff0000;">S</span> traffic differently?</p>
<p>Because HTTP<span style="color: #ff0000;">S</span> servers set the DF or Do Not Fragment IP flag on packets and regular HTTP servers do not.</p>
<p>This matters because HTTP and HTTP<span style="color: #ff0000;">S</span> usually transfer a lot of data. That means that the packets are usually quite large and are often the maximum allowed size.</p>
<p>So if a server sends out a very big HTTP packet and it goes through a route on the network that does not allow packets that size, then the router in question simply breaks the packet up.</p>
<p>But if a server sends out a big HTTP<span style="color: #ff0000;">S</span> packet and it hits a route that doesn&#8217;t allow packets that size, the routers on that route can&#8217;t break the packet up. So they drop the packet and send back an ICMP message telling the machine that sent the big packet to adjust it&#8217;s MTU (maximum transfer unit) size and resend the packet. This is called <a href="http://en.wikipedia.org/wiki/Path_MTU_discovery">Path MTU Discovery</a>.</p>
<p>This can create some interesting problems that don&#8217;t exist with plain HTTP. For example, if your ops team has gotten a little overzealous with security and decided to filter out all ICMP traffic, your web server won&#8217;t receive any of those ICMP messages I&#8217;ve described above telling it to break up it&#8217;s packets and resend them. So large secure packets that usually are sent halfway through a secure HTTP<span style="color: #ff0000;">S</span> connection will just be dropped. So visitors to your website who are across network paths that need to have their packets broken up into smaller pieces will see half-loaded pages from the secure part of your site.</p>
<p>If you have the problem I&#8217;ve described above there are two solutions: If you&#8217;re a webmaster, make sure your web server can receive ICMP messages [You need to allow ICMP code 4 "Fragmentation needed and DF bit set"]. If you&#8217;re a web surfer (client) and are trying to access a secure site that has ICMP disabled, adjust your network card&#8217;s MTU to be smaller than the default (usually the default is 1500 for ethernet).</p>
<p>But the bottom line is that if everything else is working fine and you are having a problem sending or receiving HTTP<span style="color: #ff0000;">S</span> traffic, know that the big difference with HTTP<span style="color: #ff0000;">S</span> traffic over regular web traffic is that the packets can&#8217;t be broken up.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2009/routers-treat-https-and-http-traffic-differently/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>How to upgrade your server BIOS on Linux without a floppy drive</title>
		<link>http://markmaunder.com/2008/how-to-upgrade-your-server-bios-on-linux-without-a-floppy-drive/</link>
		<comments>http://markmaunder.com/2008/how-to-upgrade-your-server-bios-on-linux-without-a-floppy-drive/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 19:40:59 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://markmaunder.com/2008/how-to-upgrade-your-server-bios-on-linux-without-a-floppy-drive/</guid>
		<description><![CDATA[This is another thing I just couldn&#8217;t find no matter how hard I googled. Here&#8217;s the story behind this post. Scroll down if you want to get at the useful stuff.
I run a cluster of Dell 2950&#8217;s and I just ordered second CPU&#8217;s (Intel XEON E5410 64 bit) for all the machines. I test upgraded one of them and the LCD on the front came up orange with an error message and the chassis cooling fan cranked all the way ...]]></description>
			<content:encoded><![CDATA[<p>This is another thing I just couldn&#8217;t find no matter how hard I googled. Here&#8217;s the story behind this post. Scroll down if you want to get at the useful stuff.</p>
<p>I run a cluster of Dell 2950&#8217;s and I just ordered second CPU&#8217;s (Intel XEON E5410 64 bit) for all the machines. I test upgraded one of them and the LCD on the front came up orange with an error message and the chassis cooling fan cranked all the way up to high. Of course I ignored the instructions that came with the CPU&#8217;s that said UPGRADE THE BIOS AND BMC BEFORE YOU INSTALL THIS.</p>
<p>ATTEMPT #1: I tried to create a Bootable USB flash (pen) drive using various utilities from HP and elsewhere but I couldn&#8217;t get my Dell 2950&#8217;s to boot into the drive. I even bought an HP Flash Floppy Key and I couldn&#8217;t get my workstations to boot into it when switched into floppy mode. I didn&#8217;t try it on the Dells because by then I&#8217;d discovered the method below. Interestingly, once I upgrade my Dell 2950 Bios&#8217;s I noticed it actually REMOVES the option to boot into a USB device from the BIOS menu. So using the method below with Linux and Grub is definitelly preferable &#8211; and it probably boots slightly faster because hard-drives are faster than USB 2.0.</p>
<p>ATTEMPT #2: I got hold of a USB floppy drive, made a DOS bootable disk and upgraded the BIOS and BMC. A week earlier I was in Fry&#8217;s joking with my wife holding up a box of 1.44&#8243; disks saying &#8220;Who uses these?!&#8221; Now I know. The problem was the BIOS upgrade and BMC upgrade was very very slow from a floppy disk. It took forever to load the BIOS upgrade software into memory. And that meant a lot of down-time for our users while I upgrade the whole cluster.</p>
<p>Here&#8217;s the solution:</p>
<p>&#8211;USEFUL STUFF&#8211;</p>
<p>If you&#8217;re running any flavour of Linux using Grub as your boot loader and you need to upgrade your BIOS from a floppy drive, and you don&#8217;t have a USB floppy drive or you don&#8217;t want to use one because they&#8217;re so damn slow, then here&#8217;s the trick. This is taken from <a href="http://www-math.mit.edu/~dave/bugs/#bios_fake_floppy">David Backeberg&#8217;s page at MIT</a> which seems to be offline at the moment. I had a very hard time finding his advice so I&#8217;m echoing much of it here. I&#8217;ve removed steps to compile memdisk because they&#8217;re unneccesary and I also don&#8217;t use autoexec.bat because I prefer to manually launch the bios upgrade on each machine so that I can shut it down immediatelly afterwards in order to upgrade the hardware.</p>
<ol>
<li>Go to <a href="http://www.fdos.org/bootdisks/">FreeDOS floppies and download the OEM bootdisk</a>. (NOTE: I&#8217;ve tried to use the 2.88 Disk that FreeDOS provides but it doesn&#8217;t mount with dosemu)</li>
<li>Unzip the file you downloaded: unzip FDOEM.144.imz</li>
<li>Rename the image to something useful: mv FDOEM.144.img dell_bios_floppy.img</li>
<li>Setup the loopback device (Try /dev/loop0 if loop2 doesn&#8217;t exist): losetup /dev/loop2 dell_bios_floppy.img</li>
<li>Install dosemu. Instructions for Ubuntu: (apt-get install dosemu)</li>
<li>Edit /etc/dosemu/dosemu.conf and add (or edit the floppy_a line) to say: $_floppy_a = &#8220;threeinch:/dev/loop2&#8243;</li>
<li>Check where the c_drive is in your dosemu.conf. It&#8217;s usually at  /root/.dosemu/c_drive</li>
<li>Copy your BIOS flash executable to the fake C Drive and give it a 8.3 style name: cp PE123456789.EXE /root/.dosemu/c_drive/BIOSUP.EXE</li>
<li>Start dosemu: dosemu</li>
<li>If you start Dosemu and you see a blank screen, try typing &#8216;cls&#8217; and hit enter.</li>
<li>Feels good being in a DOS shell on linux doesn&#8217;t it? Don&#8217;t ask me why &#8211; nostalgia maybe.</li>
<li>Copy your BIOS exe from C drive to your A drive image: copy C:\BIOSUP.EXE a:\</li>
<li>Type exitemu to exit dosemu</li>
<li>Unloop your loopback device: losetup -d /dev/loop2 (or loop0 if you used that)</li>
</ol>
<p>You now have a floppy image you can boot into that contains your BIOS exe file. If you are also upgrading your BMC or other components that require booting into a floppy and executing files, you can try to fit those files on the floppy using the above steps. If they don&#8217;t fit then you need to create a second floppy image using the above steps and add a second entry to your menu.lst file in the steps below.</p>
<p>Now you need to set up Grub to give you the option to boot into your new floppy image when you reboot your machine:</p>
<ol>
<li>First install memdisk. If you&#8217;re running Ubuntu, memdisk is in the syslinux package: apt-get install syslinux</li>
<li>Copy your dell BIOS floppy into /boot: cp /root/dell_bios_floppy.img /boot/</li>
<li>I like to put a copy of memdisk into /boot:  cp /usr/lib/syslinux/memdisk /boot/</li>
<li>Edit Grub&#8217;s menu.lst file. On Ubuntu it&#8217;s in /boot/grub/menu.lst. Add the following lines &#8211; and change (hd0,4) to whatever your harddrive setting is &#8211; look at other entries in menu.lst to figure it out.</li>
</ol>
<p>title DELL Bios flash 1<br />
root (hd0,4)<br />
kernel /boot/memdisk<br />
initrd /boot/dell_bios_floppy.img</p>
<p>That&#8217;s it! Reboot. Hit ESC when you see the grub menu. There should be a new option labled &#8220;DELL Bios flash 1&#8243;. Select it and boot into FreeDOS. Run your bios update.</p>
<p>Please add comments if you have any tips for other flavors of Linux.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2008/how-to-upgrade-your-server-bios-on-linux-without-a-floppy-drive/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Linux is Obsolete!</title>
		<link>http://markmaunder.com/2008/linux-is-obsolete/</link>
		<comments>http://markmaunder.com/2008/linux-is-obsolete/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 07:00:21 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://markmaunder.com/2008/linux-is-obsolete/</guid>
		<description><![CDATA[A lame video on techcrunch today inspired me to go hunting for the original argument between Linus Torvalds and (Professor) Andy Tanenbaum and here it is. Titled Linux is Obsolete, it&#8217;s a post by the author of Minix in 1992 telling Linus he&#8217;s just created an obsolete OS that&#8217;s running on obsolete hardware (the 386) that won&#8217;t be around in a few years.
Andy&#8217;s ideas are a great example of how an academic approach to software design can lead to layers ...]]></description>
			<content:encoded><![CDATA[<p>A l<a href="http://www.techcrunch.com/2008/03/25/great-moments-in-linux-history/">ame video on techcrunch today</a> inspired me to go hunting for the original argument between Linus Torvalds and (Professor) Andy Tanenbaum and <a href="http://www.educ.umu.se/~bjorn/mhonarc-files/obsolete/">here it is</a>. Titled Linux is Obsolete, it&#8217;s a post by the author of Minix in 1992 telling Linus he&#8217;s just created an obsolete OS that&#8217;s running on obsolete hardware (the 386) that won&#8217;t be around in a few years.</p>
<p>Andy&#8217;s ideas are a great example of how an academic approach to software design can lead to layers of abstraction that kill performance. You see this mistake often in web applications because web development teams are separate from the operations team and don&#8217;t have to think about performance under load. So their focus stays on the manageability of the code base rather than its performance. They make language choices and design decisions that help them write beautiful code in as few lines as possible that any university professor would be proud of.</p>
<p>Find me an ops guy who loves Ruby on Rails and I&#8217;ll find you a dev who loves hand-crafting SQL statements.</p>
<p>Here is AST&#8217;s original email:</p>
<pre>
Subject: LINUX is obsolete
From: ast@cs.vu.nl (Andy Tanenbaum)
Date: 29 Jan 92 12:12:50 GMT
Newsgroups: comp.os.minix
Organization: Fac. Wiskunde &amp; Informatica, Vrije Universiteit, Amsterdam

I was in the U.S. for a couple of weeks, so I haven't commented much on
LINUX (not that I would have said much had I been around), but for what
it is worth, I have a couple of comments now.

As most of you know, for me MINIX is a hobby, something that I do in the
evening when I get bored writing books and there are no major wars,
revolutions, or senate hearings being televised live on CNN.  My real
job is a professor and researcher in the area of operating systems.

As a result of my occupation, I think I know a bit about where operating
are going in the next decade or so.  Two aspects stand out:

1. MICROKERNEL VS MONOLITHIC SYSTEM
   Most older operating systems are monolithic, that is, the whole operating
   system is a single a.out file that runs in 'kernel mode.'  This binary
   contains the process management, memory management, file system and the
   rest. Examples of such systems are UNIX, MS-DOS, VMS, MVS, OS/360,
   MULTICS, and many more.

   The alternative is a microkernel-based system, in which most of the OS
   runs as separate processes, mostly outside the kernel.  They communicate
   by message passing.  The kernel's job is to handle the message passing,
   interrupt handling, low-level process management, and possibly the I/O.
   Examples of this design are the RC4000, Amoeba, Chorus, Mach, and the
   not-yet-released Windows/NT.

   While I could go into a long story here about the relative merits of the
   two designs, suffice it to say that among the people who actually design
   operating systems, the debate is essentially over.  Microkernels have won.
   The only real argument for monolithic systems was performance, and there
   is now enough evidence showing that microkernel systems can be just as
   fast as monolithic systems (e.g., Rick Rashid has published papers comparing
   Mach 3.0 to monolithic systems) that it is now all over but the shoutin`.

   MINIX is a microkernel-based system.  The file system and memory management
   are separate processes, running outside the kernel.  The I/O drivers are
   also separate processes (in the kernel, but only because the brain-dead
   nature of the Intel CPUs makes that difficult to do otherwise).  LINUX is
   a monolithic style system.  This is a giant step back into the 1970s.
   That is like taking an existing, working C program and rewriting it in
   BASIC.  To me, writing a monolithic system in 1991 is a truly poor idea.

2. PORTABILITY
   Once upon a time there was the 4004 CPU.  When it grew up it became an
   8008.  Then it underwent plastic surgery and became the 8080.  It begat
   the 8086, which begat the 8088, which begat the 80286, which begat the
   80386, which begat the 80486, and so on unto the N-th generation.  In
   the meantime, RISC chips happened, and some of them are running at over
   100 MIPS.  Speeds of 200 MIPS and more are likely in the coming years.
   These things are not going to suddenly vanish.  What is going to happen
   is that they will gradually take over from the 80x86 line.  They will
   run old MS-DOS programs by interpreting the 80386 in software.  (I even
   wrote my own IBM PC simulator in C, which you can get by FTP from
   ftp.cs.vu.nl =  192.31.231.42 in dir minix/simulator.)  I think it is a
   gross error to design an OS for any specific architecture, since that is
   not going to be around all that long.

   MINIX was designed to be reasonably portable, and has been ported from the
   Intel line to the 680x0 (Atari, Amiga, Macintosh), SPARC, and NS32016.
   LINUX is tied fairly closely to the 80x86.  Not the way to go.

Don`t get me wrong, I am not unhappy with LINUX.  It will get all the people
who want to turn MINIX in BSD UNIX off my back.  But in all honesty, I would
suggest that people who want a **MODERN** "free" OS look around for a
microkernel-based, portable OS, like maybe GNU or something like that.

Andy Tanenbaum (ast@cs.vu.nl)

P.S. Just as a random aside, Amoeba has a UNIX emulator (running in user
space), but it is far from complete.  If there are any people who would
like to work on that, please let me know.  To run Amoeba you need a few 386s,
one of which needs 16M, and all of which need the WD Ethernet card.</pre>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2008/linux-is-obsolete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anycasting anyone?</title>
		<link>http://markmaunder.com/2008/anycasting-anyone/</link>
		<comments>http://markmaunder.com/2008/anycasting-anyone/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 19:36:50 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://markmaunder.com/2008/anycasting-anyone/</guid>
		<description><![CDATA[[Thanks Sam for the idea for this entry] Ever heard of IP Anycasting? Thanks to my recent change from godaddy (frowny face and no link) to dnsmadeeasy (happy face and they get a link) I&#8217;m now using a DNS provider that provides anycasting. What is it and should you care?
IP Anycasting is assigning the same IP address to multiple instances of the same service on strategic points in the network. For example, if you are a DNS provider, you might ...]]></description>
			<content:encoded><![CDATA[<p>[Thanks <a href="http://sam.tingleff.com/blog/index.php">Sam</a> for the idea for this entry] Ever heard of IP Anycasting? Thanks to my recent change from godaddy (frowny face and no link) to <a href="http://dnsmadeeasy.com">dnsmadeeasy</a> (happy face and they get a link) I&#8217;m now using a DNS provider that provides anycasting. What is it and should you care?</p>
<p>IP Anycasting is assigning the same IP address to multiple instances of the same service on strategic points in the network. For example, if you are a DNS provider, you might have servers in New York, London and Los Angeles with the same IP address. Then when a surfer in San Diego (about 80 Miles South of Los Angeles) makes a request to your DNS system the server in Los Angeles answers and saves the network from having to route traffic to New York or London.</p>
<p>Anycasting is generally used to distribute load geographically and to mitigate the effect of distributed denial of service attacks. It&#8217;s been used by the F root server since November 2002 and has saved good ole F from getting taken down by several DDoS attacks.</p>
<p>I was using <a href="http://dnspark.net/">dnspark.net</a> a couple of years ago and we had a few hours of down-time while they were hit by a DDoS attack &#8211; so it&#8217;s not as uncommon as you think. [They obviously don't use anycasting]</p>
<p>Anycasting is suitable for DNS because DNS uses a connectionless session layer protocol called UDP. One packet is sent, a response is received and hey, if the response isn&#8217;t received the client just tries another DNS server. [This occurs in the vast majority of DNS queries. There are a small number of exceptions where DNS uses TCP.]</p>
<p>Anycasting is not ideally suited for TCP connections like web browser-server communication because TCP is connection oriented. For example, TCP requires a 3 way handshake to establish the connection. If the network topology changes and  one packet is sent to the Los Angeles server and another is sent to New York it breaks TCP because the New York server doesn&#8217;t know about the session that Los Angeles has started establishing.</p>
<p>That&#8217;s the theory anyway, but if the network topology stays reasonably stable and you don&#8217;t mind a few sessions breaking when the topology does change then perhaps you&#8217;ll consider using Anycasting with your web servers. But don&#8217;t get too creative and launch a content delivery network. <a href="http://Akamai.com/">Akamai</a> might sue you and they&#8217;ll probably win. They own patent <a href="http://www.google.com/patents?vid=USPAT6108703">No. 6,108,703</a> which covers a &#8220;global hosting system&#8221; in which &#8220;a base HTML document portion of a Web page is served from the Content Provider&#8217;s site while one or more embedded objects for the page are served from the hosting servers, preferably, those hosting servers near the client machine.&#8221; <a href="http://arstechnica.com/news.ars/post/20080303-akamai-takes-another-software-patent-scalp.html">Akamai just won a case against competitor Limelight</a> for violating that patent and the case is now heading to the appeal courts.</p>
<p>There are other protocols that are connectionless and therefore well suited for Anycasting like <a href="http://www.ntp.org/ntpfaq/NTP-s-def.htm">SNTP</a> and <a href="http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol">SNMP</a> but there isn&#8217;t much demand for these because they&#8217;re network management protocols and don&#8217;t experience the massive load that more public protocols like DNS, SMTP and HTTP get.</p>
<p>Deploying an anycast network is not something you&#8217;re likely to consider in the near future unless you&#8217;re eBay or Google, but outsourcing some of your services like DNS to an anycast provider is something that&#8217;s worked well for me and might work for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://markmaunder.com/2008/anycasting-anyone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
