<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
        <title>Bill&apos;s Words</title>
        <link>http://www.bill.eccles.net/bills_words/</link>
        <description>A curious mix of conservative values and liberal computing.</description>
        <language>en</language>
        <copyright>Copyright 2012</copyright>
        <lastBuildDate>Sat, 04 Feb 2012 09:51:10 -0500</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>Chances Are at Least Two Women Per Year May Die Because Planned Parenthood Will Get Komen Funds</title>
            <description><![CDATA[<p>I read an article<sup>1</sup> on ChicagoTribune.com which got me wondering, <em>If SGK pulled PP&#8217;s funding, how many more women would die of breast cancer?</em> The consequences, according to the Interwebs, would be dire.</p>

<p>However, the numbers indicate that SGK&#8217;s funding of PP&#8217;s clinical breast exams might be resulting in more cancer deaths than if SGK were funding mammograms directly.</p>

<p>Assume that PP used all of SGK&#8217;s money for breast cancer screenings and mammograms over the past five years. Also assume that PP got an average of $650,000 per year for those five years. (I cannot find actual figures.)</p>

<p>Now let&#8217;s do the math.</p>

<ul>
<li><p>$650,000*5 = $3,250,000.</p></li>
<li><p>Mammograms funded by SGK through PP in those five years: 6,400.<sup>1</sup></p></li>
<li><p>Total SGK funding used for mammograms (via pass-through grants to PP) at a high-end cost of $125 per mammogram<sup>2</sup>: 6,400*$125 = $800,000</p></li>
<li><p>Remaining funds used for clinical breast exams (CBEs) at PP: $3,250,000-$800,000 = $2,450,000</p></li>
<li><p>Breast cancer screenings performed by PP in the past five years: 170,000<sup>1</sup></p></li>
<li><p>Cost per CBE performed by PP: $2,450,000/170,000 = about $15.</p></li>
</ul>

<p>Unfortunately, the U.S. Preventive Services Task Force (USPSTF) can&#8217;t find evidence that the CBE is effective. Only mammograms have been proven to be effective.<sup>3</sup> About CBE&#8217;s, PP says this:</p>

<blockquote>
  <p>Dr. Vanessa Cullins, a vice president with Planned Parenthood Federation of America, defended its use of clinical breast exams. The exam, in which a doctor feels the breast for lumps, is &#8220;a good tool&#8221; <em>when followed with mammograms and other tests as needed</em>, she said.<sup>1</sup> (emphasis added)</p>
</blockquote>

<p>Clearly, funding of CBEs is diverting resources from more effective exams, but how many?</p>

<p>More math:</p>

<ul>
<li><p>Amount of money spent on CBEs performed by PP: $2,450,000.</p></li>
<li><p>Number of mammograms which could have been performed with that money (at a higher-than-average cost of $125 per mammogram): $2,450,000/$125 = 19,600.</p></li>
</ul>

<p>If the SGK money had been used for mammograms in the last five years:</p>

<ul>
<li><p>Number of women per year, ages 39-49, whose lives might have been saved: 19,600/1,904/5 = <strong>2</strong>.<sup>4</sup></p></li>
<li><p>Number of women per year, ages 50-59, whose lives might have been saved: 19,600/1,339/5 = <strong>3</strong>.</p></li>
<li><p>Number of women per year, ages 60-69, whose lives might have been saved: 19,600/377/5 = <strong>10</strong>.</p></li>
</ul>

<p>So if you were in the driver&#8217;s seat at SGK, which would you choose, an unproven use of your money, or an effective use which is proven to save lives? Would you choose to defund PP, too?</p>

<p>The Interwebs disagree with you.</p>

<p>One final note: Outside of these numbers, it&#8217;s entirely possible that the backlash against SGK could have cost SGK more funding than the funding lost (and subsequently made up) by PP. The effect of SGK&#8217;s loss is also calculable in human terms. But until SGK pulls funding from PP and we can see the cost to SGK&#8217;s fundraising, we won&#8217;t know that effect.</p>

<hr />

<p><sup>1</sup> <a href="http://www.chicagotribune.com/health/sns-bc-us-med--plannedparenthood-whoithelps,0,5575732.story""><i>Surprises in Komen-Planned Parenthood dustup: How cancer screening is done and who pays for it</i></a>, ChicagoTribune.com</p>

<p><sup>2</sup> <a href="http://health.costhelper.com/mammogram.html"><i>How Much Does a Mammogram Cost?</i></a>, CostHelper.com</p>

<p><sup>3</sup> <a href="http://www.uspreventiveservicestaskforce.org/uspstf/uspsbrca.htm"><i>Screening for Breast Cancer</i></a>, U.S. Preventive Services Task Force</p>

<p><sup>4</sup> <a href="http://www.uspreventiveservicestaskforce.org/uspstf09/breastcancer/brcanup.htm"><i>Screening for Breast Cancer
An Update for the U.S. Preventive Services Task Force</i></a>, Table 1, U.S. Preventive Services Task Force</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2012/02/chances-are-at-least-two-women.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2012/02/chances-are-at-least-two-women.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Random</category>
            
            <pubDate>Sat, 04 Feb 2012 09:51:10 -0500</pubDate>
        </item>
        
        <item>
            <title>On the SGK/PP Split</title>
            <description><![CDATA[<p>First, take a deep breath, then promise to stick with me to the end.</p>

<p>I am disappointed in the outrage which has been expressed by the Internet community at large on the Susan G. Komen for the Cure (SGK, for short) decision to withdraw its support for Planned Parenthood (PP). The outrage seems to be based on a misunderstanding of the facts. The only praise for the decision arises from conservatives who view it as a blow to abortion. But both sides of the debate are missing what could be (<em>could</em> be) a benefit to women&#8217;s health, the very cause at the center of the argument.</p>

<p>Two days ago, SGK followed its own relatively new policy of withdrawing funding for organizations which are under congressional investigation, which PP is. The policy, in and of itself, makes sense. There&#8217;s no reason why a private, non-profit organization can&#8217;t decide to withdraw funding from something which has been accused&#8212;rightly or wrongly&#8212;of misconduct. SGK has decided its in its best interests to withdraw support of organizations which might stink.</p>

<p>So, does PP stink? <em>It doesn&#8217;t matter.</em> SGK is following its own policies, as it should.</p>

<p>Was it politically motivated? SGK says &#8220;No.&#8221; Before you go dragging out words like &#8220;failed gubernatorial campaign,&#8221; remember that SGK supports cancer research, not the abortion and reproductive health businesses. So whether it&#8217;s politically motivated or not, it&#8217;s certainly in their right to drop funding for an organization which spent SGK&#8217;s money on services other than early cancer detection.</p>

<p>Is this a change in SGK&#8217;s core values? No. SGK&#8217;s mission statement reads as follows:</p>

<blockquote>
  <p>Promise: The Susan G. Komen for the Cure promise: to save lives and end breast cancer forever by empowering people, ensuring quality of care for all and energizing science to find the cures.</p>
</blockquote>

<p>You&#8217;ll note that it does not say:</p>

<blockquote>
  <p>Promise: The Susan G. Komen for the Cure promise: to save lives and end breast cancer forever by empowering people, ensuring quality of care for all and energizing science to find the cures <em>by funding Planned Parenthood.</em></p>
</blockquote>

<p>So you can&#8212;and should&#8212;continue to support SGK if you wish to fund the continued fight against breast cancer.</p>

<p>And you should drop the outrage. Because I think there&#8217;s a potential benefit which is being overlooked&#8212;if SGK lives up to its promise of &#8220;ensuring quality of care for all,&#8221; that is.</p>

<p>PP has already said that the SGK funds are already well on their way towards being replaced&#8212;$400K or the $648K in less than 24 hours isn&#8217;t a bad fundraising record. They have also said that the services funded by that $648K will still be available, regardless.</p>

<p>So far, the PP patient population is covered. If SGK &#8220;ensur[es] quality of care for all,&#8221; then there&#8217;s a potential benefit&#8212;an upside!</p>

<p>If SGK lives up to its promise, it will put that $648K towards cancer prevention. <em>That&#8217;s</em> what you should be talking to SGK about. Not about defunding PP. Not about abortion. Not about political motivations. What you <em>should</em> be voicing is what to do with the money instead, insisting that it go where it should go: to the ground, where feet meet the street.</p>

<p>In the best-case scenario, SGK would arrange for vouchers for breast cancer screenings equivalent to what PP is providing to be distributed to clinics in the cities where the defunded PP offices are&#8212;preferably at clinics very near the PP offices. Put all $648K to work here. Since PP is already covering the people who would go to PP for help, that&#8217;s an awful lot of additional women who have access to care&#8212;and may be another segment of the population which would go to a clinic but wouldn&#8217;t set foot in a PP office.</p>

<p>In the &#8220;worst case,&#8221; SGK will dedicate the money to research or similar (not a bad thing, but not in keeping with the original mission of that $648K). In the worst case, nobody loses. In the best case, more women have access to breast cancer screenings.</p>

<p>Furthermore, if we assume that it was only some percentage of the SGK donation to PP which was going to breast cancer screenings in the first place, then SGK is actually focusing <em>more</em> on its core values. More of its money will be going towards breast cancer research or early detection and not to other PP services. (Again, the other PP services are not part of SGK&#8217;s core mission.) In the end, it&#8217;s a better use of SGK money, which you probably helped raise and wanted to see go towards fighting breast cancer in the first place.</p>

<p>So&#8230; if not now, then when should you be outraged?</p>

<p>&#8212; When SGK doesn&#8217;t restore funding to PP if/when PP is ever found not guilty of misconduct, provided SGK wants to use its funds in that manner.</p>

<p>&#8212; When SGK doesn&#8217;t put the funds into the hands of the people who need it most by funding screenings directly.</p>

<p>Then I&#8217;d expect to see this kind of outrage again.</p>

<p>But, until then, cool your jets. Please.</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2012/02/on-the-sgkpp-split.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2012/02/on-the-sgkpp-split.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Random Thoughts</category>
            
            <pubDate>Wed, 01 Feb 2012 19:25:38 -0500</pubDate>
        </item>
        
        <item>
            <title>My Bucket List Just Got Shorter</title>
            <description><![CDATA[<p>I just removed <a href="http://screensociety.tumblr.com/post/16103398892/the-lions-mane-jellyfish-is-the-largest-jellyfish">swimming in the Arctic Ocean</a> from my bucket list.</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2012/01/my-bucket-list-just-got-shorte.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2012/01/my-bucket-list-just-got-shorte.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Random</category>
            
            <pubDate>Fri, 20 Jan 2012 16:31:17 -0500</pubDate>
        </item>
        
        <item>
            <title>The LaCrosse Technology WS-2010-13 PC Interface: Everything I Know</title>
            <description><![CDATA[<p>We have a LaCrosse Technology WS-2010 system which is getting close to being a decade old at this point. Aside from what I don&#8217;t like about the system (and there&#8217;s a lot), it has performed reliably, sucking weather data out of the atmosphere. Being a Mac-centric family, the fact that the WS-2010-13 PC Interface is a Windows-only, RS-232-based device was maddening. And the fact that the included software didn&#8217;t do anything useful for me didn&#8217;t help.</p>

<p>So for the last decade, I&#8217;ve had a Windows PC hooked up to it. I wrote a Perl script which grabbed the data from the interface and posted it to a MySQL database on a local Mac OS X Server. PHP scripts on that server query the database and generate all kinds of good graphs, some of which I&#8217;m particularly proud.</p>

<p>But that PC has become incredibly unreliable, requiring a reset four to five times per week. Sometimes the hard drive required unsticking with a firm <em>whack</em>. (I have a special tool for it, a dead TPV&#8212;a solid chunk of brass&#8212;from the nearby boiler.) Over the Christmas break, I decided to replace the PC with an <a href="https://mbed.org/">mbed microcontroller</a>. Unlike a lot of other microcontrollers out there, this one is very friendly with Ethernet, and that was extremely important in choosing it for the solution to this project. Its price, $59, isn&#8217;t too bad, and all I had to do was add a bit of hardware to talk RS-232, rewrite my Perl script as C++, and I&#8217;d be done.</p>

<p>As they say, <a href="http://en.wikipedia.org/wiki/Top_Gear_challenges#How_hard_can_it_be.3F"><em>How hard could it be?</em></a></p>

<p>I&#8217;ve learned a lot in the past two weeks. (Yes, I had two weeks off&#8212;vacation plus company-sponsored break.) First, I learned that the resources I relied upon a decade ago to write the code the first time have dried up. Google finds all kinds of references to 2010 (which arrived two years ago, you know), and a lot of them include &#8220;WS&#8221; in them. Depending on the memory of the Internet for useful things isn&#8217;t necessarily a good idea. (Depending on the memory of the Internet for publicly embarrassing things is probably a whole &#8216;nother story.) Here it is so I at least have a copy, and eventually Google will, too.</p>

<p>Second, I learned a lot about the WS-2010-13 hardware. The manual says specifically that operating it requires &#8220;RTS &lt;-9V and DTR >+9V&#8221;. I thought that was crap because there are only four wires from the <a href="http://en.wikipedia.org/wiki/D-subminiature">DE-9 connector</a>. I reasoned that one must be TxD, one must be RxD, one must be DTR (because it relies on a transition of DTR to know when to wakeup), and the last <em>must</em> be ground, right? <em>Wrong.</em> Indeed, the last wire is RTS and <em>there is no ground</em> that I can find. How this works exactly, I don&#8217;t know, but it does. (I have some guesses, but they&#8217;re not worth repeating here.) Anyway, it&#8217;s acceptable to connect RTS straight to -12VDC, but RxD, TxD and DTR must use level shifters to connect to your processor.</p>

<p>Third, I re-learned that &#8220;high&#8221; in RS-232 is -12VDC (actually, between -3VDC and -25VDC) and &#8220;low&#8221; is +12VDC (+3VDC to +25VDC, of course), so that when you wake up the WS-2010, you should really follow the instructions of the manual and wake it up with a high-low transition on RTS <em>which leaves the RTS at +12VDC</em>. I spent a lot of time waking the interface up with a -12V/+12V/-12V sequence, which woke the interface up, producing the correct response, but which then put it right back to sleep again.</p>

<p>Fourth, I learned the hard way that even after everything works with clipleads, breadboards, and whatnot, you can still royally foul things up when you solder everything in place by reversing V<sub>EE</sub> and V<sub>CC</sub> on your MC1488P. The 1488 will let out a little crackle of sorts and will rapidly cease to function. Even after restoring the power in the correct orientation, it will act much like a low-resistance path between V<sub>EE</sub> and V<sub>CC</sub> and the 1488 will get pretty toasty. Don&#8217;t repeat my mistake.</p>

<p>As to the subtleties of getting the WS-2010-13 to work, it&#8217;s not really all that difficult. Most of the info you need is in the manual, the two exceptions being the interpretation of the wind direction spread and rain gauge return. The former is pretty simple, but the latter presents some problems occasionally. The rain gauge, as I&#8217;m sure you&#8217;re aware, is just a see-saw mechanism. Each tip of the mechanism represents 0.0145636&#8221; of rainfall. (I found that somewhere online a decade ago, and now I can&#8217;t find it at all.) A 12-bit counter in the rain gauge reports back the total number of tips it&#8217;s ever counted. Where things get a bit tricky is that occasionally it reports back a number where some high-order bit has flipped, and then a while later, it&#8217;ll flip back. I.e., you&#8217;ll have a sudden downpour of 80&#8221; of rain and then it&#8217;ll dry up just as suddenly, or vice-versa. I choose to report back the raw count coming out of the counter and let the server figure out what happened since it can &#8220;look back in time&#8221; to see which might be realistic.</p>

<p>If you&#8217;d like to see what the data look like, I report the weather <a href="http://weather.eccles.net/index.php?show365=0">here</a>.</p>

<p>The code to do this with an mbed is shown below, and should be available on the mbed website soon. Note that there&#8217;s an awful lot of debugging feedback code commented out. These lines are <em>quite</em> useful when things are going wrong, believe you me! But since transmitting the serial data takes a while (even via USB), things run much faster when it&#8217;s not needed and is commented out. That I know of, you can uncomment anything and it won&#8217;t affect the timing of the conversation with the WS-2010-13. You should also be able to move this to just about any processor as the mbed-specific code is pretty easy to read as pseudo-code and you can substitute your own subroutine calls.</p>

<p>I hope this turns out to be of some use to somebody out there. If it does, please let me know.</p>

<hr />

<pre>
/*
WeatherStationInterface.cpp
An interface for the LaCrosse Technology WS-2010-13 PC Interface.

Copyright (C)2012 William N. Eccles

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be includied in all copies or substiantial portions of the 
Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECITON WITH
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPClient.h"
#define WAIT_time 0.05
#define D() wait(WAIT_time)

Serial mac(USBTX, USBRX);
Serial ws2010pc(p28, p27); // tx, rx
DigitalOut DTR(p29);
DigitalOut mled0(LED1);
DigitalOut mled1(LED2);
DigitalOut mled2(LED3);
DigitalOut mled3(LED4);

const char *requestDCFtime = "\x01\x30\xCF\x04";
const char *requestData = "\x01\x31\xCE\x04";
const char *requestNextDataset = "\x01\x32\xCD\x04";
const char *requestStatus = "\x01\x35\xCA\x04";

void blink() {
int m0, m1, m2, m3;

    m0 = mled0;
    m1 = mled1;
    m2 = mled2;
    m3 = mled3;

    mled0 = mled1 = mled2 = mled3 = 0;

    mled0 = 1;D();mled1 = 1;D();mled2 = 1;D();mled3 = 1;D();
    mled0 = 0;D();mled1 = 0;D();mled2 = 0;D();mled3 = 0;D();D();D();
    mled3 = 1;D();mled2 = 1;D();mled1 = 1;D();mled0 = 1;D();        
    mled3 = 0;D();mled2 = 0;D();mled1 = 0;D();mled0 = 0;D();D();D();

    mled0 = m0;
    mled1 = m1;
    mled2 = m2;
    mled3 = m3;

// takes 1s with a delay time of 0.05s

    return;
}

int errorHalt( bool L3, bool L2, bool L1, bool L0 ) {
    while (1) {
        mled3 = L0;
        mled2 = L1;
        mled1 = L2;
        mled0 = L3;
        wait(0.5);
        mled3 = false;
        mled2 = false;
        mled1 = false;
        mled0 = false;
        wait(0.5);
    }
    return -1;
}

void showLEDs( bool L3, bool L2, bool L1, bool L0 ) {
        mled3 = L0;
        mled2 = L1;
        mled1 = L2;
        mled0 = L3;
    return;
}

float H( int byte ) {
    return (float)(byte >> 4);
}

float HS( int byte ) {
    return (float)((byte >> 4) & 0x07);
}

float S( int byte ) {
    byte = (byte & 0x0F) >> 3;
    return ((byte==1) ? -1.0 : 1.0);
}

float L( int byte ) {
    byte = (byte & 0x0F);
    return (float)byte;
}

float LS( int byte ) {
    byte = (byte & 0x07);
    return (float)byte;
}

bool wakeup() {
    char aChar;
    bool wokeup = false;

//    mac.printf("Waking up the WS2010...");
    DTR = 1;
    wait(0.05);
    DTR = 0;
    wait(0.05);

    while (ws2010pc.readable()) {
        aChar = ws2010pc.getc();
        if (aChar==3) {
//            mac.printf(" and it's awake.\n\r");
            wokeup = true;
        } else {
//            mac.printf(" and it didn't want to wake up, returning a %i instead of a 3.\n\r",aChar);
            wokeup = false;
        }        
    }
    wait(0.1);
    return wokeup;
}
int sendString( char *theString ) {
    int index = 0;
    while (theString[index]!='\0') {
        ws2010pc.putc((char)theString[index++]);
//        wait(0.005);
    }
    return index;
}

int receiveString( char *theString, int numChars, int timeout_ms ) {
    int index = 0;
    bool done = false;
    int LSRValue;
    Timer aTimer;

    theString[0]='\0';
    aTimer.start();

    while ((aTimer.read_ms()<=timeout_ms)&&(index<numChars)&&(!done)) {    
//    LSRValue = LPC_UART2-> LSR;
//    if ((LSRValue!=97)&&(LSRValue!=96)) { mac.printf("Receive error? LSR is %i.\n\r",LSRValue); }
        if (ws2010pc.readable()) {
            theString[index] = ws2010pc.getc();
            if (theString[index]==0x03) {
                done = true;
            }
            index++;
            theString[index]='\0';
        }
    }
    aTimer.stop();
    return index;
}

// MAIN

int main() {
    int i, j, dataLength, strippedLength, LSRValue;
    int db, dt, spreadraw;
    float t1c, t1f, h1, hif, hic;
    float tic, tif, hi;
    float sp, dir, spread, wc;
    float pr;
    float rn;
    string n1, ni, nwin, nr;
    HTTPText txt;
    HTTPResult r;
    bool error, firstTime, haveData, dataPostedOK;
    char theData[1024], strippedData[1024], httpQuery[1024];
    EthernetNetIf eth;
    HTTPClient http;
    EthernetErr ethErr;
    IpAddr myIpAddr;

    firstTime = true;

// Setup Ethernet
    showLEDs( false, false, false, true );

//    mac.printf("Setting up Ethernet...\n\r");
    ethErr = eth.setup();
    if (ethErr) {
//        mac.printf("Error %d in setup.\n\r", ethErr);
        errorHalt( false, false, false, true );                
    } else {
//        mac.printf("Ethernet setup was successful.\n\r");
    }

    while (1) {
        error = false;

// Setup serial port

        showLEDs( false, false, true, false );

//        mac.printf("Opening serial port...\n\r");
        ws2010pc.baud(9600);
        ws2010pc.format(8, Serial::Even, 2);

// Wait six minutes unless this is the first time through this

        showLEDs( false, false, true, true );

        if (!firstTime) {
            DTR = 1;
            mac.printf("Sleeping for six minutes... ");
            i=6;
            while (i>=1) {
                mac.printf("%i...",i--);
                for (j=0; j<12; j++) {
                    blink();
                    wait(4);
                }
            }
            mac.printf("\n\r");
        }

        firstTime = false;

// Wakeup the 2010

        showLEDs( false, true, false, false );

        error = !wakeup();

// Ask the 2010 for data until there is no more to be had.


        haveData = true;
        while (haveData&&(!error)) {
            showLEDs( false, true, false, true );
            mac.printf("Requesting data.... ");
            dataLength = sendString((char *)requestData);
            dataLength = receiveString(theData, 128, 500);
            mac.printf("Received %i characters.\n\r",dataLength);
            if (dataLength<2) {
                mac.printf("No data received.\n\r");
                haveData=false;
            } else if ((theData[0]!=2)||(theData[dataLength-1]!=3)) {
                mac.printf("Bad dataset received.\n\r");
                haveData = false;
            } else if ((theData[1]==1)&&(theData[2]==16)) {
                mac.printf("No data available at the moment. Will retry later.\n\r");
                haveData = false;
            }

            if (haveData) {
/*
                mac.printf("The raw dataset has %i characters: ",dataLength);
                i=0;
                while (i<dataLength) {
                    mac.printf("%02X ",theData[i++]);
                }
                mac.printf("\n\r");
*/
// We have some data. Now strip out the ENQ escape sequences                        

                strippedLength=0;
                for (j=0; j<dataLength; j++) {
                    if (theData[j]==5) {
                        strippedData[strippedLength++]=theData[j+1]-16;
                        j++;
                    } else {
                        strippedData[strippedLength++]=theData[j];
                    }
                }
/*
                mac.printf("No ENQ  dataset has %i characters: ",strippedLength);
                i=0;
                while (i<strippedLength) {
                    mac.printf("%02X ",strippedData[i++]);
                }
                mac.printf("\n\r");
*/          
// Get rid of leading STX, and trailing checksum and ETX. (Leave the length as a pad in [0].

                for (j=2; j<strippedLength-2; j++) {
                    strippedData[j-2]=strippedData[j];
                }
                strippedLength = strippedLength-4;

// Show the user what we have.
/*
                mac.printf("SOHless dataset has %i characters: ",strippedLength);
                i=0;
                while (i<strippedLength) {
                    mac.printf("%02X ",strippedData[i++]);
                }
                mac.printf("\n\r");
*/
// Now decode everything.

// dataset ID and time before now (in minutes)
                db = strippedData[1]*256+strippedData[0];
                dt = strippedData[3]*256+strippedData[2];

// remove the header bytes (note that I'm leaving one byte in strippedData[0] so that the index value lines up with
// the index values of the bytes in the WS-2010 documentation, i.e., L25 will correspond to the low nybble of strippedData[25])

                for (j=3; j<=strippedLength; j++) {
                    strippedData[j-3]=strippedData[j];
                }
                strippedLength = strippedLength - 3;
/*
                mac.printf("Hdrless dataset has %i characters: ",strippedLength);
                i=0;
                while (i<strippedLength) {
                    mac.printf("%02X ",strippedData[i++]);
                }
                mac.printf("\n\r");
*/
//                mac.printf("Read dataset id %i from %i minutes ago.\n\r", db, dt);

// reading: temperature 1, humidity 1 and heat index

                t1c = (LS(strippedData[2])*10.0+H(strippedData[1])+L(strippedData[1])/10.0)*S(L(strippedData[2]));
                t1f = 9.0/5.0*t1c+32.0;
                h1 = LS(strippedData[3])*16.0+H(strippedData[2]);
                n1 = (S(L(strippedData[3]))==-1) ? "NEW" : "OLD";

                if (t1f>70) {
                    hif = -42.379+2.04901523*t1f+10.14333127*h1-0.22475541*t1f*h1-((6.83783e-3)*t1f*t1f)-((5.481717e-2)*h1*h1)+((1.22874e-3)*t1f*t1f*h1)+((8.5282e-4)*t1f*h1*h1)-((1.99e-6)*t1f*t1f*h1*h1);
                    hic = (hif-32.0)*5.0/9.0;
                } else {
                    hif = t1f;
                    hic = t1c;
                }

//                mac.printf("    T1C:%5.2f T1F:%5.2f H1:%5.2f HIF:%5.2f HIC:%5.2f %s \n\r", t1c, t1f, h1, hif, hic, n1);

// reading: indoor temperature and humidity

                tic = (LS(strippedData[29])*10+H(strippedData[28])+L(strippedData[28])/10)*S(L(strippedData[29]));
                tif = 9.0/5.0*tic+32;
                hi = LS(strippedData[30])*16+H(strippedData[29]);
                ni = (S((int)L(strippedData[30]))==-1) ? "NEW" : "OLD";

//                mac.printf("    TIC:%3.2f TIF:%3.2f HI:%3.2f %s \n\r", tic, tif, hi, ni);

// reading: wind speed, direction and directional spread, wind chill

                sp = (HS(strippedData[24])*100.0+L(strippedData[24])*10.0+H(strippedData[23])+L(strippedData[23])/10.0)*0.6215;
                dir = (float)((int)L(strippedData[26])%4)*100.0+H(strippedData[25])*10.0+L(strippedData[25]);
                spreadraw = (int)(L(strippedData[26])/4);
                switch (spreadraw) {
                case 1:
                    spread = 22.5;
                    break;
                case 2:
                    spread = 45;
                    break;
                case 3:
                    spread = 67.5;
                    break;
                default:
                    spread = 0;
                }
                nwin = (S((int)H(strippedData[24]))==-1) ? "NEW" : "OLD";

//                mac.printf("    SP: %5.2f DIR:%5.2f SPREADRAW:%i SPREAD:%5.2f %s \n\r", sp, dir, spreadraw, spread, nwin);

                if ((t1f<=50)&&(sp>3)) {
                    wc = 35.74+(0.6215*t1f)-(35.75*pow(sp,(float)0.16))+(0.4275*t1f*pow(sp,(float)0.16));
                } else {
                    wc = t1f;
                }

//                mac.printf("    WC: %5.2f\n\r",wc);

// reading: air pressure

                pr = (H(strippedData[27])*100.0+L(strippedData[27])*10.0+H(strippedData[26])+200.0)/33.775;
//                mac.printf("    PR: %6.3f\n\r",pr);

// Ah, rain. The see-saw tips, and each tip represents 0.0145636 inches of rain.

                rn = (strippedData[22]&0x7F)*256+strippedData[21];
                nr = (S((int)H(strippedData[22]))==-1) ? "NEW" : "OLD";

//                mac.printf("    RN: %7.1f NR %s\n\r",rn,nr);

// Generate the query string

                j = sprintf(httpQuery, "http://www.example.com/yourquery.php?datasetnumber=%06d&timedelta=%06d&t1=%.1f&h1=%.1f&n1=%s&hif=%.1f&hic=%.1f&ti=%.1f&hi=%.1f&ni=%s&sp=%.1f&dir=%.1f&spread=%.1f&nwin=%s&wc=%.1f&pr=%.7f&rn=%.1f&nr=%s",db,dt,t1f,h1,n1,hif,hic,tif,hi,ni,sp,dir,spread,nwin,wc,pr,rn,nr);
//                mac.printf("The query is \"%s\"\n\r",httpQuery);

// Now try and post the data. Make sure the response from the server doesn't exceed capacity of the buffer "txt".

                showLEDs( false, true, true, false );

                r = http.get(httpQuery, &txt);
                if(r==HTTP_OK) {
//                    mac.printf("HTTP result:\"%s\"\n\r", txt.gets());
                    dataPostedOK = true; 
                } else {
//                    mac.printf("HTTP error #%d\n\r", r);
                    dataPostedOK = false;
                }

                if (dataPostedOK) {
                    showLEDs( false, true, true, true );
                    error = !wakeup();
                    mac.printf("Requesting next dataset.... ");
                    dataLength = sendString((char *)requestNextDataset);
                    dataLength = receiveString(theData, 128, 300);
                    mac.printf("Received %i characters.\n\r",dataLength);
                    if (dataLength<2) {
                        mac.printf("No data received.\n\r");
                        haveData=false;
                        error = true;
                    } else if ((theData[0]!=2)||(theData[dataLength-1]!=3)) {
                        mac.printf("Bad dataset received.\n\r");
                        haveData = false;
                        error = true;
                    } else if ((theData[1]==1)&&(theData[2]==16)) {
                        mac.printf("No data available at the moment. Will retry later.\n\r");
                        haveData = false;
                    }
                }
            } // end of "if (haveData)"
        }      
    }

    errorHalt( true, true, true, true );
    return 0;

}

</pre>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2012/01/the-lacrosse-technology-ws-201.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2012/01/the-lacrosse-technology-ws-201.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Programming</category>
            
            <pubDate>Mon, 02 Jan 2012 13:07:57 -0500</pubDate>
        </item>
        
        <item>
            <title>...But not for Me: Netflix&apos;s plan to kill the DVD is working | SplatF</title>
            <description><![CDATA[<p>Of the <strike>184</strike> 185 discs in my queue, 15 are available on &#8220;Watch Instantly.&#8221; So Reed&#8217;s decision hasn&#8217;t changed my decision to keep using discs, and until the studios give up on discs as a whole, that likely won&#8217;t change.</p>

<p>I doubt Netflix&#8212;or, indeed, any streaming provider, Apple included&#8212;will be able to get the studios to give up the disc market until the studios have their own content distribution mechanisms.</p>

<p>Successful content distribution mechanism, that is.</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/but-not-for-me-netflixs-plan-t.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/but-not-for-me-netflixs-plan-t.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Random</category>
            
            <pubDate>Tue, 25 Oct 2011 20:55:20 -0500</pubDate>
        </item>
        
        <item>
            <title>Security Update 2011-006 Server (Snow Leopard) is not PHP Neutral</title>
            <description><![CDATA[<p>This update is not PHP-neutral. Apple installs PHP 5.3.6 over your custom PHP installation.</p>

<p>I looked at the <code>configure</code> that Apple uses and it looks about like our usual configure info.</p>

<p>So the steps required to make this all work with what we have from our previous expeditions:</p>

<ol>
<li><p>Keep copies of the Apple binaries and how they configured their installation:</p>

<pre><code>$ php -i &gt; ~/php-config-2011.10.20
$ sudo cp /usr/libexec/apache2/libphp5.so /usr/libexec/apache2/libphp5.so.old
$ sudo cp /usr/bin/php /usr/bin/php.old
</code></pre></li>
<li><p>Get the 5.3.8 tarball and unpack it. (5.3.8 seems to be a good drop-in replacement for 5.3.6, which is where I was.)</p></li>
<li><p>Move the <em>libpng</em> headers around a bit so that <code>configure</code> doesn&#8217;t find old headers for use with the new libraries:</p>

<pre><code>$ sudo mv /usr/X11R6/include/png.h /usr/X11R6/include/png.h_old
</code></pre></li>
<li><p>Append the new flags to the configure statement and configure away:</p>

<pre><code>$ ./configure  '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--sysconfdir=/private/etc' '--with-apxs2=/usr/sbin/apxs' '--enable-cli' '--with-config-file-path=/etc' '--with-libxml-dir=/usr' '--with-openssl=/usr' '--with-kerberos=/usr' '--with-zlib=/usr' '--enable-bcmath' '--with-bz2=/usr' '--enable-calendar' '--with-curl=/usr' '--enable-exif' '--enable-ftp' '--with-gd' '--with-jpeg-dir=/usr/local' '--with-png-dir=/usr/local' '--enable-gd-native-ttf' '--with-ldap=/usr' '--with-ldap-sasl=/usr' '--enable-mbstring' '--enable-mbregex' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-mysql-sock=/var/mysql/mysql.sock' '--with-iodbc=/usr' '--enable-shmop' '--with-snmp=/usr' '--enable-soap' '--enable-sockets' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--with-xmlrpc' '--with-iconv-dir=/usr' '--with-xsl=/usr' '--with-pcre-regex' '--with-freetype-dir=/usr/X11R6' '--enable-zend-multibyte' '--enable-zip'
</code></pre></li>
<li><p>Use four cores to make PHP. It&#8217;s a lot faster to use the <code>-j 4</code> option, and if you have more cores, make the number match:</p>

<pre><code>$ make -j 4
</code></pre></li>
<li><p>Install.</p>

<pre><code>$ sudo make install
</code></pre></li>
<li><p>Restart Apache.</p>

<pre><code>$ sudo apachectl restart
</code></pre></li>
<li><p>Clean up what we did to the <em>libpng</em> headers:</p>

<pre><code>$ sudo mv /usr/X11R6/include/png.h_old /usr/X11R6/include/png.h
</code></pre></li>
</ol>

<p>Done.</p>

<p>Alternatively, if you have already installed 5.3.8 before, all you need to do is:</p>

<ol>
<li><p>Keep copies of the Apple binaries and how they configured their installation:</p>

<pre><code>$ php -i &gt; ~/php-config-2011.10.20
$ sudo cp /usr/libexec/apache2/libphp5.so /usr/libexec/apache2/libphp5.so.old
$ sudo cp /usr/bin/php /usr/bin/php.old
</code></pre></li>
<li><p>Install.</p>

<pre><code>$ sudo make install
</code></pre></li>
<li><p>Restart Apache.</p>

<pre><code>$ sudo apachectl restart
</code></pre></li>
</ol>

<p>Done!</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/security-update-2011-006-serve.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/security-update-2011-006-serve.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">MacOS X Server</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">PHP</category>
            
            <pubDate>Sun, 23 Oct 2011 14:28:49 -0500</pubDate>
        </item>
        
        <item>
            <title>After weak quarter, Apple CEO sees record profit ahead | USATODAY.com</title>
            <description><![CDATA[<blockquote>
  <p>Apple on Tuesday let down Wall Street on earnings as iPhone sales came up short of forecasts.</p>
</blockquote>

<p>Whose forecasts, Apple&#8217;s? No, Apple did better than its own expectations, and yet we&#8217;re <em>still</em> listening to the idiots on Wall Street? (Other than the ones in the park, that is.)</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/after-weak-quarter-apple-ceo-s.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/after-weak-quarter-apple-ceo-s.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
            <pubDate>Wed, 19 Oct 2011 18:12:04 -0500</pubDate>
        </item>
        
        <item>
            <title>On Politics the Way It Should Be</title>
            <description><![CDATA[<p>Politics.</p>

<p>We all hate politics. The name calling. The exaggerated rhetoric. Partisanship. <em>Oh!</em> the partisanship&#8230;</p>

<p>Mudslinging? <em>Pff!</em> That&#8217;s child&#8217;s play.</p>

<p>But since I&#8217;ve <a href="http://tollandrepublicans.com/2011-bio-eccles/">entered the race for Planning and Zoning Commission</a> here in Tolland, I&#8217;ve seen a different kind of politics, a kind of politics that I believe Madison all those other men had in mind so many years ago. It&#8217;s a kind of politics I actually <em>like.</em> It&#8217;s somehow pure and clean, at least in the race for P&amp;Z.</p>

<p>It&#8217;s the politics of <em>what&#8217;s best for the town,</em> where the candidates are putting the needs of the town first, instead of putting their re-election prospects on top. Local Republicans are campaigning under the banner &#8220;Putting Tolland Citizens First.&#8221; And as I chat with other P&amp;Z candidates, I&#8217;m impressed with just how much we genuinely care about Tolland and its citizens.</p>

<p>Better yet, I am supremely impressed with the reactions of the people of Tolland to the political process. How do I know?</p>

<p>I know because I have witnessed firsthand how Tolland residents reacted to my standing at the <a href="http://maps.google.com/maps/ms?ie=UTF&amp;msa=0&amp;msid=
217567772006885052428.0004af5ba9fc673397e62">Exit 68 westbound entrance ramp</a> for I-84. In the hour-and-a-quarter that I stood there, waving my signs, waving my hands, smiling, and greeting people, I was met with exactly <em>one</em> &#8220;thumbs down&#8221;. That&#8217;s <em>it</em> for negative reactions. Of course, I didn&#8217;t get smiles and waves from everybody, but those people who reacted at all reacted in a friendly way. Lots of waves, lots of smiles.</p>

<p>And yet I was clearly out there as a candidate for political office, as an aspiring <em>politician</em>, a word that most people use as an epithet. But that didn&#8217;t stop people from being <em>nice.</em> Even though I was, in essence, nobody special to the people who drove by, I was out there waving, being nice. And they were nice in return.</p>

<p>My observations lead me to believe that from both the candidate&#8217;s view and from the citizen&#8217;s view, this is the way politics should be. It should be a collaborative effort. It should be a friendly undertaking. Though we may differ in how we get from <em>here</em> to <em>there</em>, I think we&#8217;re all on the same page that politics like this is how we take care of our community and our citizens.</p>

<p>And that&#8217;s how it should be. Right, Mr. Madison?</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/on-politics-the-way-it-should.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/on-politics-the-way-it-should.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Politics</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">Tolland</category>
            
            <pubDate>Sat, 15 Oct 2011 14:51:59 -0500</pubDate>
        </item>
        
        <item>
            <title>*!#% That Siri Says is Siri-ously Funny</title>
            <description><![CDATA[<p>Language notwithstanding, this is some siri-ously funny @#%*.</p>

<p>Ever wonder what happens when Apple&#8217;s Siri is asked something&#8230; offbeat?</p>

<p><a href="http://shitthatsirisays.tumblr.com/">Here&#8217;s the answer.</a></p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/-that-siri-says-is-siri-ously.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/-that-siri-says-is-siri-ously.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">iOS</category>
            
            <pubDate>Thu, 13 Oct 2011 21:32:54 -0500</pubDate>
        </item>
        
        <item>
            <title>iPhone 4S Pre-Orders Top One Million in First 24 Hours | Apple</title>
            <description><![CDATA[<p><i>Oh! The humanity!</i></p>

<p>It wasn&#8217;t two million phones in 24 hours, so certainly this is a failure. You&#8217;d better sell your Apple stock now. I&#8217;ll take it off your hands for a generous $100/share&#8230;</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/iphone-4s-pre-orders-top-one-m.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/iphone-4s-pre-orders-top-one-m.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">iPhone</category>
            
            <pubDate>Mon, 10 Oct 2011 18:24:48 -0500</pubDate>
        </item>
        
        <item>
            <title>Am I the Only One With This Unasked Question?</title>
            <description><![CDATA[<p>People do <em>just die</em> without any advance warning or with very short, very fast declines. It happens.</p>

<p>But I have to wonder, given Steve Jobs&#8217; propensity to control everything about &#8220;the message,&#8221; <em>Was his life supported just long enough to make it past Tuesday&#8217;s &#8220;Let&#8217;s Talk iPhone&#8221; event?</em></p>

<p>If that were the case, that would only serve to strengthen my admiration for him, and to deepen my respect for his family.</p>

<p>His final bow, timed with perfection.</p>

<p>His last &#8220;one more thing,&#8221; delivered knowing he&#8217;d done what was right for Apple.</p>

<p>His family, knowing that the event would herald the end of his life.</p>

<p>&#8230;</p>

<p>Steve, &#8220;Thanks for coming.&#8221; We&#8217;re going to miss you.</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/am-i-the-only-one-with-this-un.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/am-i-the-only-one-with-this-un.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
            <pubDate>Sun, 09 Oct 2011 11:50:45 -0500</pubDate>
        </item>
        
        <item>
            <title>Thought Different.</title>
            <description><![CDATA[<p><a href="http://www.bill.eccles.net/bills_words/assets_c/2011/10/thought_different-308.html" onclick="window.open('http://www.bill.eccles.net/bills_words/assets_c/2011/10/thought_different-308.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.bill.eccles.net/bills_words/assets_c/2011/10/thought_different-thumb-512x384-308.png" width="512" height="384" alt="thought_different.png" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/thought-different.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/thought-different.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
            <pubDate>Wed, 05 Oct 2011 21:00:31 -0500</pubDate>
        </item>
        
        <item>
            <title>Steve Jobs Died Today.</title>
            <description>
</description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/steve-jobs-died-today.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/steve-jobs-died-today.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
            <pubDate>Wed, 05 Oct 2011 20:31:27 -0500</pubDate>
        </item>
        
        <item>
            <title>Sweept: iPod nano with Multi-Touch. | Apple</title>
            <description><![CDATA[<p>Shawn Blanc points out <a href="http://www.apple.com/ipodnano/">the new homepage for the iPod <em>nano</em></a> with its animated Mickey Mouse watch face.</p>

<p>Worth noting is that the second hand is swept (i.e., it moves in less-than-one-second increments&#8212;5Hz, I think&#8212;just like a real mechanical movement watch) and that the minute and hour hands&#8217; motions emulate that of a geartrain. That is, they, too, move with each tiny tick of the second hand, just as a real watch does. The motion is beautifully imperceptible, just like a real watch. It&#8217;s stunning.</p>

<p>On the other hand (<em>ahem</em>), the clocks on the Mac OS X Dashboard have driven me nuts for years. The programmers went to all the trouble to simulate the bounce in the second hand&#8217;s quartz-driven motion, but then update the minute and hour hands only at the top of the minute. That that detail made it through the scrutiny of other folks in the shop, or maybe even Steve himself, is surprising.</p>

<p>These nano guys got it right. Finally.</p>

<p>[via <a href="http://shawnblanc.net/2011/10/new-nano/">ShawnBlanc.net</a>]</p>

<p><i>(For those of you arriving from ShawnBlanc.net, <em>Welcome!</em> Feel free to add my RSS feed to your newsreader. I post a fair mix of of Apple observations, Mac OS X Server experiences, and Conservative topics. I&#8217;m still ad free, supporting this on my own, and I&#8217;m not beholden to anybody but myself, so the mix of stuff you&#8217;ll see is pretty varied. In any case, posts are infrequent enough that you won&#8217;t be overwhelmed. And, as always, feel free to contact me however you like. I think there&#8217;s a link over there somewhere&#8230;)</i></p>

<p><strong>Update - 10/11/2011</strong></p>

<p>Correspondent Steve McDonald has this unfortunate bit of news:</p>

<blockquote>
  <p>Hi Bill and Shawn,</p>

<p>I thought you guys would be interested to know that while the iPod
nano <em>website</em> guys got it right with the sweeping hour and minute
hands, the iPod nano <em>application</em> guys did not: the hour and minute
hands only update at the top of the minute on the nano itself. (So you
don&#8217;t have to ask, yeah, this is with the brand new nano).</p>

<p>Seems odd to make the effort to have the second hand sweep and then
just not bother with the other hands.</p>

<p>-Steve</p>
</blockquote>

<p>Sorely disappointed, I am.</p>

<p>However, <a href="http://hints.macworld.com/article.php?story=20111007085929531">this hint</a> over at Mac OS X Hints tells us how to make a web clipping for the dashboard of the Mickey Mouse watch, complete with smoothly-moving hands. Give it a try. (I haven&#8217;t yet, so you&#8217;ll be the first!)</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/10/sweept-ipod-nano-with-multi-to.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/10/sweept-ipod-nano-with-multi-to.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
            <pubDate>Wed, 05 Oct 2011 16:04:40 -0500</pubDate>
        </item>
        
        <item>
            <title>iPhoto vs SWYP</title>
            <description><![CDATA[<p><a href="http://www.artefactgroup.com/#/content/swyp">&#8220;See What You Print.&#8221;</a></p>

<p>Brilliant.</p>

<p>Why doesn&#8217;t iPhoto make printing this easy?</p>
]]></description>
            <link>http://www.bill.eccles.net/bills_words/2011/09/iphoto-vs-swyp.html</link>
            <guid>http://www.bill.eccles.net/bills_words/2011/09/iphoto-vs-swyp.html</guid>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">Apple</category>
            
            <pubDate>Thu, 29 Sep 2011 17:02:12 -0500</pubDate>
        </item>
        
    </channel>
</rss>

