<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0"><channel><title>Myles' shared items in Google Reader</title><link>http://www.google.com/reader/public/atom/user/09376292171238315711/state/com.google/broadcast</link><language>en</language><managingEditor>noemail@noemail.org (Myles)</managingEditor><lastBuildDate>Fri, 06 Mar 2009 05:40:02 PST</lastBuildDate><generator>Google Reader http://www.google.com/reader</generator><gr:continuation xmlns:gr="http://www.google.com/schemas/reader/atom/">CO-wye-E7o8C</gr:continuation><description></description><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MylesSharedItemsInGoogleReader" type="application/rss+xml" /><item><title>Correlation</title><link>http://xkcd.com/552/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Thu, 05 Mar 2009 21:00:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/aebc8d1bfdd18aa0</guid><description>&lt;img src="http://imgs.xkcd.com/comics/correlation.png" title="Correlation doesn&amp;#39;t imply causation, but it does waggle its eyebrows suggestively and gesture furtively while mouthing &amp;#39;look over there&amp;#39;." alt="Correlation doesn&amp;#39;t imply causation, but it does waggle its eyebrows suggestively and gesture furtively while mouthing &amp;#39;look over there&amp;#39;."&gt;</description><gr:likingUser xmlns:gr="http://www.google.com/schemas/reader/atom/">17852474124962313312</gr:likingUser></item><item><title>Sunday Sweets: More 80s</title><link>http://cakewrecks.blogspot.com/2009/03/sunday-sweets-more-80s.html</link><category>Sunday Sweets</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jen</dc:creator><pubDate>Sun, 01 Mar 2009 18:16:40 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/2dc13594b053e647</guid><description>&lt;span style="font-size:85%"&gt;Sunday Sweets is my weekly NON-Wreck feature, the better to show how &lt;span&gt;wrecky&lt;/span&gt; the Wrecks are. As always, if you know who made one of the &lt;span&gt;un&lt;/span&gt;credited cakes, please let me know!&lt;/span&gt;&lt;br&gt;&lt;br&gt;It's been so much fun seeing what you guys turned up in your search for 80s Sweets. To narrow my selection down, I'm going to focus on things that haven't had a huge come-back recently, like Transformers and Indiana Jones. (Okay, so "huge" is relative. Boo Crystal Skull!) I'm also going to hold off on Super Mario for now, since he's got enough material out there to fill several posts on his own.&lt;br&gt;&lt;br&gt;So let's kick things off down at &lt;span&gt;Fraggle&lt;/span&gt; Rock, shall we?&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_wGr8njEWjtI/SagsDYzVUsI/AAAAAAAACD0/6KUBZwwvhCI/s1600-h/Sarah+A+.+lw+.+character+2.jpg"&gt;&lt;img style="margin:0px auto 10px;display:block;text-align:center;width:400px;height:297px" src="http://1.bp.blogspot.com/_wGr8njEWjtI/SagsDYzVUsI/AAAAAAAACD0/6KUBZwwvhCI/s400/Sarah+A+.+lw+.+character+2.jpg" alt="" border="0"&gt;&lt;/a&gt;Sarah A. found this insanely detailed &lt;span&gt;Fraggle&lt;/span&gt; &lt;span&gt;diorama&lt;/span&gt; by &lt;a href="http://www.kimberlychapman.com/crafts/cakes/cakegallery.html"&gt;Kimberly Chapman&lt;/a&gt;. The upper left-hand corner even has Sprocket waiting beside the hole in the wall! I like that Kimberly made it so detailed without being too busy: any more and the cake would have looked chaotic, but this seems to strike the right balance.&lt;br&gt;&lt;br&gt;Ah, but where are the &lt;span&gt;Doozers&lt;/span&gt;, you ask? Not to fear; Amy R. found them!&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_wGr8njEWjtI/SaguttpSPKI/AAAAAAAACD8/HPVUjwLVKns/s1600-h/Amy+R+.+fraggle+rock.jpg"&gt;&lt;img style="margin:0px auto 10px;display:block;text-align:center;width:300px;height:400px" src="http://3.bp.blogspot.com/_wGr8njEWjtI/SaguttpSPKI/AAAAAAAACD8/HPVUjwLVKns/s400/Amy+R+.+fraggle+rock.jpg" alt="" border="0"&gt;&lt;/a&gt;These &lt;span&gt;Doozers&lt;/span&gt; are &lt;span&gt;sooo&lt;/span&gt; cute, but I'm afraid it took me a moment of squinting to figure out that's supposed to be a giant radish.  (Sorry - it's been a while.) I'm curious what the &lt;a href="http://www.flickr.com/photos/thebleedingheartbakery/"&gt;Bleeding Heart Bakery&lt;/a&gt; used to make the lettering, too: is it too much to hope they're sugar rods?&lt;br&gt;&lt;br&gt;Speaking of adorable characters, check out Rainbow &lt;span&gt;Brite's&lt;/span&gt; sprite Twink:&lt;br&gt;&lt;br&gt;&lt;a href="http://2.bp.blogspot.com/_wGr8njEWjtI/SagzyG7fP4I/AAAAAAAACEE/l60N0R0zsFM/s1600-h/Michelle+M+.+rainbow+brite.jpg"&gt;&lt;img style="margin:0px auto 10px;display:block;text-align:center;width:400px;height:300px" src="http://2.bp.blogspot.com/_wGr8njEWjtI/SagzyG7fP4I/AAAAAAAACEE/l60N0R0zsFM/s400/Michelle+M+.+rainbow+brite.jpg" alt="" border="0"&gt;&lt;/a&gt;Michelle M. found this cuddly bit of &lt;span&gt;cakery&lt;/span&gt; by Dora of &lt;a href="http://cakesgarden.spaces.live.com/default.aspx"&gt;Cakes Garden&lt;/a&gt;. I had this doll when I was little, and I used to love Rainbow &lt;span&gt;Brite's&lt;/span&gt; crinkly holographic outfit, too - remember that, girls?&lt;br&gt;&lt;br&gt;Sorry, I'm veering off into extreme &lt;span&gt;girliness&lt;/span&gt; again. Uh, here you go, guys:&lt;br&gt;&lt;br&gt;&lt;a href="http://2.bp.blogspot.com/_wGr8njEWjtI/Sag1i1RklrI/AAAAAAAACEM/Ooek3RbSgSQ/s1600-h/Erin+C+.+lw+.+80s.jpg"&gt;&lt;img style="margin:0px auto 10px;display:block;text-align:center;width:357px;height:400px" src="http://2.bp.blogspot.com/_wGr8njEWjtI/Sag1i1RklrI/AAAAAAAACEM/Ooek3RbSgSQ/s400/Erin+C+.+lw+.+80s.jpg" alt="" border="0"&gt;&lt;/a&gt;Eh? A &lt;span&gt;little&lt;/span&gt; Space Invaders action? Get a load of that &lt;span&gt;pixelated&lt;/span&gt; perfection!&lt;br&gt;&lt;span style="font-size:100%"&gt;Erin C. found it over on &lt;a href="http://www.flickr.com/photos/hello_naomi/"&gt;Hello Naomi&lt;/a&gt;'s &lt;span&gt;Flickr&lt;/span&gt; stream.&lt;/span&gt;&lt;br&gt;&lt;br&gt;Here's some more arcade awesomeness, and our fondant-free Sweet of the week:&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_wGr8njEWjtI/SahDrSCZk8I/AAAAAAAACEc/jTLv5z8Ct9c/s1600-h/Karon+Z+.+pac+man.jpg"&gt;&lt;img style="margin:0px auto 10px;display:block;text-align:center;width:400px;height:300px" src="http://1.bp.blogspot.com/_wGr8njEWjtI/SahDrSCZk8I/AAAAAAAACEc/jTLv5z8Ct9c/s400/Karon+Z+.+pac+man.jpg" alt="" border="0"&gt;&lt;/a&gt;I know it's "just" a sheet cake, but that piping is perfectly done and nicely detailed. Karon Z. found it &lt;a href="http://www.flickr.com/photos/maigh/1465896776/"&gt;here&lt;/a&gt;, but the baker isn't listed.&lt;br&gt;&lt;br&gt;Moving along in the evolution of gaming, who among us didn't have one of these?&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_wGr8njEWjtI/SahCP2CPIwI/AAAAAAAACEU/tFNdm462_DY/s1600-h/Rachel+G.+Nintendo+OW.JPG"&gt;&lt;img style="margin:0px auto 10px;display:block;text-align:center;width:400px;height:300px" src="http://1.bp.blogspot.com/_wGr8njEWjtI/SahCP2CPIwI/AAAAAAAACEU/tFNdm462_DY/s400/Rachel+G.+Nintendo+OW.JPG" alt="" border="0"&gt;&lt;/a&gt;Ah, how I miss those painful square controllers jabbing into my palms. [wistful smile]&lt;br&gt;&lt;br&gt;This was the groom's cake at Rachel G.'s wedding, by the way.&lt;br&gt;&lt;br&gt;&lt;span&gt;Ok&lt;/span&gt;, that's enough for this week. Tune in next Sunday for all 80s cartoons. It's gonna be, like, totally righteous, dude.&lt;br&gt;&lt;br&gt;&lt;span style="font-style:italic"&gt;(Speaking of which, anyone have a classic GI Joe cake to send me? Or how about Thunder Cats? And I'm still waiting for something featuring the &lt;span&gt;Snorks&lt;/span&gt; - &lt;span&gt;c'mon&lt;/span&gt;, people, if you can't find one, &lt;/span&gt;make&lt;span style="font-style:italic"&gt; one! Is that too much to ask?)&lt;/span&gt;&lt;div&gt;&lt;img width="1" height="1" src="http://res1.blogblog.com/tracker/1932214040062195180-5100985752388146085?l=cakewrecks.blogspot.com"&gt;&lt;/div&gt;</description></item><item><title>Sierpinski Valentine</title><link>http://xkcd.com/543/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Thu, 12 Feb 2009 21:00:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/d94d010f51627e28</guid><description>&lt;img src="http://imgs.xkcd.com/comics/sierpinski_valentine.png" title="Especially you mouseover-text readers.  You&amp;#39;re the best.  &amp;lt;3" alt="Especially you mouseover-text readers.  You&amp;#39;re the best.  &amp;lt;3"&gt;</description></item><item><title>The Best of Times</title><link>http://widelawns.blogspot.com/2009/01/best-of-times.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Wide Lawns</dc:creator><pubDate>Tue, 20 Jan 2009 15:57:36 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/d122feeaa2b02a87</guid><description>&lt;span style="font-size:130%"&gt;For the past year or so I've heard so many people telling me that we live in the worst times in all of history. Many people I know, some of whom are related to me, really believe that we are living in the "End Times" prophesied in Revelations.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"&lt;/span&gt;&lt;span style="font-size:130%"&gt;Look how terrible things are," they say, "Wars, disasters, the economy, disease, racism and poverty."&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;Everywhere I go people are whining gloom and doom. The world is coming to an end. We're all going to die and not just die, but die painfully.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"I wish I could just go back in time," someone said to me recently.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;This person wanted to go back in time to escape the horrors of the present.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"Not me," I said.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"Why? It was so much better in the past."&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"Were you there?" I asked.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"No, of course not," they said, "But it was great in the olden days. Everything is awful now."&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;This person was wrong on both counts. It was neither better in the past, nor is everything awful now. You think things are bad now, go back in time and you'll see some bad.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;We live in the best of times. The present time, right now, is the greatest and best time the human race has ever known and we are all lucky to be alive right here and right now. Stop for a moment to be thankful.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;The past was horrible and the people who think the past was so much better are ignoring history and idealizing it, creating their own fairy-tale that never really existed.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;Anyone who thinks that the present is the worst time in human history clearly skipped class the day they learned about the Civil War, or the Holocaust. Speaking in terms of only the United States the Civil War era wins hands down for the worst time in America. You couldn't pay me to go back there. My vote for worst time in the entire world is probably World War II. On one hand you've got calculated, organized genocide all over Europe. On the other hand you've got atomic bombs on Japan, but to be fair the Japanese weren't exactly angels back then either. Ask the Chinese about that. During the 30s and 40s we had unprecedented mass slaughter and destruction on a worldwide scale. I have no desire to go back to that.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;"&lt;/span&gt;&lt;span style="font-size:130%"&gt;But what about all the wars now?" some ask.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;This isn't a new thing. There have always been wars. War is terrible, but I think we have a lot less of it than we did in the past and that we now have better negotiating skills to try to avoid it. Countries also have more incentive than ever to resolve conflicts sensibly. I admit that there are wars now and there will probably be more, but I'm optimistic that there are fewer of them and that war will continue to decline in the future.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;How about all the disasters? There have always been disasters, natural and otherwise. Because of information technology we now know about disasters sooner. We can watch disasters happening live (which we seem to love) and we can see the aftermath of a disaster immediately. In the past this wasn't possible so it just seemed like there were fewer of them. A hundred years ago if there was a tsunami in Asia we wouldn't know about it in America, nor would anyone here have cared. Hundreds of thousands of people would still be dead but we wouldn't have had pictures and video and interviews recounting the horrors. Now we know when something happens around the world and we actually care. Many might argue that seeing disasters live desensitizes us and that we exploit tragedy. Generally, I disagree. I think seeing it creates empathy and urgency. When we see something we can't deny it. Now, because of technology and advances in transportation we can go help people all over the world. Medical technology can save people who would have been left for dead years ago. We have helicopters to evacuate people, planes to fly in relief, doctors who can save and TVs to show us how bad things are so that we can empathize and then hopefully help. So yes, we still have all kinds of disasters and we always will, but now we're better equipped to deal and to help. &lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;And what about all the technology that's been developed to help predict natural disasters? Even fifty years ago we'd have no idea when a hurricane was coming (or a blizzard if you live in the north). Now we have plenty of time to prepare. We can't predict everything, but I think we're working on that and with the technology we do have, lives are really saved.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;span style="background-color:#ffffff"&gt;B&lt;/span&gt;ut the economy!!!!!&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;The economy isn't at it's greatest right now. I know. However, I feel like this is a correction and that our economy was over-inflated and out of control and that maybe some good can come out of the financial problems we're dealing with right now. First of all, too many people got greedy and were living and operating businesses far above their means. We became too materialistic. I mean really, do we need so many malls and mega-stores or gigantic shopping centers at every highway exit, flanked by seventy-five chain restaurants all offering Tyrannosaurus sized portions of fatty, sugary food? No we do not. I'm sad when people lose jobs, but we don't need all of this consumerism and mass consumption polluting our world. It has killed the creativity, drive and spark in so many people. I'm glad to see a lot of it go. We all got spoiled. Too many of us fell for the illusion of power and grandeur created by the pursuit and acquisition of a bunch of meaningless junk.  Scaling back will do us all some good. We'll get through it. Maybe we'll learn to stop valuing meaningless clutter. Perhaps we'll begin to help one another and we'll come to stop wanting and wanting and wanting and taking and taking and taking.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;At times this past year I felt like everyone I knew was ill. I felt like disease was everywhere. I can't count the number of times I heard conversations about cancer and other devastating, horrible diseases.  Yes, we have diseases. People get sick and die and suffer and it seems so unfair and when they're gone we miss them so much, but think, in the past, even in the recent past, it was so much worse. Had I lived even a hundred years ago I would likely have been dead already, from an illness that's not such a big deal now. Before my genetic condition even appeared to kill me I could have died as a child from malnutrition, polio, small pox and even measles. I may have succumbed to tuberculosis or likely died in childbirth.  Think of the advances we've made in medicine. Maybe some of the people we've lost, we would have lost sooner or they would have died in greater suffering with less dignity.  In the past, even the most privileged members of society died from things like typhoid and cholera which are now rare and which we have come to only associate with the most destitute, primitive and most poorly developed places in the world.  Because of medical advances so many of us have been spared suffering. People with infertility can give birth. So few of us have lost a child, or several children from common viruses. &lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;I'm thankful for psychology, which is such a new science that has saved and improved so many lives. I wouldn't want to live in a world where the mentally ill were tortured, abused, misunderstood or said to be demon possessed.  Now we have medications, therapies and just plain understanding for the mentally ill and think of the multitudes of people who can live functioning lives, contributing to society because of drugs and treatment instead of being locked, raving in attics to die in pain.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;I like that as a woman that I have options in life and that I can make choices about what I want to do.  I'm thrilled that women are allowed to understand their own bodies and how they work and talk openly about them without shame. I'm glad my father and husband never saw me as property and that it isn't legal for my husband to beat me. How great is it that I've been raised in a society that produced a man like my husband who would never dream of not contributing to the housework?&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;My mother, who is very young, can vividly remember the race riots burning even in small towns across America in the 60s. She remembers segregation, colored water fountains, lynch mobs and a world where black people and white people did not mix. I'm thankful that this is incomprehensible to me.  For race issues alone, I am grateful to be alive now. I can't fathom that centuries ago one race of people thought it was acceptable to enslave another and to create, perpetuate and believe in a lasting mythology that said a group of people from another place, who looked and believed differently, were not human beings.  And then they fought a war to preserve it! That is horror.  Anti-miscegenation laws were horror. The way that even forty and fifty years ago it was socially acceptable to taunt, tease and terrorize, to caricaturize and infantalize men and women of different races, cultures, orientations and abilities is a horror.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;We still have war, disasters natural and man-made. We still will have racism, disease and poverty, but in every area we have improved and we're continuing to improve. The time we live in now is truly the best time and we are all lucky to have been born when we were.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;There are many serious and often overwhelming problems in our country and in the world.  There are issues that frustrate me and worry me. I'm afraid of a lot, but I'm optimistic.  Change takes a long time. It takes generations to alter mindsets and it happens bit by bit. Often we will stride forward and then slip back a little but eventually we get there.  It's hard not to be impatient because we want it all now. We want it so badly. I know I do. There's a lot I'd like to be different even in my optimism. I also know that we can't always put a time limit on change and that Moses never made it to the promised land. Dr. Martin Luther King, Jr. couldn't live to see the inauguration of a black president.  It's a sacrifice we have to make. Our ancestors sacrificed for us and each generation must take responsibility for its descendents.  Don't give up on fighting for change just because you think you won't be around to see it or that it will never happen. It will.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;There is one thing that I believe above all others and it is this.  That everything is going to be ok and that really, it is more ok than we realize right now.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;Looking forward at all the problems we face, the solutions may seem insurmountable or impossible. They aren't.  When you look ahead, like a little kid on a road trip asking repeatedly if we're there yet, it seems like we've got forever left to go. Looking back though, you can see how far we've come.&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;We have come so far.&lt;/span&gt;&lt;br&gt;&lt;span style="font-size:130%"&gt;&lt;/span&gt;</description></item><item><title>Numerical Sex Positions</title><link>http://xkcd.com/487/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Thu, 09 Oct 2008 21:00:00 PDT</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/9ebe9b54e21ff636</guid><description>&lt;img src="http://imgs.xkcd.com/comics/numerical_sex_positions.png" title="We didn&amp;#39;t even get to the continued fractions!" alt="We didn&amp;#39;t even get to the continued fractions!"&gt;</description></item><item><title>Immortal McHorror burger is 12 years old, looks just like new</title><link>http://feeds.boingboing.net/~r/boingboing/iBag/~3/403385259/immortal-mchorror-bu.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Thu, 02 Oct 2008 07:00:48 PDT</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/5a61f2fc2eb87703</guid><description>&lt;blockquote&gt;Shared by  michellecopter 
&lt;br&gt;
oh my god.&lt;/blockquote&gt;
Karen Hanrahan has been using the same McDonald's hamburger as a prop in her "Healthy Choices for Children" class since 1996 -- 12 &lt;em&gt;years&lt;/em&gt;! -- and it's hardly aged a day in all that time. McDonald's should add "immortality" to its list of Unique Selling Propositions for its burgers (unless Karen has an ornate oil painting of the burger in her living room in which it slowly ages, grows mouldy, and decomposes).

&lt;blockquote&gt;
&lt;img src="http://craphound.com/images/Burger2008.jpg"&gt;&lt;br&gt;

The burger on the right, off the paper is a 2008 burger.  I had to buy it to get the groovy paper and bag.

The meat is a tad darker, the bun a little less golden but in 12 years it will look exactly like that too.

Do you find this horrifying?

McDonalds fills an empty space in your belly. It does nothing to nourish the cell, it is not a nutritious food.

It is not a treat.

I marvel at how McDonalds has infiltrated our entire world. A hamburger here tastes exactly the same in China or some around the world place. 

&lt;/blockquote&gt;
&lt;a href="http://bestwellnessconsultant.com/2008/09/23/1996-mcdonalds-hamburger-karen-hanrahan-best-of-mother-earth.aspx"&gt;1996 McDonalds Hamburger&lt;/a&gt;&lt;br style="clear:both"&gt;
  &lt;img alt="" style="border:0pt none;height:1px;width:1px" src="http://www.pheedo.com/img.phdo?i=3b2524f99bfd19e1b962587f75e8de39" width="1" border="0" height="1"&gt;
&lt;img src="http://www.pheedo.com/feeds/tracker.php?i=3b2524f99bfd19e1b962587f75e8de39" alt="" width="1" border="0" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.boingboing.net/%7Ea/boingboing/iBag?a=rpi5CS"&gt;&lt;img src="http://feeds.boingboing.net/%7Ea/boingboing/iBag?i=rpi5CS" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.boingboing.net/%7Er/boingboing/iBag/%7E4/403385259" width="1" height="1"&gt;
</description><gr:annotation xmlns:gr="http://www.google.com/schemas/reader/atom/"><content xmlns="http://www.w3.org/2005/Atom" type="html">oh my god.</content><author xmlns="http://www.w3.org/2005/Atom" gr:user-id="05092822119927962950" gr:profile-id="117695322316881461141"><name>michellecopter</name></author></gr:annotation></item><item><title>Babies so cute you could eat them</title><link>http://improbable.com/2007/12/30/babies-so-cute-you-could-eat-them/</link><category>Arts and science</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Marc Abrahams</dc:creator><pubDate>Sat, 29 Dec 2007 21:01:19 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/c91f3d13e5636c2d</guid><description>&lt;p&gt;Investigator Wendy Cooper of Canberra writes:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;This photo was taken on the south coast of New South Wales, Australia on a recent visit. The sign was outside an establishment that you north Americans would call a “diner”&lt;/p&gt;
&lt;div style="text-align:center"&gt;&lt;img alt="BabySausages.gif" title="BabySausages.gif" src="http://improbable.com/wp-content/uploads/2007/10/BabySausages.gif"&gt;&lt;/div&gt;
&lt;/blockquote&gt;</description></item><item><title>FLASHBACK: Will America Assassinate General Musharraf?</title><link>http://www.sott.net/articles/show/146272-Will-America-Assassinate-General-Musharraf-</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Fri, 28 Dec 2007 07:27:01 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/34b0580f54b6d6cb</guid><description>General Musharraf wants to remain president-in-uniform till 2012. America wants to keep Pakistan occupied by its armed forces for as long as possible. It seems that with these complimentary objectives, Musharraf and Washington are getting along well. The reality, however, is totally different.</description></item><item><title>Snorting a Brain Chemical Could Replace Sleep</title><link>http://feeds.wired.com/~r/wired/science/discoveries/~3/207326263/sleep_deprivation</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Alexis Madrigal</dc:creator><pubDate>Thu, 27 Dec 2007 18:00:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/79448b3c13b0f99e</guid><description>Scientists are reporting that a nasal spray of a key brain hormone cures sleepiness in sleep-deprived monkeys. With no apparent side effects, the hormone might be a promising sleep-replacement drug.
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/wired/politics/lifesciences?a=y1q3dG"&gt;&lt;img src="http://feeds.feedburner.com/~a/wired/politics/lifesciences?i=y1q3dG" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~f/wired/politics/lifesciences?a=vwl67NC"&gt;&lt;img src="http://feeds.feedburner.com/~f/wired/politics/lifesciences?i=vwl67NC" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/wired/politics/lifesciences?a=mRT7itc"&gt;&lt;img src="http://feeds.feedburner.com/~f/wired/politics/lifesciences?i=mRT7itc" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/wired/politics/lifesciences?a=FvcZG5c"&gt;&lt;img src="http://feeds.feedburner.com/~f/wired/politics/lifesciences?i=FvcZG5c" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/wired/politics/lifesciences?a=4gqT6qC"&gt;&lt;img src="http://feeds.feedburner.com/~f/wired/politics/lifesciences?i=4gqT6qC" border="0"&gt;&lt;/a&gt;
 &lt;a href="http://feeds.wired.com/~f/wired/science/discoveries?a=LVkfkNC"&gt;&lt;img src="http://feeds.wired.com/~f/wired/science/discoveries?i=LVkfkNC" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.wired.com/~f/wired/science/discoveries?a=SOllTwc"&gt;&lt;img src="http://feeds.wired.com/~f/wired/science/discoveries?i=SOllTwc" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.wired.com/~f/wired/science/discoveries?a=IlduTGc"&gt;&lt;img src="http://feeds.wired.com/~f/wired/science/discoveries?i=IlduTGc" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.wired.com/~f/wired/science/discoveries?a=GnqtW3C"&gt;&lt;img src="http://feeds.wired.com/~f/wired/science/discoveries?i=GnqtW3C" border="0"&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/wired/politics/lifesciences/~4/207326259" height="1" width="1"&gt;&lt;img src="http://feeds.wired.com/~r/wired/science/discoveries/~4/207326263" height="1" width="1"&gt;</description></item><item><title>Don't be clever</title><link>http://www.codethinked.com/post.aspx?id=d2c6a936-89ce-4c02-b3e0-f17df1575e92</link><category>Software Design</category><category>Software Development</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Justin Etheredge</dc:creator><pubDate>Sun, 16 Dec 2007 12:48:57 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/23fc17d49ac7efa4</guid><description>&lt;p&gt;I'm sure that most of us in our programming careers have seen something like this...&lt;/p&gt;  &lt;div style="font-size:10pt;background:white;color:black;font-family:consolas, courier new, courier, monospace"&gt;   &lt;pre style="margin:0px"&gt;  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt; GetNextSize(&lt;span style="color:blue"&gt;int&lt;/span&gt; i)&lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;  {&lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;    &lt;span style="color:green"&gt;//multiply it by four and make sure it is positive&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;    &lt;span style="color:blue"&gt;return&lt;/span&gt; i &amp;gt; 0 ? i &amp;lt;&amp;lt; 2 : ~(i &amp;lt;&amp;lt; 2) + 1;&lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Wasn't it nice that they at least commented the line? Ha. Well, maybe you have not seen something &lt;strong&gt;exactly&lt;/strong&gt; like that, but I&amp;#39;m sure that you have seen something equally as asinine. And I&amp;#39;m also sure that when you saw this the first thing that went through your head was &amp;quot;why would anyone &lt;strong&gt;ever &lt;/strong&gt;write something like this?&amp;quot; And surprisingly, the answer is that they did it because they are a programmer. Well, a programmer who is not in control of their urges. :-)&lt;/p&gt;

&lt;p&gt;Most programmers love to be clever. In fact, we probably got into programming because we loved being clever. We loved writing small, streamlined code that ran faster than anyone thought it could and at the same time confounded all those who read it. The problem is that the programming world is quickly changing and one of my favorite quotes of all time no longer applies:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;quot;Real programmers don&amp;#39;t write comments - it was hard to write, it should be hard to understand.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, obviously that never applied and I hope you realized that, but a fundamental shift started happening years ago that has really solidified now. The shift is that the complexity in software has moved from the smaller parts of the applications to the design of the application as a whole, and so the top priority for almost all code should be in how easy it is to read and write, because the systems that they are involved in have become so much more complex.&lt;/p&gt;

&lt;p&gt;As applications get larger and more complex, we rarely have to worry about how fast we can read a file in, but we think long and hard about how to make the format of that file easy to parse and flexible. In fact, &lt;strong&gt;I remember when XML first came out and there were a good number of people that were predicting its downfall because it was so verbose, but that was actually its strongest selling point&lt;/strong&gt;. There have been several &amp;quot;Binary&amp;quot; XML specs, but not surprisingly none of them have caught on because they take away the one thing that made XML so attractive, its readability and parseability. The thing that most of those people didn&amp;#39;t understand was that bandwidth would get cheaper, computers would get cheaper and faster, but people&amp;#39;s time will always get more expensive. The more simple and easier to work with (while still being flexible) a standard is, the more likely that it will be adopted. This has held true for HTML, XML, and sometime in the future it may even hold true for REST web services.&lt;/p&gt;

&lt;p&gt;But as programmers these same rules apply, no longer do we get any credit for writing a routine that parses a file 5 percent faster, especially not if it makes the code harder to read, longer to write, longer to debug, or harder to test. No longer does a programmer get respect for using pointer arithmetic and bit-shifting in order to speed up math operations. These kind of optimizations (for the most part) are just pointless exercises that are often written for nothing more than the programmer's ego. (And before you guys start ranting about graphics programming or physics modeling, yes, I do realize that there are places in the world for code like this) But that does remind me of one of my favorite quotes from &lt;a title="Code Complete By Steve McConnell" href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=codet-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;&amp;quot;Code Complete&amp;quot; by Steve McConnell&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;quot;Programming is not like being in the CIA, you don&amp;#39;t get credit for being sneaky.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(It took me a little bit to find that, my copy of &amp;quot;&lt;a title="Code Complete" href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=codet-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt;&amp;quot; has more highlights than Paris Hilton&amp;#39;s hair)&lt;/p&gt;

&lt;p&gt;So, if we don't get credit for writing clever code anymore, then what do we get credit for? Well, &lt;strong&gt;we get credit for making our code simple and easy to understand&lt;/strong&gt;. We get credit for loose coupling, for testability, for shallow hierarchies, for good exception handling, for fluid interfaces, for not giving our co-workers headaches, essentially for all around good design. We get credit for being good software engineers, not being winners of the &lt;a title="International Obfuscated C Code Contest" href="http://www.ioccc.org/"&gt;International Obfuscated C Code Contest&lt;/a&gt; (although you will get a certain kind of credit for that, but you get my point).&lt;/p&gt;

&lt;p&gt;Now hopefully anyone in their right mind would have written the method at the beginning of this post like this...&lt;/p&gt;

&lt;div style="font-size:10pt;background:white;color:black;font-family:consolas, courier new, courier, monospace"&gt;
  &lt;pre style="margin:0px"&gt;  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt; GetNextSize(&lt;span style="color:blue"&gt;int&lt;/span&gt; i)&lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;  {&lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;    &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Math&lt;/span&gt;.Abs(i * 4);  &lt;/pre&gt;

  &lt;pre style="margin:0px"&gt;  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Without caring one bit about performance (of which I honestly don't know or care what the implications are at this point) I can say with 100% confidence that this code is better. And why? Because I can immediately look at it and tell what it is doing. Even without the comment it is more readable than the code at the top that has the comment, and that is what we want, self-documenting code. Because as the Pragmatic Programmers pointed out, you don't want to have to comment on what the code is actually doing, you only want to comment on the assumptions that were made in order to write the code. Information that cannot be derived just by reading the code itself. The only problem is that the more complex our code gets, the more and more we need comments just to explain what the code is doing.&lt;/p&gt;

&lt;p&gt;And don't think that I am saying that there is no place for optimization, that is not true, there is just less room for optimization in the source itself, but there is lots of room for optimizations in terms of overall system performance and in terms of developer productivity. &lt;strong&gt;It is more important to focus on the big picture and solve performance problems that are system wide, or refactor code so that changes can be made much faster, than it is to solve a performance problem in a single line of code&lt;/strong&gt;...unless of course that line of code is being called 8 million times by 50 parts of the system.&lt;/p&gt;

&lt;p&gt;So next time you go to write a super clever line of code, think to yourself &amp;quot;Will the benefits of this super cleverness be outweighed by the future issues in maintaining and understanding the code?&amp;quot; And if there is &lt;strong&gt;any&lt;/strong&gt; hesitation at all, then you better not be clever, because 3 months from now you will come across that code and say &amp;quot;What the hell was I thinking?&amp;quot; Then you&amp;#39;ll end up rewriting it anyway.&lt;/p&gt;

&lt;p&gt;And one final note, if you are the kind of person who just has to write super clever looking code that no one can make sense out of, then they have a language for you, it is called Perl. :-) (let the flames begin)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.codethinked.com/~a/Codethinked?a=m0CYim"&gt;&lt;img src="http://feeds.codethinked.com/~a/Codethinked?i=m0CYim" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.codethinked.com/~f/Codethinked?a=lCzKTpC"&gt;&lt;img src="http://feeds.codethinked.com/~f/Codethinked?i=lCzKTpC" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.codethinked.com/~f/Codethinked?a=Kh2jtVC"&gt;&lt;img src="http://feeds.codethinked.com/~f/Codethinked?i=Kh2jtVC" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.codethinked.com/~f/Codethinked?a=zZc7nec"&gt;&lt;img src="http://feeds.codethinked.com/~f/Codethinked?i=zZc7nec" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.codethinked.com/~r/Codethinked/~4/201321315" height="1" width="1"&gt;</description></item><item><title>Leo Hsu and Regina Obe: CrossTab Queries in PostgreSQL using tablefunc contrib</title><link>http://www.postgresonline.com/journal/index.php?/archives/14-guid.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Thu, 27 Dec 2007 00:57:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/e24eb3f92bed047b</guid><description>&lt;p&gt;The generic way of doing cross tabs (sometimes called PIVOT queries) in an ANSI-SQL database such as PostgreSQL is to use CASE statements which we have
documented in the article 
&lt;a href="http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=25"&gt;What is a crosstab query and how do you create one using a relational database?&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;In this particular issue, we will introduce creating crosstab queries using PostgreSQL &lt;b&gt;tablefunc&lt;/b&gt; contrib.
&lt;/p&gt;
&lt;h3&gt;Installing Tablefunc&lt;/h3&gt;
&lt;p&gt;Tablefunc is a contrib that comes packaged with all PostgreSQL installations - we believe from versions 7.4.1 up (possibly earlier).  We will be assuming the
one that comes with 8.2 for this exercise.  Note in prior versions, tablefunc was not documented in the standard postgresql docs, but the new 8.3 seems to have it documented
at &lt;a href="http://www.postgresql.org/docs/8.3/static/tablefunc.html"&gt;http://www.postgresql.org/docs/8.3/static/tablefunc.html&lt;/a&gt;.  
&lt;/p&gt;

&lt;p&gt;Often when you create crosstab queries, you do it in conjunction with GROUP BY and so forth.  While the astute reader may conclude this from the docs, none of the examples in the 
docs specifically demonstrate that and the more useful example of &lt;b&gt;crosstab(source_sql,category_sql)&lt;/b&gt; is left till the end of the documentation.
&lt;/p&gt;

&lt;p&gt;To install tablefunc simply open up the &lt;b&gt;share\contrib\tablefunc.sql&lt;/b&gt; in pgadmin and run the sql file.  Keep in mind that the functions are installed by default in the &lt;i&gt;public&lt;/i&gt; schema.
If you want to install in a different schema - change the first line that reads &lt;br&gt;&lt;code&gt;SET search_path = public;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Alternatively you can use &lt;b&gt;psql&lt;/b&gt; to install tablefunc using something like the following command: &lt;br&gt;
&lt;code&gt;path\to\postgresql\bin\psql -h localhost -U someuser -d somedb -f "path\to\postgresql\share\contrib\tablefunc.sql"&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;We will be covering the following functions 
&lt;ol&gt;
	&lt;li&gt;crosstab(source_sql, category_sql)&lt;/li&gt;
	&lt;li&gt;crosstab(source_sql)&lt;/li&gt;
	&lt;li&gt;Tricking crosstab to give you more than one row header column&lt;/li&gt;
	&lt;li&gt;Building your own custom crosstab function similar to the crosstab3, crosstab4 etc. examples&lt;/li&gt;
	&lt;li&gt;Adding a total column to crosstab query&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;There are a couple of key points to keep in mind which apply to both crosstab functions.
&lt;ol&gt;
	&lt;li&gt;Source SQL must always return 3 columns, first being what to use for row header, second the bucket slot, and third is the value to put in the bucket.&lt;/li&gt;
	&lt;li&gt;crosstab except for the example crosstab3 ..crosstabN versions return unknown record types.  
		This means that in order to use them in a FROM clause, you need to either alias them by specifying the result type or create a custom crosstab that outputs a known type as demonstrated 
		by the crosstabN flavors.  Otherwise you get the common &lt;i&gt;a column definition list is required for functions returning "record"&lt;/i&gt; error.
	&lt;/li&gt;
	&lt;li&gt;A corrollary to the previous statement, it is best to cast those 3 columns to specific data types so you can be guaranteed the datatype that is returned so it doesn't fail your row type casting.&lt;/li&gt;
	&lt;li&gt;Each row should be unique for row header, bucket otherwise you get unpredictable results&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Setting up our test data&lt;/h4&gt;
&lt;p&gt;For our test data, we will be using our familiar inventory, inventory flow example.  Code to generate structure and test data is shown below.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;CREATE TABLE inventory
(
  item_id serial NOT NULL,
  item_name varchar(100) NOT NULL,
  CONSTRAINT pk_inventory PRIMARY KEY (item_id),
  CONSTRAINT inventory_item_name_idx UNIQUE (item_name)
)
WITH (OIDS=FALSE);

CREATE TABLE inventory_flow
(
  inventory_flow_id serial NOT NULL,
  item_id integer NOT NULL,
  project varchar(100),
  num_used integer,
  num_ordered integer,
  action_date timestamp without time zone 
  	NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT pk_inventory_flow PRIMARY KEY (inventory_flow_id),
  CONSTRAINT fk_item_id FOREIGN KEY (item_id)
      REFERENCES inventory (item_id) 
      ON UPDATE CASCADE ON DELETE RESTRICT
)
WITH (OIDS=FALSE);

CREATE INDEX inventory_flow_action_date_idx
  ON inventory_flow
  USING btree
  (action_date)
  WITH (FILLFACTOR=95);

INSERT INTO inventory(item_name) VALUES('CSCL (g)');
INSERT INTO inventory(item_name) VALUES('DNA Ligase (ul)');
INSERT INTO inventory(item_name) VALUES('Phenol (ul)');
INSERT INTO inventory(item_name) VALUES('Pippette Tip 10ul');


INSERT INTO inventory_flow(item_id, project, num_ordered, action_date)
	SELECT i.item_id, 'Initial Order', 10000, '2007-01-01'
		FROM inventory i;
		
--Similulate usage
INSERT INTO inventory_flow(item_id, project, num_used, action_date)
	SELECT i.item_id, 'MS', n*2, 
		'2007-03-01'::timestamp + (n || ' day')::interval + ((n + 1) || ' hour')::interval
		FROM inventory As i CROSS JOIN generate_series(1, 250) As n
		WHERE mod(n + 42, i.item_id) = 0;
		
INSERT INTO inventory_flow(item_id, project, num_used, action_date)
	SELECT i.item_id, 'Alzheimer''s', n*1, 
		'2007-02-26'::timestamp + (n || ' day')::interval + ((n + 1) || ' hour')::interval
		FROM inventory as i CROSS JOIN generate_series(50, 100) As n
		WHERE mod(n + 50, i.item_id) = 0;
		
INSERT INTO inventory_flow(item_id, project, num_used, action_date)
	SELECT i.item_id, 'Mad Cow', n*i.item_id, 
		'2007-02-26'::timestamp + (n || ' day')::interval + ((n + 1) || ' hour')::interval
		FROM inventory as i CROSS JOIN generate_series(50, 200) As n
		WHERE mod(n + 7, i.item_id) = 0 AND i.item_name IN('Pippette Tip 10ul', 'CSCL (g)');

vacuum analyze;
&lt;/code&gt;
&lt;/pre&gt;

&lt;h4&gt;Using crosstab(source_sql, category_sql)&lt;/h4&gt;
&lt;p&gt;For this example we want to show the monthly usage of each inventory item for the year 2007 regardless of project.
The crosstab we wish to achieve would have columns as follows:
&lt;b&gt;item_name, jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec&lt;/b&gt;
&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;--Standard group by aggregate query before we pivot to cross tab
--This we use for our source sql
 SELECT i.item_name::text As row_name, to_char(if.action_date, 'mon')::text As bucket, 
 		SUM(if.num_used)::integer As bucketvalue
	FROM inventory As i INNER JOIN inventory_flow As if 
		ON i.item_id = if.item_id
	WHERE (if.num_used &lt;code&gt; 0 AND if.num_used IS NOT NULL)
	  AND action_date BETWEEN date '2007-01-01' and date '2007-12-31 23:59'
	GROUP BY i.item_name, to_char(if.action_date, 'mon'), date_part('month', if.action_date)
	ORDER BY i.item_name, date_part('month', if.action_date);

--Helper query to generate lowercase month names - this we will use for our category sql	
SELECT to_char(date '2007-01-01' + (n || ' month')::interval, 'mon') As short_mname 
		FROM generate_series(0,11) n;
&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;

--Resulting crosstab query
--&lt;b&gt;Note: For this we don't need the order by month since the order of the columns is determined by the category_sql row order&lt;/b&gt;
&lt;pre&gt;
&lt;code&gt;
SELECT mthreport.*
	FROM 
	&lt;b&gt;crosstab&lt;/b&gt;('SELECT i.item_name::text As row_name, to_char(if.action_date, ''mon'')::text As bucket, 
		SUM(if.num_used)::integer As bucketvalue
	FROM inventory As i INNER JOIN inventory_flow As if 
		ON i.item_id = if.item_id
	  AND action_date BETWEEN date ''2007-01-01'' and date ''2007-12-31 23:59''
	GROUP BY i.item_name, to_char(if.action_date, ''mon''), date_part(''month'', if.action_date)
	ORDER BY i.item_name', 
	'SELECT to_char(date ''2007-01-01'' + (n || '' month'')::interval, ''mon'') As short_mname 
		FROM generate_series(0,11) n')
		As mthreport(item_name text, jan integer, feb integer, mar integer, 
			apr integer, may integer, jun integer, jul integer, 
			aug integer, sep integer, oct integer, nov integer, 
			dec integer)
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;The output of the above crosstab looks as follows: &lt;br&gt;
&lt;img alt="crosstab source_sql cat_sql example" src="http://www.postgresonline.com/images/journal/crosstab_source_cat_example.png" border="0"&gt;
&lt;br&gt;&lt;br&gt;
&lt;h4&gt;Using crosstab(source_sql)&lt;/h4&gt;
&lt;p&gt;crosstab(source_sql) is much trickier to understand and use than the crosstab(source_sql, category_sql) variant, but in certain situations
and certain cases is faster and just as effective.  The reason why is that crosstab(source_sql) is not guaranteed to put same named
buckets in the same columns especially for sparsely populated data.  For example - lets say you have data for CSCL for Jan Mar Apr and data for Phenol for Apr.  Then Phenols Apr bucket
will be in the same column as CSCL Jan's bucket.  This in most cases is not terribly useful and is confusing.&lt;/p&gt;

&lt;p&gt;To skirt around this inconvenience one can write an SQL statement that guarantees you have a row for each permutation
of Item, Month by doing a cross join.  Below is the above written so item month usage fall in
the appropriate buckets.&lt;/p&gt;

&lt;pre&gt;
	&lt;code&gt;
	--Code to generate the row tally - before crosstab
	SELECT i.item_name::text As row_name, i.start_date::date As bucket, 
			SUM(if.num_used)::integer As bucketvalue
		FROM (SELECT inventory.*,  
			  date '2007-01-01' + (n || ' month')::interval As start_date,
			  date '2007-01-01' + ((n + 1) || ' month')::interval +  - '1 minute'::interval As end_date
			FROM inventory CROSS JOIN generate_series(0,11) n) As i 
				LEFT JOIN inventory_flow As if 
		ON (i.item_id = if.item_id AND if.action_date BETWEEN i.start_date AND i.end_date)
	GROUP BY i.item_name, i.start_date
	ORDER BY i.item_name, i.start_date;

	
	--Now we feed the above into our crosstab query to achieve the same result as 
	--our crosstab(source, category) example 
	SELECT mthreport.*
	FROM crosstab('SELECT i.item_name::text As row_name, i.start_date::date As bucket, 
			SUM(if.num_used)::integer As bucketvalue
		FROM (SELECT inventory.*,  
			  date ''2007-01-01'' + (n || '' month'')::interval As start_date,
			  date ''2007-01-01'' + ((n + 1) || '' month'')::interval +  - ''1 minute''::interval As end_date
			FROM inventory CROSS JOIN generate_series(0,11) n) As i 
				LEFT JOIN inventory_flow As if 
		ON (i.item_id = if.item_id AND if.action_date BETWEEN i.start_date AND i.end_date)
	GROUP BY i.item_name, i.start_date
	ORDER BY i.item_name, i.start_date;') 
		As mthreport(item_name text, jan integer, feb integer, 
			mar integer, apr integer, 
			may integer, jun integer, jul integer, aug integer, 
			sep integer, oct integer, nov integer, dec integer)
	&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;In actuality the above query if you have an index on action_date is probably 
more efficient for larger datasets than the crosstab(source, category) example since it utilizes a date range condition for each month match.
&lt;/p&gt;

&lt;p&gt;There are a couple of situations that come to mind where the standard behavior of crosstab of not putting like items in same column is useful.  
One example is when its not necessary to distiguish bucket names, but order of cell buckets is important such as when doing column rank reports.  
For example if you wanted to know for each item, which projects has it been used most in and you want the column order of projects to be based on highest usage.  
You would have simple labels like &lt;b&gt;item_name, project_rank_1, project_rank_2, project_rank_3&lt;/b&gt; 
and the actual project names would be displayed in project_rank_1, project_rank_2, project_rank_3 columns. 
&lt;pre&gt;
	&lt;code&gt;
SELECT projreport.*
	FROM crosstab(&amp;#39;SELECT i.item_name::text As row_name, 
		if.project::text As bucket, 
		if.project::text As bucketvalue
	FROM inventory  i 
			LEFT JOIN inventory_flow As if 
	ON (i.item_id = if.item_id)
	WHERE if.num_used &amp;gt; 0
GROUP BY i.item_name, if.project
ORDER BY i.item_name, SUM(if.num_used) DESC, if.project&amp;#39;) 
	As projreport(item_name text, project_rank_1 text, project_rank_2 text, 
			project_rank_3 text)
	&lt;/code&gt;
&lt;/pre&gt;
&lt;br&gt;Output of the above looks like: &lt;br&gt;
&lt;img alt="Example crosstab column rank report" src="http://www.postgresonline.com/images/journal/crosstab_column_rank.png"&gt;
&lt;/p&gt;
&lt;br&gt;&lt;br&gt;
&lt;h3&gt;Tricking crosstab to give you more than one row header column&lt;/h3&gt;
&lt;p&gt;Recall we said that crosstab requires exactly 3 columns output in the sql source statement.  No more and No less.
So what do you do when you want your month crosstab by Item, Project, and months columns. One approach is to stuff more than one Item 
in the item slot by either using a delimeter or using an Array.  We shall show the array approach below.
&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
SELECT mthreport.row_name[1] As project, mthreport.row_name[2] As item_name,
	jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
	FROM 
	crosstab('SELECT ARRAY[if.project::text, i.item_name::text] As row_name,
		to_char(if.action_date, ''mon'')::text As bucket, SUM(if.num_used)::integer As bucketvalue
	FROM inventory As i INNER JOIN inventory_flow As if 
		ON i.item_id = if.item_id
	  AND action_date BETWEEN date ''2007-01-01'' and date ''2007-12-31 23:59''
	  WHERE if.num_used &lt;code&gt; 0
	GROUP BY if.project, i.item_name, to_char(if.action_date, ''mon''), 
		date_part(''month'', if.action_date)
	ORDER BY if.project, i.item_name', 
	'SELECT to_char(date ''2007-01-01'' + (n || '' month'')::interval, ''mon'') As short_mname 
		FROM generate_series(0,11) n')
		As mthreport(row_name text[], jan integer, feb integer, mar integer, 
			apr integer, may integer, jun integer, jul integer, 
			aug integer, sep integer, oct integer, nov integer, 
			dec integer)
&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;Result of the above looks as follows: &lt;br&gt;
&lt;img alt="crosstab with multi row header column" src="http://www.postgresonline.com/images/journal/crosstab_source_cat_multirowheading.png"&gt;

&lt;h4&gt;Building your own custom crosstab function&lt;/h4&gt;
&lt;p&gt;If month tabulations are something you do often, you will quickly become tired of writing out all the months.
One way to get around this inconvenience - is to define a type and crosstab alias that returns the well-defined type
something like below:
&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
CREATE TYPE tablefunc_crosstab_monthint AS
   (row_name text[],jan integer, feb integer, mar integer, 
	apr integer, may integer, jun integer, jul integer, 
	aug integer, sep integer, oct integer, nov integer, 
	dec integer);
	  
CREATE OR REPLACE FUNCTION crosstabmonthint(text, text)
  RETURNS SETOF tablefunc_crosstab_monthint AS
'$libdir/tablefunc', 'crosstab_hash'
  LANGUAGE 'c' STABLE STRICT;
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Then you can write the above query as&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
SELECT mthreport.row_name[1] As project, mthreport.row_name[2] As item_name,
	jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
	FROM 
	crosstabmonthint('SELECT ARRAY[if.project::text, i.item_name::text] As row_name, to_char(if.action_date, ''mon'')::text As bucket, 
SUM(if.num_used)::integer As bucketvalue
	FROM inventory As i INNER JOIN inventory_flow As if 
		ON i.item_id = if.item_id
	  AND action_date BETWEEN date ''2007-01-01'' and date ''2007-12-31 23:59''
	  WHERE if.num_used &lt;code&gt; 0
	GROUP BY if.project, i.item_name, to_char(if.action_date, ''mon''), date_part(''month'', if.action_date)
	ORDER BY if.project, i.item_name', 
	'SELECT to_char(date ''2007-01-01'' + (n || '' month'')::interval, ''mon'') As short_mname 
		FROM generate_series(0,11) n')
		As mthreport;
&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Adding a Total column to the crosstab query&lt;/h4&gt;
&lt;p&gt;Adding a total column to a crosstab query using crosstab function is a bit tricky.  Recall we said the source sql should have exactly
3 columns (row header, bucket, bucketvalue).  Well that wasn't entirely accurate.  The &lt;b&gt;crosstab(source_sql, category_sql)&lt;/b&gt; variant of the function
allows for a source that has columns &lt;b&gt;row_header, extraneous columns, bucket, bucketvalue&lt;/b&gt;.  
Don't get extraneous columns confused with row headers.  They are not the same and if you try to use it as we did for creating multi row columns, you will
be leaving out data.  For simplicity here is a fast rule to remember. &lt;br&gt;
&lt;b&gt;Extraneous column values must be exactly the same for source rows that have the same row header and they get inserted right before the bucket columns.&lt;/b&gt; &lt;br&gt;&lt;br&gt;
We shall use this fact to produce a total column.

&lt;pre&gt;
&lt;code&gt;
--This we use for our source sql
 SELECT i.item_name::text As row_name, 
 	(SELECT SUM(sif.num_used) 
		FROM inventory_flow sif 
			WHERE action_date BETWEEN date '2007-01-01' and date '2007-12-31 23:59'
				AND sif.item_id = i.item_id)::integer As total, 
				to_char(if.action_date, 'mon')::text As bucket, 
 		SUM(if.num_used)::integer As bucketvalue
	FROM inventory As i INNER JOIN inventory_flow As if 
		ON i.item_id = if.item_id
	WHERE (if.num_used &lt;code&gt; 0 AND if.num_used IS NOT NULL)
	  AND action_date BETWEEN date '2007-01-01' and date '2007-12-31 23:59'
	GROUP BY i.item_name, total, to_char(if.action_date, 'mon'), date_part('month', if.action_date)
	ORDER BY i.item_name, date_part('month', if.action_date);

--This we use for our category sql	
SELECT to_char(date '2007-01-01' + (n || ' month')::interval, 'mon') As short_mname 
		FROM generate_series(0,11) n;
		
--Now our cross tabulation query
SELECT mthreport.*
	FROM crosstab('SELECT i.item_name::text As row_name, 
	(SELECT SUM(sif.num_used) 
		FROM inventory_flow sif 
			WHERE action_date BETWEEN date ''2007-01-01'' and date ''2007-12-31 23:59''
				AND sif.item_id = i.item_id)::integer As total, 
		to_char(if.action_date, ''mon'')::text As bucket, 
		SUM(if.num_used)::integer As bucketvalue
	FROM inventory As i INNER JOIN inventory_flow As if 
		ON i.item_id = if.item_id
	WHERE (if.num_used &lt;code&gt; 0 AND if.num_used IS NOT NULL)
	  AND action_date BETWEEN date ''2007-01-01'' and date ''2007-12-31 23:59''
	GROUP BY i.item_name, total, to_char(if.action_date, ''mon''), date_part(''month'', if.action_date)
	ORDER BY i.item_name, date_part(''month'', if.action_date)', 
	'SELECT to_char(date ''2007-01-01'' + (n || '' month'')::interval, ''mon'') As short_mname 
		FROM generate_series(0,11) n'	
	) 
		As mthreport(item_name text, total integer, jan integer, feb integer, 
			mar integer, apr integer, 
			may integer, jun integer, jul integer, aug integer, 
			sep integer, oct integer, nov integer, dec integer)
&lt;/code&gt;
&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;br&gt;&lt;br&gt;
Resulting output of our cross tabulation with total column looks like this: &lt;br&gt;
&lt;img alt="Cross tabulation with total column" src="http://www.postgresonline.com/images/journal/crosstab_source_cat_withtotal.png"&gt;

&lt;p&gt;If per chance you wanted to have a total row as well you could do it with a union query in your source sql.   Unfotunately PostgreSQL does not 
support windowing functions that would make the row total not require a union.  We'll leave that one as an exercise to figure out.
&lt;/p&gt;


&lt;p&gt;Another not so obvious observation.  You can define a type that say returns 20 bucket columns, but your actual
crosstab need not return up to 20 buckets.  It can return less and whatever buckets that are not specified will be left blank.
With that in mind, you can create a generic type that returns generic names and then in your application code - set the heading based
on the category source.  Also if you have fewer buckets in your type definition than what is returned, the right most buckets are just left off.
This allows you to do things like list the top 5 colors of a garment etc.
&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</description></item><item><title>Pakistani Taliban unites under Baitullah Mehsud</title><link>http://www.longwarjournal.org/archives/2007/12/pakistani_taliban_un.php</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Sat, 15 Dec 2007 07:28:51 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/3ed3f090893e214e</guid><description>&lt;div&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" width="100"&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;
&lt;a href="http://www.longwarjournal.org/maps/swat-pakistan-battlemap-1-12062007.php"&gt;&lt;img src="http://www.longwarjournal.org/maps/swat-pakistan-battlemap-1-12062007-thumb.jpg" width="100" height="127" alt=""&gt;&lt;/a&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;Battlemap of Swat operations; blue arrow arrows are the Pakistani Army's advance to date. Click map to view.&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;

&lt;p&gt;As President Pervez Musharraf &lt;a href="http://www.foxnews.com/story/0,2933,316933,00.html"&gt;lifts the state of emergency&lt;/a&gt;, the Taliban in the tribal areas and the Northwest Frontier Province have united under a single banner, and a single leader. On Friday, a shura, or council, of 40 senior Taliban leaders &lt;a href="http://www.nation.com.pk/daily/dec-2007/15/index10.php"&gt;established the Tehrik-i-Taliban Pakistan -- the Movement of the Taliban in Pakistan -- and appointed powerful South Waziristan Taliban commander Baitullah Mehsud its leader&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The shura was made up of Taliban representatives from the seven tribal agencies of North and South Waziristan, Khyber, Orakazi, Bajaur, Mohmand, and Kurram, as well as the settled districts of Swat, Bannu, Tank, Lakki Marwat, Dera Ismail Khan, Kohistan, Buner, and the Malakand division. &lt;/p&gt;

&lt;p&gt;The Tehrik-i-Taliban Pakistan demanded the Pakistani military halt operations in Taliban territory and release of their members. The Taliban also stated it would continue the fight against Coalition forces in Afghanistan. &lt;/p&gt;

&lt;p&gt;"The meeting participants have demanded an immediate end of the military operation being carried out in Swat, and given a 10-day ultimatum to the government to pullout troops from the area," the &lt;em&gt;Nation&lt;/em&gt; reported. The Tehrik-i-Taliban Pakistan also demanded "the closure of the military checkposts in North and South Waziristan and release of all Taliban activists including former Lal Masjid Khateeb Maulana Abul Aziz."&lt;/p&gt;

&lt;p&gt;“Our main aim is to target the US allies in Afghanistan but the government of Pakistan’s ill-strategy has made us to launch a defensive Jihad in Pakistan,” spokesman Maulvi Omar stated. “The government of Pakistan would be paid in the same coin now,” Mehsud said.&lt;/p&gt;

&lt;p&gt;The consolidation of the disparate "local Taliban" movement is a logical step in the Taliban's insurgency campaign in northwestern Pakistan. The Pakistani Taliban, while allied with al Qaeda and the Afghan Taliban, has operated as local groups. The creation of a unified Taliban movement in Pakistan will allow them to better coordinate both military and political operations inside Pakistan, as well as with the Afghan Taliban and al Qaeda.&lt;/p&gt;

&lt;p&gt;The meteoric rise of Mehsud stems from his ability to organize and command large numbers of fighters, fend off the Pakistani military in South Waziristan, take the fight to neighboring agencies and districts, and organize a nationwide suicide bombing campaign. The government cut a deal with Mehsud in 2006 to end the fighting in South Waziristan. Last year it was estimated Mehsud commanded an army of 30,000 fighters. He has been directly implicated in a series of suicide attacks on military and government officials throughout the course of 2007.&lt;/p&gt;

&lt;p&gt;Mehsud leaps over some &lt;a href="http://www.longwarjournal.org/archives/2007/01/the_pakistani_taliba.php"&gt;able and influential Taliban leaders&lt;/a&gt; in North and South Waziristan, including Sadiq Noor, Mullah Nazir, and Noor Islam. It is unclear if Faqir Mohammed of Bajaur and the outlawed Tehrik-e-Nifaz-e-Shariat-e-Mohammadi (TNSM - the Movement for the Implementation of Mohammad's Sharia Law) were represented at the meeting, but it is likely. A representative of Maulana Fazlullah's Swat branch of the TNSM was in attendance. Abu Kasha, a key link between al Qaeda's Shura Majlis and the Taliban, likely holds a senior position in the Tehrik-i-Taliban Pakistan.&lt;/p&gt;</description></item><item><title>Iraq by the numbers: Graphing the decrease in violence</title><link>http://www.longwarjournal.org/archives/2007/12/iraq_by_the_numbers.php</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Mon, 17 Dec 2007 07:32:19 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/62b8cec5eddf7d41</guid><description>&lt;p&gt;Multinational Forces-Iraq has released the data of the effects of the "surge" on the security situation. The reduction in deaths, attack trends, sectarian violence, and improvised explosive device, suicide, and car bomb attacks is dramatic. The number of weapons caches found per year has more than doubled. The graphs below have been provided by Multinational Forces Iraq. Click each graph to view in detail.&lt;/p&gt;

&lt;center&gt;&lt;div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100"&gt;&lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;
&lt;a href="http://www.longwarjournal.org/images/weekly-attack-trends-12072007.php"&gt;&lt;img src="http://www.longwarjournal.org/images/weekly-attack-trends-12072007-thumb.gif" width="486" height="354" alt=""&gt;&lt;/a&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;&lt;b&gt;The weekly attack trends are now down to or below 2004 levels, with fewer than 600 attacks overall reported per week. These numbers include ineffectual attacks. The number peaked during the summer of 2007, with almost 1,600 attacks in one week in June. Click map to view.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;&lt;/center&gt;

&lt;p&gt;&lt;br&gt;
&lt;center&gt;&lt;div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100"&gt;&lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;&lt;br&gt;
&lt;a href="http://www.longwarjournal.org/images/deaths-graph-12172007.php"&gt;&lt;img src="http://www.longwarjournal.org/images/deaths-graph-12172007-thumb.JPG" width="486" height="352" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;&lt;b&gt;The number of deaths per month nationwide is down to January 2006 levels, at about 600 per month. The numbers peaked in December 2006, with about 3,000 deaths per month. Click to view.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
&lt;center&gt;&lt;div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100"&gt;&lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;&lt;br&gt;
&lt;a href="http://www.longwarjournal.org/images/high-profile-attacks-12072007.php"&gt;&lt;img src="http://www.longwarjournal.org/images/high-profile-attacks-12072007-thumb.gif" width="486" height="351" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;&lt;b&gt;High-profile attacks: Suicide car and vest bombs, and car bombs, are down from a peak of near 130 per month to about 30 per month, the lowest level since May 2006. Click to view.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;&lt;/center&gt;&lt;/p&gt;

&lt;center&gt;&lt;div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="486"&gt;&lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;
&lt;a href="http://www.longwarjournal.org/images/IED-incidence-12072007.php"&gt;&lt;img src="http://www.longwarjournal.org/images/IED-incidence-12072007-thumb.gif" width="486" height="324" alt=""&gt;&lt;/a&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;&lt;b&gt;The number of IED attacks are now at 2004 levels, with roughly 20 per day. This is down from the peak of 60 per day in May of this year, when the surge was peaking. Click to view.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;&lt;/center&gt;

&lt;p&gt;&lt;br&gt;
&lt;center&gt;&lt;div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="486"&gt;&lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;&lt;br&gt;
&lt;a href="http://www.longwarjournal.org/images/sectarian-violence-12072007.php"&gt;&lt;img src="http://www.longwarjournal.org/images/sectarian-violence-12072007-thumb.gif" width="486" height="347" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;&lt;b&gt;The sectarian violence in Baghdad has decreased dramatically over the past year. Areas that were hotspots now are quiet. Click to view.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
&lt;center&gt;&lt;div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="486"&gt;&lt;tr&gt;  &lt;td width="100%" style="border-bottom-style:none;border-bottom-width:medium"&gt;&lt;br&gt;
&lt;a href="http://www.longwarjournal.org/images/caches-12072007.php"&gt;&lt;img src="http://www.longwarjournal.org/images/caches-12072007-thumb.gif" width="486" height="345" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td width="100%" style="border-top-style:none;border-top-width:medium"&gt;  &lt;p align="center"&gt;&lt;b&gt;The number of weapons caches discovered increased by almost two and a half times from 2006 to 2007. Click to view.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;/table&gt; &lt;/div&gt;&lt;/center&gt;&lt;/p&gt;</description></item><item><title>"Civilian," "Military" Nukes: What's the Difference?</title><link>http://blog.wired.com/defense/2007/12/a-week-after-it.html</link><category>Cloak and Dagger</category><category>Mullah Menace</category><category>Nukes</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Noah Shachtman</dc:creator><pubDate>Mon, 10 Dec 2007 15:17:14 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/a6892c6721310f7f</guid><description>&lt;div&gt;&lt;p&gt;&lt;img border="0" src="http://blog.wired.com/photos/uncategorized/2007/12/10/mush_cloud_53.jpg" title="Mush_cloud_53" alt="Mush_cloud_53" style="margin:0px 0px 10px 10px;float:right"&gt;
A week after its release, the &lt;a href="http://blog.wired.com/defense/2007/12/intel-report-ir.html"&gt;intelligence report&lt;/a&gt; on Iran's nukes continues to &lt;a href="http://www.haaretz.com/hasen/spages/932430.html"&gt;stir controversy&lt;/a&gt;.  According to the document, Tehran allegedly suspended its military nuclear program -- but kept the civilian one going.  Which begs a whole bunch of questions.   Like, what&amp;#39;s the difference between the two?   And how much weapons-relevant work can be done in a “civilian” research program versus a “military” program?

&lt;/p&gt;

&lt;p&gt;The short answer: a lot. The most direct connection between nuclear energy (civilian programs) and nuclear weapons (military programs) is in the critical materials required.  &lt;a href="javascript:void(0);"&gt;Virtually all&lt;/a&gt; commercial reactors generate energy by “burning” plutonium or enriched uranium in light water reactors. These reactors all produce plutonium, as well, though not always faster than they burn it. Plutonium and enriched uranium are two of the easiest materials to use for constructing the core of a nuclear weapon.

&lt;/p&gt;

&lt;p&gt;Any state with enrichment facilities (to produce enriched uranium, as Iran is trying to do) or reprocessing facilities (which extract pure plutonium from spent uranium fuel rods) would therefore already be skilled in what most people consider the most difficult part of building a nuclear weapon: obtaining the necessary fissile material. And even in states that import nuclear fuel, anyone trained to handle plutonium and/or enriched uranium for a nuclear energy program will still have useful skills for a nuclear weapons program.

&lt;/p&gt;&lt;p&gt;Aside from enrichment and reprocessing, civilian nuclear energy
programs use some other facilities that can be directly useful for
weapons program. “Hot cells,” for instance, &lt;a href="javascript:void(0);"&gt;are&lt;/a&gt; heavily shielded rooms with remote handling equipment, used for manipulating “hot,” or highly radioactive, materials – they &lt;a href="javascript:void(0);"&gt;would be&lt;/a&gt; useful in any bomb construction.

&lt;/p&gt;

&lt;p&gt;However, the most important overlap between civilian and military
nuclear programs lies in the general types of expertise required to make either type of
program successful. Nuclear power and nuclear weapons require
similar expertise in computer programming and modeling; metallurgy; materials,
chemical, electrical, and systems engineering; along with basic
scientific expertise in physics, chemistry, and math. Powerful computer
models are used to predict the behavior of fuel geometries (in power
plants) and weapons designs, for example – even the behavior of &lt;a href="javascript:void(0);"&gt;rubber&lt;/a&gt; that encapsulates nuclear weapons components is modeled to maximize its life and strength. 

&lt;/p&gt;

&lt;p&gt;It does take time to bend these types of skills and knowledge to the
creation of a working nuclear weapon, though. How much time will depend
on many variables specific to each situation:
the level of scientific and engineering expertise present, the amount
of materials and knowledge that can be acquired from abroad, the
isotopic composition of the available materials, etc. Partially because of 
variables like these, crafting a nuclear warhead – actually building
the thing – takes a lot of trial and error from an engineering
standpoint, even though the basic problems and science required to
solve them are pretty well-known. For instance, designing a trigger
mechanism for a bomb is more difficult than it sounds, as is shaping a
perfectly spherical core of plutonium metal for an implosion weapon
(not to mention designing the explosive array to implode the metal). &lt;/p&gt;

&lt;p&gt;In theory, time is actually the only barrier between a civilian
nuclear energy program and a military nuclear weapons program. The
technical skills required for both are useful in &lt;a href="javascript:void(0);"&gt;many industries&lt;/a&gt;,
and they can easily be picked up at many universities. Further, the
level of separation between civilian and military nuclear programs has
historically varied; France’s military program had “substantial
interconnections” with its civilian energy program, but China’s nuclear
weapons stemmed from “a dedicated military program with no major
technological contribution from civilian nuclear energy.”
&lt;/p&gt;

&lt;p&gt;In the broadest sense, then, the ultimate distinction between
civilian and military nuclear programs is one of intent.  Are nuclear
weapons the desired end product? If anything, this makes the National
Intelligence Estimate on Iran more worrisome than many are contending:
the NIE explicitly says “we do not know whether [Iran] currently
intends to develop nuclear weapons.” Iran could simply be biding its
time, working on the hardest part of nuclear technology (enrichment) in
order to be able to move quickly towards a bomb later. (It is even
possible, though unlikely, that they solved their weaponization
problems in 2003 and just need time to perfect their enrichment
technology.) Historically, though, most countries that pursued nuclear
weapons established dedicated military facilities to do so, rather than
relying on their civilian nuclear industries. Let’s hope that Iran is
following this pattern.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;-- &lt;a href="http://www.cdi.org/staff/staffinfo.cfm?StaffID=106&amp;amp;&amp;amp;Orderby=LName&amp;amp;ProgramID=&amp;amp;Program=&amp;amp;Name=&amp;amp;Issue=&amp;amp;keywords=&amp;amp;from_page=index"&gt;Eric Hundman&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;ALSO&lt;/u&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/gates-gets-it-r.html"&gt;Gates Gets it Right on Iran's Nukes&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/unlike-most-of.html"&gt;Intel Insider: Iran Report Ain't Political&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/state-departmen.html"&gt;State Department Skeptic: Be Careful About Iran&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/white-house-cha.html"&gt;White House Changes Iran Intel Story&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/ahmadijad-the-m.html"&gt;Ahmadinejad: The Movie&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/nie-a-timeline.html"&gt;NIE: A Timeline&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/on-march-7-2003.html#more"&gt;International Inspectors 2, Dick Cheney 0&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/the-intelligenc.html"&gt;Diplomatic &amp;quot;Disaster&amp;quot; Led to Iran Intel Spill?&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/nuke1.html"&gt;Iran's Chance to Come Clean?&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/the-declassifie.html"&gt;Spooks = '76 Buccaneers?&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/reporters-helpe.html#more"&gt;Reporters Help Bust Iran's Nuclear Program?&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/12/intel-report-ir.html"&gt;Intel Report: Iran Halted Nuke Arms in 2003&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/11/iran-nuke-in-18.html"&gt;Iran Nuke in &amp;quot;18 Months&amp;quot;?  Unlikely.&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/04/whatever_so_in_.html"&gt;Iran&amp;#39;s &amp;quot;Industrial&amp;quot; Nukes: Yawn&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/05/irans_nukes_tim.html"&gt;Iran's Nukes: Time to Freak?&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/02/glimmers_of_hop.html"&gt;Glimmers of Hope in Iran Report&lt;/a&gt;&lt;br&gt;* &lt;a href="http://blog.wired.com/defense/2007/07/irans-nuclear-s.html"&gt;Iran's Nuclear Scientist Game&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description></item><item><title>What Doesn't Kill You ...</title><link>http://charlotte.creativeloafing.com/gyrobase/Content?oid=229763</link><category>Columns/Citizen Servatius</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Wed, 28 Nov 2007 03:00:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/1ab14a5504d1180e</guid><description>Insults that pay the bills... By Tara Servatius.I can still remember the first column I ever wrote. Some women&amp;#39;s studies major glued together a couple of half-cocked theories she&amp;#39;d picked up in class with a paste of rage at the whole male gender and published it on the editorial page of the UNC-Chapel Hill&amp;#39;s Daily Tar Heel. There wasn&amp;#39;t an original thought in her entire column, but I didn&amp;#39;t know that because I was 20 and not well-read enough to recognize it. It was the kind of...</description></item><item><title>Talk at Yale: Part 1 of 3</title><link>http://www.joelonsoftware.com/items/2007/12/03.html</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Joel Spolsky</dc:creator><pubDate>Mon, 03 Dec 2007 08:42:05 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/8cc4c88d959c4027</guid><description>&lt;a href="http://www.joelonsoftware.com/"&gt;&lt;img src="http://www.joelonsoftware.com/i/rsshead.jpg" width="100" height="44" align="right" border="0" style="margin-left:10px;margin-bottom:10px"&gt;&lt;/a&gt;
&lt;blockquote dir="ltr" style="margin-right:0px"&gt;
&lt;p&gt;&lt;em&gt;This is part one of the text of a talk delivered to the Yale Computer Science department on November 28. The rest of the talk will be published tomorrow and Wednesday.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-698.JPG" align="right" border="0"&gt;I graduated with a B.S. in Computer Science in 1991. Sixteen years ago. What I’m going to try to do today is relate my undergraduate years in the CS department to my career, which consists of developing software, writing about software, and starting a software company. And of course that’s a little bit absurd; there’s a famous part at the beginning of MIT’s Introduction to Computer Science where &lt;a href="http://www-swiss.ai.mit.edu/~hal/hal.html"&gt;Hal Abelson&lt;/a&gt; gets up and explains that Computer Science isn’t about computers and it isn’t a science, so it’s a little bit presumptuous of me to imply that CS is supposed to be training for a career in software development, any more than, say, Media Studies or Cultural Anthropology would be. &lt;/p&gt;
&lt;p&gt;I’ll press ahead anyway. One of the most useful classes I took was a course that I dropped after the first lecture. Another one was a class given by &lt;a href="http://www.engines4ed.org/hyperbook/misc/rcs.html"&gt;Roger Schank&lt;/a&gt; that was so disdained by the CS faculty that it was not allowed to count towards a degree in computer science. But I’ll get to that in a minute. &lt;/p&gt;
&lt;p&gt;The third was this little gut called CS 322, which you know of as CS 323. Back in my day, CS 322 took so much work that it was a 1½ credit class. And Yale’s rule is, that extra half credit could only be combined with other half credits from the same department. Apparently there were two other 1½ credit courses, but they could only be taken together. So through that clever trickery, the half credit was therefore completely useless, but it did justify those weekly problem sets that took 40 hours to complete. After years of students’ complaining, the course was adjusted to be a 1 credit class, it was renumbered CS 323, and still had weekly 40 hour problem sets. Other than that, it’s pretty much the same thing. I loved it, because I love programming. The best thing about CS323 is it teaches a lot of people that they just ain’t never gonna be programmers. This is a good thing. People that don’t have the benefit of &lt;a href="http://www.cs.yale.edu/people/faculty/eisenstat.html"&gt;Stan&lt;/a&gt; teaching them that they can’t be programmers have miserable careers cutting and pasting a lot of Java. By the way, if you took CS 323 and got an A, we have &lt;a href="http://www.fogcreek.com/Jobs/SummerIntern.html"&gt;great summer internships at Fog Creek&lt;/a&gt;. See me afterwards. &lt;/p&gt;
&lt;p&gt;As far as I can tell, the core &lt;a href="http://students.yale.edu/oci/ycps/ycpsProgramCourses.jsp?subject=CPSC&amp;amp;dept=Computer%20Science"&gt;curriculum&lt;/a&gt; hasn’t changed at all. 201, 223, 240, 323, 365, 421, 422, 424, 429 appear to be almost the same courses we took 16 years ago. The number of CS majors is actually up since I went to Yale, although a temporary peak during the dotcom days makes it look like it’s down. And there are a lot more interesting electives now than there were in my time. So: progress. &lt;/p&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-617.JPG" align="right" border="0"&gt;For a moment there, I actually thought I’d get a PhD. Both my parents are professors. So many of their friends were academics that I grew up assuming that all adults eventually got PhDs. In any case, I was thinking pretty seriously of going on to graduate school in Computer Science. Until I tried to take a class in Dynamic Logic right here in this very department. It was taught by &lt;a href="http://www.cs.uic.edu/~lenore/"&gt;Lenore Zuck&lt;/a&gt;, who is now at UIC. &lt;/p&gt;
&lt;p&gt;I didn’t last very long, nor did I understand much of anything that was going on. From what I gather, Dynamic Logic is just like formal logic: Socrates is a man, all men are mortal, therefore Socrates is mortal. The difference is that in Dynamic Logic truth values can change over time. Socrates was a man, now he’s a cat, etc. In theory this should be an interesting way to prove things about computer programs, in which state, i.e., truth values, change over time. &lt;/p&gt;
&lt;p&gt;In the first lecture Dr. Zuck presented a few axioms and some transformation rules and set about trying to prove a very simple thing. She had a computer program “f := not f,” f is a Boolean, that simply flipped a bit, and the goal was to prove that if you ran this program an even number of times, f would finish with the same value as it started out with. &lt;/p&gt;
&lt;p&gt;The proof went on and on. It was in this very room, if I remember correctly, it looks like the carpet hasn’t been changed since then, and all of these blackboards were completely covered in the steps of the proof. Dr. Zuck used proof by induction, proof by reductio ad absurdum, proof by exhaustion—the class was late in the day and we were already running forty minutes over—and, in desperation, proof by graduate student, whereby, she says, “I can’t really remember how to prove this step,” and a graduate student in the front row says, “yes, yes, professor, that’s right.” &lt;/p&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-621.JPG" align="right" border="0"&gt;And when all was said and done, she got to the end of the proof, and somehow was getting exactly the opposite result of the one that made sense, until that same graduate student pointed out where, 63 steps earlier, some bit had been accidentally flipped due to a little bit of dirt on the board, and all was well. &lt;/p&gt;
&lt;p&gt;For our homework, she told us to prove the converse: that if you run the program “f := not f” n times, and the bit is in the same state as it started, that n must be even. &lt;/p&gt;
&lt;p&gt;I worked on that problem for hours and hours. I had her original proof in front of me, going in one direction, which, upon closer examination, turned out to have all kinds of missing steps that were “trivial,” but not to me. I read every word about Dynamic Logic that I could find in &lt;a href="http://www.library.yale.edu/science/library/engineering.html"&gt;Becton&lt;/a&gt;, and I struggled with the problem late into the night. I was getting absolutely nowhere, and increasingly despairing of theoretical computer science. It occurred to me that when you have a proof that goes on for pages and pages, it’s far more likely to contain errors in the proof as our own intuition about the trivial statements that it’s trying to prove, and I decided that this Dynamic Logic stuff was really not a fruitful way of proving things about actual, interesting computer programs, because you’re more likely to make a mistake in the proof than you are to make a mistake in your own intuition about what the program “f := not f” is going to do. So I dropped the course, thank God for shopping period, but not only that, I decided on the spot that graduate school in Computer Science was just not for me, which made this the single most useful course I ever took. &lt;/p&gt;
&lt;p&gt;Now this brings me to one of the important themes that I’ve learned in my career. Time and time again, you’ll see programmers redefining problems so that they can be solved algorithmically. By redefining the problem, it often happens that they’re left with something that can be solved, but which is  actually a trivial problem. They don’t solve the real problem, because that’s intractable. I’ll give you an example. &lt;/p&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-681.JPG" align="right" border="0"&gt;You will frequently hear the claim that software engineering is facing a quality crisis of some sort. I don’t happen to agree with that claim—the computer software most people use most of the time is of ridiculously high quality compared to everything else in their lives—but that’s beside the point. This claim about the “quality crisis” leads to a lot of proposals and research about making higher quality software. And at this point, the world divides into the geeks and the suits. &lt;/p&gt;
&lt;p&gt;The geeks want to solve the problem automatically, using software. They propose things like unit tests, test driven development, automated testing, dynamic logic and other ways to “prove” that a program is bug-free. &lt;/p&gt;
&lt;p&gt;The suits aren’t really aware of the problem. They couldn’t care less if the software is buggy, as long as people are buying it. &lt;/p&gt;
&lt;p&gt;Currently, in the battle between the geeks and the suits, the suits are winning, because they control the budget, and honestly, I don’t know if that’s such a bad thing. The suits recognize that there are diminishing returns to fixing bugs. Once the software hits a certain level of quality that allows it to solve someone’s problem, that person will pay for it and derive benefit out of it. &lt;/p&gt;
&lt;p&gt;The suits also have a broader definition of “quality.” Their definition is about as mercenary as you can imagine: the quality of software is defined by how much it increases my bonus this year. Accidentally, this definition of quality incorporates a lot more than just making the software bug-free. For example, it places a lot of value on adding more features to solve more problems for more people, which the geeks tend to deride by calling it “&lt;a href="http://www.joelonsoftware.com/articles/fog0000000020.html"&gt;bloatware&lt;/a&gt;.” It places value on aesthetics: a cool-looking program sells more copies than an ugly program. It places value on how happy a program makes its users feel. Fundamentally, it lets the users define their own concept of &lt;a href="http://www.joelonsoftware.com/design/1stDraft/02.html"&gt;quality&lt;/a&gt;, and decide on their own if a given program meets their needs. &lt;/p&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-684.JPG" align="right" border="0"&gt;Now, the geeks are interested in the narrowly technical aspects of quality. They focus on things they can see in the code, rather than waiting for the users to judge. They’re programmers, so they try to automate everything in their life, and of course they try to automate the QA process. This is how you get unit testing, which is not a bad thing, don’t get me wrong, and it’s how you get all these attempts to mechanically “prove” that a program is “correct.” The trouble is that anything that can’t be automated has to be thrown out of the definition of quality. Even though we know that users prefer software that looks cooler, there’s no automated way to measure how cool looking a program is, so that gets left out of the automated QA process. &lt;/p&gt;
&lt;p&gt;In fact what you’ll see is that the hard-core geeks tend to give up on all kinds of useful measures of quality, and basically they get left with the only one they can prove mechanically, which is, does the program behave according to specification. And so we get a very narrow, geeky definition of quality: how closely does the program correspond to the spec. Does it produce the defined outputs given the defined inputs. &lt;/p&gt;
&lt;p&gt;The problem, here, is very fundamental. In order to mechanically prove that a program corresponds to some spec, the spec itself needs to be extremely detailed. In fact the spec has to define everything about the program, otherwise, nothing can be proven automatically and mechanically. Now, if the spec does define everything about how the program is going to behave, then, lo and behold, it contains all the information necessary to generate the program! And now certain geeks go off to a very dark place where they start thinking about automatically compiling specs into programs, and they start to think that they’ve just invented a way to program computers without programming. &lt;/p&gt;
&lt;p&gt;Now, this is the software engineering equivalent of a perpetual motion machine. It’s one of those things that crackpots keep trying to do, no matter how much you tell them it could never work. If the spec defines precisely what a program will do, with enough detail that it can be used to generate the program itself, this just begs the question: how do you write the spec? Such a complete spec is just as hard to write as the underlying computer program, because just as many details have to be answered by spec writer as the programmer. To use terminology from information theory: the spec needs just as many bits of &lt;a href="http://en.wikipedia.org/wiki/Information_entropy"&gt;Shannon entropy&lt;/a&gt; as the computer program itself would have. Each bit of entropy is a decision taken by the spec-writer or the programmer. &lt;/p&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-687.JPG" align="right" border="0"&gt;So, the bottom line is that if there really were a mechanical way to prove things about the correctness of a program, all you’d be able to prove is whether that program is identical to some other program that must contain the same amount of entropy as the first program, otherwise some of the behaviors are going to be undefined, and thus unproven. So now the spec writing is just as hard as writing a program, and all you’ve done is moved one problem from over here to over there, and accomplished nothing whatsoever. &lt;/p&gt;
&lt;p&gt;This seems like a kind of brutal example, but nonetheless, this search for the holy grail of program quality is leading a lot of people to a lot of dead ends. The Windows Vista team at Microsoft is a case in point. Apparently—and this is all based on blog &lt;a href="http://minimsft.blogspot.com/2006/05/copying-xerox-vista-mistakes-and-vp.html"&gt;rumors&lt;/a&gt; and innuendo—Microsoft has had a long term policy of eliminating all software testers who don’t know how to write code, replacing them with what they call SDETs, Software Development Engineers in Test, programmers who write automated testing scripts. &lt;/p&gt;
&lt;p&gt;The old testers at Microsoft checked lots of things: they checked if fonts were consistent and legible, they checked that the location of controls on dialog boxes was reasonable and neatly aligned, they checked whether the screen flickered when you did things, they looked at how the UI flowed, they considered how easy the software was to use, how consistent the wording was, they worried about performance, they checked the spelling and grammar of all the error messages, and they spent a lot of time making sure that the user interface was consistent from one part of the product to another, because a consistent user interface is easier to use than an inconsistent one. &lt;/p&gt;
&lt;p&gt;None of those things could be checked by automated scripts. And so one result of the new emphasis on automated testing was that the Vista release of Windows was extremely inconsistent and unpolished. Lots of obvious problems got through in the final product… none of which was a “bug” by the definition of the automated scripts, but every one of which contributed to the general feeling that Vista was a downgrade from XP. The geeky definition of quality won out over the suit’s definition; I’m sure the automated scripts for Windows Vista are running at 100% success right now at Microsoft, but it doesn’t help when just about every tech reviewer is advising people to stick with XP for as long as humanly possible. It turns out that nobody wrote the automated test to check if Vista provided users with a compelling reason to upgrade from XP. &lt;/p&gt;
&lt;p&gt;&lt;img style="margin-left:5px" alt="" src="http://www.joelonsoftware.com/items/2007/12/03-694.JPG" align="right" border="0"&gt;I don’t hate Microsoft, really I don’t. In fact, my first job out of school was actually at Microsoft. In those days it was not really a respectable place to work. Sort of like taking a job in the circus. People looked at you funny. Really? Microsoft? On campus, in particular, it was perceived as corporate, boring, buttoned-down, making inferior software so that accountants can do, oh I don’t know, spreadsheets or whatever it is that accountants do. Perfectly miserable. And it all ran on a pathetic single-tasking operating system called MS-DOS full of arbitrary stupid limitations like 8-character file names and no email and no telnet and no Usenet. Well, MS-DOS is long gone, but the cultural &lt;a href="http://www.joelonsoftware.com/articles/Biculturalism.html"&gt;gap&lt;/a&gt; between the Unixheads and the Windows users has never been wider. This is a culture war. The disagreements are very byzantine but very fundamental. To Yale, Microsoft was this place that made toy business operating systems using three-decades-old computer science. To Microsoft, “computer sciency” was a bad word used to make fun of new hires with their bizarre hypotheses about how &lt;a href="http://haskell.cs.yale.edu/yale/"&gt;Haskell&lt;/a&gt; is the next major programming language. &lt;/p&gt;
&lt;p&gt;Just to give you one tiny example of the Unix-Windows cultural war. Unix has this cultural value of separating user interface from functionality. A righteous Unix program starts out with a command-line interface, and if you’re lucky, someone else will come along and write a pretty front end for it, with shading and transparency and 3D effects, and this pretty front end just launches the command-line interface in the background, which then fails in mysterious ways, which are then not reflected properly in the pretty front end which is now hung waiting for some input that it’s never going to get. &lt;/p&gt;
&lt;p&gt;But the good news is that you can use the command line interface from a script. &lt;/p&gt;
&lt;p&gt;Whereas the Windows culture would be to write a GUI app in the first place, and all the core functionality would be tangled up hopelessly with the user interface code, so you could have this gigantic application like Photoshop that’s absolutely brilliant for editing photos, but if you’re a programmer, and you want to use Photoshop to resize a folder of 1000 pictures so that each one fits in a 200 pixel box, you just can’t write that code, because it’s all very tightly bound to a particular user interface. &lt;/p&gt;
&lt;p&gt;Anyway, the two cultures roughly correspond to highbrow vs. lowbrow, and in fact, it’s reflected accurately in the curriculum of computer science departments throughout the country. At Ivy League institutions, everything is Unix, functional programming, and theoretical stuff about state machines. As you move down the chain to less and less selective schools Java starts to appear. Move even lower and you literally start to see classes in topics like Microsoft Visual Studio 2005 101, three credits. By the time you get to the 2 year institutions, you see the same kind of SQL-Server-in-21-days “certification” courses you see advertised on the weekends on cable TV. Isn’t it time to start your career in (different voice) Java Enterprise Beans! &lt;/p&gt;
&lt;blockquote dir="ltr" style="margin-right:0px"&gt;
&lt;p&gt;&lt;em&gt;(Part two will appear tomorrow).&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Not loving your job? Visit the &lt;a href="http://jobs.joelonsoftware.com/"&gt;Joel on Software Job Board&lt;/a&gt;: Great software jobs, great people.
&lt;/p&gt;</description></item><item><title>We’re So Vain! You’re probably thinking this blog is about you!</title><link>http://charlottehousehunter.featuredblog.com/?p=54</link><category>For Realty Professionals</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jonathan osman</dc:creator><pubDate>Mon, 03 Dec 2007 07:06:58 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/fb2f59e774d2b284</guid><description>Yesterday I was reading a agent’s blog on another site and she was wondering what her car said about her.  She owns two cars: a Prius and a Lexus SUV.  Her “first impression” vehicle was the Lexus and when she feels the client has bought into her enough, she shows up in the Prius.  I have nothing wrong with [...]</description></item><item><title>Israel's Cyber Shot at Syria</title><link>http://feeds.feedburner.com/~r/DefenseTech/~3/190818233/003870.html</link><category>Around the Globe</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Mon, 26 Nov 2007 08:52:49 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/d7efd8a84f461315</guid><description>Our friends at Av Week have this story so wired, I couldn’t wait to post this update. And, as you well know, I’m a bit obsessed with it. It now seems that one of Israel’s first shots in its raid into Syria in September was a fusillade of 1s and 0s. From Aviation Week: The U.S. was monitoring the electronic emissions coming from Syria during Israel’s September attack; and—although there was no direct American help in destroying a nuclear reactor—there was some advice provided beforehand, military and aerospace industry officials tell Aviation Week &amp;amp; Space Technology. That surveillance is providing clues about how Israeli aircraft managed to slip past Syrian air defenses to bomb the site at Dayr az-Zawr. The main attack was preceded by an engagement with a single Syrian radar site at Tall al-Abuad near the Turkish border. It was assaulted with what appears to be a combination of electronic attack and precision bombs to enable the Israeli force to enter and exit Syrian airspace. Almost immediately, the entire Syrian radar system went off the air for a period of time that included the raid, say U.S. intelligence analysts. There was “no U.S. active engagement other than...&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~f/DefenseTech?a=DRJL1JB"&gt;&lt;img src="http://feeds.feedburner.com/~f/DefenseTech?i=DRJL1JB" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/DefenseTech?a=2dhTFVB"&gt;&lt;img src="http://feeds.feedburner.com/~f/DefenseTech?i=2dhTFVB" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/DefenseTech?a=ddHqGOb"&gt;&lt;img src="http://feeds.feedburner.com/~f/DefenseTech?i=ddHqGOb" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DefenseTech/~4/190818233" height="1" width="1"&gt;</description></item><item><title>SR-71:  Now, That Was Some Airplane</title><link>http://feeds.feedburner.com/~r/Wwds/~3/187349469/</link><category>Culture</category><category>HR</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">wwds</dc:creator><pubDate>Mon, 19 Nov 2007 13:09:19 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/3fa4087a29523414</guid><description>&lt;p&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;Note: At the Air Force Academy, part of our training was that we had to fly (as passengers) in every AF airplane.  One plane, however, was off limits and that was the SR-71.  If memory serves, we could barely get close enough to even touch it, it was so classified.    I did get to break the sound barrier in an F-4 Phantom once, mostly because the pilot had just returned from VietNam and had no fear nor regard for orders, “don’t be breaking the sound barrier for these cadets,” he was told.  Yeah, right.  He was a stud, and no one could make him not do something.  We broke the sound barrier at 100 feet over the desert in Nevada, &lt;strike&gt;no shit.&lt;/strike&gt;   Years later, I flew faster than Mach 1 in that little British-French, pointy nosed commercial plane, the Concorde.   I paid dearly ($$) for the experience and it wasn’t even a thrill.  Anything that has to do with the SR-71 interests me…so this first person account by another grad who got to fly it, was of particular interest.  In it, he says he was flying at Mach 3.5.  To keep it in perspective for you,  airliners today travel at about 550-600 mph–Mach 3.5 is 2,663 mph.  Rifle bullets are about 1,600 mph.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.jobdig.com/wwds/files/2007/11/sr71.jpg" title="Direct link to file"&gt;&lt;img src="http://blogs.jobdig.com/wwds/files/2007/11/sr71.thumbnail.jpg" alt="sr71.jpg" height="207" width="249"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.jobdig.com/wwds/files/2007/11/sr71_1.jpg" alt="sr71_1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;by Brian Shul, from his book &lt;a href="https://galleryonepublishing.com/sleddriver/index.html"&gt;SLED DRIVER&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In April 1986, following an attack on American soldiers in a Berlin disco, President Reagan ordered the bombing of Muammar Qaddafi’s terrorist camps in Libya. My duty was to fly over Libya and take photos recording the damage our F-111s had inflicted. Qaddafi had established a ‘line of death,’ a territorial marking across the Gulf of Sidra, swearing to shoot down any intruder that crossed the boundary. On the morning of April 15, I rocketed past the line at&lt;br&gt;
2,125 mph.&lt;/p&gt;
&lt;p&gt;I was piloting the SR-71 spy plane, the world’s fastest jet, accompanied by Maj. Walter Watson, the aircraft’s reconnaissance systems officer (RSO). We had crossed into Libya and were approaching our final turn over the bleak desert landscape when Walter informed me that he was receiving missile launch signals. I quickly increased our speed, calculating the time it would take for the weapons-most likely SA-2 and SA-4 surface-to-air missiles capable of Mach 5-to reach our altitude. I estimated that we could beat the rocket-powered missiles to the turn and stayed our course, betting our lives on the plane’s performance.&lt;/p&gt;
&lt;p&gt;After several agonizingly long seconds, we made the turn and blasted toward the Mediterranean. ‘You might want to pull it back,’ Walter suggested. It was then that I noticed I still had the throttles full forward. The plane was flying a mile every 1.6 seconds, well above our Mach 3.2 limit. It was the fastest we would ever fly. I pulled the throttles to idle just south of Sicily, but we still overran the refueling tanker awaiting us over Gibraltar.&lt;/p&gt;
&lt;p&gt;Scores of significant aircraft have been produced in the 100 years of flight following the achievements of the Wright brothers, which we celebrate in December. Aircraft such as the Boeing 707, the F-86 Sabre Jet, and the P-51 Mustang are among the important machines that have flown our skies. But the SR-71, also known as the Blackbird, stands alone as a significant contributor to Cold War victory and as the fastest plane ever-and only 93 Air Force pilots ever steered the ’sled,’ as we called our aircraft.&lt;/p&gt;
&lt;p&gt;As inconceivable as it may sound, I once discarded the plane.&lt;br&gt;
Literally. My first encounter with the SR-71 came when I was 10 years old in the form of molded black plastic in a Revell kit. Cementing together the long fuselage parts proved tricky, and my finished product looked less than menacing. Glue,oozing from the seams, discolored the black plastic. It seemed ungainly alongside the fighter planes in my collection, and I threw it away.&lt;/p&gt;
&lt;p&gt; &lt;a href="http://blogs.jobdig.com/wwds/2007/11/19/sr-71-now-that-was-some-airplane/#more-1035"&gt;(more…)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tags: &lt;a href="http://technorati.com/tag/%3Ca+href%3D%22https%3A%2F%2Fgalleryonepublishing.com%2Fsleddriver%2Findex.html%22%3ESLED+DRIVER%3C%2Fa%3E" rel="tag"&gt;SLED DRIVER&lt;/a&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~f/Wwds?a=Srg7ioB"&gt;&lt;img src="http://feeds.feedburner.com/~f/Wwds?i=Srg7ioB" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Wwds?a=TRGXErB"&gt;&lt;img src="http://feeds.feedburner.com/~f/Wwds?i=TRGXErB" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Wwds/~4/187349469" height="1" width="1"&gt;</description></item><item><title>Success</title><link>http://xkcd.com/349/</link><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">(author unknown)</dc:creator><pubDate>Sun, 25 Nov 2007 21:00:00 PST</pubDate><guid isPermaLink="false">tag:google.com,2005:reader/item/aebb58efa3f473af</guid><description>&lt;img src="http://imgs.xkcd.com/comics/success.png" title="40% of OpenBSD installs lead to shark attacks.  It&amp;#39;s their only standing security issue." alt="40% of OpenBSD installs lead to shark attacks.  It&amp;#39;s their only standing security issue."&gt;</description></item></channel></rss>
