I read an article1 on ChicagoTribune.com which got me wondering, If SGK pulled PP’s funding, how many more women would die of breast cancer? The consequences, according to the Interwebs, would be dire.
However, the numbers indicate that SGK’s funding of PP’s clinical breast exams might be resulting in more cancer deaths than if SGK were funding mammograms directly.
Assume that PP used all of SGK’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.)
Now let’s do the math.
$650,000*5 = $3,250,000.
Mammograms funded by SGK through PP in those five years: 6,400.1
Total SGK funding used for mammograms (via pass-through grants to PP) at a high-end cost of $125 per mammogram2: 6,400*$125 = $800,000
Remaining funds used for clinical breast exams (CBEs) at PP: $3,250,000-$800,000 = $2,450,000
Breast cancer screenings performed by PP in the past five years: 170,0001
Cost per CBE performed by PP: $2,450,000/170,000 = about $15.
Unfortunately, the U.S. Preventive Services Task Force (USPSTF) can’t find evidence that the CBE is effective. Only mammograms have been proven to be effective.3 About CBE’s, PP says this:
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 “a good tool” when followed with mammograms and other tests as needed, she said.1 (emphasis added)
Clearly, funding of CBEs is diverting resources from more effective exams, but how many?
More math:
Amount of money spent on CBEs performed by PP: $2,450,000.
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.
If the SGK money had been used for mammograms in the last five years:
Number of women per year, ages 39-49, whose lives might have been saved: 19,600/1,904/5 = 2.4
Number of women per year, ages 50-59, whose lives might have been saved: 19,600/1,339/5 = 3.
Number of women per year, ages 60-69, whose lives might have been saved: 19,600/377/5 = 10.
So if you were in the driver’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?
The Interwebs disagree with you.
One final note: Outside of these numbers, it’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’s loss is also calculable in human terms. But until SGK pulls funding from PP and we can see the cost to SGK’s fundraising, we won’t know that effect.
1 Surprises in Komen-Planned Parenthood dustup: How cancer screening is done and who pays for it, ChicagoTribune.com
2 How Much Does a Mammogram Cost?, CostHelper.com
3 Screening for Breast Cancer, U.S. Preventive Services Task Force
4 Screening for Breast Cancer An Update for the U.S. Preventive Services Task Force, Table 1, U.S. Preventive Services Task Force
First, take a deep breath, then promise to stick with me to the end.
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 (could be) a benefit to women’s health, the very cause at the center of the argument.
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’s no reason why a private, non-profit organization can’t decide to withdraw funding from something which has been accused—rightly or wrongly—of misconduct. SGK has decided its in its best interests to withdraw support of organizations which might stink.
So, does PP stink? It doesn’t matter. SGK is following its own policies, as it should.
Was it politically motivated? SGK says “No.” Before you go dragging out words like “failed gubernatorial campaign,” remember that SGK supports cancer research, not the abortion and reproductive health businesses. So whether it’s politically motivated or not, it’s certainly in their right to drop funding for an organization which spent SGK’s money on services other than early cancer detection.
Is this a change in SGK’s core values? No. SGK’s mission statement reads as follows:
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.
You’ll note that it does not say:
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 by funding Planned Parenthood.
So you can—and should—continue to support SGK if you wish to fund the continued fight against breast cancer.
And you should drop the outrage. Because I think there’s a potential benefit which is being overlooked—if SGK lives up to its promise of “ensuring quality of care for all,” that is.
PP has already said that the SGK funds are already well on their way towards being replaced—$400K or the $648K in less than 24 hours isn’t a bad fundraising record. They have also said that the services funded by that $648K will still be available, regardless.
So far, the PP patient population is covered. If SGK “ensur[es] quality of care for all,” then there’s a potential benefit—an upside!
If SGK lives up to its promise, it will put that $648K towards cancer prevention. That’s what you should be talking to SGK about. Not about defunding PP. Not about abortion. Not about political motivations. What you should 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.
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—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’s an awful lot of additional women who have access to care—and may be another segment of the population which would go to a clinic but wouldn’t set foot in a PP office.
In the “worst case,” 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.
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 more 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’s core mission.) In the end, it’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.
So… if not now, then when should you be outraged?
— When SGK doesn’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.
— When SGK doesn’t put the funds into the hands of the people who need it most by funding screenings directly.
Then I’d expect to see this kind of outrage again.
But, until then, cool your jets. Please.
I just removed swimming in the Arctic Ocean from my bucket list.
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’t like about the system (and there’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’t do anything useful for me didn’t help.
So for the last decade, I’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’m particularly proud.
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 whack. (I have a special tool for it, a dead TPV—a solid chunk of brass—from the nearby boiler.) Over the Christmas break, I decided to replace the PC with an mbed microcontroller. 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’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’d be done.
As they say, How hard could it be?
I’ve learned a lot in the past two weeks. (Yes, I had two weeks off—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 “WS” in them. Depending on the memory of the Internet for useful things isn’t necessarily a good idea. (Depending on the memory of the Internet for publicly embarrassing things is probably a whole ‘nother story.) Here it is so I at least have a copy, and eventually Google will, too.
Second, I learned a lot about the WS-2010-13 hardware. The manual says specifically that operating it requires “RTS <-9V and DTR >+9V”. I thought that was crap because there are only four wires from the DE-9 connector. 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 must be ground, right? Wrong. Indeed, the last wire is RTS and there is no ground that I can find. How this works exactly, I don’t know, but it does. (I have some guesses, but they’re not worth repeating here.) Anyway, it’s acceptable to connect RTS straight to -12VDC, but RxD, TxD and DTR must use level shifters to connect to your processor.
Third, I re-learned that “high” in RS-232 is -12VDC (actually, between -3VDC and -25VDC) and “low” 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 which leaves the RTS at +12VDC. 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.
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 VEE and VCC 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 VEE and VCC and the 1488 will get pretty toasty. Don’t repeat my mistake.
As to the subtleties of getting the WS-2010-13 to work, it’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’m sure you’re aware, is just a see-saw mechanism. Each tip of the mechanism represents 0.0145636” of rainfall. (I found that somewhere online a decade ago, and now I can’t find it at all.) A 12-bit counter in the rain gauge reports back the total number of tips it’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’ll flip back. I.e., you’ll have a sudden downpour of 80” of rain and then it’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 “look back in time” to see which might be realistic.
If you’d like to see what the data look like, I report the weather here.
The code to do this with an mbed is shown below, and should be available on the mbed website soon. Note that there’s an awful lot of debugging feedback code commented out. These lines are quite 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’s not needed and is commented out. That I know of, you can uncomment anything and it won’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.
I hope this turns out to be of some use to somebody out there. If it does, please let me know.
/*
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 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 (i70) {
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;
}
Of the 184 185 discs in my queue, 15 are available on “Watch Instantly.” So Reed’s decision hasn’t changed my decision to keep using discs, and until the studios give up on discs as a whole, that likely won’t change.
I doubt Netflix—or, indeed, any streaming provider, Apple included—will be able to get the studios to give up the disc market until the studios have their own content distribution mechanisms.
Successful content distribution mechanism, that is.
This update is not PHP-neutral. Apple installs PHP 5.3.6 over your custom PHP installation.
I looked at the configure that Apple uses and it looks about like our usual configure info.
So the steps required to make this all work with what we have from our previous expeditions:
Keep copies of the Apple binaries and how they configured their installation:
$ php -i > ~/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.oldGet 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.)
Move the libpng headers around a bit so that
configuredoesn’t find old headers for use with the new libraries:$ sudo mv /usr/X11R6/include/png.h /usr/X11R6/include/png.h_oldAppend the new flags to the configure statement and configure away:
$ ./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'Use four cores to make PHP. It’s a lot faster to use the
-j 4option, and if you have more cores, make the number match:$ make -j 4Install.
$ sudo make installRestart Apache.
$ sudo apachectl restartClean up what we did to the libpng headers:
$ sudo mv /usr/X11R6/include/png.h_old /usr/X11R6/include/png.h
Done.
Alternatively, if you have already installed 5.3.8 before, all you need to do is:
Keep copies of the Apple binaries and how they configured their installation:
$ php -i > ~/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.oldInstall.
$ sudo make installRestart Apache.
$ sudo apachectl restart
Done!
Apple on Tuesday let down Wall Street on earnings as iPhone sales came up short of forecasts.
Whose forecasts, Apple’s? No, Apple did better than its own expectations, and yet we’re still listening to the idiots on Wall Street? (Other than the ones in the park, that is.)
Politics.
We all hate politics. The name calling. The exaggerated rhetoric. Partisanship. Oh! the partisanship…
Mudslinging? Pff! That’s child’s play.
But since I’ve entered the race for Planning and Zoning Commission here in Tolland, I’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’s a kind of politics I actually like. It’s somehow pure and clean, at least in the race for P&Z.
It’s the politics of what’s best for the town, 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 “Putting Tolland Citizens First.” And as I chat with other P&Z candidates, I’m impressed with just how much we genuinely care about Tolland and its citizens.
Better yet, I am supremely impressed with the reactions of the people of Tolland to the political process. How do I know?
I know because I have witnessed firsthand how Tolland residents reacted to my standing at the Exit 68 westbound entrance ramp 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 one “thumbs down”. That’s it for negative reactions. Of course, I didn’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.
And yet I was clearly out there as a candidate for political office, as an aspiring politician, a word that most people use as an epithet. But that didn’t stop people from being nice. 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.
My observations lead me to believe that from both the candidate’s view and from the citizen’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 here to there, I think we’re all on the same page that politics like this is how we take care of our community and our citizens.
And that’s how it should be. Right, Mr. Madison?
Language notwithstanding, this is some siri-ously funny @#%*.
Ever wonder what happens when Apple’s Siri is asked something… offbeat?
Oh! The humanity!
It wasn’t two million phones in 24 hours, so certainly this is a failure. You’d better sell your Apple stock now. I’ll take it off your hands for a generous $100/share…
People do just die without any advance warning or with very short, very fast declines. It happens.
But I have to wonder, given Steve Jobs’ propensity to control everything about “the message,” Was his life supported just long enough to make it past Tuesday’s “Let’s Talk iPhone” event?
If that were the case, that would only serve to strengthen my admiration for him, and to deepen my respect for his family.
His final bow, timed with perfection.
His last “one more thing,” delivered knowing he’d done what was right for Apple.
His family, knowing that the event would herald the end of his life.
…
Steve, “Thanks for coming.” We’re going to miss you.
Shawn Blanc points out the new homepage for the iPod nano with its animated Mickey Mouse watch face.
Worth noting is that the second hand is swept (i.e., it moves in less-than-one-second increments—5Hz, I think—just like a real mechanical movement watch) and that the minute and hour hands’ 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’s stunning.
On the other hand (ahem), 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’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.
These nano guys got it right. Finally.
[via ShawnBlanc.net]
(For those of you arriving from ShawnBlanc.net, Welcome! 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’m still ad free, supporting this on my own, and I’m not beholden to anybody but myself, so the mix of stuff you’ll see is pretty varied. In any case, posts are infrequent enough that you won’t be overwhelmed. And, as always, feel free to contact me however you like. I think there’s a link over there somewhere…)
Update - 10/11/2011
Correspondent Steve McDonald has this unfortunate bit of news:
Hi Bill and Shawn,
I thought you guys would be interested to know that while the iPod nano website guys got it right with the sweeping hour and minute hands, the iPod nano application guys did not: the hour and minute hands only update at the top of the minute on the nano itself. (So you don’t have to ask, yeah, this is with the brand new nano).
Seems odd to make the effort to have the second hand sweep and then just not bother with the other hands.
-Steve
Sorely disappointed, I am.
However, this hint 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’t yet, so you’ll be the first!)
A lot of hubbub has been made of Netflix’s decision to spin off its disc-in-the-mail service. The reason I kept using Netflix even after the price increase was the complementary combination of (1) “whatever I might want to watch so long as I can wait for it” and (2) “some of whatever I might want to watch if I want to watch it instantly”.
Since these are no longer bundled with each other, I now feel free to shop around for my instant streaming service. As for discs by mail? I’ll shop for them, too, maybe at the local Redbox.
I don’t think Netflix is worried about the latter, but I’d guess they’re not expecting the former.
Obama: “The odds of me being reelected are much higher than the odds of me being elected in the first place.”
In related news, the odds of his using a possessive with a gerund? Exactly zero.
The problem with Obama’s math is the underlying assumption that the government has to spend money that it doesn’t have in the first place. It’s maddening to watch this man repeat Act I: Promise big spending, then go look for money between the couch cushions.
Who ends up happy with that kind of nonsensical approach?
Maybe you don’t choose to believe Rick Perry’s assertion that Social Security is a Ponzi scheme—even though he is technically correct—because he’s a politician.
So let’s ask Nobel laureate Milton Friedman what he thinks. Mr. Friedman titled this article on Social Security, “The Biggest Ponzi Scheme on Earth”…
…in 1999.
If you don’t trust the dictionary and a Nobel Prize-winning economist, then you truly have your head buried… Let’s just say it’s buried in the sand, shall we?
And then let’s ask Why do you care in the first place? Why are the Republican candidates jumping all over each other to defend the “good name” of Social Security? Why are Democrats doing the same? Who cares?
“What’s in a name? That which we call a rose
By any other name would smell as sweet.”
Romeo and Juliet (II, ii, 1-2)
Similarly, when I step in a pile of dog poo (or, more likely, run it over with a mower), I’m not confused by fancy names like “Social Security” or “a compact between the generations.”
It’s still a Ponzi scheme. Period.
Along with all the other liberal ilk of his kind, John Gruber cherry picks this quote from The Economist:
The Economist on Texas governor Rick Perry’s crackpot claim that Social Security “is a Ponzi scheme”:
No Ponzi scheme in the history of the world has ever lasted 75 years.
Just because no other Ponzi scheme has lasted 75 years doesn’t make Social Security any less of a Ponzi scheme. If it walks like a duck and quacks like a duck1 (before the liberal mainstream media redefines “duck,” of course2), then it is a duck, no matter how old it is.
Besides, who really cares if anybody calls Social Security a Ponzi scheme? Does that change the fact that Social Security is an insolvent, underfunded mess?
1 By all definitions of “Ponzi scheme” I can find, Social Security is a Ponzi scheme. Check out the wikipedia entry, for example. Or this, from the SEC:
A Ponzi scheme is an investment fraud that involves the payment of purported returns to existing investors from funds contributed by new investors. Ponzi scheme organizers often solicit new investors by promising to invest funds in opportunities claimed to generate high returns with little or no risk.
What’s not a Ponzi scheme about Social Security?
2 Here, for example. It is interesting that few of the items in the Mother Jones Makes Up Its Own Definition for “Ponzi Scheme” Venn diagram in that article appear in the real definitions of Ponzi scheme.
Recent Comments
Joel Bernstein on More on Why I Think "two ex" Isn't As Likely As "any ex": The issue
Public Farley on I Side With Engadget: Cold Water on the iPad 2 Retina Display Hype | Daring Fireball: Nice post!
Bill Eccles on How Not to be Prepared for 24" of Snow (And Some Advice): I feel you
Janine F. on How Not to be Prepared for 24" of Snow (And Some Advice): Yeah, I sh
Greg on Note to Gruber: Democratic Congresswoman Gabrielle Giffords Shot in the Head at Public Event in Arizona | DaringFireball.net: This is ex
Bill Eccles on Designed to Fail: Apple Time Machine and MacOS X Server: Funny thin
Quentin Smith on Designed to Fail: Apple Time Machine and MacOS X Server: I just had
Anton E. on Building a Mac OS X Server 10.6: Step 1, Adventures With PHP [Updated 1/24/10 and 1/30/10]: Hi, I ve b
Arthur Nisnevich on Building a Mac OS X Server 10.6: Step 1, Adventures With PHP [Updated 1/24/10 and 1/30/10]: Thank you!