<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4718463370485858599</atom:id><lastBuildDate>Fri, 10 Feb 2012 05:20:07 +0000</lastBuildDate><category>apache</category><category>linux</category><category>ant</category><category>tools</category><category>mysql</category><category>CSS</category><category>linkspam</category><category>php</category><category>security</category><category>programming</category><category>phpunit</category><category>Design</category><category>zend studio</category><category>databases</category><category>netflix</category><category>git</category><category>servers</category><category>purdy</category><category>marketing</category><category>windows</category><category>hg</category><category>testing</category><category>cacti</category><category>rant</category><category>google</category><title>Tales of an IT Nobody</title><description>devbox:~$ iptables -A OUTPUT -j DROP</description><link>http://tales.itnobody.com/</link><managingEditor>noreply@blogger.com (Justin Rovang)</managingEditor><generator>Blogger</generator><openSearch:totalResults>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TalesOfAnItNobody" /><feedburner:info uri="talesofanitnobody" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-8748149087979019774</guid><pubDate>Mon, 06 Feb 2012 07:27:00 +0000</pubDate><atom:updated>2012-02-06T09:12:16.433-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Disable PHP 5.4's built-in web server, while keeping CLI ...</title><description>Administrators: Don't get blind-sided by PHP 5.4's CLI web server!&lt;br /&gt;
&lt;br /&gt;
I've &lt;a href="http://tales.itnobody.com/2011/09/inherent-risks-of-daemonize-features-in.html"&gt;gone over a similar issue&lt;/a&gt; like this before regarding the likes of git/hg. While those are developer tools and are less likely to be present on a production machine.&lt;br /&gt;
&lt;br /&gt;
PHP 5.4 is jumping on the bandwagon to include a&lt;a href="http://us.php.net/manual/en/features.commandline.webserver.php"&gt; 'cute' little internal server&lt;/a&gt; - which is enabled by default.&lt;br /&gt;
The 'everything needs a standalone server' thing is starting to &lt;strike&gt;get on my security nerves&lt;/strike&gt; feel silly.&lt;br /&gt;
&lt;br /&gt;
It has limited use, and most developers will have limited use for it due to it's lack of mod_rewrite (and equiv.) behavior ... The worse part is: You can't disable it if you want to keep cli (e.g.: no pear!)&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
Wish I spoke up on the list!&lt;br /&gt;
&lt;br /&gt;
Anywho, here's a hob-knobbed patch (for PHP 5.4.0RC6) that will change that for you.&lt;br /&gt;
(GNU/*nix only!) The patch adds a new configure option '--disable-cli-server'.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Download the patch here: &lt;a href="http://www.itnobody.com/patch-php5.4.0RC6-no-cli-server.diff"&gt;patch-php5.4.0RC6-no-cli-server.diff&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Place it in the PHP source base directory.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: shell;"&gt;tar -zxvf PHP-5.4.0.RC6.tar.gz
cd PHP-5.4.0.RC6/ 
patch -p1 &amp;lt; foo.patch
./buildconf --force
./configure [config options, etc] --enable-cli --disable-cli-server
make # (-jX if you've got spares ;) )
&lt;/pre&gt;&lt;br /&gt;
In the future I'll plan on formalizing this patch and propose it in php.internals when I get a chance to make the windows part of the patch.&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;a href="https://wiki.php.net/rfc/builtinwebserver"&gt;https://wiki.php.net/rfc/builtinwebserver&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/sapi/cli/"&gt;http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/sapi/cli/&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://gist.github.com/835698"&gt;https://gist.github.com/835698&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-8748149087979019774?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=M6fkIsZ2MFY:hes7awZgZ-I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=M6fkIsZ2MFY:hes7awZgZ-I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=M6fkIsZ2MFY:hes7awZgZ-I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/M6fkIsZ2MFY/disable-php-54s-built-in-web-server.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2012/02/disable-php-54s-built-in-web-server.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-1079674752622704231</guid><pubDate>Fri, 27 Jan 2012 15:56:00 +0000</pubDate><atom:updated>2012-01-27T09:58:11.502-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Observations: Google's new Terms of Service</title><description>The new TOS and Privacy Policy documents from Google are a welcome change, reducing 60 individual ones into a standard, global set is a much better idea for understanding's sake. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Observation 1:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;i&gt;&lt;b&gt;We may review content &lt;/b&gt;to determine whether it is illegal or violates our  policies, and we may remove or refuse to display content that we  reasonably believe violates our policies or the law.&lt;b&gt; But that does not  necessarily mean that we review content&lt;/b&gt;, so please don’t assume that we  do. &lt;/i&gt;&lt;span style="font-size: xx-small;"&gt;&lt;br /&gt;
&lt;br /&gt;
Usng Our Services &lt;a href="http://www.google.com/policies/terms/#toc-services"&gt;http://www.google.com/policies/terms/#toc-services&lt;/a&gt;&lt;/span&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;
I get what they're saying, but the wording seems a little humorous if you don't hone in on 'necessarily'.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Observation 2:&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;i&gt;We provide information to help copyright holders manage their  intellectual property online.&lt;/i&gt;&lt;span style="font-size: xx-small;"&gt; &lt;br /&gt;
&lt;br /&gt;
Privacy and Copyright Protection &lt;a href="http://www.google.com/policies/terms/#toc-protection"&gt;http://www.google.com/policies/terms/#toc-protection&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
Odd, this leaves some open questions to what information they provide ... are they helping police things "SOPA style"? &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Observation 3:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;i&gt;Some of our Services allow you to submit content. You retain ownership  of any intellectual property rights that you hold in that content. In  short, what belongs to you stays yours.&amp;nbsp; &lt;/i&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/blockquote&gt;&amp;nbsp;That's neat... but wait, the next paragraph:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;i&gt;When you upload or otherwise submit content to our Services, you give  Google (and those we work with) a worldwide license to use, host, store,  reproduce, modify, create derivative works (such as those resulting  from translations, adaptations or other changes we make so that your  content works better with our Services), communicate, publish, publicly  perform, publicly display and distribute such content.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: xx-small;"&gt;Your Content in our Services &lt;a href="http://www.google.com/policies/terms/#toc-content"&gt;http://www.google.com/policies/terms/#toc-content&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
Uh... ok...&lt;br /&gt;
&lt;br /&gt;
I don't have any intent on copyright infringement, so the first two don't bother me, but the third one leaves me with some questions ...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-1079674752622704231?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=pOZPZGANL5Q:1Wuk7SfqUY0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=pOZPZGANL5Q:1Wuk7SfqUY0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=pOZPZGANL5Q:1Wuk7SfqUY0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/pOZPZGANL5Q/observations-googles-new-terms-of.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2012/01/observations-googles-new-terms-of.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-4490769687739409703</guid><pubDate>Sat, 14 Jan 2012 08:22:00 +0000</pubDate><atom:updated>2012-01-14T02:22:55.850-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>PHP Vulnerability - DJBX33A - Hash table collisions</title><description>Trickling through my RSS feeds this morning was an article with quite the topic "&lt;a href="http://www.phpclasses.org/blog/post/171-PHP-Vulnerability-May-Halt-Millions-of-Servers.html"&gt;PHP Vulnerability May Halt Millions of Servers&lt;/a&gt;".&lt;br /&gt;
&lt;br /&gt;
In a nutshell: A modest size POST to almost all PHP versions in the wild (Sans 5.3.9+) are in danger of an extremely simple DoS.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube-nocookie.com/embed/R2Cq3CLI6H8" width="640"&gt;&lt;/iframe&gt; &lt;br /&gt;
&lt;br /&gt;
The vulnerability exploits the PHP internal hash table function (responsible for managing data structures) - more specifically: the technique used to 'hash' (generate a key for the hash table) the key for a key=&amp;gt;value relationship.&lt;br /&gt;
&lt;br /&gt;
Here's the informative part regarding PHP's problem in the &lt;a href="http://permalink.gmane.org/gmane.comp.security.full-disclosure/83694"&gt;security advisory &lt;/a&gt;for this:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;On an i7 core, the 60 seconds take a string of multi-collisions of about
500k. 30 seconds of CPU time can be generated using a string of about
300k. This means that an attacker needs about 70-100kbit/s to keep one
i7 core constantly busy. An attacker with a Gigabit connection can keep
about 10.000 i7 cores busy.&lt;/pre&gt;&lt;/blockquote&gt;Apache has a&lt;a href="http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestline"&gt; built in limit of 8K&lt;/a&gt; max request length (that is, maximum size in request URL) by default. &lt;br /&gt;
Can the damage from an 8k request (this affects GET) - really cause the mentioned DDoS attack on reasonable hardware?&lt;br /&gt;
&lt;br /&gt;
Additionally - PHP has a limiter on POST data too: max_post_size. &lt;br /&gt;
It's this configuration variable in particular I think should be put in the limelight.&lt;br /&gt;
&lt;br /&gt;
max_post_size is a run-time/htaccess configurable directive that maybe we don't respect like we should.&lt;br /&gt;
Often, administrators (myself included) just tell php.ini to accept a large POST size to allow form based file uploads - It's not uncommon to see:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:shell"&gt;upload_max_filesize = 20M
post_max_size = 21M # or multitudes more!
&lt;/pre&gt;&lt;br /&gt;
- in almost any respectable setup.&lt;br /&gt;
&lt;br /&gt;
Perhaps we should evaluate the underlying effects of this setting; maybe it should be something stupidly low by default (enough to allow a large WYSIWYG CMS article's HTML and a bit more? 32K?) - and then delegate a higher limit using Apache configuration.&lt;br /&gt;
&lt;br /&gt;
Caveat: these settings are PER DIR meaning:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;.htaccess use is limited, you can't set the php_value in a .htaccess with a URL match - you're stuck using a context sensitive .htaccess (within a dir) or use the &lt;files&gt; directive - this won't work for people using front controllers through a single file on their websites/apps.&lt;/files&gt;&lt;/li&gt;
&lt;li&gt;Modifying the actual vhost/host configuration is a sound bet - you can do Location/File matching and set these at will; for situated web apps, this may be a feasible decision to take whitelist or blacklist approach on uploader destinations.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;More resources:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=R2Cq3CLI6H8&amp;amp;t=45m25s"&gt;Here's the video&lt;/a&gt; that thoroughly covers the vulnerability - I've shortcut it to their recommended mitigation (outside of polymorphic hashing):&lt;/li&gt;
&lt;li&gt;&lt;a href="http://translate.google.com/translate?sl=auto&amp;amp;tl=en&amp;amp;js=n&amp;amp;prev=_t&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;layout=2&amp;amp;eotf=1&amp;amp;u=http%3A%2F%2Fwww.ilmuhacking.com%2Fweb-security%2Fhashtable-collision-dos%2F"&gt;A full blown rundown&lt;/a&gt;, including proof of concept (USE AT YOUR OWN RISK!) &lt;/li&gt;
&lt;li&gt;A &lt;a href="http://www.itnobody.com/hashcollide.txt"&gt;string of hash &lt;/a&gt;collisions targeting DJBX33A for vuln testing (PS: Firefox seems to struggle with this in a GET format, Chrome doesn't, odd!)&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-4490769687739409703?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=owqXNE2EElI:X8cF4AMeXqI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=owqXNE2EElI:X8cF4AMeXqI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=owqXNE2EElI:X8cF4AMeXqI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/owqXNE2EElI/php-vulnerability-djbx33a-hash-table.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2012/01/php-vulnerability-djbx33a-hash-table.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-3106062193351159203</guid><pubDate>Wed, 11 Jan 2012 01:22:00 +0000</pubDate><atom:updated>2012-01-31T14:29:06.334-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">purdy</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Why I won't (can't) adopt Google Chrome yet...</title><description>Privacy aside, simply put: in my role, I do my fair share of design work, AJAX debugging, CSS, you name it -&amp;nbsp; I need tools at my fingertips to quickly do more than just rip apart the DOM of a page, these are my deal breaker extensions/capabilities that aren't in chrome:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dealbreakers:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Web Developer Toolbar - Session toggle, disable/enable &lt;strike&gt;cache&lt;/strike&gt;&lt;/b&gt;&lt;br /&gt;
&lt;strike&gt;Chrome has no way to turn on/off cache at the click of a button. The closest thing I have found is a to create an icon that has a switch in the launch parameters. &lt;/strike&gt;Another biggie for me is to clear a specific &lt;i&gt;set&lt;/i&gt; of session cookies for a domain instead of &lt;i&gt;all&lt;/i&gt; of them. The chrome version of Web Developer Toolbar completely lacks these options.&lt;br /&gt;
&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-djXZNjT7YhI/TwyIg4RN12I/AAAAAAAAAjg/yBNsIaeMJRI/s1600/fvc1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://3.bp.blogspot.com/-djXZNjT7YhI/TwyIg4RN12I/AAAAAAAAAjg/yBNsIaeMJRI/s400/fvc1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;2. &lt;a href="http://seleniumhq.org/projects/ide/"&gt;Selenium IDE&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Only firefox has the Selenium IDE plugin; for those of us who perform automation or frequent checking on forms for SQL injection or other; there's a few alternatives out there for chrome, but none as extensive as Selenium (you can also reuse the IDE tests for Selenium RC)&lt;br /&gt;
&lt;b&gt; &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wmoAgg8d7aA/TwyJCP9Q1KI/AAAAAAAAAjo/1c04rDrUF4M/s1600/fvc2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://1.bp.blogspot.com/-wmoAgg8d7aA/TwyJCP9Q1KI/AAAAAAAAAjo/1c04rDrUF4M/s400/fvc2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. &lt;a href="http://www.s3fox.net/"&gt;S3Fox &lt;/a&gt;(or equiv.)&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-mHmSAzwIPWM/TwyNd06WBnI/AAAAAAAAAjw/Gv_qupmjO8o/s1600/fvc3.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://1.bp.blogspot.com/-mHmSAzwIPWM/TwyNd06WBnI/AAAAAAAAAjw/Gv_qupmjO8o/s400/fvc3.PNG" width="400" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;4. View image info (&lt;i&gt;'nuff said; even IE has it!)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-NAkvnJfPJKc/TwyzRp9ILYI/AAAAAAAAAj4/Zra1Kl_HSzI/s1600/fvc4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-NAkvnJfPJKc/TwyzRp9ILYI/AAAAAAAAAj4/Zra1Kl_HSzI/s1600/fvc4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Google Chrome &lt;i&gt;IS&lt;/i&gt; the browser of the future;&amp;nbsp; it's still not quite there yet for me...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-3106062193351159203?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=imnYS85Efo0:MttjXzaertY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=imnYS85Efo0:MttjXzaertY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=imnYS85Efo0:MttjXzaertY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/imnYS85Efo0/why-i-wont-cant-adopt-google-chrome-yet.html</link><author>noreply@blogger.com (Justin Rovang)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-djXZNjT7YhI/TwyIg4RN12I/AAAAAAAAAjg/yBNsIaeMJRI/s72-c/fvc1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2012/01/why-i-wont-cant-adopt-google-chrome-yet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-3166807015743149982</guid><pubDate>Fri, 23 Dec 2011 07:30:00 +0000</pubDate><atom:updated>2011-12-23T02:01:11.963-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">marketing</category><category domain="http://www.blogger.com/atom/ns#">linkspam</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>If you're not off of Godaddy yet ...</title><description>You should be. The Godaddy girls are stupid. The commercials are worse. Bob Parsons is kinda creepy (not just the &lt;a href="http://www.youtube.com/watch?v=HXVH4OsfapI&amp;amp;feature=player_embedded#%21"&gt;elephant thing&lt;/a&gt;). The ads are terrible. The site is terrible.&lt;br /&gt;
&lt;br /&gt;
Do you need another excuse to move your registrar needs to another company such as &lt;a href="http://www.gandi.net/"&gt;Gandi &lt;/a&gt;or &lt;a href="http://www.namecheap.com/"&gt;Namecheap&lt;/a&gt;?&lt;br /&gt;
&lt;br /&gt;
You need another excuse?&lt;a href="http://www.ibtimes.com/articles/271730/20111222/sopa-bill-2012-godaddy-reveals-support.htm"&gt; here it is.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
You should know what &lt;a href="http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act"&gt;SOPA&amp;nbsp; &lt;/a&gt;&lt;a href="http://thomas.loc.gov/cgi-bin/bdquery/z?d112:h.r.3261:"&gt;*&lt;/a&gt; is about between the lines. (Job growth? Puh-leese, the job growth from the .com boom didn't need SOPA thank you very much!)&lt;br /&gt;
&lt;br /&gt;
Over the last few months I've moved a dozen domains off of Godaddy on to others (client's discretion).&lt;br /&gt;
If you're still on the fence, there's a pretty good run down of good alternative registrars&lt;a href="http://shiflett.org/blog/2011/jul/domain-registrars"&gt; on this blog post.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ICANN also has a full (but impersonal) list of&lt;a href="http://www.icann.org/en/registrars/accredited-list.html"&gt; accredited registrars &lt;/a&gt;as well.&lt;br /&gt;
&lt;br /&gt;
PS: Namecheap has a coupon code for a little bit off "SOPASUCKS".&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-3166807015743149982?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=jnkk6S8okg0:U_CwMEQXQjY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=jnkk6S8okg0:U_CwMEQXQjY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=jnkk6S8okg0:U_CwMEQXQjY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/jnkk6S8okg0/if-youre-not-off-of-godaddy-yet.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/12/if-youre-not-off-of-godaddy-yet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-1383963350937078602</guid><pubDate>Wed, 21 Dec 2011 00:50:00 +0000</pubDate><atom:updated>2011-12-20T18:51:31.545-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>/bin/false - Report false bugs to ...</title><description>While sifting through the manpages for /bin/false (looking for crafty uses for this oddball command) - I just had to share a funny line from within the manpage:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='brush: shell;'&gt;REPORTING BUGS
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Report false bugs to bug-coreutils@gnu.org
&lt;/pre&gt;&lt;br /&gt;
Maybe it's been a long day =|&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-1383963350937078602?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=9WzZ7Y0Z4vs:FILT6L4lm0Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=9WzZ7Y0Z4vs:FILT6L4lm0Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=9WzZ7Y0Z4vs:FILT6L4lm0Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/9WzZ7Y0Z4vs/binfalse-report-false-bugs-to.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/12/binfalse-report-false-bugs-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-7144106654397571299</guid><pubDate>Sun, 04 Dec 2011 04:51:00 +0000</pubDate><atom:updated>2011-12-08T17:01:20.286-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">testing</category><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>ab - Apache Bench, understanding and getting tangible results.</title><description>ab is a very powerful tool when used right. I use it as a guideline for how to set up my apache2/httpd.conf files. &lt;br /&gt;
All too often I see people boasting that they can get an outrageous number of RPS in ab (the Apace Bench tool).&lt;br /&gt;
&lt;br /&gt;
"OMG, I totally get 3,000 rps in an AWS micro instance!!!" (I've seen this on the likes of &lt;a href="http://serverfault.com/"&gt;Serverfault&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Debunking misunderstandings:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Concurrency != users on site at same time&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Requests per second != &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;users on site at same time &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;ab is meant to give a 'feel of pants' diagnostic for the page/s you point it to.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Every page on a website is different; and may require a different number of requests to load (resources: css, js, images, html, etc). &lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;Aspects of effective Apache benchmarking:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Concurrent users&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Response time&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Requests&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;"Concurrent users" -&lt;/b&gt; Have you ever stopped to ask yourself: What the hell is a user? (in the Apache sense) We don't stop to think about them individually, we just think about them as a 'request' or the 'concurrent' part of benchmarking.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;When a &lt;i&gt;user &lt;/i&gt;loads a page, their browser may start X connections at the same time to your server to load resources. This is a complex dynamic, because browsers have a built in limit of how many &lt;a href="http://weblogs.asp.net/mschwarz/archive/2008/07/21/internet-explorer-8-and-maximum-concurrent-connections.aspx"&gt;&lt;i&gt;concurrent requests&lt;/i&gt;&lt;/a&gt; to make to a host at a given time (a hackable aspect).&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So at any given time, let's say a &lt;i&gt;user&lt;/i&gt; =&lt;i&gt; 6 concurrent connections/requests.&lt;/i&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;"Response time"&lt;/b&gt; - What is an acceptable response time? What is a response? In the context of this article, it's the round trip process involved with &lt;i&gt;the transfer&lt;/i&gt; of a resource. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;This summarizes the intricacies of database queries and programming logic, etc into a measurable aspect for consideration in your benchmarking.&lt;br /&gt;
&lt;br /&gt;
Is 300ms to load the HTML output of a &lt;a href="http://drupal.org/"&gt;Drupal &lt;/a&gt;website acceptable? 400? 500? 600? 700?&lt;br /&gt;
&lt;br /&gt;
How fast does a static asset load? What is the typical size of an asset for your webpages? 10KiB? 20? &lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;"Requests"&lt;/b&gt; - &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Requests happen at the sub-second level, measured in milliseconds.&amp;nbsp; &lt;br /&gt;
Let's say the average &lt;i&gt;page &lt;/i&gt;has 15 resources (images, js, css files, html data, etc) - aka:&lt;i&gt; 15 requests per page&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
This means if a single user comes to load a page, there's a good chance his/her browser will make 15 requests total.&lt;br /&gt;
&lt;br /&gt;
Another part of this aspect is to be aware that the browser will perform these requests in a 'trickle' fashion, meaning one request to get the HTML, then an instant 6 requests (browser concurrency) but the next 8 will happen one at a time once concurrent connections free up.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt; &lt;/i&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Putting aspects together:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;We have to draw an understanding of how these aspects all tie together to determine the start-to-finish load of a typical page. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Let's say a page is 15 requests (14 images/js/css files and HTML) with an average payload of 10KB of data each.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;150KB of data.&lt;br /&gt;
&lt;br /&gt;
A user/browser makes 6 simultaneous requests (All completing at slightly different times, ideally, at the same time). &lt;br /&gt;
&lt;br /&gt;
Response time is the metric we're interested in.&lt;br /&gt;
&lt;br /&gt;
The questions we ask of ab are - given the current configuration and environmental conditions:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;What's the highest level of concurrency I can support loading a given asset in less than &lt;i&gt;X milliseconds&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;How many requests per second can I support at that given level of concurrency &lt;/li&gt;
&lt;/ul&gt;By attempting to answer these questions, we'll derive the tipping point of the server - and what it's bottlenecks are. (This article will not cover determining bottlenecks - just how to get meaning from ab)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;Caveats&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Naturally these seat of pants numbers are generated on a machine on the same network with plenty of elbow room - making them best case scenarios - in today's world it's close enough with how widespread HSI is. It also assumes the network can handle the throughput of the transfers involved with a page. It also assumes all assets are hosted on the same host, nothing cross domain, e.g.: Google Analytics, Web Fonts, etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;How to test&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;First, we need to classify the load. As mentioned a few times, there's two types of site data: static files, and generated files.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Static files have extremely fast response times,&amp;nbsp; generated files take longer because they're performing logic, database work and other things.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
A browser doesn't know what to load until it retrieves the HTML file containing the references to other resources - this changes how we look at timings, and most cases, the HTML document is generated.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;First&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Let's simulate a single user/browser loading a page from an idle server.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;First, we must get the HTML data...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-otBjC_rKrvw/Ttrf6IyOoEI/AAAAAAAAAiY/Q3Nw1ypkJTw/s1600/ab-it-drupal-base.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-otBjC_rKrvw/Ttrf6IyOoEI/AAAAAAAAAiY/Q3Nw1ypkJTw/s1600/ab-it-drupal-base.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; So you can see, this took 29ms, at 299KB/s to generate the HTML from Drupal and send it across the pipe.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Now, let's simulate a browser at 6 concurrent connections loading 15 assets at 10KiB each.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PkFz8DmLqRg/Ttrjd54dwEI/AAAAAAAAAiw/IZrfxuUoRqA/s1600/ab-it-static-base.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PkFz8DmLqRg/Ttrjd54dwEI/AAAAAAAAAiw/IZrfxuUoRqA/s1600/ab-it-static-base.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So here you can see, each request completed at 35ms or less - The whole test took about 560 ms.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;This means that under pristine conditions, the user would have the entire webpage loaded in 589ms.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Finding the limits...&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So, looking at our numbers - it's clear that 1 user is a piece of cake.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;It's also clear that there's two big considerations into acceptable timings:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Time to get HTML (our 1 generated request)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Time to get references from that HTML (our 15 static requests)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;We're going to multiply our numbers and start pushing the server harder - let's say by 30 times&lt;b&gt;:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So once again, let's emulate 30 users making 30 requests to our Drupal page:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XAm10505nFo/TtrqALgynAI/AAAAAAAAAi4/WTbze2N_sxc/s1600/ab-it-30.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-XAm10505nFo/TtrqALgynAI/AAAAAAAAAi4/WTbze2N_sxc/s1600/ab-it-30.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Every user got the HTML file in ~298ms or less.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Next up, static files - 30 users = 180 concurrent connections, 450 requests.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sLTr-Z-A16I/TtrrEeehcvI/AAAAAAAAAjI/4tP2FyNTpT4/s1600/ab-it-static-30.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-sLTr-Z-A16I/TtrrEeehcvI/AAAAAAAAAjI/4tP2FyNTpT4/s1600/ab-it-static-30.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So, here's where things start getting interesting - 2% of the requests were slowed down to 600+ms per request. The exact cause of that is out of the scope of this article - could be IO - regardless, the numbers are still good and it's clear that this is indicating the start of a tipping point for the host.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Take the HTML load time - 298ms&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Do some fuzzy math here: 265ms&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;* 2.5 = 662ms (mean total)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;957ms average for entire page to load. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;This is 'fuzzy math' because I'm not simulating the procedural/trickle loading effect of browsers mentioned above (initial burst of 6 connections, and making them busy as they become available at different times to complete the 15 requests). But instead treating it as 6 requests in sets. Someone more mathematically inspired might calculate better numbers - I use this method because it's my "buffer factor" that I use for variables (bursts of activity, latency changes, etc).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So from this data, we can say the server can sustain 30 constant users given our assumptions.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Phase two: &lt;/b&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;So now we have a ballpark figure of where our server will tip over. We're going to perform two simultaneous ab sessions to put this to the test, this will simulate both worlds of content: generating content and loading the assets. This is the 'honing' phase where we dial down/up our configuration by smaller increments.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;5 minutes of load at our proposed 30 users&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;30 concurrent connections for our generated content page.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;180 concurrent connections for static data. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-l2bZLSOBO0s/Ttr00CCxg0I/AAAAAAAAAjQ/hvfUBllBM7Y/s1600/ab-it-tipping.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-l2bZLSOBO0s/Ttr00CCxg0I/AAAAAAAAAjQ/hvfUBllBM7Y/s1600/ab-it-tipping.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Ding ding ding! &lt;/b&gt;We've got a tipper!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Ok, so as you can see, for the most part, everything was fairly responsive. If the system could not keep up, most of the percentiles will have the awful numbers like the ones shown in the highest 2%. However, overall these numbers should be improved upon to deal with sporadic spikes above our estimates, and other environmental factors that may have a swaying factor in our throughput.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;How to interpret:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Discard the 100% - longest request; at these volumes it's irrelevant.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;However,  the 98-99% matter - your goal should be to make the 98% fall under your  target response time for the request. The 99% shows us that we've found  our happy limit.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;(Remember, at these levels, theres many many variables involved - and the server should &lt;i&gt;never&lt;/i&gt; reach this limit, that's why we're finding it out!)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Let's tone our bench down to supplement 25 users and see what happens ...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-aFUiOIwjXp8/Ttr5BIqQQdI/AAAAAAAAAjY/x3tu__rTaUE/s1600/ab-it-good.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-aFUiOIwjXp8/Ttr5BIqQQdI/AAAAAAAAAjY/x3tu__rTaUE/s1600/ab-it-good.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Wrap up&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;25 simultaneous users may not sound like a lot, but imagine a classroom of 25 students - and they all click to your webpage at the &lt;i&gt;exact same moment&lt;/i&gt; - this is the kind of load we're talking about; to have every one of those machines (under correct conditions) load up the website &lt;i&gt;within 1 second&lt;/i&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;To turn that into a real requests per second: 375. (25 users @ 15 requests).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;The configuration - workload (website code, images) and hardware (2 1Ghz CPU's...) are capable of performing this at a constant rate - these benchmarks indicate that the hardware (or configuration) should be changed before it gets to this point to supplement growth. These benchmarks indicate that ~430 pageloads out of 21,492 will take longer than a second to load. In reality, the ebbs and flows of request peaks and valleys make these less likely to happen. &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;As you can see, the static files are served &lt;i&gt;very&lt;/i&gt; fast in comparison to the generated content from Drupal.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;If this Apache instance was backed by the likes of Varnish, the host would be revitalized &lt;/span&gt;to handle quite a bit more (depending on cache retention).&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;Testing hardware&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;1x AWS EC2 Large instance on EBS - Apache host&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;2 virtual cores with 2 EC2 Compute Units each&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; AKA:&amp;nbsp; (2) 2Ghz Xeon equiv&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;7GB RAM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;1x AWS EC2 4X Large CPU &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; - AB runner&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;8 virtual cores with 3.25 EC2 Compute Units each&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;AKA: (8) 3.25Ghz Xeon Equiv&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;68GB RAM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-7144106654397571299?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=2-GBesmxrvI:J3TUEvk-GdI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=2-GBesmxrvI:J3TUEvk-GdI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=2-GBesmxrvI:J3TUEvk-GdI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/2-GBesmxrvI/ab-apache-bench-understanding-and.html</link><author>noreply@blogger.com (Justin Rovang)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-otBjC_rKrvw/Ttrf6IyOoEI/AAAAAAAAAiY/Q3Nw1ypkJTw/s72-c/ab-it-drupal-base.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/12/ab-apache-bench-understanding-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-7878782068206376438</guid><pubDate>Mon, 28 Nov 2011 18:40:00 +0000</pubDate><atom:updated>2011-11-28T12:41:37.516-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Grepping extremely large files</title><description>So you forgot to set up logrotate on an active log eh? You've got a many gigabyte file to weed through and you need to extract a chunk of time from it?&lt;br /&gt;
&lt;br /&gt;
Here's a quick cheat sheet to help you get by, quickly and sanely.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;It's about byte offsets!&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;/b&gt;Get the byte offset in the file where your time range starts&lt;/li&gt;
&lt;li&gt;Get the byte offset in the file where your time range ends&lt;/li&gt;
&lt;li&gt;dd the data out!&lt;/li&gt;
&lt;/ul&gt;&lt;pre class='brush:shell;'&gt;# Get first byte offset, leftmost number is the offset, "offset_start"
grep -m 1 -b "2011-11-15 11:3" error_log
 # Get last byte offset, "offset_end"
grep -m 1 -b "2011-11-16 01:3" error_log

 #Subtract offset_start from offset_end to get byte length, then do:
dd if=error_log of=filtered bs=c skip=[offset_start] count=[byte_length]
&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Caveats&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;You should tack on extra bytes to the byte length, because the offset_end number is actually the beginning byte of your boundary log entry&lt;/li&gt;
&lt;li&gt;Figuring out the boundary is a bit tricky because a log entry -has- to be present in order to match, so if you're looking for what happened at 20:00 hours on X date, you may have to round up to the date level depending on how busy your log is&lt;/li&gt;
&lt;li&gt;This is just a trick to extract a chunk of entries to speed up further filtering.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;Full example&lt;/h3&gt;&lt;br /&gt;
&lt;pre class='brush:shell;'&gt;dev:/var/log/apache2# grep -m 1 -b  "23/Nov/2011:00" access.log.1
6633711:3694 127.0.0.1:53784 - - 176us [23/Nov/2011:00:00:10 -0600]

dev:/var/log/apache2# grep -m 1 -b  "24/Nov/2011:19" access.log.1
9674209:10872 127.0.0.1:46097 - - 173us [24/Nov/2011:19:00:10 -0600]

# byte length: 9674209 - 6633711 = 3040498 bytes (Plus 256 to cover the caveat) = 
dd if=access.log.1 of=filtered bs=c skip=6633711 count=3040754
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-7878782068206376438?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=lhFDQla4fz8:fDdNMRCk87k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=lhFDQla4fz8:fDdNMRCk87k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=lhFDQla4fz8:fDdNMRCk87k:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/lhFDQla4fz8/grepping-extremely-large-files.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/11/grepping-extremely-large-files.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-4109859506991005578</guid><pubDate>Sat, 05 Nov 2011 05:10:00 +0000</pubDate><atom:updated>2011-12-08T20:34:48.668-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Worthy of distribution: Cloud analogy</title><description>This post on Beyond Bandwidth seems to summarize some of my feelings about cloud computing - it's best thought of as an outsourcing task for the most part; Although the benefits of something like an extra DNS server are a bit more than an 'outsource benefit'; but you get the idea:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://blog.level3.com/2011/11/03/cloudy-analogies-with-a-chance-of-illusion/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+BeyondBandwidth+%28Beyond+Bandwidth%29&amp;amp;utm_content=Google+Reader"&gt;Cloudy analogies with a chance of illusion&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-4109859506991005578?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=MpGoABVov3c:Kxk2AzeXDiE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=MpGoABVov3c:Kxk2AzeXDiE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=MpGoABVov3c:Kxk2AzeXDiE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/MpGoABVov3c/worthy-of-distribution-cloud-analogy.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/11/worthy-of-distribution-cloud-analogy.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-3921783123594690724</guid><pubDate>Mon, 26 Sep 2011 19:55:00 +0000</pubDate><atom:updated>2011-09-26T15:05:07.673-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Is there a hacking campaign against open source?</title><description>Linux.com, kernel.org, mysql(twice this year), wordpress and php have all reported breaches of some sort this year. Is there some sort of campaign against these 'high profile' open source projects? It's starting to feel like it, to me.&lt;br /&gt;
&lt;br /&gt;
The more hands you get in the pot, the more nervous you should get as an administrator. System issues stem from more than password &lt;a href="http://www.itnobody.com/bash/chage-email"&gt;change frequency &lt;/a&gt;and difficulty - stale keys and giving access to folks that shouldn't have access happens.&lt;br /&gt;
&lt;br /&gt;
I also feel isolation or 'separation of concerns' is a tactic that is pushed aside in the name of maxing out a system, more often than not this stop gap would save a lot of trouble. Apache's ability to mitigate concern from last year's breaches is a good example of isolation, they had a fairly sophisticated break in and the repercussions weren't as vocal as the ones from this year. &lt;br /&gt;
&lt;br /&gt;
There doesn't seem to be sufficient coverage of thi&lt;i&gt;s&lt;/i&gt; MySQL hack&lt;i&gt; right now&lt;/i&gt; - how sure are we this isn't a sample set from a compromised browser as opposed to the site?&lt;br /&gt;
&lt;br /&gt;
I hope there will be continued disclosure so everyone can learn something extra to safeguarding themselves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While it doesn't feel right to ream MySQL (at all, or at this point of the news) I have some initial thoughts I just can't shake:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;If MySQL was 'hacked': Infiltrated earlier this year; you made no extra measures on a wider scope? really?&lt;/li&gt;
&lt;li&gt;Why the hell is your web/any cluster accessible without a VPN? &lt;i&gt;It sounds&lt;/i&gt; like they're selling shell access directly to the host/s..&lt;/li&gt;
&lt;/ol&gt;&amp;nbsp;C'est la vie&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-3921783123594690724?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=MzB3aBMgazE:Qx0OFT-4vO0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=MzB3aBMgazE:Qx0OFT-4vO0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=MzB3aBMgazE:Qx0OFT-4vO0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/MzB3aBMgazE/is-there-hacking-campaign-against-open.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/09/is-there-hacking-campaign-against-open.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-5067791502607608373</guid><pubDate>Sat, 24 Sep 2011 23:47:00 +0000</pubDate><atom:updated>2011-09-24T18:57:18.712-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">hg</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>The inherent risks of 'daemonize' features in developer tools - Git, Mercurial (hg)</title><description>A handful of tools such as mercurial, git, (soon PHP - which chances are will be it's own binary) have their own 'daemonize' functionality.&lt;br /&gt;
&lt;br /&gt;
Whatever your reasons - if you want to disable these; there's little to no help in figuring out how... til now...&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;If you want to disable Mercurial's `hg serve`:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Open the file (Your python install path may differ, but this should give you an idea of what to search for)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;/usr/local/lib/python2.x/dist-packages/mercurial/hgweb/server.py:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Find the function 'create-server' and add 'sys.exit()' in the first line:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: python"&gt;def create_server(ui, app):
    sys.exit()
    if ui.config('web', 'certificate'):
        if sys.version_info &gt;= (2, 6):
            handler = _httprequesthandlerssl
        else:
            handler = _httprequesthandleropenssl
    else:
        handler = _httprequesthandler
(etc, etc)
&lt;/pre&gt;&lt;br /&gt;
How to verify this works:&lt;br /&gt;
&lt;br /&gt;
1. Before patching - run 'hg serve' from a mercurial repository. It will report the port number and remain active in console.&lt;br /&gt;
2. After patching - 'hg serve' from a mercurial repository will simply exit and say nothing.&lt;br /&gt;
3. netstat, ps -A ux |grep 'hg serve'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;If you want to disable git's `git daemon`:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
This one is probably the easiest of the two: find and 'chmod a-x' (remove execute permissions) from the 'git-daemon' binary on your system - mine is in /usr/libexec/git-core. You can also relocate it somewhere in-accessible. &lt;br /&gt;
&lt;br /&gt;
How to verify this works:&lt;br /&gt;
&lt;br /&gt;
1. Before relocating/removing/chmodding - run 'git daemon' - your console will remain active as if it's listening. (You can try a base dir for a proper daemon setup if you want ...)&lt;br /&gt;
2. After relocating/removing - run 'git daemon', you'll get an error saying there are insufficient privileges, or in the case of relocating/removing you'll see "not a git command".&lt;br /&gt;
3. netstat, ps -A ux |grep 'git daemon'&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-5067791502607608373?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=fDS5yA8HNlA:LY_TEnE54PA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=fDS5yA8HNlA:LY_TEnE54PA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=fDS5yA8HNlA:LY_TEnE54PA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/fDS5yA8HNlA/inherent-risks-of-daemonize-features-in.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/09/inherent-risks-of-daemonize-features-in.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-4744961478403648565</guid><pubDate>Mon, 12 Sep 2011 06:05:00 +0000</pubDate><atom:updated>2011-09-12T01:11:44.767-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Day of the Googmonster - from ... a google blog...</title><description>This is a&lt;a href="http://bergie.iki.fi/blog/embrace_and_extend/"&gt;&lt;b&gt; must read&lt;/b&gt;&lt;/a&gt; for anyone who feels Google can do no evil, putting them on a pedestal.&lt;br /&gt;
If you embrace every little 'tech' knick knack they throw out to the world, or If you're in the percentile with a who's seeing Google turn into a cashgrabber like everyone else - you should read it!&lt;br /&gt;
&lt;br /&gt;
It is by far the most concise rundown of why I have a love-hate relationship with Google. I'm not against a company making some coin; anyone who knows me knows I'm a reasonable capitalist, but I do -not- agree with the direction Google seems to keep poking at.&lt;br /&gt;
&lt;br /&gt;
The pace of change from Google over the past year has been alarming. I'm not talking about the new pretty UI stuff - I'm talking about their &lt;a href="http://tales.itnobody.com/2011/09/google-app-engine-pricing-changes-and.html"&gt;business&lt;/a&gt; and technological tact. &lt;br /&gt;
&lt;br /&gt;
Google business observations:&lt;br /&gt;
&lt;br /&gt;
- Apps angine, dirt cheap - now expensive and complicated for saving money.&lt;br /&gt;
- Labs is being retired (I view this as a strong indicator of their new business stance).&lt;br /&gt;
- "Music beta" - seeing this first hand makes me wonder "what's the catch" - it doesn't feel like Google, it -WILL- change dramatically! (I predict this will either be pulled, or quickly move to a "paid" service - another 'get em hooked' tactic).&lt;br /&gt;
- More aggressive advertisement in every facet - especially GMail.&lt;br /&gt;
- Self driving cars. What don't they want their fingers in?&lt;br /&gt;
- Drop of Android app inventor (Platform training / consultation anyone?)&lt;br /&gt;
&lt;br /&gt;
The above things are all OK with me - they can do what they want with their company!&lt;br /&gt;
&lt;br /&gt;
My problem lies in an old fashioned tactic used by the likes of Microsoft, Netscape, etc to round up users and get them stuck on an exclusive technology (ranging from mundane protocols to programs) - now it's Google bringing Dart and the likes of &lt;a href="http://code.google.com/speed/webp/"&gt;WebP&lt;/a&gt; to the fray. &lt;br /&gt;
&lt;br /&gt;
I don't hate Google - a lot of engineering feats give them their credibility and "trust" from the masses - the world has benefited for sure! However, I trust them much less than I did 2+ years ago... and most certainly don't think that there's no strings attached to these attempts to re-invent (add to) old problems.&lt;br /&gt;
&lt;br /&gt;
Maybe my contention for all of this is just a sign of being winded in "web development"... I'd rather setup key gen + git access on "dev", or work on making MegaCli stomachable than tread water in the emotions of&amp;nbsp; browser and it's dependent technology...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-4744961478403648565?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=3TF9LcvZD44:wrisVtpXgTw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=3TF9LcvZD44:wrisVtpXgTw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=3TF9LcvZD44:wrisVtpXgTw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/3TF9LcvZD44/day-of-googmonster-from-google-blog.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/09/day-of-googmonster-from-google-blog.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-3987635023630336873</guid><pubDate>Mon, 12 Sep 2011 02:22:00 +0000</pubDate><atom:updated>2011-09-21T10:58:37.972-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">security</category><title>Kernel.org, linux.com down, still... also, Git! - Updated!</title><description>With news breaking about the compromised systems for kernel.org, linux.com, which are sites are&lt;i&gt;&amp;nbsp;&lt;/i&gt;"down for maintenance". Completely - and it's been this way for many days now. (Kernel.org since the 28th)&lt;br /&gt;
&lt;br /&gt;
I think it's safe to say the range and scope of the issues are pretty disappointing - the longer these systems stay down the more obvious it is that the damages are probably higher than perceived before; I'm having a hard time saying the administrators of these groups are just &lt;i&gt;this &lt;/i&gt;slow at being cautious. (Especially the 'forward facing &amp;nbsp;' hosts)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(Segway to Git)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It's interesting to note that a LOT of bullets with the security breach are dodged with the parity cryptography used by Git. Pretty cool! (Linus seems to be flirting with the idea of using&amp;nbsp;&lt;a href="http://www.theregister.co.uk/2011/09/06/linus_torvalds_dumps_kernel_for_github/"&gt;Github for latest kernel developement&lt;/a&gt;.)&lt;br /&gt;
&lt;br /&gt;
After keeping an eye on the "&lt;a href="https://wiki.php.net/rfc/dvcs"&gt;choosing a DVCS&lt;/a&gt;" discussions for PHP, a lot of people are in favor of leveraging Git purely because of Github - whereas Mercurial, something we use at M State has been around for a bit less - has a stronger, more mature toolset (Albeit, a bumpy ride for sure!); and, from my standpoint - better cross platform implementation. The speed differences are somewhat minimal.&lt;br /&gt;
&lt;br /&gt;
The allure of Github is the social endeavour; this has fueled a much more active community (compared to Bitbucket, less 'social-ly'). It looks like Git has finished clobbering competitors like Bazaar and Perforce and finally, I'm willing to throw in the towel for my support of Mercurial and say there's little room for traction for Hg.&lt;br /&gt;
&lt;br /&gt;
The programming world is a lot of work to follow =\&lt;br /&gt;
&lt;br /&gt;
(&lt;b&gt;Also&lt;/b&gt;: It's September 11th - take a moment to reflect - cast some sympathy and reverence for the lives lost! )&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPDATE: 2011-09-21-&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
linux.com has been updated and now states that they will be "restoring service shortly" - different from the original FAQ page they had up about the breach.&lt;br /&gt;
&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
I'd expect kernel.org to follow.&lt;br /&gt;
&lt;br /&gt;
After over half a month (almost a month for kernel.org) of being down with poorly communicated "maintenance" pages. I hope there's a fallout for the culprits - and I hope the maintainers of those domains take a more serious approach to how they handle this situation next time...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-3987635023630336873?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=_L3hmudV3BY:eAGF8jQBLl4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=_L3hmudV3BY:eAGF8jQBLl4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=_L3hmudV3BY:eAGF8jQBLl4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/_L3hmudV3BY/kernelorg-linuxcom-down-still.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/09/kernelorg-linuxcom-down-still.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-1040799516089781997</guid><pubDate>Fri, 09 Sep 2011 22:34:00 +0000</pubDate><atom:updated>2011-09-09T17:34:03.421-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Google App Engine - Pricing changes and another prediction</title><description>I'm not sure what the Goog'monster is thinking with so many dramatic changes over the last year. Most of them have been good - but the loss of labs, app inventor and the pricing hikes for the Google App Engine platform is really rising some eyebrows for me - It seems they're tightening their belt and distancing themselves from individuals and more toward bigger dollars.&lt;br /&gt;
&lt;br /&gt;
Anywho, anyone unhappy with the pricing changes will enjoy reading what I will call the&lt;a href="https://groups.google.com/forum/#%21msg/google-appengine/obfGjbIkOTI/Qji2eUm0cO4J"&gt; "GAE reaming" thread.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Is it a matter of time before they trickle pricing for Music and Docs? Starting to wonder ...&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-1040799516089781997?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=D6V7ii9EXvk:aE1IivcEwQQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=D6V7ii9EXvk:aE1IivcEwQQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=D6V7ii9EXvk:aE1IivcEwQQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/D6V7ii9EXvk/google-app-engine-pricing-changes-and.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/09/google-app-engine-pricing-changes-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-3892556741751625044</guid><pubDate>Thu, 25 Aug 2011 05:25:00 +0000</pubDate><atom:updated>2011-12-08T17:01:55.333-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">purdy</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>System admin 'helper': Zebra stripe log / console output</title><description>Looking at an ASCII data table can be difficult - so to start a small trip into Perl programming - I tossed together a simple Perl script, with no module requirements - zebra.pl as I call it; adds a nice touch to say `vmstat` or viewing something like the interrupts on a multicore box. It's super simple and done in the nature of &lt;a href="http://code.google.com/p/aspersa/"&gt;Aspersa&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
It doesn't work 100% like I want - I would have liked it to take an $ARGV; to do that it seems like I'd have to create a dependency with a module (something like GetOpts) - so I decided one can simply modify the script to change how many X rows are striped.&lt;br /&gt;
&lt;br /&gt;
You can&lt;a href="http://www.itnobody.com/bash/zebra"&gt; fetch it here. &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rxLPUGF-v9A/TlXcF1_KzqI/AAAAAAAAAh8/5Mmn0DDeg34/s1600/zebra-1.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-rxLPUGF-v9A/TlXcF1_KzqI/AAAAAAAAAh8/5Mmn0DDeg34/s1600/zebra-1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-3892556741751625044?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=QTwFk5jkg6g:4MmqfMUK0mM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=QTwFk5jkg6g:4MmqfMUK0mM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=QTwFk5jkg6g:4MmqfMUK0mM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/QTwFk5jkg6g/system-admin-helper-zebra-stripe-log.html</link><author>noreply@blogger.com (Justin Rovang)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-rxLPUGF-v9A/TlXcF1_KzqI/AAAAAAAAAh8/5Mmn0DDeg34/s72-c/zebra-1.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/08/system-admin-helper-zebra-stripe-log.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-2758214492665981030</guid><pubDate>Tue, 09 Aug 2011 16:49:00 +0000</pubDate><atom:updated>2011-08-09T16:21:35.890-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">servers</category><title>On coining terms: Kiloreq, Megareq, Gigareq, Terareq</title><description>I'm inventing these terms. You heard them here first!&lt;br /&gt;
&lt;br /&gt;
Ok so the idea goes like this:&lt;br /&gt;
We use kilo(bit/byte, etc) as measurements of rate, and size - even weight (kinda).&lt;br /&gt;
&lt;br /&gt;
I thought it'd be fun to come up with another terminology that's right in line with the nature of these units of measurement geared toward server load: "R" for request - prexed accordingly: Kiloreq, Megareq, Gigareq, etc.&lt;br /&gt;
&lt;br /&gt;
So for example, if you get 1000 requests a second, you can say "I get 1KR/sec", if you have 500 request per second, instead of '500 rps', use the standardized "KR" (Kiloreq) suffix: 0.5KR/sec&lt;br /&gt;
&lt;br /&gt;
How many requests did foo Apache server handle this month?&lt;br /&gt;
About 3MR. 3 mega reqs. (3MR * 1000KR * 1000R = 3,000,000 requests).&lt;br /&gt;
&lt;br /&gt;
Or how about for the year? (Assuming a flat rate of 300MR over 12 months)&lt;br /&gt;
3.6GR. Gigareqs!&lt;br /&gt;
&lt;br /&gt;
Far fetched? Yes. But I plan on using them in my day-to-day language to try and make them stick :) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-2758214492665981030?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=mf7fjhooObM:NN9MYTsl43A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=mf7fjhooObM:NN9MYTsl43A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=mf7fjhooObM:NN9MYTsl43A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/mf7fjhooObM/on-coining-terms-kiloreq-megareq.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/08/on-coining-terms-kiloreq-megareq.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-5099594660507061404</guid><pubDate>Fri, 05 Aug 2011 04:28:00 +0000</pubDate><atom:updated>2011-08-04T23:28:52.977-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">netflix</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Netflix is run by monkeys!</title><description>An entertaining read for the HA operations for netflix - a good sense of humor and a very cool, hardcore philosophy for testing! &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://techblog.netflix.com/2011/07/netflix-simian-army.html"&gt;http://techblog.netflix.com/2011/07/netflix-simian-army.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It's nice to see Netflix stepping up their involvement in the technical community even more; with the Netflix prize and their blog and API feedback - I hope they become even more successful because of these investments.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-5099594660507061404?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=PsXIXixckdA:UT6oiLXe2Qk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=PsXIXixckdA:UT6oiLXe2Qk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=PsXIXixckdA:UT6oiLXe2Qk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/PsXIXixckdA/netflix-is-run-by-monkeys.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/08/netflix-is-run-by-monkeys.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-7029910349255185966</guid><pubDate>Fri, 05 Aug 2011 03:32:00 +0000</pubDate><atom:updated>2011-08-04T22:32:45.688-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>MySQL - max_allowed_packet - what is going on?</title><description>So there's enough noise in the MySQL community about what's covered well &lt;a href="https://www.facebook.com/note.php?note_id=10150236650815933"&gt;here (https://www.facebook.com/note.php?note_id=10150236650815933)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Unfortuantely the bug is private for the time being; in my conversation with others, the general premise seems to be what good does max_allowed_packet really do?&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
First off, I'd like to point out what seems to be what I hope is heading for deprecation - otherwise it just feels a bit sloppy; the &lt;i&gt;default&lt;/i&gt; max_allowed_packet for the MySQL client is 1GB. (AKA: Maximum).&lt;br /&gt;
&lt;br /&gt;
As the FB&amp;nbsp; post recognizes, there's some ambiguity to how this setting is even enforced in the first place, especially when considering a master-&amp;gt;slave configuration (Why does replication even have to follow that rule? Maybe replication clients can have a hard-coded packet to the maximum to get over this?)&lt;br /&gt;
&lt;br /&gt;
I'd propose one of the two:&lt;br /&gt;
&lt;br /&gt;
1. Enforce max_allowed_packet at the server - negotiate a loose communication with the client, where the client will obtain the server's value and take it for it's own.&lt;br /&gt;
&lt;br /&gt;
2. Better yet, allow it to be set on a per user basis, following #1.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-7029910349255185966?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=dfKYLVWIzbg:Io9dVUhx07w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=dfKYLVWIzbg:Io9dVUhx07w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=dfKYLVWIzbg:Io9dVUhx07w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/dfKYLVWIzbg/mysql-maxallowedpacket-what-is-going-on.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/08/mysql-maxallowedpacket-what-is-going-on.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-4543335050366143514</guid><pubDate>Tue, 26 Jul 2011 18:32:00 +0000</pubDate><atom:updated>2011-07-26T13:37:28.744-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mysql</category><title>mk-heartbeat - sample conf file</title><description>There's not a whole lot (if any) documentation on what the file for the --config parameter for &lt;a href="http://www.maatkit.org/"&gt;Maatkit&lt;/a&gt;'s &lt;tt&gt;mk-heartbeat&lt;/tt&gt; should look like.&lt;br /&gt;
&lt;br /&gt;
If you quickly pilfer through the &lt;a href="http://code.google.com/p/maatkit/source/browse/releases/2010-07/mk-heartbeat/mk-heartbeat#1589"&gt;source code,&lt;/a&gt; what it's looking for becomes pretty straight forward (It'd be nice to have this in the documentation, however).&lt;br /&gt;
&lt;br /&gt;
The config files are newline delimited and resemble a my.cnf file using 'param=value' notation.&lt;br /&gt;
&lt;br /&gt;
E.g.:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Sample config&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: shell;"&gt;dev:~/scripts# cat heartbeat-xxx-mysql.conf
host=my.host.name
pass=password
user=username
database=maatkit
&lt;/pre&gt;&lt;br /&gt;
So this would be launched using something like:&lt;br /&gt;
&lt;pre class="brush: shell;"&gt;dev:~/scripts# mk-heartbeat --config /path/to/heartbeat-xxx-mysql.conf --update --daemonize&lt;/pre&gt;&lt;br /&gt;
In my book, this is essential behavior to avoid having your password hang out on the output from &lt;tt&gt;ps&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: shell;"&gt;dev:~/scripts# ps -A ux |grep mk
root     11612  0.0  0.1  12756  6384 ?        Ss   13:27   0:00 perl /usr/bin/mk-heartbeat --config heartbeat-xxx-mysql.conf --daemonize --update
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-4543335050366143514?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=nfu-I5mqTe4:2kTY9GdDQ5Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=nfu-I5mqTe4:2kTY9GdDQ5Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=nfu-I5mqTe4:2kTY9GdDQ5Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/nfu-I5mqTe4/mk-heartbeat-sample-conf-file.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/07/mk-heartbeat-sample-conf-file.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-2459274508110873214</guid><pubDate>Fri, 22 Jul 2011 16:19:00 +0000</pubDate><atom:updated>2011-07-22T11:19:46.936-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>All of your PHP code is going to look silly! PHP 5.4, here we come!</title><description>No, not as in 5.4 will make you write stupid code. As in it will make all pre-5.4 attempts to maximize re-use through crazy inheritance chains look ridiculous compared to what traits will deliver.&lt;br /&gt;
&lt;br /&gt;
I already have a sense of dread of being a year into PHP traits looking at not-too-old code; how painful it will be to look back at what kind of crap we put up with!&lt;br /&gt;
&lt;br /&gt;
This is going to be awesome, and I for one, welcome our new trait supporting overlords.&lt;br /&gt;
&lt;br /&gt;
Now .. WHERE ARE MY RETURN TYPE HINTS!&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
I recently had a discussion with a peer and we pretty much summarized what we &lt;i&gt;wish&lt;/i&gt; the stance on types for PHP will become something like this:&lt;br /&gt;
&lt;br /&gt;
PHP is a loosely typed language, as it matures in OOP, it must &lt;i&gt;support&lt;/i&gt; more strict typing features (including generics: string, int, float, bool, etc). Emphasis on support, not enforce.&lt;br /&gt;
&lt;br /&gt;
Those who want to leverage the dynamics of loosely typed programming can go for it, there's a place for everyone here to do what they want.&lt;br /&gt;
&lt;br /&gt;
It's the hippy thing to do! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
P.S.: Here's a fun &lt;a href="http://blog.roshambo.org/one-way-php-may-capitalize-on-its-popularity/"&gt;conjecture about the php.net domain name&lt;/a&gt; and a get-rich-quick scheme!&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-2459274508110873214?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=rOytT_PA5Js:y4jgeT3CJSY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=rOytT_PA5Js:y4jgeT3CJSY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=rOytT_PA5Js:y4jgeT3CJSY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/rOytT_PA5Js/all-of-your-php-code-is-going-to-look.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/07/all-of-your-php-code-is-going-to-look.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-4520553762838280593</guid><pubDate>Tue, 19 Jul 2011 14:46:00 +0000</pubDate><atom:updated>2011-07-19T09:46:19.317-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">databases</category><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Nay say for ext2/ext3, seemingly ext4 for MySQL servers</title><description>&amp;nbsp;Basically I felt compelled to make a note regarding what filesystem to evaluate when you are performing a MySQL install. There seems to be a lot of reasons &lt;i&gt;NOT&lt;/i&gt; to use the ext filesystems, and instead use XFS..&lt;br /&gt;
&lt;br /&gt;
This is a straight out quote from a&lt;a href="https://www.facebook.com/note.php?note_id=10150210901610933"&gt; MySQL at Facebook&lt;/a&gt; blog entry:&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;ext-2 and ext-3 lock a per-inode mutex for the duration of a write. This  means that ext-2 and ext-3 do not allow concurrent writes to a file and  that can prevent you from getting the write throughput you expect when  you stripe a file over several disks with RAID. XFS does not do this  which is one of the reasons many people prefer XFS for InnoDB.&lt;/i&gt;&lt;/blockquote&gt;More on IO concurrency from&amp;nbsp; MySQL big name &lt;a href="http://dom.as/2008/08/11/notes-from-land-of-io/"&gt;Domas Mituzas&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;O_DIRECT serializes writes to a file on ext2, ext3, jfs, so I got at most 200-250w/s.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;xfs allows parallel (and out-of-order, if that matters) DIO, so I  got 1500-2700w/s (depending on file size – seek time changes.. :) of  random I/O without write-behind caching. There are few outstanding bugs  that lock this down back to 250w/s &lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&amp;nbsp;A&lt;a href="http://article.gmane.org/gmane.comp.file-systems.ext4/17697"&gt; patch for ext4 was created&lt;/a&gt;, but it doesn't appear that it made it in; it seems to yield minimal benefit. &lt;br /&gt;
&lt;br /&gt;
And some other &lt;a href="http://www.mysqlperformanceblog.com/2009/01/21/beware-ext3-and-sync-binlog-do-not-play-well-together/"&gt;performance and risk &lt;/a&gt;observations involved with the most wildly used ext3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you're looking to install or upgrade a MySQL server, it may very well be worth the time investment to research the depths of what filesystem you select, since it has just as much to do with the database performance as the MySQL configuration itself!&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-4520553762838280593?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=yVA7UQIO1Rw:qLKfDGQq3U8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=yVA7UQIO1Rw:qLKfDGQq3U8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=yVA7UQIO1Rw:qLKfDGQq3U8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/yVA7UQIO1Rw/nay-say-for-ext2ext3-seemingly-ext4-for.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/07/nay-say-for-ext2ext3-seemingly-ext4-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-4452082871323172742</guid><pubDate>Mon, 18 Jul 2011 21:03:00 +0000</pubDate><atom:updated>2011-07-18T16:04:24.873-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">databases</category><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">servers</category><title>Worthy of distribution: Reset root MySQL password</title><description>Oh snap! Need to reset your mysql root/admin (or any?) MySQL password? Well, you'll need root and control over MySQLd to some extent, but &lt;a href="http://mysqlpreacher.com/wordpress/2011/03/recovering-a-mysql-root-password-three-solutions/"&gt;this is &lt;/a&gt;worthy of a rainy-day bookmark indeed: &lt;a href="http://mysqlpreacher.com/wordpress/2011/03/recovering-a-mysql-root-password-three-solutions/"&gt;http://mysqlpreacher.com/wordpress/2011/03/recovering-a-mysql-root-password-three-solutions/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-4452082871323172742?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=raYC2bjdxN8:4p6RcIspa6M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=raYC2bjdxN8:4p6RcIspa6M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=raYC2bjdxN8:4p6RcIspa6M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/raYC2bjdxN8/worthy-of-distribution-reset-root-mysql.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/07/worthy-of-distribution-reset-root-mysql.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-5550488277595244733</guid><pubDate>Thu, 30 Jun 2011 03:39:00 +0000</pubDate><atom:updated>2011-06-29T22:40:48.149-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">zend studio</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">phpunit</category><title>Upgrading to PHPUnit 3.5 on Zend Studio</title><description>Here's a quick clip I made to show those who hankering to have an updated PHPUnit plugin for Zend Studio.&lt;br /&gt;
&lt;br /&gt;
I hope this video is obsoleted soon so others don't have to endure the annoyance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;object height="390" width="640"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/Tlzcqvd0po8?version=3&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/Tlzcqvd0po8?version=3&amp;amp;hl=en_US" type="application/x-shockwave-flash" width="640" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;&lt;b&gt;&lt;a href="http://www.youtube.com/watch?v=Tlzcqvd0po8"&gt;View in HD!&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-5550488277595244733?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=SD9J7dl1bvM:jtwoZccqqg4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=SD9J7dl1bvM:jtwoZccqqg4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=SD9J7dl1bvM:jtwoZccqqg4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/SD9J7dl1bvM/upgrading-to-phpunit-35-on-zend-studio.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/06/upgrading-to-phpunit-35-on-zend-studio.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-2680050585613496679</guid><pubDate>Mon, 27 Jun 2011 14:51:00 +0000</pubDate><atom:updated>2011-06-27T09:54:12.850-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">testing</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Worthy of distribution: PHPUnit's dbunit testing rundown</title><description>This is by far the most complete and best example of a rundown of database testing using &lt;a href="http://phpun.it/"&gt;PHPUnit&lt;/a&gt;'s "dbunit" extension. It seems it's difficult to track down a whole rundown on the more technical aspects of 'getting into it'.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;h1&gt;&lt;a href="http://www.beberlei.de/dbunit.html"&gt;&lt;span style="font-size: large;"&gt;The Ultimate Guide to Database-Testing with PHPUnit&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/li&gt;
&lt;li&gt;&lt;h4&gt;Author: Benjamin Eberlei (kontakt@beberlei.de)&lt;/h4&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.beberlei.de/dbunit.html"&gt;http://www.beberlei.de/dbunit.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-2680050585613496679?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=P-YgGY_qBGk:ja1T1Zmtgjs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=P-YgGY_qBGk:ja1T1Zmtgjs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=P-YgGY_qBGk:ja1T1Zmtgjs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/P-YgGY_qBGk/worthy-of-distribution-phpunits-dbunit.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/06/worthy-of-distribution-phpunits-dbunit.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4718463370485858599.post-3664780983383220559</guid><pubDate>Tue, 07 Jun 2011 04:38:00 +0000</pubDate><atom:updated>2011-06-06T23:42:12.483-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Interfaces in PHP are worthless. Blasphemy? yes.</title><description>What is the purpose of an interface? One would simply say "they're a contract, etc.", and you'd be right.&lt;br /&gt;
&lt;br /&gt;
Long story short, all PHP interfaces do - is enforce:&lt;br /&gt;
&lt;br /&gt;
- What methods are implemented&lt;br /&gt;
- What their signatures look like&lt;br /&gt;
&lt;br /&gt;
However there's one HUGE (in my book) fundamental lack: RETURN TYPES.&lt;br /&gt;
&lt;br /&gt;
Thus, I will call interfaces 'half a contract'.&lt;br /&gt;
&lt;br /&gt;
The PHP developers and contributors often examine other 'big brother' languages to determine some direction for the PHP OO offerings. I think this is where this half-assed implementation came from - an aspiration of the language trying too hard to implement features of strongly typed langauges.&lt;br /&gt;
&lt;br /&gt;
Need examples?&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Interface_(Java)"&gt;http://en.wikipedia.org/wiki/Interface_(Java)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/64syzecx.aspx"&gt;http://msdn.microsoft.com/en-us/library/64syzecx.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
PHP misses a very important component of the 'contract', return types. In Java / C# &amp;nbsp;you can define your methods as such:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;public &lt;b&gt;string&lt;/b&gt; foo() {}&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Now, if you're willing to shell out for the honor system of implementation or to add some spice to your inductive reasoning - go for it. For what little an interface really does for you, it's not worth the added complexity and lack of piece of mind interfaces in PHP bring to the table.&lt;br /&gt;
&lt;br /&gt;
I believe that in the current state of PHP, developers will end up implementing additional checks and balances to ensure interface implementors are still behaving correctly.&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;&lt;img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://feeds.feedburner.com/TalesOfAnItNobody" rel="alternate" type="application/rss+xml"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4718463370485858599-3664780983383220559?l=tales.itnobody.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=ShfTkLtKrJw:uj_f_2Cgli8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=ShfTkLtKrJw:uj_f_2Cgli8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?a=ShfTkLtKrJw:uj_f_2Cgli8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TalesOfAnItNobody?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/TalesOfAnItNobody/~3/ShfTkLtKrJw/interfaces-in-php-are-worthless.html</link><author>noreply@blogger.com (Justin Rovang)</author><thr:total>0</thr:total><feedburner:origLink>http://tales.itnobody.com/2011/06/interfaces-in-php-are-worthless.html</feedburner:origLink></item></channel></rss>

