<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dannyman.toldme.com &#187; Technical</title>
	<atom:link href="http://dannyman.toldme.com/category/technical/feed/" rel="self" type="application/rss+xml" />
	<link>http://dannyman.toldme.com</link>
	<description>Interesting bits of information and editorial, evolving online since 1995.</description>
	<lastBuildDate>Sat, 28 Jan 2012 05:40:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Notes: Make Ubuntu GUI Less Annoying</title>
		<link>http://dannyman.toldme.com/2011/12/07/ccsm-ubuntu-gui-tweaks/</link>
		<comments>http://dannyman.toldme.com/2011/12/07/ccsm-ubuntu-gui-tweaks/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 21:21:28 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6316</guid>
		<description><![CDATA[If anyone knows how to reconcile Focus Follows Mouse with "menu bar at the top of the screen" I would love to hear it!  Or if you know how to configure the pager to something besides 2x2 ...]]></description>
			<content:encoded><![CDATA[<p>First, install <code>ccsm</code>.</p>
<p>Terminal windows resize themselves stupidly when changing font size.  I don&#8217;t know how to fix that, but in the CompizConfig Settings Manager, I can enable <strong>Resize Info </strong> to overlay the dimensions of any window as I resize it.</p>
<p>Often, when dragging a window around, it tries to go full-screen on me.  This is obnoxious!  Just disable <strong>Grid</strong> in CCSM.</p>
<p>If anyone knows how to reconcile Focus Follows Mouse with &#8220;menu bar at the top of the screen&#8221; I would love to hear it!  Or if you know how to configure the pager to something besides 2&#215;2 &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/12/07/ccsm-ubuntu-gui-tweaks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JIRA: Require User Time Tracking</title>
		<link>http://dannyman.toldme.com/2011/12/01/jira-jython-validator-enforce-time-spent/</link>
		<comments>http://dannyman.toldme.com/2011/12/01/jira-jython-validator-enforce-time-spent/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 01:23:40 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[JIRA]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6302</guid>
		<description><![CDATA[Time tracking in <a href="https://jira.ironport.com/">JIRA</a> is a nice feature, but we have to get people to do it.]]></description>
			<content:encoded><![CDATA[<p>Time tracking in <a href="https://jira.ironport.com/">JIRA</a> is a nice feature, but we have to get people to do it.  My <a href="http://confluence.atlassian.com/display/JIRA/Configuring+Time+Tracking?focusedCommentId=269980718&#comment-269980718">initial attempts to enforce time tracking</a> ran into trouble, but I was able to develop a <a href="http://www.jython.org/">Jython</a> Validator to hook on to transitions to the Resolved state.  Now it is mandatory for our users to log time worked before they can resolve an issue:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># -*- coding: UTF-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">import</span> com.<span style="color: black;">atlassian</span>.<span style="color: black;">jira</span>.<span style="color: black;">issue</span>.<span style="color: black;">worklog</span>.<span style="color: black;">Worklog</span>
<span style="color: #ff7700;font-weight:bold;">from</span> com.<span style="color: black;">atlassian</span>.<span style="color: black;">jira</span> <span style="color: #ff7700;font-weight:bold;">import</span> ComponentManager
&nbsp;
<span style="color: #808080; font-style: italic;"># Time Already Logged</span>
timespent = issue.<span style="color: black;">getTimeSpent</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># Time Logged via current screen</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
    timelogged = <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>issue.<span style="color: black;">getModifiedFields</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'worklog'</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
    timelogged = <span style="color: #008000;">False</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Duplicate Issue?  It is as good as logged!</span>
resolution = issue.<span style="color: black;">getResolution</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> resolution<span style="color: black;">&#91;</span><span style="color: #483d8b;">'name'</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">&quot;Duplicate&quot;</span>:
    timelogged = <span style="color: #008000;">True</span>
<span style="color: #ff7700;font-weight:bold;">if</span> resolution<span style="color: black;">&#91;</span><span style="color: #483d8b;">'name'</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">&quot;Self Corrected&quot;</span>:
    timelogged = <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Nagios likes to close tickets, but doesn't get paid</span>
<span style="color: #dc143c;">user</span> = ComponentManager.<span style="color: black;">getInstance</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">getJiraAuthenticationContext</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">getUser</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">user</span>.<span style="color: black;">getName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;nagios&quot;</span>:
    timelogged = <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> timespent <span style="color: #66cc66;">&lt;</span> = <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> timelogged == <span style="color: #008000;">False</span>:
    result = <span style="color: #008000;">False</span>
    description = <span style="color: #483d8b;">&quot;Please log the time you spent on this ticket.&quot;</span></pre></div></div>

<p><b>2012-01-24 Update:</b> the script now contains additional logic, which exempts the nagios user from enforcement and allows resolution of duplicated or self-correcting issues which may not require time tracking.  Hopefully this example is useful to somebody.</pre>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/12/01/jira-jython-validator-enforce-time-spent/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Is CloudFlare Saving Me Money?</title>
		<link>http://dannyman.toldme.com/2011/11/23/is-cloudflare-saving-me-money/</link>
		<comments>http://dannyman.toldme.com/2011/11/23/is-cloudflare-saving-me-money/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 22:09:22 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Sundry]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testimonials]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6265</guid>
		<description><![CDATA[I’m skeptical that they are saving me as much as they claim to be, but for a free service to speed up my web site and save me even a little money . . . that is a good deal in my book!]]></description>
			<content:encoded><![CDATA[<p>I was poking around my <a href="https://www.cloudflare.com/analytics">CloudFlare Control Panel</a>, and pulled up stats for the past month, from Oct 11 to Nov 11.  It says it had blocked a bunch of attacks on my site, and consequently saved me over 5GB in bandwidth.</p>
<div id="attachment_6266" class="wp-caption aligncenter" style="width: 610px"><a href="http://dannyman.toldme.com/2011/11/23/is-cloudflare-saving-me-money/cloudblaze/" rel="attachment wp-att-6266"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/11/cloudblaze-600x306.png" alt="5.1GB saved!?" title="cloudblaze" width="600" height="306" class="size-large wp-image-6266" /></a><p class="wp-caption-text">I said to myself, &quot;I pay for bandwidth!  Maybe this free service is saving me money?!&quot;</p></div>
<p>&#8220;Really,&#8221; I said, &#8220;I pay for bandwidth, so if CloudFlare is saving me bandwidth, it is saving me money!&#8221;</p>
<p>But 5GB seemed kind of high.  So, I checked my invoices from <a href="http://www.rackspace.com/">RackSpace</a>.  Here is the outbound bandwidth I have been charged for this year:</p>
<pre>
Invoice Date   Bandwidth Out
<b>11/11          4.660 GB</b>
10/11          4.972 GB
09/11          7.534 GB
08/11          5.467 GB
07/11          6.402 GB
06/11          5.978 GB
05/11          4.694 GB
04/11          6.294 GB
03/11          6.254 GB
02/11          9.652 GB
01/11          7.117 GB
</pre>
<p>RackSpace charges me on the 11th of the month, and, conveniently enough, <a href="/2011/10/11/cloudflare-free-cdn/">I started using CloudFlare around October 11th</a>.  The highlighted line above is my first month on CloudFlare.  It is my lowest number of the year, and  it is conceivable that I could have totaled 9.5 GB in October since I pushed more than that in February.  I&#8217;m skeptical that they are saving me as much as they claim to be, but for a free service to speed up my web site and save me even a little money . . . that is a good deal in my book!</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/11/23/is-cloudflare-saving-me-money/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Reader Interface: -1</title>
		<link>http://dannyman.toldme.com/2011/11/01/google-reader-interface-1/</link>
		<comments>http://dannyman.toldme.com/2011/11/01/google-reader-interface-1/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 20:03:03 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[About Me]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testimonials]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6164</guid>
		<description><![CDATA[The OS claims 24 pixels, the web browser claims 90 pixels, and <i>the web application claims 250 pixels</i>.

Squinting into a tiny pane to read news makes me angry.  Google, you can do way way better than this!]]></description>
			<content:encoded><![CDATA[<p>Note to modern web designers: since the displays are becoming wide and short, please do not squander vertical screen space.  Here&#8217;s a good example of what not to do:</p>
<p style="text-align: center"><a href="http://dannyman.toldme.com/2011/11/01/google-reader-interface-1/ugly-reader/" rel="attachment wp-att-6165"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/11/ugly-reader-600x432.png" alt="" title="ugly-reader" width="600" height="432" class="aligncenter size-large wp-image-6165" /></a></p>
<p>Viewed <a href="http://dannyman.toldme.com/wp-content/uploads/2011/11/ugly-reader.png">full size</a>, you see a window that is 705 pixels tall.  The OS claims 24 pixels, the web browser claims 90 pixels, and <strong>the web application claims 250 pixels</strong>.  So, by the time you hit the actual content, <strong>50% of the window has been wasted!</strong></p>
<p>Squinting into a tiny pane to read news makes me angry.  Google, you can do way way better than this!</p>
<p>Hotpatch: Install <a hreef="https://chrome.google.com/webstore/detail/makmndpcndgheboeifhhgehleeabhoab">New Google Reader Rectifier</a> for Chrome, which relies on you bringing up the left pane.  (Thanks, <a href="https://plus.google.com/u/0/105963723653795498499/posts">Mike</a>!)</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/11/01/google-reader-interface-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FizzBuzz</title>
		<link>http://dannyman.toldme.com/2011/10/31/fizzbuzz/</link>
		<comments>http://dannyman.toldme.com/2011/10/31/fizzbuzz/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 02:19:26 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[About Me]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6156</guid>
		<description><![CDATA[I remember when a CTO explained that a SysAdmin should have at least mediocre programming skills.  So, I have always aspired to have at least mediocre programming skills.]]></description>
			<content:encoded><![CDATA[<p>I was enjoying <a href="http://www.kalzumeus.com/2011/10/28/dont-call-yourself-a-programmer/">Patrick Kalzumeus&#8217; career advice to computer programmers</a>, which in turn linked to an article that states that <a href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html">only 1:200 applicants for computer programming jobs can write a simple FizzBuzz program</a>.  FizzBuzz must be something tricky like MapReduce!  Not quite:</p>
<blockquote><p>Write a program that prints the numbers from 1 to 100. But for multiples of three print &#8220;Fizz&#8221; instead of the number and for the multiples of five print &#8220;Buzz&#8221;. For numbers which are multiples of both three and five print &#8220;FizzBuzz&#8221;.</p>
<p>Most good programmers should be able to write out on paper a program which does this in under a couple of minutes. Want to know something scary? <strong>The majority of comp sci graduates can&#8217;t. I&#8217;ve also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.</strong></p></blockquote>
<p>Huh?  I remember when a CTO explained that a SysAdmin should have at least mediocre programming skills.  So, I have always aspired to have at least mediocre programming skills.  (More important, SysAdmins are extremely well-served when they can write programs to make their work easier!)</p>
<p>I haven&#8217;t written C code in a long while, but I fired up vim and had this compiled and running in a few minutes:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio .h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> fb<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        fb <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> i <span style="color: #339933;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Fizz&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> fb<span style="color: #339933;">++;</span> <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> i <span style="color: #339933;">%</span> <span style="color: #0000dd;">5</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Buzz&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> fb<span style="color: #339933;">++;</span> <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> fb <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>I recall at least one interview with Google and probably other companies where I have done something like this on a white board, with the interviewer challenging me with compiler-like errors to help me repair syntax errors.</p>
<p>Patrick&#8217;s point is that when you work with excellent people, you see your skills in that context, and will tend to be unduly modest.  But when you step back a bit and look at your skills in the context of the industry as a whole, you may well be among the best on the market.</p>
<p>Here in the Silicon Valley, there are plenty of tech jobs, but there is also plenty of competition, which means that the folks you come to associate with will tend to be toward the top of their field.</p>
<p>Patrick&#8217;s further point would be that you need to take your skills, and develop the capacity to convey the value that those skills can bring to an organization.</stdio></pre>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/31/fizzbuzz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Birth of the Internet!</title>
		<link>http://dannyman.toldme.com/2011/10/28/birth-of-the-internet/</link>
		<comments>http://dannyman.toldme.com/2011/10/28/birth-of-the-internet/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 21:23:05 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Biography]]></category>
		<category><![CDATA[News and Reaction]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6142</guid>
		<description><![CDATA[First word was <strong>LO</strong> . . .]]></description>
			<content:encoded><![CDATA[<p>Leonard Kleinrock tells the story of the Internet&#8217;s birth.  First word was <strong>LO</strong>:</p>
<p style="text-align: center"><iframe width="640" height="480" src="http://www.youtube.com/embed/vuiBTJZfeo8" frameborder="0" allowfullscreen></iframe></p>
<p>And then, he shows us the world&#8217;s first router, which they were going to throw out:</p>
<p style="text-align: center"><iframe width="640" height="480" src="http://www.youtube.com/embed/yU9oMOcRsuE" frameborder="0" allowfullscreen></iframe></p>
<p>My first experience of the Internet was a 1200 baud dialup connection to a USENET host that connected upstream twice a day at 2400 baud.  That would have been around 1992 or 1993.  (I was a broke highschool kid who couldn&#8217;t afford the $30/mo+ for a proper Internet connection.)  My first email address was <strong>dannyman@netwrk21.chi.il.us</strong>, and I lost that address when my network uplink failed to pay his phone bill.  Oh well!</p>
<p>When I started <a href="http://www.uiuc.edu/">college</a> in January, 1995, and had access to <a href="http://www.housing.illinois.edu/Future/Technology/Computer%20Labs/Locations%20and%20Staffing.aspx">labs</a> and <a href="http://www.cso.uiuc.edu/computerlabs/">labs</a> and <a href="http://ews.uiuc.edu">labs</a> of computers directly connected via Ethernet, with <a href="http://www.ncsa.illinois.edu/Projects/mosaic.html">Mosaic</a> and <a href="http://en.wikipedia.org/wiki/Netscape_(web_browser)">Netscape</a> installed, it was like I had found my Nerd Nirvana!  It only got better when I took a C programming course on the <a href="http://en.wikipedia.org/wiki/SPARCstation">Sun workstations</a> in the basement of the <a href="http://en.wikipedia.org/wiki/UIUC_Engineering_Campus#Digital_Computer_Laboratory">DCL</a> . . .</p>
<p>Hat Tip: <a href="http://www.rackspace.com/blog/?p=2630">Rackspace</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/28/birth-of-the-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Electronic Recipe Rant</title>
		<link>http://dannyman.toldme.com/2011/10/28/electronic-recipe-rant/</link>
		<comments>http://dannyman.toldme.com/2011/10/28/electronic-recipe-rant/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 00:12:43 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[About Me]]></category>
		<category><![CDATA[Recipes]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testimonials]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6138</guid>
		<description><![CDATA[A paper cookbook in electronic form?  Dull!  Let’s leverage information technology to really make it easy for the people to cook healthy, inexpensive meals at home!]]></description>
			<content:encoded><![CDATA[<p>A friend posted a link about <a href="http://www.inkling.com/pro-chef/">some iPad App that will show you recipes</a>.  My reaction was one of being condescendingly underwhelmed, and here&#8217;s the gist of what I&#8217;d really like to see in a &#8220;cookbook app&#8221;:</p>
<blockquote><p>&#8220;Will it plan a week&#8217;s menus based on seasonal ingredients and give you a shopping list? Because that&#8217;s the fucking time-consuming part the computers need to fix.</p>
<p>Any clown can convert a menu book to an App . . . and any clown can find a recipe, drive to the store, spend 45 minutes trying to find some ingredient they don&#8217;t know about which is out of season, pay a bunch of money, get home, if they still have the energy maybe cook something sorta edible . . .</p>
<p>. . . but this being the 21st century, an electronic cookbook ought to be able to suggest recipes for you based on the ingredients you have ready access to.  (In your pantry, in your growing region, partner with a supermarket&#8230;) I have found a website that does a mediocre job of this.  This thing is begging to be invented.</p>
<p>Anyway, what I&#8217;m saying is&#8211;cookbooks in an app&#8211;that&#8217;s like lets transcribe 15th century technology into silicon.  I say hell no, with all this information technology let&#8217;s leverage the information to really make it easy for the people to cook healthy, inexpensive meals at home.  THAT is the revolution that will make us all better off.&#8221;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/28/electronic-recipe-rant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript Hack: Hide an Element on a Page</title>
		<link>http://dannyman.toldme.com/2011/10/25/javascript-hack-hide-an-element-on-a-page/</link>
		<comments>http://dannyman.toldme.com/2011/10/25/javascript-hack-hide-an-element-on-a-page/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 18:53:22 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[JIRA]]></category>
		<category><![CDATA[Sundry]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6127</guid>
		<description><![CDATA[<a href="http://www.atlassian.com/software/jira/">JIRA</a> is an issue tracking system that is really flexible, but sometimes presents irritatingly arbitrary limitations.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.atlassian.com/software/jira/">JIRA</a> is an issue tracking system that is really flexible, but sometimes presents irritatingly arbitrary limitations.</p>
<p>I have been working on a screen which uses multiple tabs.  The tabs are there to make it easier for the user to find the fields they want to edit, without scrolling through a single long, complex issue.  But every tab has a Comment field rendered on it, which makes things confusing, and makes each tab look like it needs scrolling.</p>
<p>So, just remove the Comment field from the Screen, right?  No, it isn&#8217;t in there.  So, can I remove Comment via the Field Configuration Scheme?  No, it is mandatory.  <a href="https://jira.atlassian.com/browse/JRA-12244">Damn your arbitrary limitation, JIRA!</a></p>
<p>Anyway, I don&#8217;t normally speak JavaScript, but I managed to gin up the following <a href="http://pastebin.mozilla.org/1364522">snippet</a> to paste into a Field description which appears in the screen I wanted to tweak.  It finds the element containing the Comment, and sets its style display attribute to <code>none</code>.  As the page loads, the Comment box is rendered, but once the page load completes, the Comment box disappears.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> hideCommentField<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> elements <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'field-group aui-field-wikiedit'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        elements<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// http://stackoverflow.com/questions/807878/javascript-that-executes-after-page-load</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    window.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onload'</span><span style="color: #339933;">,</span> hideCommentField<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>window.<span style="color: #000066;">onload</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> curronload <span style="color: #339933;">=</span> window.<span style="color: #000066;">onload</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> newonload <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            curronload<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            hideCommentField<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> newonload<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> hideCommentField<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>It is ugly, but effective.  Also, it is helpful for me to learn JavaScript!</p>
<p>PS: Thanks for the Guidance, <a href="http://xri.net/=edburns">Ed Burns</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/25/javascript-hack-hide-an-element-on-a-page/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Yahoo URLs Cafe</title>
		<link>http://dannyman.toldme.com/2011/10/21/yahoo-urls-cafe/</link>
		<comments>http://dannyman.toldme.com/2011/10/21/yahoo-urls-cafe/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 02:25:07 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Photo-a-Day]]></category>
		<category><![CDATA[Sundry]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/2011/10/21/yahoo-urls-cafe/</guid>
		<description><![CDATA[It is a little thrill to query Google Maps for &#8220;yahoo urls&#8221; &#8212; URLs is the name of one of their cafeterias, where I am right now for a Meetup.]]></description>
			<content:encoded><![CDATA[<p><a alt="image" href="http://dannyman.toldme.com/wp-content/uploads/2011/10/wpid-IMG_20111020_1921021.jpg"><img style="display:block;margin-right:auto;margin-left:auto;" alt="image" src="http://dannyman.toldme.com/wp-content/uploads/2011/10/wpid-IMG_20111020_192102.jpg" /></a></p>
<p>It is a little thrill to query Google Maps for &#8220;yahoo urls&#8221; &#8212; URLs is the name of one of their cafeterias, where I am right now for a Meetup.</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/21/yahoo-urls-cafe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes on CloudFlare</title>
		<link>http://dannyman.toldme.com/2011/10/11/cloudflare-free-cdn/</link>
		<comments>http://dannyman.toldme.com/2011/10/11/cloudflare-free-cdn/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 22:30:19 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6057</guid>
		<description><![CDATA[I personally have never set up a CDN before, but it has always sounded like a pain in the rear. So, I was pleased to see that CloudFlare made it braindead simple.]]></description>
			<content:encoded><![CDATA[<p>What it is: a free CDN!</p>
<p><strong>What is a CDN?</strong>  A Content Delivery Network is a service that caches parts of your web site at different points around the world.  This makes your web site load faster in foreign countries, and it reduces load on your server, which is really useful if there&#8217;s a traffic spike.</p>
<p><strong>Why is it free?</strong>  Apparently, they started as a honey pot.  A honey pot is a trap where you leave something sweet out for spammers and hackers, who will come and try to taste your honey.  The honey pot keeps track of where the bad guys are coming from and what techniques they are using, and this data is then analysed to improve security.  They also have a bunch of apps they can sell you, and honestly when you&#8217;re looking for a paid service for your company, the first thing that will come to mind is the service you already use for your personal stuff.</p>
<p>I personally have never set up a CDN before, but it has always sounded like a pain in the rear.  So, I was pleased to see that Cloudflare made it braindead simple: they did a pretty good job of guessing out the contents of my DNS zone file, which I was later allowed to upload in full, then a quick update of my registrar&#8217;s NS records and yes, I was using Cloudflare inside of 5 minutes.</p>
<p><strong>How does it work?</strong>  It basically replaces your world-facing, web-serving A records with its own IPs, which it then answers HTTP/1.1 style.  If you need dedicated IPs for SSL, that costs money.  You set some A records to go straight to your server, so you can, for example, use SSH.  It hands out the same IPs around the world, then magic network routing that I haven&#8217;t learned about takes care of the rest.</p>
<div id="attachment_6060" class="wp-caption aligncenter" style="width: 610px"><a href="http://dannyman.toldme.com/2011/10/11/cloudflare-free-cdn/direct-ip/" rel="attachment wp-att-6060"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/10/direct-ip-600x266.png" alt="" title="direct-ip" width="600" height="266" class="size-large wp-image-6060" /></a><p class="wp-caption-text">You&#039;re sharing IPs now, so HTTP/1.1 will work fine, but you&#039;ll need to set aside an A record if you need direct access.</p></div>
<div id="attachment_6061" class="wp-caption aligncenter" style="width: 610px"><a href="http://dannyman.toldme.com/2011/10/11/cloudflare-free-cdn/a-records/" rel="attachment wp-att-6061"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/10/a-records-600x100.png" alt="CloudFlare A Records" title="a-records" width="600" height="100" class="size-large wp-image-6061" /></a><p class="wp-caption-text">Configure your A records: orange clouds will be fronted by CloudFlare, grey clouds will go straight home.</p></div>
<p>So, is it faster?  Results from <a href="http://just-ping.com">just-ping.com</a> look very promising.  I see an average latency of 62ms for CloudFlare versus an average latency of 144ms for direct access to my server in Chicago.</p>
<p>An interesting aside, here&#8217;s a bit of the <a href="http://just-ping.com/index.php?vh=dannyman.toldme.com">just-ping.com output for CloudFlare</a>:</p>
<pre>
 Mumbai, India: 	Okay	64.1	64.5	67.4	173.245.60.121
 <b>Chicago, U.S.A.:	Okay	0.3	0.5	1.4	173.245.60.121</b>
 Nagano, Japan: 	Okay	5.5	5.7	6.1	173.245.60.121
. . .
 Lisbon, Portugal:	Okay	58.8	59.1	59.4	173.245.60.121
 <b>Chicago, U.S.A.:	Okay	1.8	2.3	2.7	173.245.60.44</b>
 Dallas, U.S.A.:	Okay	1.4	1.6	1.7	173.245.60.44
</pre>
<p>And <a href="http://just-ping.com/index.php?vh=173.203.101.184">for my direct IP</a>:</p>
<pre>
 Mumbai, India: 	Okay	286.8	288.1	293.1	173.203.101.184
 <b>Chicago, U.S.A.:	Okay	1.9	2.0	2.5	173.203.101.184</b>
 Nagano, Japan: 	Okay	165.8	165.9	166.1	173.203.101.184
. . .
 Lisbon, Portugal:	Okay	151.1	152.7	153.6	173.203.101.184
 <b>Chicago, U.S.A.:	Okay	0.2	0.3	0.5     173.203.101.184</b>
 Dallas, U.S.A.:	Okay	25.3	25.5	25.9	173.203.101.184
</pre>
<p>This shows two things.  First, CloudFlare thoroughly reduces my  latency anywhere outside Chicago.  Second, and really just interesting for the biggest nerds, just-ping&#8217;s first Chicago node is closer to CloudFlare&#8217;s Chicago node, and just-ping&#8217;s second Chicago node is closer to my <a href="http://www.rackspace.com/">RackSpace</a>-hosted Chicago node.</p>
<p>Okay, what about actual page-loading time?  Well, I just happened to be doing some <a href="/2011/09/09/netem-test-tcp-performance/">basic latency testing</a> last month.  Here&#8217;s what page load looked like in Google Chrome then:</p>
<div id="attachment_5922" class="wp-caption aligncenter" style="width: 734px"><a href="http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/developer-1/" rel="attachment wp-att-5922"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/09/developer-1.png" alt="" title="developer-1" width="724" height="348" class="size-full wp-image-5922" /></a><p class="wp-caption-text">Google Chrome&#039;s Developer Tool Network view last month.</p></div>
<p>Here&#8217;s what a page load from California looks like just now:</p>
<div id="attachment_6082" class="wp-caption aligncenter" style="width: 735px"><a href="http://dannyman.toldme.com/2011/10/11/cloudflare-free-cdn/chrome-dev/" rel="attachment wp-att-6082"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/10/chrome-dev.png" alt="" title="chrome-dev" width="725" height="348" class="size-full wp-image-6082" /></a><p class="wp-caption-text">Page load time from California with CloudFlare enabled.</p></div>
<p>So, a basic test shows that the initial round trips go from 275ms to 136ms, and the total page load time is reduced by about 1/3.  Now, the difference between 750ms and 500ms isn&#8217;t a huge deal, but the second you step overseas it makes a big difference.  Above you see that the latency from my server in Chicago to Lison is 150ms, and 165ms to Nagano, and 290ms to Mumbai.  With the <a href="/2011/09/09/netem-test-tcp-performance/">latency goggles</a> cranked to 200ms my page load times went from .75s to nearly 2s.  So, my web site <del datetime="2011-10-11T21:15:45+00:00">feels</del><ins datetime="2011-10-11T21:15:45+00:00">felt</ins> sluggish for people in Europe or Japan, and frustratingly slow in India.  CloudFlare removes that frustration.  Now, Mumbai can browse my site as comfortably as I could from California the day before.  (Mumbai should be even faster <a href="https://www.cloudflare.com/features-cdn.html">once Cloudflare adds a node in India</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/11/cloudflare-free-cdn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So Long, Steve . . .</title>
		<link>http://dannyman.toldme.com/2011/10/06/rip-steve-jobs/</link>
		<comments>http://dannyman.toldme.com/2011/10/06/rip-steve-jobs/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 00:02:19 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[News and Reaction]]></category>
		<category><![CDATA[Sundry]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testimonials]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=6022</guid>
		<description><![CDATA[You will be missed, even by us non-Apple-fanboys.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.apple.com/stevejobs/"><img class="aligncenter size-full wp-image-6023" title="rip-steve-jobs" src="http://dannyman.toldme.com/wp-content/uploads/2011/10/rip-steve-jobs.png" alt="" width="674" height="746" /></a></p>
<p>. . . and thanks for all the fonts!</p>
<p>You will be missed, even by us non-Apple-fanboys.</p>
<p><b>UPDATE:</b> Glenn Kelman has written <a href="http://blog.redfin.com/blog/2011/10/trying_not-trying.html">the most eloquent words I have read</a> that explain why Steve was an inspiration:</p>
<blockquote><p>
Many eulogies celebrate Steve  in terms of his &#8220;products&#8221; &#8212; those mass-produced little gadgets that we love for letting  us check email in front of our friends &#8212; and lose sight of <a href="http://daringfireball.net/2011/10/universe_dented_grass_underfoot">his grass-strained spirit</a>. What always moved me about Steve was the calligraphy and the LSD, the passage to India and his firing from Apple, his struggles at NeXT and his return from the wilderness.</p>
<p>The insistence on Steve’s perfection, on the vast difference between him as a producer and us as consumers, seems inhuman and even lonely to me. I wish we could take a moment in eulogizing Steve to grieve for him as one frail human to another, and feel in his passing the miracle of every human life; so many other people, geniuses on a smaller scale, are struggling his struggle. It hurts me that we have so much love to give to Steve and not to them.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/10/06/rip-steve-jobs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Latency Goggles for Linux</title>
		<link>http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/</link>
		<comments>http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 00:19:49 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=5909</guid>
		<description><![CDATA[As a Linux user, I can use <a href="http://www.linuxfoundation.org/collaborate/workgroups/networking/netem">netem</a> to induce added latency on my network interface.]]></description>
			<content:encoded><![CDATA[<p>While diagnosing why an internal web site is slow for some users, I got data that our overseas colleagues see ping latency to the web site of around 200 ms.  This is not unreasonable.  Some web sites that attach a lot of additional objects cause remote clients to have to open several connections and make several round-trips to load and render a web page.  What might work fine at 20 ms latency can really drag at 200 ms.</p>
<p>How to test this out?  As a Linux user, I can use <a href="http://www.linuxfoundation.org/collaborate/workgroups/networking/netem">netem</a> to induce added latency on my network interface:</p>
<pre>
# <b>ping -qc 2 google.com</b>
PING google.com (74.125.224.145) 56(84) bytes of data.

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 5009ms
rtt min/avg/max/mdev = 4.136/4.197/4.258/0.061 ms
# <b>tc qdisc add dev wlan0 root netem delay 200ms</b>
# <b>ping -qc 2 google.com</b>
PING google.com (74.125.224.144) 56(84) bytes of data.

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 5474ms
rtt min/avg/max/mdev = 205.006/205.034/205.062/0.028 ms

# <b>tc qdisc change dev wlan0 root netem delay 0ms</b>
# <b>ping -qc 2 google.com</b>
PING google.com (74.125.224.50) 56(84) bytes of data.

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 5011ms
rtt min/avg/max/mdev = 4.117/4.182/4.248/0.092 ms
</pre>
<p>Note, I&#8217;m on wireless, so I&#8217;m tuning <code>wlan0</code>.  you&#8217;ll want to hit <code>eth0</code> or whatever is appropriate to your configuration.</p>
<hr />
<p>The <a href="http://developer.yahoo.com/yslow/">YSlow</a> plugin or the <a href="http://code.google.com/chrome/devtools/">Google Chrome Developer tool</a> Network tab can be helpful to see what is going on:</p>
<div id="attachment_5922" class="wp-caption aligncenter" style="width: 734px"><a href="http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/developer-1/" rel="attachment wp-att-5922"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/09/developer-1.png" alt="" title="developer-1" width="724" height="348" class="size-full wp-image-5922" /></a><p class="wp-caption-text">Google Chrome&#039;s Developer Tool Network view without extra latency.</p></div>
<div id="attachment_5923" class="wp-caption aligncenter" style="width: 734px"><a href="http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/developer-2/" rel="attachment wp-att-5923"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/09/developer-2.png" alt="" title="developer-2" width="724" height="348" class="size-full wp-image-5923" /></a><p class="wp-caption-text">Google Chrome&#039;s Developer Tool Network view with extra 200ms latency.</p></div>
<p>So, with my web site, an added 200 ms latency doubles total page load time from 0.8 seconds to 1.6 seconds.</p>
<p>Here&#8217;s what I see when I visit the problem web site:</p>
<div id="attachment_5926" class="wp-caption aligncenter" style="width: 734px"><a href="http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/jira-1/" rel="attachment wp-att-5926"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/09/jira-1.png" alt="" title="jira-1" width="724" height="348" class="size-full wp-image-5926" /></a><p class="wp-caption-text">A problem web site at normal latency.</p></div>
<div id="attachment_5927" class="wp-caption aligncenter" style="width: 734px"><a href="http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/jira-2/" rel="attachment wp-att-5927"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/09/jira-2.png" alt="" title="jira-2" width="724" height="348" class="size-full wp-image-5927" /></a><p class="wp-caption-text">A problem web site at additional 200ms latency.</p></div>
<p>Total page load time at 7.5 seconds is nearly three times slower than without latency.</p>
<hr />
<p>A very crude way to measure things is with <code>wget</code> on the command-line.</p>
<p>The wget man page mentions the -p (page requisites) option, then the author suggests <code>wget -E -H -k -K -p &lt;URL&gt;</code>.  (You&#8217;ll need to RTFM yourself&#8230;)  So I do:</p>
<pre>
$ <b>cd /tmp</b>
$ <b>sudo tc qdisc change dev wlan0 root netem delay 0ms</b>
$ <b>time wget -q -E -H -k -K -p http://google.com</b>

real	0m0.160s
user	0m0.010s
sys	0m0.000s
$ <b>sudo tc qdisc change dev wlan0 root netem delay 200ms</b>
$ <b>time wget -q -E -H -k -K -p http://google.com</b>

real	0m3.832s
user	0m0.010s
sys	0m0.000s
</pre>
<p>Of course, even with all those options, wget behaves very differently from a modern GUI web browser: there&#8217;s no caching, it doesn&#8217;t parse the DOM and it will blindly download requisites it doesn&#8217;t actually need.  (Even a large font file found in a CSS comment.)  And it does all its requests serially, whereas a modern GUI web browser will fetch several objects in parallel.  And whatever web browser you use over a connection with induced latency is not going to replicate the experience of remote users pulling page requisites from zippy local CDNs.</p>
<hr />
<p>At the end of the day, I proposed the following advice to my remote colleagues:</p>
<ol>
<li>Try tuning the web browser to use more concurrent TCP connections.</li>
<li>Try modifying browser behavior: middle-click faster-loading sub-pages in to new tabs, work on those tabs, then refer back to the slower-loading &#8220;dashboard&#8221; screen, reloading only when needed.</li>
</ol>
<p>I also tweaked the web application to make it possible to show a more lightweight &#8220;dashboard&#8221; screen with fewer objects hanging off of it.  This seems to improve load time on that page about 50%.</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/09/09/netem-test-tcp-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TICKET. OR. GTFO.</title>
		<link>http://dannyman.toldme.com/2011/08/17/ticket-or-gtfo/</link>
		<comments>http://dannyman.toldme.com/2011/08/17/ticket-or-gtfo/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 00:03:07 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[doodles]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=5798</guid>
		<description><![CDATA[I do not know the provenance of the source material, and can make no claims of intellectual property rights here. TinEye finds 550 similar images.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><a href="http://dannyman.toldme.com/2011/08/17/ticket-or-gtfo/ticket-or-gtfo/" rel="attachment wp-att-5799"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/08/ticket-or-gtfo.png" alt="" title="ticket-or-gtfo" width="492" height="700" class="aligncenter size-full wp-image-5799" /></a></p>
<p>I do not know the provenance of the source material, and can make no claims of intellectual property rights here.  <a href="http://www.tineye.com/">TinEye</a> finds 550 similar images.</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/08/17/ticket-or-gtfo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Updating WordPress: Upgrading php53 on CentOS</title>
		<link>http://dannyman.toldme.com/2011/07/05/wordpress-upgrade-php53-centos/</link>
		<comments>http://dannyman.toldme.com/2011/07/05/wordpress-upgrade-php53-centos/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 20:21:57 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sundry]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Testimonials]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=5411</guid>
		<description><![CDATA[If you have a self-hosted WordPress blog, you really ought to keep it up to date.]]></description>
			<content:encoded><![CDATA[<p>If you have a self-hosted WordPress blog, you really ought to keep it up to date.  Popular software is a popular security target, and as new exploits are discovered, new patches are deployed.  Fortunately, WordPress makes this super-easy.  Just go to <em>Dashboard &gt; Updates</em> and you can update with one click.  I basically get a free update any time I get it in my head to write something.</p>
<p>Except this morning, when I was told that an update was available, but:</p>
<p style="text-align: center"><a href="http://dannyman.toldme.com/2011/07/05/wordpress-upgrade-php53-centos/wordpress-php/" rel="attachment wp-att-5412"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/07/wordpress-php.png" alt="&quot;You cannot update because WordPress 3.2 requires PHP version 5.2.4 or higher. You are running version 5.1.6.&quot;" title="WordPress Update" width="710" height="250" class="aligncenter size-large wp-image-5412" /></a></p>
<p>On my CentOS VM, this was addressed by:</p>
<pre><strike>
sudo yum update
sudo service httpd restart
</strike></pre>
<p>Actually, it was a little difficult, because we&#8217;re replacing <code>php</code> with <code>php53</code>:</p>
<pre>
0-13:11 djh@www0 ~$ <strong>cat /etc/redhat-release</strong>
CentOS release 5.6 (Final)
0-13:11 djh@www0 ~$ <strong>rpm -q php</strong>
php-5.1.6-27.el5_5.3
0-13:11 djh@www0 ~$ <strong>yum list installed | grep ^php</strong>
php.x86_64                               5.1.6-27.el5_5.3              installed
php-cli.x86_64                           5.1.6-27.el5_5.3              installed
php-common.x86_64                        5.1.6-27.el5_5.3              installed
php-gd.x86_64                            5.1.6-27.el5_5.3              installed
php-mysql.x86_64                         5.1.6-27.el5_5.3              installed
php-pdo.x86_64                           5.1.6-27.el5_5.3              installed
1-13:11 djh@www0 ~$ <strong>sudo service httpd stop</strong>
Stopping httpd:                                            [  OK  ]
0-13:11 djh@www0 ~$ <strong>yum list installed | grep ^php | awk '{print $1}' </strong>
php.x86_64
php-cli.x86_64
php-common.x86_64
php-gd.x86_64
php-mysql.x86_64
php-pdo.x86_64
0-13:12 djh@www0 ~$ <strong>sudo yum remove `!!`</strong>
<em>sudo yum remove `yum list installed | grep ^php | awk '{print $1}'`</em>
Loaded plugins: fastestmirror
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:5.1.6-27.el5_5.3 set to be erased
---> Package php-cli.x86_64 0:5.1.6-27.el5_5.3 set to be erased
---> Package php-common.x86_64 0:5.1.6-27.el5_5.3 set to be erased
---> Package php-gd.x86_64 0:5.1.6-27.el5_5.3 set to be erased
---> Package php-mysql.x86_64 0:5.1.6-27.el5_5.3 set to be erased
---> Package php-pdo.x86_64 0:5.1.6-27.el5_5.3 set to be erased
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch          Version                 Repository        Size
================================================================================
Removing:
 php               x86_64        5.1.6-27.el5_5.3        installed        6.2 M
 php-cli           x86_64        5.1.6-27.el5_5.3        installed        5.3 M
 php-common        x86_64        5.1.6-27.el5_5.3        installed        397 k
 php-gd            x86_64        5.1.6-27.el5_5.3        installed        333 k
 php-mysql         x86_64        5.1.6-27.el5_5.3        installed        196 k
 php-pdo           x86_64        5.1.6-27.el5_5.3        installed        114 k

Transaction Summary
================================================================================
Remove        6 Package(s)
Reinstall     0 Package(s)
Downgrade     0 Package(s)

Is this ok [y/N]: <strong>y</strong>
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing        : php-gd                                                   1/6
  Erasing        : php                                                      2/6
  Erasing        : php-mysql                                                3/6
  Erasing        : php-cli                                                  4/6
  Erasing        : php-common                                               5/6
warning: /etc/php.ini saved as /etc/php.ini.rpmsave
  Erasing        : php-pdo                                                  6/6 

Removed:
  php.x86_64 0:5.1.6-27.el5_5.3            php-cli.x86_64 0:5.1.6-27.el5_5.3
  php-common.x86_64 0:5.1.6-27.el5_5.3     php-gd.x86_64 0:5.1.6-27.el5_5.3
  php-mysql.x86_64 0:5.1.6-27.el5_5.3      php-pdo.x86_64 0:5.1.6-27.el5_5.3    

Complete!

0-13:13 djh@www0 ~$ <strong>sudo yum install php53 php53-mysql php53-gd</strong>
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: yum.singlehop.com
 * epel: mirror.steadfast.net
 * extras: mirror.fdcservers.net
 * updates: mirror.sanctuaryhost.com
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package php53.x86_64 0:5.3.3-1.el5_6.1 set to be updated
--> Processing Dependency: php53-cli = 5.3.3-1.el5_6.1 for package: php53
--> Processing Dependency: php53-common = 5.3.3-1.el5_6.1 for package: php53
---> Package php53-gd.x86_64 0:5.3.3-1.el5_6.1 set to be updated
--> Processing Dependency: libXpm.so.4()(64bit) for package: php53-gd
---> Package php53-mysql.x86_64 0:5.3.3-1.el5_6.1 set to be updated
--> Processing Dependency: php53-pdo for package: php53-mysql
--> Running transaction check
---> Package libXpm.x86_64 0:3.5.5-3 set to be updated
---> Package php53-cli.x86_64 0:5.3.3-1.el5_6.1 set to be updated
---> Package php53-common.x86_64 0:5.3.3-1.el5_6.1 set to be updated
---> Package php53-pdo.x86_64 0:5.3.3-1.el5_6.1 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch          Version                 Repository      Size
================================================================================
Installing:
 php53               x86_64        5.3.3-1.el5_6.1         updates        1.3 M
 php53-gd            x86_64        5.3.3-1.el5_6.1         updates        109 k
 php53-mysql         x86_64        5.3.3-1.el5_6.1         updates         92 k
Installing for dependencies:
 libXpm              x86_64        3.5.5-3                 base            44 k
 php53-cli           x86_64        5.3.3-1.el5_6.1         updates        2.4 M
 php53-common        x86_64        5.3.3-1.el5_6.1         updates        605 k
 php53-pdo           x86_64        5.3.3-1.el5_6.1         updates         67 k

Transaction Summary
================================================================================
Install       7 Package(s)
Upgrade       0 Package(s)

Total download size: 4.6 M
Is this ok [y/N]: <strong>y</strong>
Downloading Packages:
(1/7): libXpm-3.5.5-3.x86_64.rpm                         |  44 kB     00:00
(2/7): php53-pdo-5.3.3-1.el5_6.1.x86_64.rpm              |  67 kB     00:00
(3/7): php53-mysql-5.3.3-1.el5_6.1.x86_64.rpm            |  92 kB     00:00
(4/7): php53-gd-5.3.3-1.el5_6.1.x86_64.rpm               | 109 kB     00:00
(5/7): php53-common-5.3.3-1.el5_6.1.x86_64.rpm           | 605 kB     00:00
(6/7): php53-5.3.3-1.el5_6.1.x86_64.rpm                  | 1.3 MB     00:00
(7/7): php53-cli-5.3.3-1.el5_6.1.x86_64.rpm              | 2.4 MB     00:00
--------------------------------------------------------------------------------
Total                                            12 MB/s | 4.6 MB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : php53-common                                             1/7
  Installing     : php53-pdo                                                2/7
  Installing     : php53-cli                                                3/7
  Installing     : libXpm                                                   4/7
  Installing     : php53                                                    5/7
  Installing     : php53-mysql                                              6/7
  Installing     : php53-gd                                                 7/7 

Installed:
  php53.x86_64 0:5.3.3-1.el5_6.1           php53-gd.x86_64 0:5.3.3-1.el5_6.1
  php53-mysql.x86_64 0:5.3.3-1.el5_6.1    

Dependency Installed:
  libXpm.x86_64 0:3.5.5-3                  php53-cli.x86_64 0:5.3.3-1.el5_6.1
  php53-common.x86_64 0:5.3.3-1.el5_6.1    php53-pdo.x86_64 0:5.3.3-1.el5_6.1   

Complete!
0-13:14 djh@www0 ~$ <strong>sudo service httpd start</strong>
Starting httpd:                                            [  OK  ]
</pre>
<p>And now I have successfully upgraded via the web UI.</p>
<p>Most days, I am not a CentOS admin, so if there is a better way to have done this, I am keen to hear.</p>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/07/05/wordpress-upgrade-php53-centos/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>UPS Tracking Numbers DO Roll Over!</title>
		<link>http://dannyman.toldme.com/2011/06/30/ups-tracking-number-rollover/</link>
		<comments>http://dannyman.toldme.com/2011/06/30/ups-tracking-number-rollover/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 20:00:52 +0000</pubDate>
		<dc:creator>dannyman</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://dannyman.toldme.com/?p=5404</guid>
		<description><![CDATA[My package was shipped today.  It arrived last January.]]></description>
			<content:encoded><![CDATA[<div id="attachment_5405" class="wp-caption aligncenter" style="width: 621px"><a href="http://dannyman.toldme.com/2011/06/30/ups-tracking-number-rollover/ups-rollover/" rel="attachment wp-att-5405"><img src="http://dannyman.toldme.com/wp-content/uploads/2011/06/ups-rollover.png" alt="" title="ups-rollover" width="611" height="554" class="size-full wp-image-5405" /></a><p class="wp-caption-text">My package was shipped today.  It arrived last January.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://dannyman.toldme.com/2011/06/30/ups-tracking-number-rollover/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 3/46 queries in 0.089 seconds using disk: basic
Object Caching 939/1022 objects using disk: basic

Served from: dannyman.toldme.com @ 2012-02-08 14:50:30 -->
