<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Cantoni.org</title>
<link>http://www.cantoni.org/</link>
<atom:link rel="self" type="application/rss+xml" href="http://www.cantoni.org/rss.xml" />
<description>Brian Cantoni writes about software development, interesting mobile websites, and occasionally sports.</description>
<language>en-us</language>
<copyright>Copyright 2012 Brian Cantoni</copyright>
<creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license>
<lastBuildDate>Thu, 26 Jan 2012 13:28:01 -0800</lastBuildDate>
<pubDate>Thu, 26 Jan 2012 14:04:50 -0800</pubDate><generator>http://www.movabletype.org/?v=4.35-en</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 
<item>
<title>JIRA OnDemand: Great Solution For Vendors and Partners</title>
<link>http://www.cantoni.org/2012/01/26/jira-ondemand</link>
<description>Keeping track of technical issues, bugs and tasks between companies can be a real hassle. In my current job we switched from emailing Excel spreadsheets to hosted JIRA (OnDemand) which costs only $10/month for up to 10 users. (193 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2012/01/26/jira-ondemand</guid>
<content:encoded><![CDATA[<p>Keeping track of technical issues, bugs and tasks between companies can be a real hassle. In my <a href="http://citrixonline.com/">current job</a>, we&#8217;ve been using Excel spreadsheets with a couple of partners, emailing them back and forth with changes and updates. These quickly get out of sync, causing us to lose track of important issues. Also, this is only helpful for a very short summary of each issue &#8212; forget trying to have a more detailed conversation or screenshot attachments.</p>

<p>For one project we decided to try <a href="http://www.atlassian.com/software/jira/pricing/?tab=ondemand" title="Atlassian JIRA">JIRA OnDemand</a> and couldn&#8217;t be happier with the results. For only $10/month for the first 10 users, we&#8217;ve got a shared online tracking system that both companies can access. We divided the 10 users up across the two companies, and were up and running in about 10 minutes.</p>

<p>It helps that JIRA is pretty simple to learn and use, especially for anyone who&#8217;s used any type of bug tracking system. We&#8217;ve got email notifications, attachment support, and the ability to converse in detail on each issue as we resolve them.</p>

<p>Highly recommended!</p>

<div class="mt-image-center">
<a href="http://www.cantoni.org/assets_c/2012/01/jira-ondemand-80.html" onclick="window.open('http://www.cantoni.org/assets_c/2012/01/jira-ondemand-80.html','popup','width=1030,height=671,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.cantoni.org/assets_c/2012/01/jira-ondemand-thumb-200x130-80.png" width="200" height="130" alt="JIRA OnDemand pricing starts at an easy $10 per month for 10 users!"  /></a><div class="image-caption">JIRA OnDemand pricing starts at an easy $10 per month for 10 users</div></div>


]]></content:encoded>
<category>Tools</category>
<pubDate>Thu, 26 Jan 2012 13:28:01 -0800</pubDate>
</item><item>
<title>Stack Overflow: Kind of Addicting</title>
<link>http://www.cantoni.org/2012/01/23/stack-overflow</link>
<description>Over this past Christmas break I spent some more time on Stack Overflow, answering some questions in a few areas I felt I could contribute. As I answered and contributed more, I saw how the reputation and badges system can really draw you in. Not as a motivator per se, but it&apos;s fun to get &quot;kudos&quot; when someone finds your answers or edits helpful. (185 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2012/01/23/stack-overflow</guid>
<content:encoded><![CDATA[<p>Over this past Christmas break I spent some more time on <a href="http://stackoverflow.com/">Stack Overflow</a>, answering some questions in a few areas I felt I could contribute. As I answered and contributed more, I saw how the reputation and badges system can really draw you in. Not as a motivator per se, but it&#8217;s fun to get &#8220;kudos&#8221; when someone finds your answers or edits helpful.</p>

<p>Some conclusions so far:</p>

<ul>
<li>Some questions get answered <em>very quickly</em> - if you watch the most recent questions you&#8217;ll see a small number of page views, but a bunch of answers already. Must be a lot of people watching the newest questions and trying to contribute.</li>
<li>Answering older questions is worthwhile if the originator has a decent accept rate. Corollary: it&#8217;s not worth bothering with really old questions asked by <em>User1234</em> with only 1 reputation point.</li>
<li>Editing tag (wiki) descriptions is a good way to contribute for lesser-known tags.</li>
<li>Upvoting good quality questions and answers is a good way to keep up the overall quality level of the site</li>
</ul>

<p><br></p>

<div class="mt-image-center">
<a href="http://stackoverflow.com/users/9965/brianc">
<img src="http://stackoverflow.com/users/flair/9965.png" width="208" height="58" alt="profile for BrianC at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for BrianC at Stack Overflow, Q&amp;A for professional and enthusiast programmers">
</a>
<div class="image-caption">Check out my sweet Stack Overflow flair badge!</div>
</div>


]]></content:encoded>
<category>Web</category>
<pubDate>Mon, 23 Jan 2012 19:08:26 -0800</pubDate>
</item><item>
<title>Curl Cheat Sheet</title>
<link>http://www.cantoni.org/2012/01/10/curl-cheat-sheet</link>
<description>Curl is a very handy tool for downloading pretty much anything from a URL, and should be in every web developer&apos;s toolkit. However, the sheer number of Curl options can be overwhelming. Here I give a quick summary of the most common options and a few typical examples. (605 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2012/01/10/curl-cheat-sheet</guid>
<content:encoded><![CDATA[<p>This is a quick introduction and cheat sheet for <a href="http://curl.haxx.se/" title="cURL and libcurl homepage">Curl</a> - a very handy command-line tool for downloading pretty much anything from a URL.</p>

<p>The <a href="http://curl.haxx.se/" title="cURL and libcurl homepage">Curl website</a> describes it as:</p>

<blockquote>
  <p>&#8230; a command line tool for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos&#8230;), file transfer resume, proxy tunneling and a busload of other useful tricks.</p>
</blockquote>

<p>There are many things that Curl can do, and there is a voluminous <a href="http://curl.haxx.se/docs/manpage.html" title="cURL manpage">man page</a> that lists all of the details.</p>

<p>Here I want to boil down all those options into the most common and useful ones for web or webservices developers (using HTTP/HTTPS protocols). If you don&#8217;t already have Curl installed on your system (try running <code>curl</code> from a command prompt), see Getting Curl below.</p>

<h2>Basic Usage</h2>

<p>The basic form of all Curl commands is:</p>

<p><code>curl [options...] &lt;url&gt;</code></p>

<p>For example:</p>

<pre><code>$ curl http://www.google.com/humans.txt
Google is built by a large team of engineers, designers, researchers, robots, and others in many different sites across the globe. It is updated continuously, and built with more tools and technologies than we can shake a stick at. If you'd like to help us out, see google.com/jobs.</code></pre>

<h2>Common Options</h2>

<p>Options are the real power of of Curl. Here we&#8217;ll cover the most common ones that I&#8217;ve used for typical web and webservices development. (You can get the full set of options on your system with <code>curl --help</code> or <code>curl --manual</code>.)</p>

<dl>

<dt>-A / &#8212;user-agent AGENT</dt>
<dd>Set the HTTP User Agent string if you don&#8217;t want the default &#8220;curl&#8221; string</dd>
<dt>&#8212;compressed</dt>
<dd>Add the HTTP header to request compressed content, if the server can provide it</dd>
<dt>-d / &#8212;data DATA</dt>
<dd>Set data to be sent with a POST request</dd>
<dt>-D / &#8212;dump-header FILE</dt>
<dd>Save the response headers to a separate file</dd>
<dt>-H / &#8212;header HEADER</dt>
<dd>Set a custom HTTP header</dd>
<dt>-i / &#8212;include</dt>
<dd>Include the response headers in the output</dd>
<dt>-k / &#8212;insecure</dt>
<dd>Skip SSL certification verification</dd>
<dt>-o / &#8212;output FILE</dt>
<dd>Write output to a file rather than stdout</dd>
<dt>-s / &#8212;silent</dt>
<dd>Run silently (i.e., don&#8217;t show progress meter)</dd>
<dt>&#8212;trace-ascii FILE</dt>
<dd>Write request and response headers and data to local file</dd>
<dt>-x / &#8212;proxy HOST:PORT</dt>
<dd>Route data through the given proxy</dd>
<dt>-X / &#8212;request METHOD</dt>
<dd>Set custom HTTP method (GET, PUT, POST, DELETE)</dd>
</dl>

<h2>Examples</h2>

<h3>Fetch and Save Web Page</h3>

<pre><code>$ curl --silent http://boston.com -o boston.html  
$ head boston.html
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
&lt;html lang="en">
&lt;head>
&lt;meta http-equiv="Refresh" content="900;url=?refresh=true">
&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
&lt;title>Boston.com - Boston, MA news, breaking news, sports, video&lt;/title></code></pre>

<h2>Check Size Without Downloading</h2>

<pre><code>$ curl --head http://s3.amazonaws.com/hanselminutes/hanselminutes_0300.mp3
HTTP/1.1 200 OK
x-amz-request-id: 31D80700E3C2811E
Date: Wed, 11 Jan 2012 04:01:35 GMT
Last-Modified: Sat, 07 Jan 2012 02:49:49 GMT
ETag: "1d08609ab5434eea651e95af332ddb3a"
Accept-Ranges: bytes
Content-Type: audio/mpeg
Content-Length: 24474192
Server: AmazonS3</code></pre>

<h2>Getting Curl</h2>

<p>If you&#8217;re running Mac OSX, Linux, FreeBSD, or similar systems, you&#8217;ve probably already got Curl installed. (Try <code>curl --version</code> to double-check your version.)</p>

<p>If you&#8217;re running Windows, you&#8217;ll need to download it yourself. Start at the <a href="http://curl.haxx.se/download.html" title="cURL downloads">Curl downloads page</a> and find the Win32 section. I suggest the &#8220;Win32 - Generic binary, with SSL&#8221; option. You will also need the <a href="http://www.shininglightpro.com/products/Win32OpenSSL.html" title="Win32 OpenSSL">Windows OpenSSL libraries</a>; I suggest using the &#8220;Win32 OpenSSL v1.x Light&#8221; installer. Make sure to put both Curl and OpenSSL libraries in the same location, and add that location to your path.</p>


]]></content:encoded>
<category>Tools</category>
<pubDate>Tue, 10 Jan 2012 19:40:24 -0800</pubDate>
</item><item>
<title>Simple Webservice Echo Test</title>
<link>http://www.cantoni.org/2012/01/08/simple-webservice-echo-test</link>
<description>I&apos;ve created a simple webservice which echos back the request details, including request parameters and HTTP headers. Results can be returned in test, JSON, or XML formats, and source is on Github. (200 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2012/01/08/simple-webservice-echo-test</guid>
<content:encoded><![CDATA[<p>While troubleshooting some PHP Curl issues, I found and used <a href="http://respondto.it/">http://respondto.it/</a> (and later <a href="http://requestb.in/">http://requestb.in/</a>) which allows you to create a dummy webservice endpoint which reveals the full request made to it by your code.</p>

<p>An even simpler use case would be a webservice that simply returned data about the request directly to the calling application. I just created such a <a href="http://scooterlabs.com/echo" title="Echo Webservice - Scooter Labs">simple echo webservice</a> on my scooterlabs.com domain.</p>

<h2>Plain text example</h2>

<pre><code>$ curl http://scooterlabs.com/echo
Array
(
    [method] =&gt; GET
    [headers] =&gt; Array
        (
            [User-Agent] =&gt; curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
            [Host] =&gt; scooterlabs.com
            [Accept] =&gt; */*
        )

    [request] =&gt; Array
        (
            [foo] =&gt; bar
        )

    [client_ip] =&gt; 68.125.160.82
    [time_utc] =&gt; 2012-01-08T21:33:28+0000
    [info] =&gt; Echo service from Scooterlabs (http://www.scooterlabs.com)
)
</code></pre>

<h2>JSON example</h2>

<pre><code>$ curl --silent curl http://scooterlabs.com/echo.json?foo=bar | json_xs
{
   "info" : "Echo service from Scooterlabs (http://www.scooterlabs.com)",
   "request" : {
      "foo" : "bar"
   },
   "headers" : {
      "User-Agent" : "curl/7.21.3 (i386-portbld-freebsd7.3) libcurl/7.21.3 OpenSSL/1.0.0e zlib/1.2.3 libidn/1.22",
      "Accept" : "*/*",
      "Host" : "scooterlabs.com"
   },
   "client_ip" : "66.39.158.129",
   "time_utc" : "2012-01-08T22:07:54+0000",
   "method" : "GET"
}
</code></pre>

<h2>Source</h2>

<p>Source code is up on Github: <a href="https://github.com/bcantoni/echotest">https://github.com/bcantoni/echotest</a>. If anyone has any comments or feedback, let me know here or on Github.</p>


]]></content:encoded>
<category>Web</category>
<pubDate>Sun, 08 Jan 2012 13:59:33 -0800</pubDate>
</item><item>
<title>Tech Advent Calendars</title>
<link>http://www.cantoni.org/2011/12/05/tech-advent-calendars</link>
<description>Several awesome tech and programming communities create advent calendars each year with a different article or demo for each day of December. Here are the ones I&apos;m following. (68 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2011/12/05/tech-advent-calendars</guid>
<content:encoded><![CDATA[<p>Several awesome tech and programming communities create advent calendars each year with a different article or demo for each day of December. Here are the ones I&#8217;m following. </p>

<p>I&#8217;ve also created a Yahoo Pipe to combine all of these RSS feeds into one: <a href="http://pipes.yahoo.com/pipes/pipe.run?_id=c9a42b2f23c108a801e1afa9ce7df012&amp;_render=rss" title="Yahoo Pipe: Tech Advent Calendar RSS Feed">2011 Tech Advent Feed</a>.</p>

<p><br />
<strong>Performance</strong></p>

<p>website: <a href="http://calendar.perfplanet.com/2011/">http://calendar.perfplanet.com/2011/</a> <br />
feed: <a href="http://calendar.perfplanet.com/feed/">http://calendar.perfplanet.com/feed/</a></p>

<p><img alt="Performance Advent Calendar 2011" src="http://www.cantoni.org/images/perfplanet-2011.png" width="250" height="175" /></p>

<p><br />
<strong>24ways</strong></p>

<p>website: <a href="http://24ways.org/">http://24ways.org/</a> <br />
feed: <a href="http://feeds.feedburner.com/24ways">http://feeds.feedburner.com/24ways</a></p>

<p><img alt="24ways Advent Calendar 2011" src="http://www.cantoni.org/images/24ways-2011.png" width="250" height="175" /></p>

<p><br />
<strong>Perl</strong></p>

<p>website: <a href="http://perladvent.org/2011/">http://perladvent.org/2011/</a> <br />
feed: <a href="http://perladvent.org/2011/atom.xml">http://perladvent.org/2011/atom.xml</a></p>

<p><img alt="Perl Advent Calendar 2011" src="http://www.cantoni.org/images/perladvent-2011.png" width="250" height="175" /></p>

<p><br />
<strong>PHP</strong></p>

<p>website: <a href="http://phpadvent.org/2011">http://phpadvent.org/2011</a> <br />
feed: <a href="http://feeds.feedburner.com/phpadvent">http://feeds.feedburner.com/phpadvent</a></p>

<p><img alt="PHP Advent Calendar 2011" src="http://www.cantoni.org/images/phpadvent-2011.png" width="250" height="175" /></p>


]]></content:encoded>
<category>Web</category>
<pubDate>Mon, 05 Dec 2011 13:54:07 -0800</pubDate>
</item><item>
<title>Clean Up Android Downloaded Files</title>
<link>http://www.cantoni.org/2011/12/05/clean-up-android-downloads</link>
<description>I didn&apos;t realize there was a separate app for this, but had wondered if there was a way to return to browser downloaded files. Within Downloads, I found over 65MB of files, some of which I downloaded over a year ago. With a few taps I cleaned them all out. These are treated separately and outside of the browser cache, so if you download a lot you should periodically clean them up. (114 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2011/12/05/clean-up-android-downloads</guid>
<content:encoded><![CDATA[<p>Today I randomly noticed on my HTC Evo a &#8220;Downloads&#8221; app which brings you directly to all of the downloaded files and attachments.</p>

<div class="mt-image-center">
<img alt="Android Downloads Icon" src="http://www.cantoni.org/images/android-downloads-icon.png" width="131" height="120" />
<div class="image-caption">Look for the Downloads application</div>
</div>

<p>I didn&#8217;t realize there was a separate app for this, but had wondered if there was a way to return to browser downloaded files. Within Downloads, I found over 65MB of files, some of which I downloaded over a year ago. With a few taps I cleaned them all out. These are treated separately and outside of the browser cache, so if you download a lot you should periodically clean them up.</p>

<div class="mt-image-center">
<img alt="Android Downloads Screenshot" src="http://www.cantoni.org/images/android-downloads-screen.png" width="240" height="400" />
<div class="image-caption">
The Downloads app shows how much space is used by everything you&#8217;ve ever downloaded
</div>

<p></div></p>


]]></content:encoded>
<category>Mobile</category>
<pubDate>Mon, 05 Dec 2011 11:32:13 -0800</pubDate>
</item><item>
<title>Effective Android Screenshots</title>
<link>http://www.cantoni.org/2011/12/03/effective-android-screenshots</link>
<description>Taking screenshots from an Android device is similar to other platforms, although a bit more setup is needed. With a little bit of additional editing, your screenshots can look clean and professional. To get your PC ready for taking Android screenshots, refer to addictive tips for a good set of instructions; setting up a Mac is a similar process. In... (279 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2011/12/03/effective-android-screenshots</guid>
<content:encoded><![CDATA[<p>Taking screenshots from an Android device is similar to other platforms, although a bit more setup is needed. With a little bit of additional editing, your screenshots can look clean and professional.</p>

<p>To get your PC ready for taking Android screenshots, refer to <a href="http://www.addictivetips.com/mobile/how-to-take-screenshots-of-android-device/" title="How to Take Screenshots of Android Device, addictivetips.com">addictive tips</a> for a good set of instructions; setting up a Mac is a similar process.</p>

<p>In the instructions below, we&#8217;ll clean up the extra icons that appear in the notification area (the top left corner of the screen) when the device is connected via a USB cable. In this example screenshot, notice the extra icons that we want to clean up:</p>

<div class="image"><img alt="Android Screenshot 'Before' Example" src="http://www.cantoni.org/images/android-screenshot-before.png" width="300" height="500" class="mt-image-center" /></div>

<p>Follow these instructions on your Mac to take better screenshots and clean those up:</p>

<ol>
<li>Prepare the Android device with the screen or application you&#8217;re taking a shot of</li>
<li>Connect to your PC/Mac via USB cable</li>
<li>Take the screenshot and save as a PNG file (refer to <a href="http://www.addictivetips.com/mobile/how-to-take-screenshots-of-android-device/" title="How to Take Screenshots of Android Device, addictivetips.com">addictive tips</a> for instructions)</li>
<li>Open the PNG file in the Preview Mac app</li>
<li>Zoom in once or twice and scroll to the upper left corner</li>
<li>Select a rectangular area that is &#8220;clean&#8221; (showing just the header background)</li>
<li>Copy</li>
<li>Paste</li>
<li>Use the arrow keys to move the pasted block to the left (using the keys keeps the copied rectangle in the proper vertical position)</li>
<li>Repeat as needed to cover the undesired icons</li>
</ol>

<p>This close-up screenshot show the copy area from the clean background:</p>

<div class="image"><img alt="Android Screenshot Select" src="http://www.cantoni.org/images/android-screenshot-select.png" width="448" height="129" class="mt-image-center" /></div>

<p>And here we have the clean area being pasted over the icons we are hiding:</p>

<div class="image"><img alt="Android Screenshot Copy Paste" src="http://www.cantoni.org/images/android-screenshot-paste.png" width="448" height="125" class="mt-image-center" /></div>

<p>Finally, the end result:</p>

<div class="image"><img alt="Android Screenshot 'After' Example" src="http://www.cantoni.org/images/android-screenshot-after.png" width="300" height="500" class="mt-image-center" /></div>


]]></content:encoded>
<category>Mobile</category>
<pubDate>Sat, 03 Dec 2011 19:39:00 -0800</pubDate>
</item><item>
<title>Using Splunk to Analyze Apache Logs</title>
<link>http://www.cantoni.org/2011/08/17/using-splunk-apache-logs</link>
<description>Splunk is an enterprise-grade software tool for collecting and analyzing log files and other data. They have a free version which is great for personal projects or smaller websites. In this blog post I explain how to use Splunk on standard Apache logs to explore your data, and an example of a misbehaving bot that I identified and was able to block. (620 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2011/08/17/using-splunk-apache-logs</guid>
<content:encoded><![CDATA[<p><a href="http://www.splunk.com/">Splunk</a> is an enterprise-grade software tool for collecting and analyzing log files and other data. Actually Splunk uses the broader term &#8220;machine data&#8221;:</p>

<blockquote>
  <p>At Splunk we talk a lot about machine data, and by that we mean all of the data generated by the applications, servers, network devices, security devices and other systems that run your business.</p>
</blockquote>

<p>Certainly, log files do fall under that umbrella, and are probably the easiest way to understand Splunk&#8217;s capabilities. The company offers a free license which has some limitations compared to a paid enterprise license, the most significant limitation being a maximum of 500 MB/day of indexed data. (For more details, see the <a href="http://www.splunk.com/view/free-vs-enterprise/SP-CAAAE8W">differences between free and enterprise licenses</a>.) To learn Splunk, or to use it for personal or smaller sites, the limitations are manageable and the free product is a great option.</p>

<p>In this example I&#8217;ve uploaded logs from a couple of my websites and let Splunk index them. I also explain the process I used to identify a rogue user agent which I later blocked.</p>

<p>To get started with Splunk, visit the <a href="http://www.splunk.com/download">download</a> page and get the appropriate version for your platform. Follow the installation manual (from the excellent <a href="http://docs.splunk.com/Documentation/Splunk">documentation</a> site) to get the software installed and configured.</p>

<p>There are several ways to get data into Splunk; for this case I told it to monitor a local directory for files and manually told it the host name to expect. Then I copied down about 6 months&#8217; of compressed Apache logs into that target directory. You can repeat this for each site, using a separate directory and separate hostname. </p>

<p>Splunk will quickly index your data which you&#8217;ll see in the Search application. I suggest going through their quick overview to help learn what&#8217;s going on. Click on a hostname to start viewing data that Splunk has indexed. Because Splunk automatically recognizes the Apache log file format, it already knows how to pull out the common fields which you can use for searching and filtering, as shown in this screenshot:</p>

<p><img alt="Splunk Fields Example" src="http://www.cantoni.org/images/fields.png" width="169" height="804" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>In my case after poking around a bit, I noticed a pretty high amount of traffic fetching my RSS feed file (/rss.xml). The screenshot below shows the number of daily requests, normally hovering around 400 but peaking at about 2,000 per day (click for larger image):</p>

<p><a href="http://www.cantoni.org/assets_c/2011/08/rss-summary-58.html" onclick="window.open('http://www.cantoni.org/assets_c/2011/08/rss-summary-58.html','popup','width=965,height=422,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.cantoni.org/assets_c/2011/08/rss-summary-thumb-400x174-58.png" width="400" height="174" alt="RSS File Accesses Over Time" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></p>

<p>By clicking on the useragent field, I found that an agent named &#8220;NewsOnFeedsBot&#8221; was accounting for over 60% of the total requests (click for larger image):</p>

<p><a href="http://www.cantoni.org/assets_c/2011/08/useragent-60.html" onclick="window.open('http://www.cantoni.org/assets_c/2011/08/useragent-60.html','popup','width=510,height=377,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.cantoni.org/assets_c/2011/08/useragent-thumb-300x221-60.png" width="300" height="221" alt="Useragent Breakout Chart" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></p>

<p>Once I filtered on just the NewsOnFeedsBot useragent, some more details emerged:</p>

<ul>
<li>The HTTP status code for all requests was 200, meaning it was doing a full request of the 36KB file each time. (Whereas a well-behaved bot would use if-modified-since or other techniques.)</li>
<li>All requests were coming from a single IP address</li>
<li>The bot was basically continuously fetching the RSS file several times a minute</li>
</ul>

<p>Blocking this poorly-behaving bot was just a matter of checking for the useragent string and returning a 403 Forbidden response. After I made the change, the bot made a handful of further requests, received the 403, then stopped. At least it has some logic that indicated it should give up trying to fetch this file.</p>

<p>It&#8217;s been about a month since I blocked this bot, so I wanted to see an overview of the results. Splunk has a nice built-in charting capability which I used to stack the most popular useragents (again, just for the rss.xml file) and show their portion of visits over the past few months. You can see in the picture below that NewsOnFeedsBot was by far the biggest contributor over the summer, but now it&#8217;s gone (click for larger image):</p>

<p><a href="http://www.cantoni.org/assets_c/2011/08/useragent-over-time-59.html" onclick="window.open('http://www.cantoni.org/assets_c/2011/08/useragent-over-time-59.html','popup','width=983,height=273,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.cantoni.org/assets_c/2011/08/useragent-over-time-thumb-500x138-59.png" width="500" height="138" alt="Useragents Over Time" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></p>


]]></content:encoded>
<category>Web</category>
<pubDate>Wed, 17 Aug 2011 21:13:14 -0800</pubDate>
</item><item>
<title>Debug HTTP Traffic From Android Tablets Using Fiddler</title>
<link>http://www.cantoni.org/2011/06/28/debug-http-android-fiddler</link>
<description>Having recently upgraded my Samsung Galaxy Tab 10.1 to the latest Android &quot;Honeycomb&quot; 3.1 release, I wanted to take a closer look at watching the HTTP web traffic from and to the device. Using the Fiddler web debugging tool on Windows, I was able to set this up rather quickly with these steps... (246 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2011/06/28/debug-http-android-fiddler</guid>
<content:encoded><![CDATA[<p>Having recently upgraded my <a href="http://www.samsung.com/global/microsite/galaxytab/10.1/" title="Samsung Galaxy Tab 10.1">Samsung Galaxy Tab 10.1</a> to the latest Android &#8220;Honeycomb&#8221; 3.1 release, I wanted to take a closer look at watching the HTTP web traffic from and to the device. Using the <a href="http://www.fiddler2.com/fiddler2/" title="Fiddler Web Debugger">Fiddler</a> web debugging tool on Windows, I was able to set this up rather quickly with these steps:</p>

<p>On the PC, Install <a href="http://www.fiddler2.com/fiddler2/" title="Fiddler Web Debugger">Fiddler</a> if needed. After install, configure Fiddler by opening the options panel (menu Tools | Fiddler Options). Select the Connections tab and enable the &#8216;Allow remote computers to connect&#8217; option. Note the &#8216;Fiddler listens on port&#8217; option (normally 8888), and close the dialog. Exit and restart Fiddler.</p>

<p><img alt="Fiddler Options" src="http://www.cantoni.org/images/fiddler_options.png" width="349" height="308" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>On the PC, determine it&#8217;s current IP address (open a command prompt, then type <code>ipconfig</code>).</p>

<p>On the Android tablet, install <a href="https://market.android.com/details?id=org.credil.proxysettings" title="HTTP Proxy Settings App - Android Market">HTTP Proxy Settings</a> app on the tablet. This app simply brings up the &#8220;HTTP Proxy&#8221; setting panel so you can make changes. Start the HTTP Proxy Settings app and enter your PC&#8217;s IP address as the host, and port number 8888.</p>

<p><img alt="HTTP Proxy Settings" src="http://www.cantoni.org/images/galaxy_proxy_settings.png" width="386" height="336" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>Now run the Android Browser and you should see HTTP traffic routed through Fiddler on the PC. Below see an example of visiting Yahoo&#8217;s &#8220;tablet&#8221; home page:</p>

<p><img alt="Fiddler Log Results" src="http://www.cantoni.org/images/fiddler_log.png" width="491" height="347" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>When you&#8217;re done, don&#8217;t forget to run the HTTP Proxy Settings app again to clear out the host and port fields. (Otherwise your tablet browser will become unusable when Fiddler is no longer running.)</p>


]]></content:encoded>
<category>Mobile</category>
<pubDate>Tue, 28 Jun 2011 21:14:02 -0800</pubDate>
</item><item>
<title>Work Shifting</title>
<link>http://www.cantoni.org/2011/06/07/work-shifting</link>
<description>Now that I&#8217;m working at Citrix Online, I&#8217;m coming up to speed on the ways in which our collaboration products like GoToMeeting are being used. One of the interesting outreach efforts is workshifting.com, based on a new term workshifting: If you work out of coffee shops, hotels, airports and your home every bit as much as the office, workshifting.com is... (129 Words)</description>
<guid isPermaLink="true">http://www.cantoni.org/2011/06/07/work-shifting</guid>
<content:encoded><![CDATA[<p>Now that I&#8217;m <a href="http://www.cantoni.org/2011/05/31/citrix-online" title="Joining Citrix Online - Cantoni.org - 2011-05-31">working at Citrix Online</a>, I&#8217;m coming up to speed on the ways in which our collaboration products like GoToMeeting are being used. One of the interesting outreach efforts is <a href="http://workshifting.com" title="Work Shifting by Citrix Online">workshifting.com</a>, based on a new term <em>workshifting</em>:</p>

<blockquote>
  <p>If you work out of coffee shops, hotels, airports and your home every bit as much as the office, workshifting.com is for you.  We share resources on telecommuting, online tools, travel, technology, business &amp; virtual offices to help you shift when, where &amp; how you work. </p>
</blockquote>

<p>If you want to follow along with the latest, subscribe to the website feed and/or follow along on Twitter: <a href="https://twitter.com/#!/workshifting" title="WorkShifting on Twitter">@workshifting</a>.</p>

<p><a href="http://workshifting.com" title="Work Shifting by Citrix Online"><img alt="workshifting.png" src="http://www.cantoni.org/images/workshifting.png" width="280" height="200" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></p>


]]></content:encoded>
<category>Career</category>
<pubDate>Tue, 07 Jun 2011 12:01:19 -0800</pubDate>
</item>
</channel>
</rss>
