<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3994031581234674823</id><updated>2011-11-30T20:08:03.669-08:00</updated><category term='lily'/><category term='postgresql'/><category term='UDBUG'/><category term='food'/><category term='sourdough'/><category term='bread'/><category term='organ'/><category term='lolcode'/><category term='ssh'/><category term='PL/LOLCODE'/><category term='statistics'/><category term='What fer?'/><category term='kids'/><category term='databases'/><category term='presentations'/><title type='text'>Unspecified error</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-857797550331972536</id><published>2011-11-30T19:32:00.000-08:00</published><updated>2011-11-30T20:05:58.839-08:00</updated><title type='text'>Ticked</title><content type='html'>&lt;p&gt;It has been ages since I posted anything here. Since today I'm feeling particularly worked up, I've chosen to post the following letter. On the advice of &lt;strike&gt;counsel&lt;/strike&gt; my wife, I've not sent it to Senator Hatch yet, but am waiting to cool off first. Silly me :)&lt;/p&gt;&lt;hr/&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://hatch.senate.gov"&gt;Senator Hatch&lt;/a&gt;,&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Today you lost any chance at my vote. I admit you'd have lost it already, had I been paying attention, thanks to your support for &lt;a href="http://en.wikipedia.org/wiki/PROTECT_IP_Act"&gt;various ill-conceived&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Combating_Online_Infringement_and_Counterfeits_Act"&gt;clearly clueless&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act"&gt;Hollywood-sponsored bills&lt;/a&gt; that would ruin (in some cases, have already ruined) the internet for most reasonable purposes; how that I am, indeed, paying attention, your vote today in favor of the &lt;a href="http://www.huffingtonpost.com/2011/11/29/senate-votes-to-let-military-detain-americans-indefinitely_n_1119473.html"&gt;National Defense Authorization Act&lt;/a&gt; has sealed the deal (side note: I'm moderately surprised I'm actually linking to the Huffington Post...). You have proven yourself ignorant of the value of due process yet once more. &lt;a href="http://lee.senate.gov/public/"&gt;Senator Lee&lt;/a&gt;, who struck me during his campaign as little more than "full of sound and fury", has proven himself intelligent and reasonable on the issue, having obviously made the realization you have yet to grasp, namely that indefinite imprisonment of United States citizens, captured on American soil on potentially unfounded suspicion of terrorism, is in violation of the due process guaranteed by the Constitution, and cannot be legislatively endorsed under any circumstances.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Perhaps you think that such a scenario, although allowed by the act I mentioned, is too unlikely to be worth considering. That may be, but that's not how laws work. Correct and just laws prohibit the wrong, and allow everything else. Perhaps you think a citizen imprisoned under this act would be released after judicial review, because of its clear Constitutional violations. That may also be, however the point is to write decent laws in the first place, not write lousy laws and make the courts correct them while bankrupting the poor soul who first contravenes the idiotic legislation you've cooked up. Furthermore, Constitutional violations aren't exactly a new thing in the federal government, as you well know, and it's entirely likely that yet another such violation would be justified by some twisted logic or other, as so many others already have been. Perhaps you think that only the truly guilty would ever be thus imprisoned. That may be, but there's still a reason we have due process. Considering the Dept. of Justice regularly describes as potential terrorists people who own firearms, possess survival skills, say nasty things about government policies, and keep food storage, I'm unconvinced the terrorist witch hunt won't catch plenty of innocents in its net. By that description, most of my neighbors and the vast majority of your constituents are already possible terrorists.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I hesitate to use the word, but in this case it applies: this has me outraged. My vote, and those of anyone I manage to influence sufficiently, will go elsewhere.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-857797550331972536?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/857797550331972536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=857797550331972536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/857797550331972536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/857797550331972536'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2011/11/ticked.html' title='Ticked'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-3428256433760973926</id><published>2011-05-21T18:55:00.001-07:00</published><updated>2011-05-21T18:56:08.509-07:00</updated><title type='text'>Today</title><content type='html'>I planted corn today. I also helped with a move, biked a bit, and learned a few things. But whatever rapture may have happened left me behind. Should I feel accomplished, or not?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-3428256433760973926?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/3428256433760973926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=3428256433760973926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3428256433760973926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3428256433760973926'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2011/05/today.html' title='Today'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-851747179378518899</id><published>2010-04-26T21:52:00.000-07:00</published><updated>2010-04-26T21:55:24.344-07:00</updated><title type='text'>Sprouts. Lots of sprouts...</title><content type='html'>&lt;p&gt;I was tempted to take a side trip with the boys to the garden last night. It didn't happen due to time constraints, but the temptation was there, Had I gone, I probably would have found the lovely site that awaited me this morning: all kinds of little baby plants coming up. We've got peas a-plenty, and radishes and lettuce all over. The leeks appear still to be going strong (rumor has it that to get big leeks, you let them overwinter; I have my doubts that this batch will live to see that day), but no bean sprouts yet... unless the evil quail have stolen them. Also no dill nor fennel, but given that my seed stock dated from 1996, I'm not terribly surprised.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-851747179378518899?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/851747179378518899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=851747179378518899' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/851747179378518899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/851747179378518899'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2010/04/sprouts-lots-of-sprouts.html' title='Sprouts. Lots of sprouts...'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-9052358337053581488</id><published>2010-04-17T20:54:00.000-07:00</published><updated>2010-04-17T21:07:45.610-07:00</updated><title type='text'>...and beans...</title><content type='html'>&lt;p&gt;Today we planted beans, and scattered a few more leek seeds to round out those that volunteered from last year. I have high hopes for both leeks and beans, as they come from seed we've saved from last year (or possibly, in the case of the beans, the year before), and because I'm a fan of both of them. Karlyn surprised me with her hearty endorsement of our salt-preserved beans; hopefully we'll end up with bunches of them this year, though if we finally sell our house and move elsewhere, that may become difficult.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We also took the time today to hoe up the remaining maple tree volunteers, and among their remains, to my dismay, I discovered the first of the year's morning glory. The bane of all Salt Lake City gardeners, it has apparently wasted no time getting going this spring. Fortunately the rhubarb isn't yet big enough to have overgrown what are usually the morning glory's best defended strongholds, so we have a few more weeks to really nip it in the proverbial bud, before having to cede vast swaths of formerly fertile garden to its persistent grip.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I realized today that the quarter of a beef we bough in January has lasted us approximately one quarter of a year thus far, with plenty to spare. Realizing that when we have our own cow(s?), the calves they provide will be far smaller than the full grown beef that filled our freezer, it's still nice to think that in at least some of those years our cow provides us with a male calf (we'd likely sell the females), we could accompany it with a pig or two and several chickens, and be entirely set for the year's meat supply. This doesn't necessarily relate to the garden so much, but it's a comforting thought, and bore recording.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-9052358337053581488?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/9052358337053581488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=9052358337053581488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/9052358337053581488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/9052358337053581488'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2010/04/and-beans.html' title='...and beans...'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-4885018351021971545</id><published>2010-04-11T10:43:00.001-07:00</published><updated>2010-04-11T10:45:00.636-07:00</updated><title type='text'>Ooo... rain</title><content type='html'>Being of a curious nature, I eventually checked the expected weather for the next few days. And indeed, it is supposed to rain (not that all the wind this morning isn't enough of a sign already). &lt;a href="http://eggyknap.blogspot.com/2010/04/peas.html"&gt;My seeds&lt;/a&gt; will be happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-4885018351021971545?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/4885018351021971545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=4885018351021971545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/4885018351021971545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/4885018351021971545'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2010/04/ooo-rain.html' title='Ooo... rain'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-7331420223825483034</id><published>2010-04-10T20:36:00.000-07:00</published><updated>2010-04-10T20:51:34.859-07:00</updated><title type='text'>Peas</title><content type='html'>&lt;p&gt;I haven't used this blog thing for much lately. Various friends and family blog, and sometime I think I ought to join in. I haven't made the leap yet, though, and in all likelihood I probably won't.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The blog is about the most suitable tool I have right now for one specific purpose, though. As we've been working on moving to a new house, one with a few acres we hope to grow stuff on, I've realized we'll need to do a fair bit of experimentation as we learn how properly to handle a more agricultural lifestyle, and it will be critically important to keep notes. Eventually I'm kinda thinking of applying some database technology I've been hoping to experiment with anyway, and writing my own program to handle those notes, but I've not done that yet. Instead, I'll use the blog.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So here goes. Today we planted "Early Frost" peas. This is the second planting, as the first germinated less than enthusiastically. Grandma says peas in particular need to be planted more deeply than one might expect, because they work themselves out of the ground and die if they're too shallow. Of the two initial rows, one has germinated about 60%; the other was a complete dud. So after pulling out about a billion little maple seedlings, we replanted. There's a reason they recommend &lt;b&gt;composting&lt;/b&gt; leaves before digging them into a garden, but we didn't have that luxury; last fall we tilled in a bunch of leaves and a little fertilizer.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Karlyn and I seem to have different ideas about what it means to plant "a ton" of peas. Every year we've grown a garden, we've had a couple scraggly pea plants and enough peas that everyone in the family got one or two pods before it got too warm and the plants died, and every year we've thought "next year we'll grow more." And we have done that, but in my view, not enough more. So in the place Karlyn put two rows, I put four, and used up the package and a half of seed we had remaining.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Today we also planted a bunch of radishes (we've always thought of planting those, but never gotten around to it), two kinds of lettuce (head lettuce, and a leaf lettuce mix), and some dill and fennel. These last two sound really neat but the seeds were packed for the 1996 season, so they may not do so well.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;All the plantings are covered, the peas with a garden blanket, and the rest with wood-and-wire-mesh cages. Per instructions from Grandma we haven't watered yet. Hopefully we'll get some rain in a few days (I've no idea what the weather man has to say about that; I'd just like some in a few days), or we'll start some light watering.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The boys really enjoy digging. Just not where they're told to dig.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-7331420223825483034?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/7331420223825483034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=7331420223825483034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/7331420223825483034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/7331420223825483034'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2010/04/peas.html' title='Peas'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-6050422820949879185</id><published>2009-06-28T15:39:00.000-07:00</published><updated>2009-11-05T09:04:46.180-08:00</updated><title type='text'>Electronics is fun</title><content type='html'>&lt;p&gt;Those with a passing familiarity with electronic components will, in all likelihood, consider this just plain silly. However, as I have long had an interest in electronics combined with an apparent irrevocable curse when it comes to actually building a working circuit, I found this experience comforting and inspiring.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Central to modern electronics is a device called the &lt;a href="http://en.wikipedia.org/wiki/Transistor"&gt;transistor&lt;/a&gt;. It allows a small current to control a larger one, which essentially means it's an amplifier.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The upper of the two schematics below shows a circuit that doesn't work. Your skin allows small amounts of current to pass, but if you hook your skin to a 5 volt power source, the current coming out of it won't be enough to light an LED. The second schematic, though, is the one I just built, and shows a transistor in action. The fact that it actually worked still makes me grin. For that matter, it also got Andrew fairly excited -- he likes that kind of thing.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The working circuit allows the tiny current from your skin into a transistor. That convinces the transistor to allow lots of current through, which is adequate to light the LED. Better still, the tighter you grab the wires, or the wetter your hands, or in short the better a conductor you are, the brighter the light gets.&lt;p&gt;&lt;br /&gt;&lt;p&gt;Now what I'm not sure of is why this works when I only grab the wire going into the transistor. I don't even have to is greater than my power supply's ground potential. I haven't seen it light up brighter when I shuffle my feet on the carpet; that would be cool :)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Update: Ok, I do know why this works -- the ground potential here is more positive than the ground potential in my power supply, which in turn is based, I guess, on the neutral level at the power plant (my power supply doesn't use the ground plug in the outlet here). So current flows from me and everything else to the power plant even if I don't hold the positive wire.&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Skfzss1fgUI/AAAAAAAAANE/qcpqwqyOY1E/s1600-h/schematic.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 173px;" src="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Skfzss1fgUI/AAAAAAAAANE/qcpqwqyOY1E/s320/schematic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5352514631428440386" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-6050422820949879185?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/6050422820949879185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=6050422820949879185' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6050422820949879185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6050422820949879185'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/06/electronics-is-fun.html' title='Electronics is fun'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Skfzss1fgUI/AAAAAAAAANE/qcpqwqyOY1E/s72-c/schematic.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-1064271983963821599</id><published>2009-06-17T07:59:00.000-07:00</published><updated>2009-06-17T08:00:21.970-07:00</updated><title type='text'>More kids' stuff</title><content type='html'>&lt;a href="http://vimeo.com/5183525"&gt;This was fun.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-1064271983963821599?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/1064271983963821599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=1064271983963821599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/1064271983963821599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/1064271983963821599'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/06/more-kids-stuff.html' title='More kids&apos; stuff'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-5242145862361883090</id><published>2009-05-03T21:04:00.000-07:00</published><updated>2009-05-03T21:34:29.014-07:00</updated><title type='text'>Kids are cute</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sU_ETxlI/AAAAAAAAAL8/uB6KgiIhsgg/s1600-h/SDC10321.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sU_ETxlI/AAAAAAAAAL8/uB6KgiIhsgg/s320/SDC10321.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5331818116635936338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sUhaYYZI/AAAAAAAAAL0/Y4q9SLwgQAs/s1600-h/SDC10313.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sUhaYYZI/AAAAAAAAAL0/Y4q9SLwgQAs/s320/SDC10313.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5331818108675449234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sUT-iTGI/AAAAAAAAALs/hzX6pmFw_GA/s1600-h/SDC10301.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sUT-iTGI/AAAAAAAAALs/hzX6pmFw_GA/s320/SDC10301.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5331818105068997730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sUL_Bo2I/AAAAAAAAALk/-Ex-VMS4qzk/s1600-h/SDC10433.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sUL_Bo2I/AAAAAAAAALk/-Ex-VMS4qzk/s320/SDC10433.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5331818102923567970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sTsi8K6I/AAAAAAAAALc/3aypT2s6iN0/s1600-h/SDC10432.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sTsi8K6I/AAAAAAAAALc/3aypT2s6iN0/s320/SDC10432.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5331818094484269986" /&gt;&lt;/a&gt;&lt;br /&gt;By popular demand, here are kid pics. Aren't they fun? Also, a &lt;a href="http://vimeo.com/4466954"&gt;video&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-5242145862361883090?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/5242145862361883090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=5242145862361883090' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5242145862361883090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5242145862361883090'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/05/kids-are-cute.html' title='Kids are cute'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Q7kwFwwUJ0o/Sf5sU_ETxlI/AAAAAAAAAL8/uB6KgiIhsgg/s72-c/SDC10321.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-615622917234156243</id><published>2009-05-01T20:13:00.000-07:00</published><updated>2009-05-01T20:14:50.437-07:00</updated><title type='text'>PL/LOLCODE commit</title><content type='html'>I've just finished &lt;a href="http://archives.postgresql.org/pgsql-committers/2009-05/msg00016.php"&gt;another commit&lt;/a&gt; to PL/LOLCODE. It's a beautiful thing. That is all. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-615622917234156243?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/615622917234156243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=615622917234156243' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/615622917234156243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/615622917234156243'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/05/pllolcode-commit.html' title='PL/LOLCODE commit'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-5185233962048601092</id><published>2009-04-28T14:42:00.001-07:00</published><updated>2009-04-28T14:43:46.287-07:00</updated><title type='text'>More geeky database stuff</title><content type='html'>I tend lately to post geeky stuff on &lt;a href="http://blog.endpoint.com"&gt;the company blog&lt;/a&gt; instead of here. Those interested should refer to &lt;a href="http://blog.endpoint.com/2009/04/inside-postgresql-data-types-and.html"&gt;this page&lt;/a&gt; to see the latest on that front.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-5185233962048601092?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/5185233962048601092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=5185233962048601092' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5185233962048601092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5185233962048601092'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/04/more-geeky-database-stuff.html' title='More geeky database stuff'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-879862428189471230</id><published>2009-03-26T04:33:00.000-07:00</published><updated>2009-05-10T22:00:57.927-07:00</updated><title type='text'>Spread the Joy</title><content type='html'>With my &lt;a href="http://www.endpoint.com"&gt;day job&lt;/a&gt; comes the opportunity to create posts on the &lt;a href="http://blog.endpoint.com"&gt;company blog&lt;/a&gt;. It seems of more value to the company if I put database-related techie nerd posts on their blog rather than on this one, and the value to me is probably sixes either way. That said, this blog post simply serves as notice to those few (approx. 1) of my many readers (approx. 2) who care about such things that there's &lt;a href="http://blog.endpoint.com/2009/03/inside-postgresql-multi-batch-hash-join.html"&gt;a new database-related techie nerd post&lt;/a&gt; available for perusal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-879862428189471230?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/879862428189471230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=879862428189471230' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/879862428189471230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/879862428189471230'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/03/bigger-blog.html' title='Spread the Joy'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-6959400937180743931</id><published>2009-03-14T22:40:00.000-07:00</published><updated>2009-03-14T22:46:00.895-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><title type='text'>Fun With SQL</title><content type='html'>Later this week I'll be presenting at the &lt;a href="http://uphpu.org/"&gt;Utah PHP Users Group&lt;/a&gt; meeting about neat stuff you can do in SQL. I've finished the first draft of the slides, here.&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=df9t2m5q_25hbvgxzcq' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;br /&gt;I'm not much of a PHP fan, and not necessarily always quiet about that fact, so extra thanks to &lt;a href="http://uphpu.org/author/mindjuju/"&gt;mindjuju&lt;/a&gt; for the invitation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-6959400937180743931?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/6959400937180743931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=6959400937180743931' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6959400937180743931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6959400937180743931'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/03/fun-with-sql.html' title='Fun With SQL'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-6328574880892694245</id><published>2009-03-01T07:25:00.001-08:00</published><updated>2009-03-01T07:25:55.044-08:00</updated><title type='text'>More kid videos</title><content type='html'>Again in doting parent mode: &lt;a href="http://vimeo.com/3420005"&gt;Joshers dancing required a video&lt;/a&gt;. Message ends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-6328574880892694245?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/6328574880892694245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=6328574880892694245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6328574880892694245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6328574880892694245'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/03/more-kid-videos.html' title='More kid videos'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-8172227976846722714</id><published>2009-02-22T10:01:00.000-08:00</published><updated>2009-02-22T10:07:06.413-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kids'/><category scheme='http://www.blogger.com/atom/ns#' term='lily'/><title type='text'>Lily videos</title><content type='html'>Doting parent that I am, I couldn't rest until I got this videos posted. Well, ok, I have a newborn, Karlyn's stuck in bed most of the time, and the boys are sick, so I haven't been able to rest anyway. But &lt;a href="http://vimeo.com/album/67730"&gt;here are some videos&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-8172227976846722714?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/8172227976846722714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=8172227976846722714' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/8172227976846722714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/8172227976846722714'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/02/lily-videos.html' title='Lily videos'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-6161798091925354285</id><published>2009-02-21T09:26:00.000-08:00</published><updated>2009-02-21T09:33:23.340-08:00</updated><title type='text'>Baby's here</title><content type='html'>After nearly two weeks more waiting than we originally expected, Lillian Elizabeth was born Wednesday, and I'm getting around to posting pictures, &lt;a href="http://picasaweb.google.com/eggyknap/LillianElizabeth#"&gt;here&lt;/a&gt;. More from a very helpful sister and brother-in-law, &lt;a href="http://jerandjanie.blogspot.com"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lily weighs about 0.68 stone (66,500 grain, 0.13 talents) and is a little over one cubit long (about 1/400 of a furlong).&lt;br /&gt;&lt;br /&gt;Unrelated note: &lt;a href="http://www.convert-me.com/en/"&gt;This&lt;/a&gt; is a fun online unit conversion utility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-6161798091925354285?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/6161798091925354285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=6161798091925354285' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6161798091925354285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6161798091925354285'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/02/babys-here.html' title='Baby&apos;s here'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-5690572787562382183</id><published>2009-02-02T12:15:00.000-08:00</published><updated>2009-02-02T12:18:03.310-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Slony1-2.0.0 + PostgreSQL 8.4devel</title><content type='html'>&lt;a href="http://blog.endpoint.com/2009/02/slony1-200-postgresql-84devel.html"&gt;Excellent post&lt;/a&gt;, if I do say so myself, from the &lt;a href="http://blog.endpoint.com/"&gt;End Point blog&lt;/a&gt; about using Slony1-2.0.0 and PostgreSQL 8.4devel. Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-5690572787562382183?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/5690572787562382183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=5690572787562382183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5690572787562382183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5690572787562382183'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2009/02/slony1-200-postgresql-84devel.html' title='Slony1-2.0.0 + PostgreSQL 8.4devel'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-2047237101939727575</id><published>2008-12-18T05:48:00.000-08:00</published><updated>2008-12-18T05:50:00.120-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lolcode'/><title type='text'>I CAN HAS SQRT?</title><content type='html'>I was pointed at this today. Although it doesn't follow the LOLCODE spec as I read it (perhaps it follows some consensus about future specs that I've not paid attention to), it's neat: &lt;a href="http://www.nsquaredsoftware.com/lib/exe/fetch.php?id=challenge&amp;cache=cache&amp;media=dalehalliwelllolcodesqrt.txt"&gt;square roots in LOLCODE.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-2047237101939727575?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/2047237101939727575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=2047237101939727575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/2047237101939727575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/2047237101939727575'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/12/i-can-has-sqrt.html' title='I CAN HAS SQRT?'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-3577470195114678009</id><published>2008-12-12T22:55:00.000-08:00</published><updated>2008-12-12T23:09:51.173-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>ForwardAgent</title><content type='html'>Periodically I'll learn something so useful I immediately wish I'd known it years ago, and so simple I'm almost ashamed to admit it was news to me. UNIX systems in general, and Linux in particular, seem to be especially good at coming up with such things. Yesterday was one such experience, when I learned about SSH's ForwardAgent option.&lt;br /&gt;&lt;br /&gt;SSH agents let you use passphrase-protected SSH keys without typing in your passphrase all the time. If I connect from Host1 to Host2 via SSH, Host2 sends me a key challenge and my SSH agent answers it authenticate me. But if I then use SSH to go from Host2 to Host3, by default I need to either type a password on Host3 (which is annoying and not terribly secure) or copy my private key to Host2 (which is annoying and terribly not secure) (yes, I meant to write it that way).&lt;br /&gt;&lt;br /&gt;ForwardAgent (configured in ssh_config) allows Host3 to send a key challenge to Host2, and Host2 to forward the challenge to the SSH agent living on Host1. It's as if my private key followed me wherever I went. Neat :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-3577470195114678009?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/3577470195114678009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=3577470195114678009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3577470195114678009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3577470195114678009'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/12/forwardagent.html' title='ForwardAgent'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-9029178898809553946</id><published>2008-12-11T22:38:00.000-08:00</published><updated>2008-12-11T22:44:04.272-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Woah... a MUMPS person</title><content type='html'>Yesterday, on the bus, I found out an otherwise unassuming acquaintance who works at the local veterans' hospital, is a devotee of the VA's &lt;a href="http://en.wikipedia.org/wiki/Veterans_Health_Information_Systems_and_Technology_Architecture"&gt;VistA&lt;/a&gt; health information system, and the &lt;a href="http://en.wikipedia.org/wiki/MUMPS"&gt;MUMPS&lt;/a&gt; system that supports it. I knew there were people still forced to use MUMPS; I didn't know anyone actually enjoyed it.&lt;br /&gt;&lt;br /&gt;The VA open sourced VistA while I was working in medical software. I spent a few hours typing inscrutable strings of strange characters into an only semi-responsive console before giving up with the conclusion that anything that esoteric wouldn't be much of a competitor to our product. Which is not to say our product actually &lt;b&gt;worked&lt;/b&gt;, just that it was easier to install.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-9029178898809553946?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/9029178898809553946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=9029178898809553946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/9029178898809553946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/9029178898809553946'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/12/woah-mumps-person.html' title='Woah... a MUMPS person'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-3483409497697157959</id><published>2008-12-07T10:28:00.000-08:00</published><updated>2008-12-07T10:54:01.270-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sourdough'/><category scheme='http://www.blogger.com/atom/ns#' term='bread'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>New sourdough starter</title><content type='html'>We like sourdough. It's neat, it's fun, it's yummy... but we've had problems with sourdough starters. I got a sourdough start from a coworker a while back. It came with a pedigree: a settler had started it over a century before in the Joe's valley area of Utah, and it had been shared and passed down through families ever since. This coworker grew up on sourdough pancakes from this same starter. For a while it worked well, and even when we didn't remember to treat it kindly, it still made decent bread. We learned that even though we couldn't see the difference between quality wheat and crummy wheat, the starter could, and flour from good wheat would rise better. We learned that the electric flour mill we used heated the flour too much, and the starter wouldn't grow well, and when we finally got our &lt;a href="http://www.countrylivinggrainmills.com/"&gt;manual grain mill&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/STwZQQhPjTI/AAAAAAAAAFU/KucxR9CKHpY/s1600-h/p1010073.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_Q7kwFwwUJ0o/STwZQQhPjTI/AAAAAAAAAFU/KucxR9CKHpY/s320/p1010073.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5277120630474378546" /&gt;&lt;/a&gt;the starter worked much better. But eventually the starter just got nasty. Sourdough recipes talk about a "pleasant sour odor" but ours was far from pleasant. It was more like sour feet than sour dough. &lt;br /&gt;&lt;br /&gt;So we started a new one. It's easy enough -- mix flour and water and let it sit out for a few days, periodically adding more flour and more water, and occasionally changing the bowl it's in to a nice clean one. Cheesecloth or perforated plastic wrap on the top is good for letting wild yeasts in and keeping bugs out, and in a few days you get something kinda foamy. That starter worked decently enough, but since last summer we've been fairly busy, and haven't been able to feed it regularly. So the other day we retired it from its dark corner of the refrigerator where it had spent the last few months, and I ground up some rye to start a new one.&lt;br /&gt;&lt;br /&gt;Rye is supposed to be better than other grains for starting sourdough cultures, because it has less phytic acid than other grains. Eventually we'll have to -- gently -- introduce wheat flour to this starter; it takes a while for a starter to make the transition to a new flour. But for now, we've got a pasty flour blob sitting in a bowl showing faint signs of bubbling. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Q7kwFwwUJ0o/STwZQQqpOxI/AAAAAAAAAFc/XKH0Or_LThE/s1600-h/p1010072.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_Q7kwFwwUJ0o/STwZQQqpOxI/AAAAAAAAAFc/XKH0Or_LThE/s320/p1010072.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5277120630513810194" /&gt;&lt;/a&gt;This being winter, the wild yeasts we collect aren't as active and our kitchen counter isn't as warm, so it takes a while for it to get started, but here are some pictures, just for kicks...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-3483409497697157959?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/3483409497697157959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=3483409497697157959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3483409497697157959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3483409497697157959'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/12/new-sourdough-starter.html' title='New sourdough starter'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Q7kwFwwUJ0o/STwZQQhPjTI/AAAAAAAAAFU/KucxR9CKHpY/s72-c/p1010073.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-5698089814668253470</id><published>2008-11-14T01:23:00.000-08:00</published><updated>2008-11-14T02:30:05.182-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Cross-column statistics III</title><content type='html'>I'm hoping, possibly in vain, that in this post I'll actually get to the point I was hoping for when I started these posts (previous editions available &lt;a href="http://eggyknap.blogspot.com/2008/10/cross-column-statistics.html"&gt;here (part 1)&lt;/a&gt; and &lt;a href="http://eggyknap.blogspot.com/2008/11/cross-column-statistics-ii.html"&gt;here (part 2)&lt;/a&gt;. This wasn't originally supposed to be a series, much less an epic.&lt;br /&gt;&lt;br /&gt;The last post introduced a few questions we need to answer in order to implement cross-column statistics, and got as far as demonstrating how PostgreSQL uses histograms and why it assumes columns are independent. Again, this assumption stems entirely from the fact that the planner has no better information go on, not because it's a particularly correct assumption. As an example, height and weight of an individual are fairly closely correlated values; people who are relatively tall tend to be relatively heavy. In statistical terms, they're "dependent random variables". But since PostgreSQL doesn't know that, it can't make query plans that take advantage of the fact.&lt;br /&gt;&lt;br /&gt;There has been a fair bit of study into modeling the dependence between random variables. Some go so far as to say dependence is the most studied topic in statistics[1]. So there are a few different well-studied ways of modeling interactions between database columns. But the simple histogram method used for single columns probably won't work, for several reasons. Principle among them is what's called the "curse of dimensionality"[2], which says in effect that as you add more and more dimensions (in this case, columns) to a dataset (in this case, a histogram), the volume of the space increases exponentially, but the amount of data available to describe that space doesn't, so the details of the space are less and less defined as dimensions are added.&lt;br /&gt;&lt;br /&gt;There are other ways. Right now I'm interested in what's called a copula[3], suggested on the pgsql-hackers list by Nathan Boley. A copula is a function defined on the domain [0, 1] in multiple dimensions whose arguments are uniform random variables. Assume we are given two random variables x and y, drawn from populations X and Y respectively, and functions F(x) and G(y), where F(x) gives the percentage of members of the population X that are less than the value x, and similarly for G(y). In our application, X could be all the values from one column of a table, and Y could be all the values from another column in either the same table or some other table. Existing histogram techniques allow us to determine F(x) and G(y). Our cross column statistics are trying to give us a value for H(x, y), which is the proportion of the joint population X + Y whose values are less than both x and y. For two variables, Sklar's theorem[see 3, again] states that H(x, y) = C(F(x), G(y)), where C is a copula.&lt;br /&gt;&lt;br /&gt;So what's so neat about copulas that we'd want to investigate them? Perhaps most important is that they help overcome the curse of dimensionality. They model a probability space, not a population space, and every new dimension you add to a copula is defined across its entire probability. Just think about that one, because I can't figure out how to explain it better. That's a blow to my ego, but a blessing in that it means this post won't be as long. :)&lt;br /&gt;&lt;br /&gt;Copulas (or if you want to be pretentious, copulae) are also interesting because they're getting a lot of attention, which means there are people figuring out how to use them effectively (which is nice if we want to use them effectively within PostgreSQL). Economists and actuaries and the like use copulas a lot to model interactions between variables so they can tell you, for instance, how much they're raising your insurance premium. &lt;br /&gt;&lt;br /&gt;All that said, if we decide copulas work to model this stuff, there will be a bunch more questions to answer:&lt;br /&gt;&lt;br /&gt;1) What kind of copula will we use? There are lots to choose from, with names like "Ali-Mikhail-Haq" and "Farlie-Gumbel-Morgenstern"&lt;br /&gt;2) How will we store the copula in some quickly usable but not terribly huge format?&lt;br /&gt;3) How will we actually use these things, anyway?&lt;br /&gt;4) Which columns will we store this way?&lt;br /&gt;... and lots of others.&lt;br /&gt;&lt;br /&gt;Finally, by request, an &lt;a href="http://icanhascheezburger.files.wordpress.com/2008/05/funny-pictures-cat-kittens-fractal-schrodinger-back.jpg"&gt;almost entirely unrelated point&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[1] K. Jogdeo, Dependence, concepts of. in: Samuel kotz, norman l. johnson, and campbell b.&lt;br /&gt;read, Encyclopedia of Statistical Sciences 2 (1982), 324–334.  as cited by  &lt;br /&gt;Ioannidis, Christos and Williams, Julian M.,A Black Box Approach to Copulas: The Non-Parametric Empirical Copula Approach. Available at SSRN: &lt;a href="http://ssrn.com/abstract=955493"&gt;http://ssrn.com/abstract=955493&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://en.wikipedia.org/wiki/Curse_of_dimensionality"&gt;http://en.wikipedia.org/wiki/Curse_of_dimensionality&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://en.wikipedia.org/wiki/Copula_(statistics)"&gt;http://en.wikipedia.org/wiki/Copula_(statistics)&lt;/a&gt;&lt;br /&gt;[4] &lt;a href="http://archives.postgresql.org/pgsql-hackers/2008-10/msg00865.php"&gt;http://archives.postgresql.org/pgsql-hackers/2008-10/msg00865.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-5698089814668253470?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/5698089814668253470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=5698089814668253470' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5698089814668253470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/5698089814668253470'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/11/cross-column-statistics-iii.html' title='Cross-column statistics III'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-8686257258526365729</id><published>2008-11-06T05:27:00.000-08:00</published><updated>2008-11-06T07:12:34.227-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Cross-column statistics II</title><content type='html'>My &lt;a href="http://eggyknap.blogspot.com/2008/10/cross-column-statistics.html"&gt;last post&lt;/a&gt; talked generally about how PostgreSQL uses statistics for query planning, and was written to introduce the topic of cross-column statistics, in which I've long been interested. This post will blather on for a while about what such things are, and why they might be neat. Or it might end up being more on single-column statistics, because a basis in one-column stats is useful for understanding cross-column stats.&lt;br /&gt;&lt;br /&gt;PostgreSQL's statistics are kept for each column, and each column's statistics are independent of those for another column. The planner assumes that the data in one column are independent of the data in another column; that is, that the probability of a particular value showing up in a given column and row is independent of the other values in the row. The planner makes this assumption not because it's reasonable (it's not), but because it's a lot of work to do otherwise. In order to get past this independence assumption, the planner would need to keep "cross-column" statistics, or statistics that model the interactions between values of different columns.&lt;br /&gt;&lt;br /&gt;There are a few questions to answer when considering implementing something like this. They include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What statistics could we keep that would improve query planning? In other words, what statistics can we use?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How can we keep those statistics without taking too long to build them, too much space to keep them, or too long to use them when planning queries?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How do we know which columns have interesting interactions? In other words, which are dependent enough and involved in enough queries together to make it worth tracking their interactions?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Does this work for columns that are part of the same table, or can it work for columns in different tables, joined by some defined relationship?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What statistics could we keep that would be useful?&lt;/span&gt;&lt;br /&gt;To answer this question, it helps to know how PostgreSQL uses its current statistics. Remember that the point of keeping column statistics is to estimate the number of rows in the column that meet a given condition, such as "LAST_NAME = 'Heiseldorf'" from "SELECT * FROM PERSON WHERE LAST_NAME = 'Heiseldorf'". To answer this question, PostgreSQL keeps several statistics values for each column, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the most common values in a column&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the number of distinct values in the column&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the fraction of NULL values (NULLs are often treated separately, as it's reasonable to assume the distribution of NULLs would behave differently than the distribution of other values)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the most common values in the column and their frequencies&lt;/li&gt;&lt;br /&gt;&lt;li&gt;a histogram describing the distribution of values in the column. "Histogram" means different things for different people; in this case it's a list of the 1/Nth quantiles, where N is the column's statistics target value. In other words, if statistics target is 10, this will include a list of 10 values in order. The first value in the list is greater than 10% of the values in the column, the second value in the list is greater than 20% of the values in the column, and so on.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The planner can use these values to approximate the number of rows where a particular column's value is equal to, greater than, or less than any other given value. For instance, to find how many values in a column equal "Foo", the planner will look for "Foo" in the most common values list. If it finds it, it uses the estimated number of total rows in the relation (pg_class.reltuples) and the estimated frequency of that particular value (available in pg_stats.most_common_freqs) to guess the number of rows containing that value. If the value isn't in the most common values list, it assumes it's uniformly distributed with all other "less common" values. For inequalities (e.g. "WHERE some_field &lt; 'Foo'"), it looks through the histogram buckets to find which one contains "Foo". Assuming it finds "Foo" in the 5th bucket, it knows "Foo" is greater than all the values in the first four buckets. If there are 20 buckets (e.g. statistics target = 20), that means "Foo" is greater than 4/20, or 25% of the rows in the table. Multiplying by pg_class.reltuples gives the number of rows the inequality operator is expected to return. For data types where a distance metric exists (like numeric values, where it can use the subtraction operator), PostgreSQL can assume a linear distribution of values in the histogram bucket and get a presumably more accurate estimate. But this can only work if the data type's values are from a metric space, that is, where there's a distance metric.&lt;br /&gt;&lt;br /&gt;Trying to extend this idea into multiple dimensions quickly becomes difficult, especially when one remembers that it has to apply to data types without a distance metric. If everything had a distance metric, we could (for instance) divide the space between the maximum and minimum values in each column into N uniform segments (N again represents the column's statistics target), create a P-dimensional matrix (where P is the number of columns involved) with N^P cells, where each cell contains the count of rows whose values fall within the histogram bucket defined by that cell.&lt;br /&gt;&lt;br /&gt;This approach is simple, but fails miserably in practice. For starters, as you add columns to the mix, the number of histogram cells goes up exponentially. Also, this falls victim to the "curse of dimensionality"; put simply, although the size of the matrix increases exponentially as you add columns, the amount of data does not increase, so the amount of data in each part of the matrix decreases, until it's so small that you know effectively nothing about most of the matrix, and it becomes useless for estimation.&lt;br /&gt;&lt;br /&gt;Further posts will explore more of the questions above, as well as ways to implement cross-column statistics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-8686257258526365729?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/8686257258526365729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=8686257258526365729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/8686257258526365729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/8686257258526365729'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/11/cross-column-statistics-ii.html' title='Cross-column statistics II'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-7857075391537509390</id><published>2008-10-20T16:26:00.000-07:00</published><updated>2008-10-20T20:48:55.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Cross-column statistics</title><content type='html'>Of late, I've been involved in an interesting thread on the pgsql-hackers mailing list regarding cross-column statistics. I can admit no immediate personal use for such a feature, but that hasn't stopped me before (cf. PL/LOLCODE), and it's a very interesting subject. I'm blogging about it because, well, I can. I expect, though, that my kids won't let me finish it all now, and that this will be a multi-part post.&lt;br /&gt;&lt;br /&gt;The idea of planner statistics on single columns is well understood and implemented all over the database world. That's what you run ANALYZE for -- to refresh those statistics. Ideally the statistics the database keeps will help it determine the best way to execute queries. For instance, assume you have a table called PERSON which stores FIRST_NAME and LAST_NAME, with an index on both columns, and you tell the database to SELECT * FROM PERSON WHERE FIRST_NAME = 'Alfred' AND LAST_NAME = 'Heiseldorf'. The planner can choose several different ways to execute this plan. It can:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Scan the entire table and check each row to find matches to the query&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Scan the index on FIRST_NAME for 'Alfred', and scan the results for LAST_NAME = 'Heiseldorf'&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Scan the index on LAST_NAME for 'Heiseldorf' and scan the results for FIRST_NAME = 'Alfred'&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The planner has to choose which of these three options would be the fastest, and to do that it has to guess how many rows are involved in each method -- hence the statistics. PostgreSQL keeps track of, among several other things, a list of the most common values in each column, and what percentage of the table each comprises (most_common_vals and most_common_freqs in pg_stats). The length of each list is determined by the statistics target value for each column (or default_statistics_target if a target for that column is not specified). PostgreSQL will look at the statistics for the FIRST_NAME and LAST_NAME columns to see if 'Alfred' or 'Heiseldorf' are in the lists of most_common_values for their respective columns. See &lt;a href="http://is.gd/4svb"&gt;here&lt;/a&gt; for more specifics, but using these values, along with estimated numbers of rows in the table, the planner can guess that there are, say, 310 'Alfred's in the table and 4 'Heiseldorf's. In that case, the optimizer will probably choose to look for 'Heiseldorf' first using an index scan on the LAST_NAME field, meaning it will have to scan only those four rows looking for 'Alfred's.&lt;br /&gt;&lt;br /&gt;There are lots of other details, and to avoid being too long (but mostly to avoid embarrassing myself by getting them wrong) I'll leave them out. Suffice it to say that having good guesses about the number of rows a query will return is important for getting decent query plans.&lt;br /&gt;&lt;br /&gt;More on this subject later...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-7857075391537509390?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/7857075391537509390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=7857075391537509390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/7857075391537509390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/7857075391537509390'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/10/cross-column-statistics.html' title='Cross-column statistics'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-930351509509666781</id><published>2008-10-12T11:35:00.000-07:00</published><updated>2009-04-25T07:43:51.863-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PL/LOLCODE'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Calculating pi in LOLCODE</title><content type='html'>&lt;a href="http://people.planetpostgresql.org/mha/"&gt;Magnus Hagander&lt;/a&gt; asked me for a simple function to return a number using PL/LOLCODE. Here's a pi calculator, based on a &lt;a href="http://archives.postgresql.org/pgsql-general/2008-10/msg00298.php"&gt;post by Grzegorz Jaśkiewicz&lt;/a&gt; on the PostgreSQL GENERAL mailing list showing how to find pi using PostgreSQL's new recursive query feature:&lt;br /&gt;&lt;br /&gt;create or replace function lol_pi() returns float immutable language pllolcode as $$&lt;br /&gt;HAI&lt;br /&gt;&lt;div style="padding-left: 30px;"&gt;&lt;br /&gt;      I HAS A PIADD ITZ 0.0&lt;br /&gt;      I HAS A PISUB ITZ 0.0&lt;br /&gt;      I HAS A ITR ITZ 0&lt;br /&gt;      I HAS A ITRZ ITZ 20000&lt;br /&gt;      I HAS A T1&lt;br /&gt;      I HAS A T2&lt;br /&gt;&lt;br /&gt;      IM IN YR LOOP&lt;br /&gt;&lt;div style="padding-left: 60px;"&gt;&lt;br /&gt;              T1 R QUOSHUNT OF 4.0 AN SUM OF 3.0 AN ITR&lt;br /&gt;              T2 R QUOSHUNT OF 4.0 AN SUM OF 5.0 AN ITR&lt;br /&gt;              PISUB R SUM OF PISUB AN T1&lt;br /&gt;              PIADD R SUM OF PIADD AN T2&lt;br /&gt;              ITR R SUM OF ITR AN 4.0&lt;br /&gt;              BOTH SAEM ITR AN BIGGR OF ITR AN ITRZ, O RLY?&lt;br /&gt;&lt;div style="padding-left: 90px;"&gt;&lt;br /&gt;                      YA RLY, GTFO&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;              OIC&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;      IM OUTTA YR LOOP&lt;br /&gt;      FOUND YR SUM OF 4.0 AN DIFF OF PIADD AN PISUB&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;KTHXBYE&lt;br /&gt;$$;&lt;br /&gt;&lt;br /&gt;select lol_pi();&lt;br /&gt;&lt;br /&gt;UPDATE: Fixed indenting to make this look nicer, and credited the mailing list post&lt;br /&gt;UPDATE PART 2: Note that this particular function doesn't use anything special about PL/LOLCODE, and AFAICS should run just fine in any LOLCODE interpreter.&lt;br /&gt;UPDATE PART 3: Note also that there are better facilities for loops in LOLCODE, but PL/LOLCODE doesn't implement them yet, which is why I've got to track the counter explicitly, and explicitly GTFO when it hits ITRZ.&lt;br /&gt;UPDATE PART 3: Some investigation has revealed that this method of calculating pi is called a Gregory-Leibniz series&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-930351509509666781?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/930351509509666781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=930351509509666781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/930351509509666781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/930351509509666781'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/10/calculating-pi-in-lolcode.html' title='Calculating pi in LOLCODE'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-1042663839619923598</id><published>2008-10-08T14:34:00.000-07:00</published><updated>2008-10-08T14:46:01.926-07:00</updated><title type='text'>PL/LOLCODE HOWTO</title><content type='html'>&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=df9t2m5q_13gzzxhdc8' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;br /&gt;I'm working on a presentation for this weekend's &lt;a href="http://postgresqlconference.org/"&gt;PostgreSQL Conference&lt;/a&gt;. It's 90 minutes of me chatting about turning LOLCODE, of all things, into a PostgreSQL procedural language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-1042663839619923598?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/1042663839619923598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=1042663839619923598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/1042663839619923598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/1042663839619923598'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/10/pllolcode-howto.html' title='PL/LOLCODE HOWTO'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-592715819002906633</id><published>2008-09-15T22:48:00.000-07:00</published><updated>2008-10-20T15:38:32.979-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UDBUG'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Why You Should Consider PostgreSQL</title><content type='html'>&lt;iframe src="http://docs.google.com/EmbedSlideshow?docid=df9t2m5q_1168mrwkfd" width="410" frameborder="0" height="342"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;I'll be presenting at the &lt;a href="http://uphpu.org/"&gt;Utah PHP Users Group (UPHPU)&lt;/a&gt; this Thursday on PostgreSQL. I'm not much of a PHP person. The last time I used it heavily was shortly after PHP5 was released, and I found between changes I had to make to get PHP4 code to work in PHP5, plus frequent security patches I had to install, plus changes I had to make to get my code to work with the patched PHP, it was all more work than I felt I wanted to endure. So I switched to Java. That was also an inappropriate choice for many reasons, but it was an excellent introduction to the sorts of things the programmers were doing at the job I started around that same time, and since the project for which I was doing all this programming never went anywhere anyway, it's probably all for the best.&lt;br /&gt;&lt;br /&gt;Anyway, I met "mindjuju", the president of UPHPU at the recent &lt;a href="http://2008.utosc.com/pages/home/"&gt;Utah Open Source Conference&lt;/a&gt;, and since I'm president of the &lt;a href="http://udbug.org/"&gt;Utah Database Users Group&lt;/a&gt; we started chatting user groups. We're trying to get UDBUG off the ground, and since most of our membership is already involved in other users groups, we figured one way is to have meetings in conjunction with other groups.&lt;br /&gt;&lt;br /&gt;A few days later, I got a message on IRC from mindjuju suggesting that, as I'd expressed my devotion to all things PostgreSQL to him at UTOSC, I might want to do a presentation to introduce people to PostgreSQL and let them know why they might want to use it. Another message a few days later told me that the scheduled presenter at this month's UPHPU meeting might have to cancel and could I step in if that happened. Hence the talk, the first draft of which is above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-592715819002906633?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/592715819002906633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=592715819002906633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/592715819002906633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/592715819002906633'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/09/ill-be-presenting-at-utah-php-users.html' title='Why You Should Consider PostgreSQL'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-6850364814941766460</id><published>2008-09-14T14:38:00.001-07:00</published><updated>2008-09-15T23:00:02.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='organ'/><title type='text'>Schematic, etc.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Q7kwFwwUJ0o/SM2JQFkyQ1I/AAAAAAAAAEM/YVkIYC2IE3o/s1600-h/organ.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Q7kwFwwUJ0o/SM2JQFkyQ1I/AAAAAAAAAEM/YVkIYC2IE3o/s400/organ.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5246000050423874386" /&gt;&lt;/a&gt;&lt;br /&gt;I'm hoping to get this blog caught up with the current state of the project, and as such, have spent the last $way_too_long messing with &lt;a href="http://kicad.sourceforge.net/wiki/index.php/Main_Page"&gt;KiCad&lt;/a&gt; to draw a workable schematic of what I plan to do. See the image associated with this post for the somewhat disappointing results. KiCad made a nice postscript schematic, but I had to settle for a ATmega8 in the image instead of the ATmega168 I'm using, and the multiplexers I've got aren't the 74LS154s shown, because of limitations in the KiCad component libraries such as they exist on my laptop. Also, blogger.com wouldn't, so far as I could see, allow me to upload the original postscript, so I've had to convert it to PNG, with a fair bit of lost resolution as a result. Anyway, the idea is that the microcontroller counts, as quickly as possible, from 0 to 255, and puts the value out on PORTB, four bits of which act as the selectors for each of two 1:16 multiplexers. One multiplexer has a constant +5V input, and it electrifies one of 16 possible rows in a matrix of switches, depending on the selector values from the ATmega168. Then the other multiplexer, whose selectors are the lower four bits of PORTB, iterates through all 16 columns of the matrix. The output of that multiplexer goes to a pin on the microcontroller; if a charge manages to show up on that pin, the microcontroller knows that a switch has been pushed. The software on the ATmega168 will keep track of what keys are pushed at any given time, and when something changes, will send a signal to a computer somewhere. Here's hoping it actually works.&lt;br /&gt;&lt;br /&gt;The multiplexers are really neat. In this project, they serve simply to give me a bunch more pins to work with. You can put a signal on its "input" pin and send it to one of 16 possible outputs by applying a binary number between 0 and 15 inclusive to the four selector pins. They also work in reverse, so if you're applying signals to the 16 pins, you can choose which signal ought to be fed out of what would then be the "output" pin. That lets me control a 16x16 matrix of 256 "switches" (the organ pedals, keys, and whatever else I want to control) with only eight microcontroller pins to selecting the switch I'm interested in. I feed +5V into one multiplexer constantly, and use one more microcontroller pin to see if that +5V gets through the switch matrix to tell me a key is pressed. Quick thanks to Intersil for sending me two free 1:8 multiplexers (three selector bits, eight possible outputs). If I don't find a place for them in this project, I'll find a place in another project :)&lt;br /&gt;&lt;br /&gt;Yesterday I soldered together a 5V power supply with pretty much the schematic shown &lt;a href="http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=57"&gt;here&lt;/a&gt;. Now my test circuit on a breadboard on the floor next to the baby cradle behaves predictably :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-6850364814941766460?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/6850364814941766460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=6850364814941766460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6850364814941766460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/6850364814941766460'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/09/schematic-etc.html' title='Schematic, etc.'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Q7kwFwwUJ0o/SM2JQFkyQ1I/AAAAAAAAAEM/YVkIYC2IE3o/s72-c/organ.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-2650501429486540029</id><published>2008-09-09T04:20:00.000-07:00</published><updated>2008-09-09T04:54:08.995-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='organ'/><title type='text'>Background</title><content type='html'>I started this blog principally so I could document projects I'm working on, or thinking of working on, or concluding not to work on, etc. Principle among these is the organ I'm hoping to refurbish. One Christmas, my grandma called me to say that an aunt of mine was getting a new organ for Christmas (similar, if I remember correctly, to &lt;a href="http://www.rodgersinstruments.com/organ928"&gt;this one&lt;/a&gt;, giving her old one to grandma, and would I like grandma's old Hammond that's been sitting in the basement for years (similar to &lt;a href="http://www.hammond-organ.com/Museum/image_directory/concorde.jpg"&gt;this one&lt;/a&gt;), and kinda still works?&lt;br /&gt;&lt;br /&gt;I said yes, and with much grunting, straining, and herniating, we got the thing up the stairs and into my second floor condo, whereupon I discovered what little it could do. Half the time it doesn't even turn on, and the sounds it makes are pretty rough. However, thanks to &lt;a href="http://users.skynet.be/solaris/linuxaudio/aeolus.html"&gt;a nice, open source, software organ synthesizer called Aeolus&lt;/a&gt;, my computer can do a decent organ impression. So I figured I'd build a MIDI interface into my new Hammond, whose console is pretty decent, internals notwithstanding, and via MIDI the console could tell my computer what sounds to make.&lt;br /&gt;&lt;br /&gt;So I started learning electronics. It's loads of fun -- I've wanted to learn this stuff for years anyway, and now that I have a real project to apply it to, I find it's not too tough. Yet. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-2650501429486540029?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/2650501429486540029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=2650501429486540029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/2650501429486540029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/2650501429486540029'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/09/background.html' title='Background'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3994031581234674823.post-3302419399599641851</id><published>2008-09-08T20:10:00.000-07:00</published><updated>2008-09-08T20:23:29.226-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='What fer?'/><title type='text'>Why?</title><content type='html'>Someone asked me today, "Are you blogging this somewhere?" Having never felt the need to start a blog, much less update one (regularly or otherwise), I was somewhat taken aback. Who, after all, could possibly be interested, and if no one was interested, what difference if I just stick to scribbling occasional poorly composed ramblings into my neglected journal while slumped listlessly in a chair at the kitchen table at 4:00 AM, having once again allowed the nocturnal demands of my two little boys to chase from me all capacity for more sleep?&lt;br /&gt;&lt;br /&gt;Whew... take a breath...&lt;br /&gt;&lt;br /&gt;The answer: The Greater Good. Or perhaps not. In fact, it has been suggested that some of the activities I've seen fit to engage in (or to make vague plans one day to engage in) might prove useful or interesting or something to various denizens of the InterTubes. Not only that, I realized that my embarrassingly spotty journal writing habits didn't lend themselves well to the strict documentation required by experiments such as I intend to conduct in relation to the above activities, and that perhaps the convenience of blogging would somehow encourage more consistent record-keeping.&lt;br /&gt;&lt;br /&gt;If you've made it this far with some measure of comprehension, my congratulations to you.&lt;br /&gt;&lt;br /&gt;In short, I'm writing this because someone suggested they might be interested. That being the case, I'll try to ensure that the stuff I post aligns with the expressed interests of my readers, such as they are(n't). Should I fail in those efforts, well, phooey.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3994031581234674823-3302419399599641851?l=eggyknap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eggyknap.blogspot.com/feeds/3302419399599641851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3994031581234674823&amp;postID=3302419399599641851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3302419399599641851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3994031581234674823/posts/default/3302419399599641851'/><link rel='alternate' type='text/html' href='http://eggyknap.blogspot.com/2008/09/why.html' title='Why?'/><author><name>Joshua Tolley</name><uri>http://www.blogger.com/profile/08481531515300677240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
