<?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-10546575</id><updated>2011-07-07T16:11:20.991-07:00</updated><title type='text'>The Race</title><subtitle type='html'>How to race:

Step 1:  Start running.

There is no step 2.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10546575.post-4173094865857033491</id><published>2011-07-04T11:28:00.001-07:00</published><updated>2011-07-04T11:55:25.060-07:00</updated><title type='text'>How to Sleep In and still Run Like Carl Lewis</title><content type='html'>So this morning, I declined to set the alarm, letting my &lt;s&gt;awesome sleeping habits and ability to go to sleep early&lt;/s&gt;delusion be my alarm instead.  And it worked like a charm.  I woke up, got ready, headed out and was completely alone on the trail.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because it was noon and 90+ fricking degrees out with 40% humidity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-5VoIZU1rNKs/ThIG9LEogyI/AAAAAAAAAIM/CE17mpOhP7E/s1600/sculpture8.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/-5VoIZU1rNKs/ThIG9LEogyI/AAAAAAAAAIM/CE17mpOhP7E/s400/sculpture8.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5625566532553179938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Still, today marked an important milestone in my post-injury recovery:  The first time I slowed down because I &lt;s&gt;had a sudden epiphany that will solve the world's oil crisis&lt;/s&gt; I couldn't breath instead of because my knee hurt!  Although I could be deluded, I think it's in part because of my weak attempts at following the Pose Method of running which look something like this:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/RwNw6zT2s-U" frameborder="0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;If you watch that video carefully, you'll notice that Carl Lewis' feet don't actually touch the ground for the entire 100M.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So Pose, is this method by a bunch of British sport scientists who are trying to make their triathletes faster and it basically involves running by falling forwards.  They claim that its two main benefits are being easier on the knees and keeping your heart rate lower at the same speed.  There is a lot of debate about the second claim, but as for the first claim, I can say I'm a believer.  For the whole story, buy their &lt;a href="http://www.amazon.com/gp/product/0972553762/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=thra0d-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=0972553762"&gt;Book&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0972553762&amp;amp;camp=217145&amp;amp;creative=399369" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; or watch their &lt;a href="http://www.amazon.com/gp/product/B002SRQ4VM/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=thra0d-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399373&amp;amp;creativeASIN=B002SRQ4VM"&gt;Movie&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thra0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B002SRQ4VM&amp;amp;camp=217145&amp;amp;creative=399373" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, but my two take-aways for knee-saving today are thus:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Lift up with your knees.  You can seemingly get a similar propulsive effect from not leaning forward as much and pushing back with your trailing foot, but this is most definitely much harder on your knee.  Especially one with a torn PCL.&lt;/li&gt;&lt;li&gt;Shoulders back, head up.  Just like Mom said.  Mostly this &lt;s&gt;is significantly more attractive&lt;/s&gt; makes your body more like a plank, which means it falls forward faster and with less effort.  Also helpful is that it is easier on your lungs to breath this way.  &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-4173094865857033491?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/4173094865857033491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=4173094865857033491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4173094865857033491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4173094865857033491'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2011/07/how-to-sleep-in-and-still-run-like-carl.html' title='How to Sleep In and still Run Like Carl Lewis'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-5VoIZU1rNKs/ThIG9LEogyI/AAAAAAAAAIM/CE17mpOhP7E/s72-c/sculpture8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-3148780985642110737</id><published>2011-06-29T11:27:00.000-07:00</published><updated>2011-06-29T11:53:57.478-07:00</updated><title type='text'>Turning Runkeeper Cycle Logs into Watts</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: verdana, arial, sans-serif; font-size: 11px; "&gt;A good enough approximation is (10 x velocity x slope x mass) + velocity^3 / 8&lt;br /&gt;&lt;br /&gt;velocity in metres per second (divide kmh by 3.6, divide mph by 2.25)&lt;br /&gt;&lt;br /&gt;mass in kg (bike and rider)&lt;br /&gt;&lt;br /&gt;slope in percent&lt;br /&gt;&lt;br /&gt;output in watts.&lt;br /&gt;&lt;br /&gt;Example, a 70 kg rider on a 7 kg bike doing 18 kmh up a 10% grade:&lt;br /&gt;&lt;br /&gt;(10 x 5 x 0.1 x (70 + 7)) + 5^3 / 8 = 5 x 77 + 125 / 8 = 401 watts = 5.7 watts per kg. That's Cadel Evans territory.&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/span&gt;In keeping with my all numbers, all the time philosophy, I decided that what I really need to be able to do is to turn a watts number.  Of course, the &lt;s&gt;way to bankrupt yourself&lt;/s&gt; correct way to do this is with a gizmo on your bike like this one:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-7h3iWqgaAe4/TgtvnO4esxI/AAAAAAAAAH8/xdaGkZx5xi8/s1600/cycleops_joule3_10_m.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 360px; height: 343px;" src="http://4.bp.blogspot.com/-7h3iWqgaAe4/TgtvnO4esxI/AAAAAAAAAH8/xdaGkZx5xi8/s400/cycleops_joule3_10_m.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5623711279502766866" /&gt;&lt;/a&gt;&lt;br /&gt;If you want a non-wired version of something like that it'll set you back about $1,000.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I figured, there's got to be a math way to do it.  And I googled, and found this cool formula: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: verdana, arial, sans-serif; font-size: 11px; "&gt;&lt;blockquote&gt;A good enough approximation is (10 x velocity x slope x mass) + velocity^3 / 8&lt;br /&gt;&lt;br /&gt;velocity in metres per second (divide kmh by 3.6, divide mph by 2.25)&lt;br /&gt;&lt;br /&gt;mass in kg (bike and rider)&lt;br /&gt;&lt;br /&gt;slope in percent&lt;br /&gt;&lt;br /&gt;output in watts.&lt;br /&gt;&lt;br /&gt;Example, a 70 kg rider on a 7 kg bike doing 18 kmh up a 10% grade:&lt;br /&gt;&lt;br /&gt;(10 x 5 x 0.1 x (70 + 7)) + 5^3 / 8 = 5 x 77 + 125 / 8 = 401 watts = 5.7 watts per kg. That's Cadel Evans territory.&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Sweet.  So now I just have to get from runkeeper data to this formula.  Here's my most recent &lt;s&gt;AWESOME&lt;/s&gt; ok for a beginner ride: &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-OOn0H4Vvl_Y/TgtxEnp1GII/AAAAAAAAAIE/ZJB_Kp034m0/s1600/Capture.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 55px;" src="http://1.bp.blogspot.com/-OOn0H4Vvl_Y/TgtxEnp1GII/AAAAAAAAAIE/ZJB_Kp034m0/s400/Capture.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5623712883880040578" /&gt;&lt;/a&gt;&lt;br /&gt;And then I realized that since I always bike a loop, the whole first part of that equation dissapears and we get simply velocity^3/8.  Which honestly seems like a drastic oversimplification, but what the heck, let's give it a shot.  2:33 min/km needs to be converted to meteres per second for this formula, which converts to 153 seconds/km.  Divide by 1000 to get .153 seconds/meter, and invert to get 6.535.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, after this simple conversion, the internet is telling me that my power output for this ride was: (6.536^3)/8 = 35.  Which is pitiful.  Also, I don't believe it.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what's wrong?  Well, for one, there's no account for resistance, size of bike, wind resistence, rolling resistance etc.  So, I check out &lt;a href="http://bikecalculator.com/wattsMetric.html"&gt;http://bikecalculator.com/wattsMetric.html&lt;/a&gt;.  There, entering in the same numbers resulted in 97 watts for the ride, which is closer, but there again there are problems.  Primarily, there is no way to indicate the elevation changes in the ride.  As the runkeeper data shows, the road goes up and down significantly.  The uphills suck, and the downhills rock, but do they offset each other?  Not likely.   But I'm out of time and space, so that will have to be the topic for another post!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-3148780985642110737?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/3148780985642110737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=3148780985642110737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3148780985642110737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3148780985642110737'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2011/06/turning-runkeeper-cycle-logs-into-watts.html' title='Turning Runkeeper Cycle Logs into Watts'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-7h3iWqgaAe4/TgtvnO4esxI/AAAAAAAAAH8/xdaGkZx5xi8/s72-c/cycleops_joule3_10_m.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-7968497693677144141</id><published>2011-06-25T18:45:00.000-07:00</published><updated>2011-06-25T19:31:40.783-07:00</updated><title type='text'>Couch to 5k.  Again.</title><content type='html'>&lt;div&gt;This is me several months ago:&lt;/div&gt;&lt;br /&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/7/7e/Knie_ct.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 208px; height: 208px;" src="http://upload.wikimedia.org/wikipedia/commons/7/7e/Knie_ct.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;And this is me now:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-hmayaEjARTs/TgTlZ3aV3yI/AAAAAAAAJ0I/9V5gLubGq6I/s640/SYTO+Bib+Template.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 576px; height: 432px;" src="http://4.bp.blogspot.com/-hmayaEjARTs/TgTlZ3aV3yI/AAAAAAAAJ0I/9V5gLubGq6I/s640/SYTO+Bib+Template.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Standard disclaimer about photos of me:  Neither of those are actually me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So approximately 400 years ago, the Dr. gave me the verdict that that I had torn the ligament that holds the kneecap, well, on the knee.  Otherwise it just becomes a cap.  Which is what I had.  Fortunately, he said I'd be back to normal in a month.  Now here we are, 399 years and 11 months later, and I finally ran a 5k again.  At less than half the speed I was running 10k's before.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Actually, I still don't feel in shape to do it, but the above race is put on the never boring and occasionally naked &lt;a href="http://www.theboringrunner.com/"&gt;Boring Runner&lt;/a&gt; who promised a box of prizes like his old sunglasses and used sneakers if everyone would run the race from him, and I'm like, "Hey, who wouldn't want to run a race that only exists on the internet?  It will fulfill all of the stereotypes my friends have of me.  And then I did.  And it looked like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-SyNzr65AmxU/TgaZ3loAjhI/AAAAAAAAAH0/_le2y92rDJk/s1600/sweatyourthornsoff.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 393px;" src="http://3.bp.blogspot.com/-SyNzr65AmxU/TgaZ3loAjhI/AAAAAAAAAH0/_le2y92rDJk/s400/sweatyourthornsoff.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5622350365090418194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-7968497693677144141?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/7968497693677144141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=7968497693677144141' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/7968497693677144141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/7968497693677144141'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2011/06/couch-to-5k-again.html' title='Couch to 5k.  Again.'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-hmayaEjARTs/TgTlZ3aV3yI/AAAAAAAAJ0I/9V5gLubGq6I/s72-c/SYTO+Bib+Template.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-1044766479301951817</id><published>2011-06-24T08:09:00.001-07:00</published><updated>2011-06-24T08:26:42.274-07:00</updated><title type='text'>So apparently I just suck at running</title><content type='html'>First off, a picture just for &lt;a href="http://blog.lilsoak.com/"&gt;my fair trading half&lt;/a&gt; who is always saying that she doesn't understand the absurd ratio of cars to houses on our street.  This particular absurd ratio came from my bike ride this morning:&lt;div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-bGBD-bsBZC8/TgSpdvr8AuI/AAAAAAAAAHk/LoH2yIYRjAA/s1600/IMG_0486.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 299px; height: 400px;" src="http://1.bp.blogspot.com/-bGBD-bsBZC8/TgSpdvr8AuI/AAAAAAAAAHk/LoH2yIYRjAA/s400/IMG_0486.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5621804563347276514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So then I went and finish my run.  Here's the stats, courtesy of the&lt;a href="http://palantar.blogspot.com/2011/06/forget-stories-give-me-numbers.html"&gt; new cockpit &lt;/a&gt;: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-ptIqW7LFRWc/TgSqK2G8vDI/AAAAAAAAAHs/YAJGWw-WxdM/s1600/Capture.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 382px;" src="http://2.bp.blogspot.com/-ptIqW7LFRWc/TgSqK2G8vDI/AAAAAAAAAHs/YAJGWw-WxdM/s400/Capture.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5621805338165296178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;So not bad right?  And here's the thing:  I wasn't even really trying.  Basically this makes me really angry at running.   So basically, &lt;a href="http://www.dcrainmaker.com/2011/06/2011-dc-tri-race-report-3rd-overall.html"&gt;a really fast race&lt;/a&gt; is about 1:25 min/km, or roughly 80% faster than this.  By comparison, the fastest 10k I have *ever* run was officially 52 mins, or about 85% faster than a really fast race.  Translation?  I SUCK AT RUNNING.  Oy.  Maybe the &lt;a href="http://www.amazon.com/Nicholas-Romanovs-Pose-Method-Running/dp/0972553762/ref=sr_1_1?ie=UTF8&amp;amp;qid=1308929150&amp;amp;sr=8-1"&gt;Pose Method&lt;/a&gt; will help me.  I'll let you know. :)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-1044766479301951817?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/1044766479301951817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=1044766479301951817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1044766479301951817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1044766479301951817'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2011/06/so-apparently-i-just-suck-at-running.html' title='So apparently I just suck at running'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-bGBD-bsBZC8/TgSpdvr8AuI/AAAAAAAAAHk/LoH2yIYRjAA/s72-c/IMG_0486.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-5188501094515627424</id><published>2011-06-17T19:13:00.000-07:00</published><updated>2011-06-17T19:32:51.913-07:00</updated><title type='text'>Forget stories, give me numbers.</title><content type='html'>&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Timothy_Ferriss.jpg/400px-Timothy_Ferriss.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="text-align: center;float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 10px; cursor: pointer; width: 400px; height: 600px; " src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Timothy_Ferriss.jpg/400px-Timothy_Ferriss.jpg" border="0" alt="" /&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Timothy_Ferriss.jpg/400px-Timothy_Ferriss.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;Timothy Ferris, author of Four Hour Body.  Looking Sketchy  ---&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Anyone who has ever read anything by Timothy Ferris knows that it's about 1 part awesome, 2 parts horse ...stuff.  That includes his recent book &lt;a href="http://www.amazon.com/4-Hour-Body-Uncommon-Incredible-Superhuman/dp/030746363X/ref=sr_1_1?ie=UTF8&amp;amp;qid=1308363220&amp;amp;sr=8-1"&gt;The Four Hour Body&lt;/a&gt;, which is essentially his chronicle of attempting to hack his own body.  I was especially interested in his section distance events (since that's why I do).  Unfortunately that turned out to be a bit on the horsey side, the experiment mentioned in the book never actually took place, instead pointing his poor readers to &lt;a href="http://www.fourhourworkweek.com/blog/ultra/"&gt;this page&lt;/a&gt; which has been coming soon &lt;s&gt;since he decided that suckers like me would buy the book anyway&lt;/s&gt; for a while.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, this isn't about that.  This is about an actual good suggestion that he had.   One of the big things to the book is that if you want to see some progress, measure EVERYTHING.  As a &lt;s&gt;computer&lt;/s&gt;  completely real and legitimate scientist, this totally appeals to me.  So, two years after finally getting a real job again, I went out and bought myself &lt;a href="http://www.amazon.com/RAM-Mounting-Systems-RAP-274-1-AP9U-Handlebar/dp/B003ZFL4K2/ref=sr_1_1?ie=UTF8&amp;amp;qid=1308364102&amp;amp;sr=8-1"&gt;some &lt;/a&gt;&lt;a href="http://www.amazon.com/Wahoo-Fitness-WFFisica01-fisica-Sensor/dp/B0042WGO3Y/ref=sr_1_1?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1308364079&amp;amp;sr=8-1"&gt;real &lt;/a&gt;&lt;a href="http://www.amazon.com/Garmin-010-10997-00-Heart-Rate-Monitor/dp/B000UOD5QM/ref=sr_1_1?ie=UTF8&amp;amp;qid=1308364028&amp;amp;sr=8-1"&gt;equipment&lt;/a&gt;.   And oh my goodness, I couldn't be happier.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So when I got home, I got to plug it all in to the computer.  (OK, I lied, that part is automatic too).  Yes folks, I came home to this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-7SXr_GZ6RO8/TfwN6Rq-l1I/AAAAAAAAAHc/u74j8JmEnec/s1600/Capture.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 393px;" src="http://2.bp.blogspot.com/-7SXr_GZ6RO8/TfwN6Rq-l1I/AAAAAAAAAHc/u74j8JmEnec/s400/Capture.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5619381729878775634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, if I understand that 4 hour body book, I'm only 3.5 hours away from winning the Kona Ironman.  See you there!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-5188501094515627424?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/5188501094515627424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=5188501094515627424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/5188501094515627424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/5188501094515627424'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2011/06/forget-stories-give-me-numbers.html' title='Forget stories, give me numbers.'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-7SXr_GZ6RO8/TfwN6Rq-l1I/AAAAAAAAAHc/u74j8JmEnec/s72-c/Capture.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-3418804605774762005</id><published>2011-06-14T15:08:00.000-07:00</published><updated>2011-06-14T15:20:56.554-07:00</updated><title type='text'>My New Inspiration</title><content type='html'>As The Girl knows, I've recently become obsessed with a new video.  I haven't actually said this out loud, but I think everyone realizes that I see it as a metaphor for my life.  If you haven't seen it before, you totally have to check out.... The Race:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;object style="height: 390px; width: 640px" width="640" height="390"&gt;&lt;div style="text-align: center;"&gt;&lt;embed src="http://www.youtube.com/v/cM5A1K6TxxM?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="390"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I have, in fact, been known to stand up at my computer and start applauding that finish.  Of course, that's mostly because that's where I want to be.  I'm sure that's where most people want to be.  I mean, who hasn't been tripped up, lieing down flat, watching their hopes and dreams fly past them.  That's why Heather is so inspirational here.  &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Heather doesn't give up, in fact, if you watch carefully, she doesn't even slow down.  The race starts out super fast with the field closing the first 200 in somewhere around 29 seconds.  People lock into their positions, seemingly all fairly OK with where they are in the race.  Heather makes a move towards the front and trips, but when she trips, she's running towards a 59 second lap two.  The second lap, in other words, was slightly slower than the first for the whole field. She takes 2-3 seconds to get back up (hard to tell, it's off camera) and then starts running again.  Heather finishes the last lap in 29 seconds and wins the race.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;So basically, what Heather did, is primarily to not slow down.  It was a run of faith.  She got back up, and ran exactly as fast as she was capable.  If the entire rest of the field had run as fast in the last 200 as they had in the first, Heather wouldn't have had a chance.  That was totally outside of her control.  She simply ran as fast as she could, and it was enough.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;More later, but for now, it's time for me to get back to "Running" my own race, which means for now working some more on &lt;a href="http://bluefirereader.com"&gt;Bluefire Reader&lt;/a&gt;.&lt;/div&gt;&lt;param name="movie" value="http://www.youtube.com/v/cM5A1K6TxxM?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-3418804605774762005?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/3418804605774762005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=3418804605774762005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3418804605774762005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3418804605774762005'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2011/06/my-new-inspiration.html' title='My New Inspiration'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-2721688811247644147</id><published>2009-01-17T20:48:00.000-08:00</published><updated>2009-01-17T20:52:58.983-08:00</updated><title type='text'>India - outsourcing jobs to Canada again!</title><content type='html'>Yes, I wrote that title correctly :)  This post is about a fascinating company profiled in &lt;a href="http://www.byteclub.tv/2009/01/episode-14-learnhub/"&gt;this video&lt;/a&gt; which uses technology in the form of social networking education to help fill the giant void of higher education in India.  The remarkable stats sighted in this video have IIT (India's IT training capitol) accepting 8,000 new applicats every year and &lt;span style="font-weight:bold;"&gt;turning down 342,000 every year&lt;/span&gt;! Learnhub was founded to fill that void.  So check out the video which reminds me yet again of Paul Graham's statement that good startups are remarkably similar to non-profits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-2721688811247644147?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/2721688811247644147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=2721688811247644147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2721688811247644147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2721688811247644147'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2009/01/india-outsourcing-jobs-to-canada-again.html' title='India - outsourcing jobs to Canada again!'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-2205176859108275015</id><published>2009-01-17T14:40:00.001-08:00</published><updated>2009-01-17T14:48:17.450-08:00</updated><title type='text'>New Name, New Story</title><content type='html'>Well, in line with the new focus for this blog, I've renamed it to "Technology and Aid in the Modern World."  It still doesn't have quite the exact feeling to it that I want to convey, but its much closer.&lt;br /&gt;&lt;br /&gt;And, to go along with it, I have another story for you guys, this time from &lt;a href="http://wired.com"&gt;Wired&lt;/a&gt;.  In a special on cancer, they profiled &lt;a href="http://www.wired.com/medtech/health/magazine/17-01/ff_cancer?currentPage=2"&gt;Don Listwin&lt;/a&gt; who, looking back, must have worked at Cisco right about the same time I did.  He was the heir apparent to Cisco CEO John Chambers when his mom was misdiagnosed (twice) with a bladder infection instead of the cancer that she was actually suffering from.  &lt;br /&gt;&lt;br /&gt;Well, Listwin, like many in his position, knew that something had to be done, but he did it in a very engineering sort of way.  Listwin found out that 90% of patients whose cancer was discovered early (so-called Stage I) live to survive their cancer, while only 10% of late-discovered cancers (Stage IV) survided.  Listwin's Mom was a stage IV cancer patient by the time she was diagonsed.  Probability wise, if Listwin's Mom had been in the Stage I category, she will still be alive today.  Now Listwin had worked at Cisco during the boom years and had manage to put together over $100 million dollars in savings, so he decided to stop his business pursuits and start the &lt;a href="http://www.canaryfoundation.org/"&gt;Canary Foundation&lt;/a&gt; - an institution devoted to enabling cancer detection in as many and as early of ways as possible.  Well done Mr. Listwin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-2205176859108275015?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/2205176859108275015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=2205176859108275015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2205176859108275015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2205176859108275015'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2009/01/new-name-new-story.html' title='New Name, New Story'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-3908972131633510309</id><published>2008-10-25T13:44:00.000-07:00</published><updated>2008-10-25T13:51:23.913-07:00</updated><title type='text'>More On Cell Phone Banking</title><content type='html'>Technology Review has &lt;a href="http://www.technologyreview.com/business/21533/"&gt;a fairly comprehensive article&lt;/a&gt; on banking through cell phones, particular in India.  Fascinating read.  Many Indian farmers and urban dwellers have predictable patterns (go to auction at 4:00 AM, go back to farm at 6:00 AM, get mugged at 6:10 AM on the road - optional) that leave them somewhat vulnerable to thuggery.  By using cell phones which are attached to an identity to store the money electronically (pin and sometimes thumbprint protected) some of that susceptibility is lessened.&lt;br /&gt;&lt;br /&gt;Additionally, when multiplied by millions, even with only a few dollars a piece, that puts a lot of capital in the banking system.  And, if my Freshman economics serves me, that is something that manages to increase the speed of money in the economy and open up opportunities across the entire population.  The article mentions lots of exciting specifics, so you should check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-3908972131633510309?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/3908972131633510309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=3908972131633510309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3908972131633510309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3908972131633510309'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/10/more-on-cell-phone-banking.html' title='More On Cell Phone Banking'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-2754811668135310402</id><published>2008-10-17T01:01:00.000-07:00</published><updated>2008-10-17T01:13:04.683-07:00</updated><title type='text'>Meet Amy B. Smith</title><content type='html'>Amy B Smith just won the Popular Mechanics Leadership Award for her leadership efforts and work in the area of engineering for the very poor.  Smith has led student trips to places as far away as Ghana and India and has impressed many people in the area of engineering for the poor such as &lt;a href="http://en.wikipedia.org/wiki/Paul_Polak"&gt;Paul Polak&lt;/a&gt;, author of &lt;a href="http://www.amazon.com/Out-Poverty-Traditional-Approaches-Hardcover/dp/1576754499/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1224230936&amp;sr=8-1"&gt;Out of Poverty: What Works when Traditional Approaches Fail.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://video.popularmechanics.com/services/link/bcpid1858324731/bctid1856952337"&gt;Video Here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-2754811668135310402?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/2754811668135310402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=2754811668135310402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2754811668135310402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2754811668135310402'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/10/meet-amy-b-smith.html' title='Meet Amy B. Smith'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-8062760944852702442</id><published>2008-10-09T14:15:00.000-07:00</published><updated>2008-10-09T14:20:00.730-07:00</updated><title type='text'>The Aquaduct(bike)</title><content type='html'>Here's something rather interesting, and the winner of this year's &lt;a href="http://www.innovate-or-die.com/"&gt;Innovate or Die&lt;/a&gt; contest.  It's a pedal-powered bike purpose built for transporting and cleaning water.   It's a really great idea by some people who appear to have a reasonable concept of what the issues are. &lt;br /&gt;&lt;br /&gt;On the other hand, I really hope that we can start seeing some more innovation on the urban front where, unfortunately, most of the world's truly poor live.  &lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-U-mvfjyiao&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-U-mvfjyiao&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-8062760944852702442?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/8062760944852702442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=8062760944852702442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/8062760944852702442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/8062760944852702442'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/10/aquabike.html' title='The Aquaduct(bike)'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-7335773112032814889</id><published>2008-09-16T16:09:00.000-07:00</published><updated>2008-09-16T16:12:58.355-07:00</updated><title type='text'>Curing TB - now with free cellphone minutes!</title><content type='html'>There's a fascinating, and slightly gross article &lt;a href="http://web.mit.edu/newsoffice/2008/tb-cellphone-tt0604.html"&gt;here&lt;/a&gt; which talks about the difficulties in curing TB in developing nations.  The short of it is that it is really hard to convince most people to continue to take their pills for a whole six months.  I've been told this is quite the problem the world over.  When I was in the Philippines last year, it was definitely present there, and presents huge problems because if you don't take the whole 6 months of pills, the viruses predictably come back more resistant to antibiotic treatment, hurting not only the person involved but everyone that they might spread the resistant TB too.  This is a very cool solution to a very real problem, and worth the read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-7335773112032814889?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/7335773112032814889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=7335773112032814889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/7335773112032814889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/7335773112032814889'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/09/curing-tb-now-with-free-cellphone.html' title='Curing TB - now with free cellphone minutes!'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-1653648173107772572</id><published>2008-09-11T16:35:00.000-07:00</published><updated>2008-09-11T16:41:17.808-07:00</updated><title type='text'>Let's make power with a string!</title><content type='html'>Alrighty, this isn't software related, but it is darn cool.  Shawn Frayne, a 28 year old inventor has managed to create a device that harness the power of wind at 10-30 times the efficiency of a windmill.  These devices are very small and can be produced very cheaply, and could be a great boon to remote, developing locations such as Haiti.  Check out the &lt;a href="http://video.popularmechanics.com/services/link/bcpid1214137061/bctid1233395616"&gt;video from popular mechanics&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-1653648173107772572?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/1653648173107772572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=1653648173107772572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1653648173107772572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1653648173107772572'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/09/lets-make-power-with-string.html' title='Let&apos;s make power with a string!'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-4040913955315335682</id><published>2008-09-09T10:38:00.000-07:00</published><updated>2008-09-09T10:57:30.561-07:00</updated><title type='text'>Social Justice Programming</title><content type='html'>It's hard to be a programmer who cares about the world around you.  There isn't the directness of other disciplines.  You can't walk up to a starving child and give them a sheet of code, it just doesn't help.  If you're a water engineer, you can help build a new well.  A sanitation engineer can help with desperately needed, erm, sanitation.  Agriculture, nutrition, etc, these are all very directly applicable and needed skills throughout the world, but Software Engineering is harder. &lt;br /&gt;&lt;br /&gt;Still, I am a Software engineer, and I love it, so how do I help?  I have been struggling with this idea for years, but now I've decided that I want to start bringing it to my blog, and the first, somewhat quirky thing I'd like to mention is mobile phone money.  (Yes, I hear the skepticism, but hear me out!) :)&lt;br /&gt;&lt;br /&gt;There are a couple new project, one called &lt;a href="http://www.safaricom.co.ke/index.php?id=228"&gt;M-PESA&lt;/a&gt; and the other called &lt;a href="http://www.indiaprwire.com/pressrelease/financial-services/200803077912.htm"&gt;"Hello Money"&lt;/a&gt; and both of them are being launched in more violent, less safe parts of the world, and for good reason.  It turns out, according to &lt;a href="http://liftconference.com/person/david-birch"&gt;David Birch&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Bruce_Sterling"&gt;Bruce Sterling&lt;/a&gt; at the &lt;a href="http://www.liftconference.com/"&gt;LIFT|ASIA&lt;/a&gt; conference, that cash is actually the hardest thing for poor people to use, and it is no wonder that in places like Kenya, people use their SIM cards as currency because they are more secure and less dangerous to carry than paper money.  &lt;br /&gt;&lt;br /&gt;Also, thanks to the fantastic people at &lt;a href="http://www.adaptivepath.com/blog/"&gt;Adaptive Path&lt;/a&gt; for turning me onto this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-4040913955315335682?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/4040913955315335682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=4040913955315335682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4040913955315335682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4040913955315335682'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/09/social-justic-programming.html' title='Social Justice Programming'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-97667115831973856</id><published>2008-06-09T13:06:00.000-07:00</published><updated>2008-06-09T13:11:00.938-07:00</updated><title type='text'>Properly Naming Exceptions Is Important</title><content type='html'>I just got done spending over an hour debugging an OutOfMemoryException in a C# application I have.  It was a really peculiar error because it began spontaneously in an application that primarily just iterates over about fifty thousand images in a repository and resizes them for the web.  This was peculiar because the application had already run succesfully many times for the same data set with no memory exception.&lt;br /&gt;&lt;br /&gt;Regardless, I dutifully set up lots of different memory freeing mechanism, going to the final state of forcing a Image.dispose() and forced garbage collection after every single image.  Still OutOfMemory.  DANG YOU!!!&lt;br /&gt;&lt;br /&gt;Ok, so what it turns out is that if you are attempting to load a corrupted image file using C#'s Image.FromFile(), it crashes with the very unhelpful OutOfMemoryException instead of something more useful like ImageCorruptedException. Heck, I would have settled for IAmTooLazyToThinkOfAnActualException, at least that wouldn't have misled me so much :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-97667115831973856?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/97667115831973856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=97667115831973856' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/97667115831973856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/97667115831973856'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/06/properly-naming-exceptions-is-important.html' title='Properly Naming Exceptions Is Important'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-5388725359738004800</id><published>2008-05-15T12:33:00.000-07:00</published><updated>2008-05-15T12:43:02.206-07:00</updated><title type='text'>Flex 3 - Get the text of your DataGrid Item</title><content type='html'>The task (which you would really think should be simple) is to get the text of the current DataGrid element in a custom drop-in itemRenderer. This can be useful for a lot of reason - for me specifically, I wanted to use the same renderer for an entire DataGrid and color things one color if they're less than 5 and another if they are more than 5. But to do that, you have to create an itemRenderer that knows which column it is in in order to retreive the correct data. Sadly, this took me several hours of searching and not only could I not find any proper solutions, but I ran across a number of dated examples that sent me in the wrong direction.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, without further ado, getting the text of your DataGrid item in an ItemRenderer:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;     private function getItemText():Object&lt;br /&gt;     {&lt;br /&gt;      return data.elements(getColumn().headerText);&lt;br /&gt;     }&lt;br /&gt;     &lt;br /&gt;     private function getColumn():DataGridColumn&lt;br /&gt;     {&lt;br /&gt;        var dg:DataGrid = (listData) ? DataGrid(listData.owner) : null;&lt;br /&gt;    var column:DataGridColumn = (dg) ? dg.columns[listData.columnIndex] as DataGridColumn : null;&lt;br /&gt;    &lt;br /&gt;    return column;&lt;br /&gt;     }&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-5388725359738004800?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/5388725359738004800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=5388725359738004800' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/5388725359738004800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/5388725359738004800'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/05/flex-3-get-text-of-your-datagrid-item.html' title='Flex 3 - Get the text of your DataGrid Item'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-1050932230357712994</id><published>2008-05-06T18:35:00.000-07:00</published><updated>2008-05-06T18:36:35.058-07:00</updated><title type='text'>Yet another reason to choose bittorrent...</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_yDgiGeIzBKs/SCEHaDfHFvI/AAAAAAAAACE/xXMjqm6iAd4/s1600-h/hulu.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5197443589156050674" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_yDgiGeIzBKs/SCEHaDfHFvI/AAAAAAAAACE/xXMjqm6iAd4/s320/hulu.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I wish Hulu had been done right, but seriously, when it is *easier* to pirate than to "do the right thing" something is just wrong with your business model.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-1050932230357712994?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/1050932230357712994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=1050932230357712994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1050932230357712994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1050932230357712994'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2008/05/yet-another-reason-to-choose-bittorrent.html' title='Yet another reason to choose bittorrent...'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_yDgiGeIzBKs/SCEHaDfHFvI/AAAAAAAAACE/xXMjqm6iAd4/s72-c/hulu.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-3918186285863314895</id><published>2007-08-21T10:14:00.001-07:00</published><updated>2007-08-21T10:16:53.483-07:00</updated><title type='text'>How to tell if you're a programmer</title><content type='html'>Apologies to Jeff Foxworth, but:  If you search for "test" in your gmail account and google just says "hundreds" because it doesn't want to count them all, then, you just might be a programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-3918186285863314895?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/3918186285863314895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=3918186285863314895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3918186285863314895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/3918186285863314895'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2007/08/how-to-tell-if-youre-programmer.html' title='How to tell if you&apos;re a programmer'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-1219081698638777690</id><published>2007-08-17T08:48:00.001-07:00</published><updated>2007-08-17T08:50:36.279-07:00</updated><title type='text'>The Right Caption</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://news.yahoo.com/photo/070816/480/bf3b9536fb304a739cd7f64b2848fd87;_ylt=AnWC5gRr8y_W7z6UV_dHB78DW7oF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_yDgiGeIzBKs/RsXDb_Dt-zI/AAAAAAAAAAc/6K32AEf___c/s400/dog_in_rain.jpg" alt="" id="BLOGGER_PHOTO_ID_5099697038617869106" border="0" /&gt;&lt;/a&gt;"I'm in your rain.  Owning your roads."&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-1219081698638777690?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/1219081698638777690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=1219081698638777690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1219081698638777690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/1219081698638777690'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2007/08/right-caption.html' title='The Right Caption'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yDgiGeIzBKs/RsXDb_Dt-zI/AAAAAAAAAAc/6K32AEf___c/s72-c/dog_in_rain.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-4496026442621084790</id><published>2007-07-26T20:43:00.001-07:00</published><updated>2007-07-26T20:51:52.904-07:00</updated><title type='text'>Shoes of Humility + 2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_yDgiGeIzBKs/RqlqGpsJB3I/AAAAAAAAAAU/WUXnlPHMbow/s1600-h/IMG_0544.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_yDgiGeIzBKs/RqlqGpsJB3I/AAAAAAAAAAU/WUXnlPHMbow/s400/IMG_0544.JPG" alt="" id="BLOGGER_PHOTO_ID_5091717516221810546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Look at them, sitting there smugly.  They think they've foiled me, but I know where they sleep...&lt;br /&gt;&lt;br /&gt;Ok, some background needed - I've finally managed to get up to running half marathon distances, and I have constant, completely irrational dreams of winning races.  Some people just run for the exercise.  Some people run so they can eat more.  I run to win races.  Full disclosure dictates that I mention that I am excruciatingly slow and have never finished better than the top third of any distance race I've ran, but the dream lives on.&lt;br /&gt;&lt;br /&gt;Having run my last pair of shoes into the ground, I bought this pair, above, and they have proceeded to attack my feet at every opportunity.  Today, I wasn't able to run more than 20 minutes in them before crippling foot pain and blisters forced me to walk back to my truck. Everyone passed me and gave me that look that meant, "Wow, you sure have a lot of running gear on for somebody who's just walking slowly."  Even the tag-along friends gave me that look (that's the friend whose super-athletic best friend somehow tricked them into coming running with them).  I definitely learned some empathy for the trail walkers today.  Well played, Adidas Supernovas, well played, but I've got something to say to you:  Yo mama was a rubber tree.  Yeah, I went there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-4496026442621084790?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/4496026442621084790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=4496026442621084790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4496026442621084790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4496026442621084790'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2007/07/shoes-of-humility-2.html' title='Shoes of Humility + 2'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_yDgiGeIzBKs/RqlqGpsJB3I/AAAAAAAAAAU/WUXnlPHMbow/s72-c/IMG_0544.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-2840636692184440496</id><published>2007-07-04T14:35:00.001-07:00</published><updated>2007-07-04T14:36:43.233-07:00</updated><title type='text'>A What Server?</title><content type='html'>So as not to be too mean, I won't link to this, but I was browsing the Seattle craigslist web design jobs and I came across these qualifications:&lt;br /&gt;&lt;br /&gt;Strong knowledge of Visual Studio / ASP .Net (C#)&lt;br /&gt;Sequel Server 2007&lt;br /&gt;Microsoft Exchange&lt;br /&gt;QuickBooks Enterprise Edition v7&lt;br /&gt;&lt;br /&gt;That must be like Server 2007 II, the Sequel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-2840636692184440496?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/2840636692184440496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=2840636692184440496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2840636692184440496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/2840636692184440496'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2007/07/what-server.html' title='A What Server?'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-4845193356272980578</id><published>2007-06-07T14:17:00.000-07:00</published><updated>2007-06-07T14:22:20.790-07:00</updated><title type='text'>Vista and the ASUS A8N-SLI Deluxe</title><content type='html'>This is a post for all you folks out there pulling your hair out trying to get Vista to install on your ASUS A8N-SLI Delux MOBOs.  If you're anything like me, you keep hitting the screen where it says choose a hard drive and you get blankityblank/zero hard drives.  It askes for drivers, and you may keep feeding it the RAID drivers that ASUS has over and over again, but to no avail.  Fear not: I have discovered the solution.&lt;br /&gt;&lt;br /&gt;Move the SATA cable 2 inches to the right. :D&lt;br /&gt;&lt;br /&gt;As it turns out, only the interior SATA plugs are controlled by those dreaded SATA RAID drivers that Vista can't figure out.  The external SATA plugs are instead controlled by the nForce chipset, which Vista has drivers for built in.  I googled this one to death and couldn't see a solution posted anywhere, so hopefully, this will help some poor soul. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-4845193356272980578?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/4845193356272980578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=4845193356272980578' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4845193356272980578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/4845193356272980578'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2007/06/vista-and-asus-a8n-sli-deluxe.html' title='Vista and the ASUS A8N-SLI Deluxe'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-7132448272005715391</id><published>2007-01-27T04:06:00.000-08:00</published><updated>2007-01-27T04:14:01.126-08:00</updated><title type='text'>Of Fish and Kettles</title><content type='html'>I just wanted to give two big shout outs today.&lt;br /&gt;&lt;br /&gt;The first is to my friend Jordan, who just launched a website for lending things to/from friends.  I really wondered how useful this thing would be, but then at the launch party last night, I discovered three different things that my group of friends had and were willing to lend that I'd been wanting to borrow from somebody for months, and I had to just think to myself, "&lt;a href="http://lendlist.org"&gt;This is cool."&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the second is to my friend Tom who has been systematically gutting things around his house and turning them into aquariums.  Normally, this could be considered suspect behaviour (he's from the UK, I gotta spell it that way), but I think the results are actually pretty darn cool.  You can find him at &lt;a href="http://adifferentkettleoffish.net"&gt;adifferentkettleoffish.net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-7132448272005715391?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/7132448272005715391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=7132448272005715391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/7132448272005715391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/7132448272005715391'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2007/01/of-fish-and-kettles.html' title='Of Fish and Kettles'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-116406291943565214</id><published>2006-11-20T14:22:00.000-08:00</published><updated>2006-11-20T14:48:39.646-08:00</updated><title type='text'>The Horrors of Objects</title><content type='html'>So, I discovered today, as is proved by a screenshot below from digg's RSS feed, that C++ is actually 21 times harder than C!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4363/820/1600/ObjectOriented.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4363/820/320/ObjectOriented.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-116406291943565214?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/116406291943565214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=116406291943565214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/116406291943565214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/116406291943565214'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/11/horrors-of-objects.html' title='The Horrors of Objects'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-116231341143937968</id><published>2006-10-31T08:47:00.000-08:00</published><updated>2006-10-31T08:50:11.450-08:00</updated><title type='text'>Ubuntu Edgy</title><content type='html'>Let me start off by saying that Ubuntu Edgy is awesome.  Throw on a bit of Automatix after that, and it's a heaven-sent operating system - unless you upgrade.  If you upgrade, everything just blows up.  Your eclipse stops working, and that experimental fix that you pushed to the website?  Well, it's going to stay there for a while as you fight your install and fight it and fight it, and then finally save *everything* off to another disk and re-install from scratch.&lt;br /&gt;&lt;br /&gt;This is palantar signing out, saying, "Don't Upgrade Your Linux"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-116231341143937968?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/116231341143937968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=116231341143937968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/116231341143937968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/116231341143937968'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/10/ubuntu-edgy.html' title='Ubuntu Edgy'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-115336753281034052</id><published>2006-07-19T20:48:00.000-07:00</published><updated>2006-07-19T20:53:08.793-07:00</updated><title type='text'>CSS Code Blocks</title><content type='html'>Ok, this is just silly, but I hate having to experiment and look things up, so I'm thinking you aren't so different.  Here, I've layed out in CSS a basic little css block to create those nifty little blocks of code that you see everywhere with their fancy formatting.  The following CSS block defines the look of the code. Add that to your CSS file, or template file, or wherever :)&lt;br /&gt;&lt;br /&gt;.code {&lt;br /&gt;  font-style: bold;&lt;br /&gt;  margin: 0 0 1.5em 0;&lt;br /&gt;  padding: 0 0 1.5em 14px;&lt;br /&gt;  background-color: #EEEEEE;&lt;br /&gt;  font-family: monospace; font-size: 14px;&lt;br /&gt;  border: 1px solid black;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;Now, in your post/document/etc just surround your post with the following: &amp;lt;div class="code"&gt; and &amp;lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-115336753281034052?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/115336753281034052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=115336753281034052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/115336753281034052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/115336753281034052'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/07/css-code-blocks.html' title='CSS Code Blocks'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-115092676761160137</id><published>2006-06-21T14:34:00.000-07:00</published><updated>2009-06-27T23:30:38.700-07:00</updated><title type='text'>AGAD!! (Tutorial-ish sort of post)</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Please note this blog has now moved &lt;a href="http://painlesswebdesign.com/blog/development/agad-tutorial-ish-sort-of-post/"&gt;Here.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Asynchronous &lt;a href="http://code.google.com/webtoolkit/"&gt;Google (Web Toolkit)&lt;/a&gt; and &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Personally, I think that the acronymn is way more fun to say than "Ajax".  Picture this, you're sneaking up behind someone at a party... you wait until the perfect moment when the music has just paused slightly between songs and you yell one of two things, you yell "AJAX!" or "AGAD!"  Also, it should be noted, that the person you chose to sneak up behind has been horribly disfigured by a childhood accident involving large quantities of a brand-name cleaner.  NOW, which are you going to yell?  At this point, the superiority of AGAD should be evident, but just in case not, I will proceed to actually talk about it.&lt;br /&gt;&lt;br /&gt;The Google Web Toolkit (GWT) is designed to work primarily with a Java backend, but a lot of people, myself included, don't really want to mess with the monolithic terror that is a Java backend, and so Google provides a &lt;a href="http://json.org/"&gt;JSON&lt;/a&gt; interface as well.  In my most recent application, I decided to use JSON to communicate between the GWT front end and Django backend.  The results are midly thrilling, so it is not advised that  you not follow the link unless you have a strong heart, a good back, and at least one friend named Bubbles for support. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lunchtimevoter.com/"&gt;www.lunchtimevoter.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So, how do you integrate the Django and the GWT?  The key part is found in the &lt;a href="http://sourceforge.net/projects/json-py/"&gt;here&lt;/a&gt;.  It's a Python-JSON package that will help Django to speak GWT's language.  It does a pretty good job of converting standard Pythonisms into JSON.  I actually use a modified version, which can be found &lt;a href="http://lunchtimevoter.com/media/json.py"&gt;here&lt;/a&gt;. It takes the Python-JSON package and adds the function of interpreting any Python object into JSON as well.  Feel free to download and use to your hearts content...&lt;br /&gt;&lt;br /&gt;Now, once you have got that, you need to create the object to send, say an object looking something like this, which is the code for a single choice in the lunchtime voter :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;class DisplayChoice(object):&lt;br /&gt;   __name__ = "DisplayChoice"&lt;br /&gt;  &lt;br /&gt;   def __init__(self,choice):&lt;br /&gt;       votes = LunchVote.objects.filter( choice__choiceName__exact = choice.choiceName )&lt;br /&gt;       blackballs = LunchBlackball.objects.filter( choice__choiceName__exact = choice.choiceName )&lt;br /&gt;      &lt;br /&gt;       self.choiceName = choice.choiceName;&lt;br /&gt;      &lt;br /&gt;       self.voteList = list()&lt;br /&gt;       self.blackballList = list()&lt;br /&gt;      &lt;br /&gt;       for vote in votes:&lt;br /&gt;           self.voteList.append(vote.user.displayName)&lt;br /&gt;      &lt;br /&gt;       for blackball in blackballs:&lt;br /&gt;           self.blackballList.append(blackball.user.displayName)&lt;/div&gt;&lt;br /&gt;As you can see, this code is nothing more than a shell for containing a few essentials that need to be communicated to the frontend.  It is then written using the JSON write function with a call such as:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;    response = HttpResponse(write(displayChoice))&lt;br /&gt;   response['Pragma'] = "no cache"&lt;br /&gt;   response['Cache-Control'] = "no-cache, must-revalidate"&lt;br /&gt;   return response;&lt;/div&gt;&lt;br /&gt;Since you'll be updating the AJAX frequently (that's kinda the point of the AJAX stuff isn't it?) you will want to the cache control lines to make sure you get a new copy each time you ask for it.  Additionally, you can add some random garbage GET variable to your request from GWT to force the browser to recognize the response as new.  After that, you have to decode the thing in your GWT application.  This is actually really easy, and for the most part, you can just follow along with the included JSON example.  However, it can be a bit tricky to get the JSON decoder working in *your* application.  After copying the JSON decoder into your own project structure, it is probably easiest to leave the decoder in its own package and import it using the XML files.  Firstly, you want to remove the entry-point from the JSON xml file, just rip the whole line out of there.  Secondly, you want to inherit the json classes.  As an example, here is what the core xml file for the lunchtime voter looks like:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;module&gt;&lt;br /&gt;&amp;lt;!-- Inherit the core Web Toolkit stuff.                  --&gt;&lt;br /&gt;&amp;lt;inherits name='com.google.gwt.user.User'/&gt;&lt;br /&gt;&amp;lt;inherits name='com.google.gwt.sample.json.JSON'/&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Specify the app entry point class.                   --&gt;&lt;br /&gt;&amp;lt;entry-point class='com.lunchtimevoter.client.Display'/&gt;&lt;br /&gt;&amp;lt;/module&gt;&lt;/div&gt;&lt;br /&gt;And that's about it.  After that, it's all standard &lt;a href="http://www.djangoproject.com/"&gt;django&lt;/a&gt; and or &lt;a href="http://code.google.com/webtoolkit/"&gt;gwt&lt;/a&gt; stuff, so experiment and have fun :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-115092676761160137?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/115092676761160137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=115092676761160137' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/115092676761160137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/115092676761160137'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/06/agad-tutorial-ish-sort-of-post.html' title='AGAD!! (Tutorial-ish sort of post)'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-114805938309427686</id><published>2006-05-19T09:33:00.000-07:00</published><updated>2006-05-19T10:49:47.070-07:00</updated><title type='text'>What do they want this time???</title><content type='html'>This post/link is for everyone who has ever tried to figure out what their website users really wanted.  I present to you the FeatureVoter.  As you can see, it gives your own users the option to either submit new feature requests or vote up someone else's feature request.  This way, you can tell what your users really want the most, so you can give it to them before your competitors do :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bybirth.net/features/features.py/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4363/820/400/voterpic.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bybirth.net/features/features.py/"&gt;See the Live Version&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To download the app (it's in python), &lt;a href="http://www.bybirth.net/features.zip"&gt;click here&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;To install the app, simply unzip it in the directory that you want it and alter the settings file appropriately.  It's all fairly intuitive, but I'll go over it quickly... &lt;br /&gt;&lt;br /&gt;web_root = (the URL of the the installation location)&lt;br /&gt;admin_user = (the admin password for the feature voter itself, default feature_admin&lt;br /&gt;admin_pass = (the admin password for the feature voter itself)&lt;br /&gt;db_host = (wherever your mysql db is, usually localhost)&lt;br /&gt;db_name = (name of your mysql database)&lt;br /&gt;db_user = (username for your mysql database)&lt;br /&gt;db_password = (password for your mysql database)&lt;br /&gt;&lt;br /&gt;the feature_header and the feature_footer are whatever you want to go before and after the feature voter table in HTML... and example is provided.&lt;br /&gt;&lt;br /&gt;After setting that up, just go to your base url and then admin.py in order to set up the database tables that the app will need, then point your user at your base url + features.py/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-114805938309427686?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/114805938309427686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=114805938309427686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114805938309427686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114805938309427686'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/05/what-do-they-want-this-time.html' title='What do they want this time???'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-114798281993209120</id><published>2006-05-18T13:00:00.000-07:00</published><updated>2006-05-18T13:08:17.303-07:00</updated><title type='text'>The Python Conspiracy</title><content type='html'>Python produces some really beautiful code sometimes.  It's powerful, and even better in nerd currency, Google uses it.  It is, however, driving me completely nuts.  Pull my hair out nuts.  Stryker's son in X-men 2 nuts, and it's all because of one thing: mod_python.  In what universe is it ok, that you have to restart the web server to make one little fix?  I suppose this wouldn't be so bad if I had my own server to host stuff off of, but since none of my readers seem to click on my ads...ever, I am currently stuck with a more cost-effective option: shared hosting.&lt;br /&gt;&lt;br /&gt;Then again, perhaps mod_python was written by admins as a way of extorting nerd-treats (Mountain dew, Snickers bars, etc).  This could explain the last e-mail I got from my admin:&lt;br /&gt;&lt;br /&gt;"Dear Palantar,&lt;br /&gt;&lt;br /&gt;We thank you for your patronage, but regret to inform you that we cannot at this time restart the Apache server AGAIN as we are feeling very tired due to lack of nerd-treats (Mountain dew, Snickers bars, etc).  Please feel free to send us a lot of them. "&lt;br /&gt;&lt;br /&gt;Or I could just be paranoid...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-114798281993209120?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/114798281993209120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=114798281993209120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114798281993209120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114798281993209120'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/05/python-conspiracy.html' title='The Python Conspiracy'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-114643968776660653</id><published>2006-04-30T16:26:00.000-07:00</published><updated>2006-04-30T16:28:07.776-07:00</updated><title type='text'>Wiiiiii!</title><content type='html'>So as we all know, Nintendo is producing a "different" sort of console, supposedly emphasizing small size, ease of use, that sort of thing.  AND Nintendo just renamed the thing "Wii".  So, does this mean that when it comes out we can go to Best Buy and gawk and go, "Aww, look at Nintendo's little wii.  It's so cute." ?  Just wondering...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-114643968776660653?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/114643968776660653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=114643968776660653' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114643968776660653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114643968776660653'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/04/wiiiiii.html' title='Wiiiiii!'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-114304928221090602</id><published>2006-03-22T09:24:00.000-08:00</published><updated>2006-04-12T11:50:17.850-07:00</updated><title type='text'>Kiko The Unselfish</title><content type='html'>So, I actually received an e-mail from &lt;a href="http://kiko.com"&gt;Kiko &lt;/a&gt;(AJAX web calendar people) today.  This shocked me because I'm fairly certain it has been the first useful reply I have gotten from an online company since the dawn of automated reply systems.  Further more, it encouraged me greatly because it turns out that they're planning to add export and synchronization tools for iCal users.  Good new for people with Mac laptops everywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-114304928221090602?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/114304928221090602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=114304928221090602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114304928221090602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114304928221090602'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/03/kiko-unselfish.html' title='Kiko The Unselfish'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-114238032816726346</id><published>2006-03-14T15:50:00.000-08:00</published><updated>2006-03-14T15:52:08.183-08:00</updated><title type='text'>More on SplitNight Sleeping</title><content type='html'>So, I was rather surprised to see some actual scientific evidence that says that my &lt;a href="http://palantar.blogspot.com/2006/01/sleep-hack.html"&gt;new method of sleeping&lt;/a&gt; may actually be somewhat natural and generally beneficial.  See &lt;a href="http://www.nytimes.com/2006/03/14/health/14beha.html?_r=1&amp;oref=slogin"&gt;this article&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-114238032816726346?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/114238032816726346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=114238032816726346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114238032816726346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/114238032816726346'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/03/more-on-splitnight-sleeping.html' title='More on SplitNight Sleeping'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-113719779072962328</id><published>2006-01-13T16:02:00.000-08:00</published><updated>2006-02-11T11:38:31.750-08:00</updated><title type='text'>Sleep Hack</title><content type='html'>Ok, for now, I'm just going to take a departure from my normal programming-intensive topics to go with a sleep hack.  What is a sleep hack you say?  Well, this one got dugg recently: &lt;a href="http://www.stevepavlina.com/blog/2005/10/polyphasic-sleep/"&gt;Polyphasic Sleep&lt;/a&gt;.  The short of it is that Steve Pavlina managed to condition his body to sleep for only three total hours a day by only taking short naps of around 25 minutes apiece many times throughout the day.  He reports vast productivity gains with no particular downside.  Evidently this comes by forcing the body to fall asleep faster and head straight down into REM sleeping almost as soon as your eyes close.  Fascinating.&lt;br /&gt;&lt;br /&gt;I've always slept for about 9 hours a day bcause I can't seem to get by on less, and I've always thought that I really had to be especially productive during the remaining 15 hours because I had so much less time to work with than my 6-7 hour a night sleeping friends.  I've tried working out more and going with less sleep since it has been reported that physically active people sleep less, but I haven't found that to be true  for me.  However, if we really can train our bodies to drop sleep stages faster by forcing it into smaller naps, that would be great news.  Unfortunately, I am a college student and I have classes to attend to and my schedule just won't let me drop off any ol' time to take a nap, so I'm going to try a different experiment, let's call it SplitNight napping.&lt;br /&gt;&lt;br /&gt;SplitNight napping appropriately follows my own personal naming convention for classes in Java or C++, but that's completely irrelavent.  More relevant is that I'm going to try splitting my night apart into a sleep phase ending at midnight and another ending at 7:00am.  In between, I intend to stay up for at least 3 hours every night.  If, mathematically speaking, napping once a night leads to 9 hours of sleep per day and napping 6 times a night leads to 3 hours of sleep per day, I figure that this should bring me down to somewhere around 6 hours of sleep total.&lt;br /&gt;&lt;br /&gt;Hopefully, this less drastic plan will also allow me to actually be a functional human being during the "transition" phase which is important as my volleyball team plays Sunday and school starts the following day. :)&lt;br /&gt;&lt;br /&gt;Day 1:&lt;br /&gt;Tried to force myself to sleep before midnight.  I'm not consciously aware of it happening, but I did spend a little over an hour in bed before rising from sheer boredom.  In addition to helping me rest a little bit, it gave me time to think of such things as: how much extra time will I be spending changing into and out of pajamas on this new schedule?&lt;br /&gt;Sleep total: 5 hours, Mental AcuityEstimate: 75%&lt;br /&gt;&lt;br /&gt;Day 2:&lt;br /&gt;I don't know if I really exactly stuck to the true intent of the experiment today.  I appropriately woke up at midnight and then 7:00 as I was supposed to, but then I let myself go back to sleep again for another 3 hours session.  My theory being at the time that as long as I was forcing myself into 3 hour sleep intervals, I was helping my body adjust to the new schedule.  In any case, I slep another 3 hours until 10:00 and it felt great :)&lt;br /&gt;Sleep Total: 7 hours, Mental Acuity Estimate: 90%&lt;br /&gt;&lt;br /&gt;Day 3:&lt;br /&gt;Today, I really tried to hold strictly to the regimen, but my biorhythms sure weren't cooperating.  I only managed to get an hour in before midnight and another hour or two in before 7:00 am.  A little afternoon, I fell asleep again for a couple of hourse nearly missing class.  So, the good was that today I've only had my goal 6 hours of sleep, but my body is so not used to it.  I could barely function earlier this morning, having to reread my homework assignments over and over to even remember what any given paragraph had just said.  Can only hope this gets better tomorrow.&lt;br /&gt;Sleep Total: 6 hours, Mental Acuity Estimate: 40%&lt;br /&gt;&lt;br /&gt;Day 4:&lt;br /&gt;I woke up exhausted again after a total of four hours of sleep.  I have found it almost impossible to actually get to sleep for the second half of my nightly sleep.  I slept for two hours, woke up at midnight like I was supposed to, and then slept for... not at all.  Again.  I believe the issue here is that the little 2 hour sleep invigorates me too darned much.  It gives me enough energy for many hours of being awake, but my schedule isn't supporting that.  So, I do believe I am going to change the experiment.  I am going to try to push my two naps as far away from each other as possible so that each one only needs to energize me for the following 9 hours or so.&lt;br /&gt;Sleep Total: 2 hours, Mental Acuity Estimate 75%&lt;br /&gt;&lt;br /&gt;Day 5:&lt;br /&gt;Well, I thought this after the Day 1 and Day 2 of the original experiment, but I really think that splitting my sleep schedule into two equidistant naps is going to work.  Today, I woke up a bit groggy but quite competent.  I could program, I went to class and payed pretty good attention, and then about 12 hours later, I was just ready for my nap.  I didn't have to force myself down and I didn't feel too bad when I got up later.  Part of this is probably psychological.  When you sleep the whole night at once, you know its going to be another 18 hours or so before you have a chance to sleep again.  Now that I'm splitting my night, I only have to wait 9 hours until I get another chance at sleep.&lt;br /&gt;Sleep Total: 6 hours, Mental Acuity Estimate 85%&lt;br /&gt;&lt;br /&gt;Day 7:&lt;br /&gt;&lt;table&gt;&lt;br /&gt;   &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;So it has been a week, and this is my sixth report,&lt;br /&gt;which evidently&lt;br /&gt;means that for one or more of the days I was absurdly sleepy and lost&lt;br /&gt;all track of time. Especially at the beginning of this experiment, I&lt;br /&gt;did notice that my sense of what day it was had drastically diminished.&lt;br /&gt;I think I'm getting used to it now though.&lt;br /&gt;In any case, yesterday I completely missed my afternoon nap and then&lt;br /&gt;when night snowboarding on &lt;a href="http://cypressmountain.com"&gt;Cypress&lt;br /&gt;Mountain&lt;/a&gt; - and had an absolute blast without really feeling&lt;br /&gt;tired. So, evidently, its a bit easier to lose sleep if you know you&lt;br /&gt;have another nap time coming soon.&lt;br /&gt;Sleep Total: 4 hours, Mental Acuity Estimate 100%&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4363/820/1600/Hello_Web.0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/4363/820/320/Hello_Web.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Day 8:&lt;br /&gt;Well, between the snowboarding and the lack of sleep I slept for four hours+ during each of my nap sessions.  I wasn't completely functional during my first daytime, but did pretty well during my second daytime.  I really do try to simulate daytime during these uptimes and I feel that may be why it has been easier and easier to wake up as my body's natural biorhythms adjust to the new schedule.  As soon as I wake up, the first thing I do is turn on a light and leave it on, and then make sure I keep whatever room I'm in well lit as i go. &lt;br /&gt;&lt;br /&gt;In any case, I am starting to think that this experiment is just plain working and as such is growing less interesting with each passing day, so I'm gonna tone it down and  try posting weekly updates for a couple of weeks and then (hopefully) just call it a success. :)&lt;br /&gt;Sleep Total: 8 hours, Mental Acuity Estimate 80%&lt;br /&gt;&lt;br /&gt;Week 2:&lt;br /&gt;This week was a mitigated failure worthy of a thumbs down icon if I were inspired enough to go find one.  The biggest issue was that life kept getting in the way of my 3-6 PM nap.  The second biggest issue was the snooze button.  Between the two of them I got worse and worse throughout the week until I ended up with a single 9 hour long sleep on Friday.  As of Saturday, though, I am back on schedule and hoping for better progress next week.&lt;br /&gt;Sleep Average: 8 hours, Mental Acuity Estimate: 95%&lt;br /&gt;&lt;br /&gt;Week 3:&lt;br /&gt;Went pretty well.  Two interesting notes:  You are way more likely to get woken up by random environmental noise at 3-6PM than 3-6AM, and second, possibly because of the first, I always have a LOT more trouble waking up at 6AM.  I will often just roll out of bed before the alarm hits at 6PM wide awake and ready to get back to work.  6AM is still very hard for me though.&lt;br /&gt;Sleep Average: 8 hours, Mental Acuity Estimate: 100%&lt;br /&gt;&lt;br /&gt;Week 4 (The Last week):&lt;br /&gt;Success!  The only real drawback at present is that it can be difficult to schedule in that daytime nap.  Besides that, I sleep 7 to 8 hours a day on average, which though not quite the benefits I was hoping for, is still a worthwhile gain.  On occasion, I have thought about giving up this experiment, and mostly this was because of the difficulty of finding a quiet place from around 3-6PM.  In the end though, I do not currently think it is worth the loss in productivity to go back to a long night's sleep. &lt;br /&gt;&lt;br /&gt;I hope these results have helped you, and as you can see it is possible to gain a significant number of hours by splitting your night up without going to the drastic extremes of polyphasic sleep.  As always, though, I'm sure mileage may vary, and if you've had some interesting experience with these please leave me a comment and let me know. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-113719779072962328?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/113719779072962328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=113719779072962328' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/113719779072962328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/113719779072962328'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/01/sleep-hack.html' title='Sleep Hack'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-113650669870909424</id><published>2006-01-05T13:40:00.000-08:00</published><updated>2006-01-06T00:05:25.796-08:00</updated><title type='text'>iTunes Style Music DB with AJAX</title><content type='html'>I recently decided that since I have some free time on my hands, something that would look really cool is a web page with a music database that works kinda like the iTunes window.  The pretty tables are all good, but what I really love about the iTunes window is the Search box.  You type things in and then the results appear instantly below.  With AJAX, we can do the same thing...&lt;br /&gt;&lt;br /&gt;First off, since we all like playing with the end results first, you can find one version of the results &lt;a href="http://www.northwestbaptistchurchonline.org/choir.php"&gt;here.&lt;/a&gt;   Do note that that Firefox has some minor issues with this page and Opera some more major ones.  More on that later.&lt;br /&gt;&lt;br /&gt;Next, we need just a little bit of background.  Before starting this project, the site had a mySQL database table called "choir".  The choir table holds such information as the song title, what time it was recorded, and the actual location of the audio file.&lt;br /&gt;&lt;br /&gt;I decided to do this in PHP,  so, the first thing I needed was a function to print the table where the search results would be displayed.  This function needs to take two parameters: one parameter indicates which text the user is searching for (starts blank) and the second parameter indicates which entry the results should start at (starts at zero).  This means that we only ever need one PHP function to print the data.&lt;br /&gt;&lt;br /&gt;One last thing before we look at the main function.  I used a very small helper function for outputting cells of a table which looks like so:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;function cellPrint($cellText)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;    echo "&amp;lt;td&gt;$cellText&amp;lt;/td&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All of this information is contained in a file called choirwindow.php.&lt;br /&gt;&lt;br /&gt;Step one then is to connect to the database and query for the information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;font-size:85%;"  &gt;function printChoirs($searchText,$startNumber)&lt;br /&gt;{&lt;br /&gt;//This variable represents the maximum number of songs to be shown&lt;br /&gt;//on one page.&lt;br /&gt;$maxAudioTableSize = 20;&lt;br /&gt;&lt;br /&gt;//Keep the username/password/db stuff in easy to grep for places so they&lt;br /&gt;//are easy to change if you need to later.&lt;br /&gt;$username = "SuperUser";&lt;br /&gt;$password = "AdminPassword";&lt;br /&gt;$database = "SuperSpecialDatabase";&lt;br /&gt;&lt;br /&gt;//Connect to the mySQL database&lt;br /&gt;$link = mysql_connect(localhost,$username,$password);&lt;br /&gt;@mysql_select_db($database) or die (mysql_error());&lt;br /&gt;&lt;br /&gt;//This first query is to find out how many choir songs total match up to the&lt;br /&gt;//search text.  For optimization, this could be buffered and passed along in&lt;br /&gt;//a post variable if the user is going to spend a lot of time selecting the NEXT&lt;br /&gt;//or PREVIOUS links.&lt;br /&gt;$countQuery = "SELECT count(*) from choir";&lt;br /&gt;$countQuery = $countQuery . " WHERE song_name LIKE '%$searchText%'";&lt;br /&gt;$countResult = mysql_query($countQuery);&lt;br /&gt;$count = mysql_result($countResult,0,"count(*)");&lt;br /&gt;&lt;br /&gt;//This second query is to retrieve the actual song information that we are&lt;br /&gt;//going to display and save it in the $result variable.&lt;br /&gt;$infoquery = "SELECT * FROM choir";&lt;br /&gt;$infoquery = $infoquery . " WHERE song_name LIKE '%$searchText%'";&lt;br /&gt;$infoquery = $infoquery . " order by date DESC";&lt;br /&gt;$infoquery = $infoquery . " limit $startNumber,$maxAudioTableSize";&lt;br /&gt;$result = mysql_query($infoquery);&lt;br /&gt;&lt;br /&gt;//Let the user know how many search results he/she has.&lt;br /&gt;echo "There are: " . $count . " choir song(s)";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One interesting thing to note from this is that mySQL is doing all of the work for the search mechanism through the use of the LIKE construct.  This is not only lazy but good design as well as the search algorithm for mySQL is quite fast and running natively as compared to any possible solution in PHP.&lt;br /&gt;&lt;br /&gt;Next up, we need to output the table itself.  This is done quite simply by echoing out each row of the mySQL $result to a row of an HTML table.  In the code, you will note that the table is completely unadorned.  The visual look of the table is cleaned up later using &lt;a href="http://www.w3.org/Style/CSS/"&gt;css&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:85%;" &gt;&lt;span style="font-family:arial;"&gt;     //$num is the number of results we have for THIS page.&lt;br /&gt;$num = mysql_numrows($result);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;//Start the HTML table.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;     echo "&amp;lt;table&gt;";&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     //Output Table Header.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     echo &amp;lt;thead&gt;&amp;lt;tr&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     cellPrint("Song Name");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     cellPrint("Date");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     cellPrint("");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     echo "&amp;lt;/tr&gt;&amp;lt;/thead&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;//Now the table body.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;     echo "&amp;lt;tbody&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     $i = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     while ($i &lt; $num)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         echo "&amp;lt;tr&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $choir_name=mysql_result($result,$i,"song_name");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $date=mysql_result($result,$i,"date");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $filename=mysql_result($result,$i,"filename");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $id=mysql_result($result,$i,"id");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $dateString = strftime("%m/%d/%y",$date);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;        cellPrint($choir_name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;        cellPrint($dateString);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;        cellPrint("&amp;lt;a href=\"$filename\"&gt;Download&amp;lt;/a&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;        echo "&amp;lt;/tr&gt;";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $i++;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     echo "&amp;lt;/tbody&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     echo "&amp;lt/table&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     //Don't forget to close your db connection!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     mysql_close($link);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Now that the table itself is on the page, the only other HTML we have to put out is the code for the "hyperlinks" at the bottom of the table that allow navigation through various pages of results.  You may have noticed from the web page that these are not actually hyperlinks, they just look like them.   They are actually connected to a javascript function called "reloadMusic" which we will get to shortly.  They appear to be real links because they are set to the class "fakelink" which corresponds to the following css rule.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;.fakelink{text-decoration:underline;cursor:pointer;cursor:hand}&lt;br /&gt;&lt;br /&gt;Now, the code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;font-size:85%;"  &gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:85%;" &gt;&lt;span style="font-family:arial;"&gt;     //We only need to do this if there are more total entries than current...&lt;br /&gt;//Remember, $count is total entries matching the search string whereas&lt;br /&gt;//$num is the number of entries returned by our mySQL query.&lt;br /&gt;if ($count &gt; $num)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         // Print out PREV if necessary&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         if ($startNumber &gt; 0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             $previousNumber = $startNumber-$maxAudioTableSize;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             echo "&amp;lt;a class=\"fakelink\" onclick=\"reloadMusic('$searchText',$i);\"&gt;$page&amp;lt;/a&gt; ";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;         // Print out a bunch of numbers for each of the pages.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $i = 0; //This will be the base index number for each page set.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         $page = 1; //Which "Page" is this located... the 1,2,3,4 selection.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         while ($i &lt; $count)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             if ($i &lt;&gt; $startNumber)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;                 echo "  &amp;lt;a class=\"fakelink\" onclick=\"reloadMusic('$searchText',$i);\"&gt;$page&amp;lt;/a&gt; ";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;                 echo " $page ";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             $page++;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             $i = $i+$maxAudioTableSize;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         // Print out NEXT if necessary.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         if ( ($startNumber+$maxAudioTableSize) &lt; $count)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             $nextNumber = $startNumber+$maxAudioTableSize;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             echo "&amp;lt;a class=\"fakelink\" onclick=\"reloadMusic('$searchText',$nextNumber);\"&gt;Next&amp;lt;/a&gt;";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;         &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This brings us naturally to the question of the javascript.  Obviously, if I'm calling this AJAX (Asynchronous Javascript and XML) it's gotta have some javascript in it.  Although, I confess, I am not making use of XML in this example which technically makes it AJAH (Asynchronous Javascript and HTML) but that is a much more obtuse term.   In any case, it is time to examine the Javascript.  The javascript is printed out in a seperate PHP function which is called by parent file shortly after (or in) its header.  The javascript could easily have stood on its own in this case, but I wanted to make the file as modular as possible.  Hence, the PHP function that prints out javascript:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;font-size:85%;"  &gt;  function printChoirHeader()&lt;br /&gt; {&lt;br /&gt;     print"&lt;br /&gt;&amp;lt;script language=\"javascript\" type=\"text/javascript\" src=\"./ajax.js\"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language=\"javascript\" type=\"text/javascript\"&amp;gt;&lt;br /&gt;&lt;br /&gt;function reloadMusic(searchText,startNumber){&lt;br /&gt;   var url =\"choirwindow.php?searchText=\" + escape(searchText);&lt;br /&gt;   url = url + \"&amp;startNumber=\" + escape(startNumber);&lt;br /&gt;   http.open(\"GET\", url,true);&lt;br /&gt;   http.onreadystatechange = handleHTTPResponse;&lt;br /&gt;   http.send(null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function search(){&lt;br /&gt;   var searchText = document.getElementById(\"searchtext\").value;&lt;br /&gt;   var url = \"choirwindow.php?searchText=\" + escape(searchText);&lt;br /&gt;   url = url + \"&amp;startNumber=0\";&lt;br /&gt;   http.open(\"GET\", url,true);&lt;br /&gt;   http.onreadystatechange = handleHTTPResponse;&lt;br /&gt;   http.send(null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function handleHTTPResponse() {&lt;br /&gt; if (http.readyState == 4) {&lt;br /&gt;   document.getElementById('audiotable').innerHTML = http.responseText;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var http = getHTTPObject(); // We create the HTTP Object&lt;br /&gt;&amp;lt;/script&amp;gt;";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;This uses the same pattern as my &lt;a href="http://palantar.blogspot.com/2005/12/incredible-appearing-ajax-map.html"&gt;appearing map example&lt;/a&gt;, so it might be helpful to get some review there.  Basically, the reloadMusic() and search() functions take whatever parameters were previously there and ferry them on to a call to choirwindow.php and pass GET parameters for the search text and the startNumber which is the mySQL index of what will be the first entry of the new table.  The reload music function is passed these parameters by the PHP code that we have previously seen and does no work for them on its own.  When writing the search function, it is already known that since we are now performing a new search, we will start at a new index (0).  All the javascript function has to do then is to get the search text which is does by finding the box with the id of "searchtext" in the calling page.  This naturally means that any file that makes use of the choirwindow.php functionality and desires to use its search functionality must give its searchbox an id of "searchtext".  (See Requirements section below).  Similarly, the calling file must have a division whose id is "audiotable" in which to print this table by calling printChoirs("",0);&lt;br /&gt;&lt;br /&gt;Now, this code calls back to choirwindow.php with its GET parameters.  These are handled outside of any function by the following code:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  $searchText = $_GET['searchText'];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  $startNumber = $_GET['startNumber'];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  if (isset($searchText))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;      printChoirs($searchText,$startNumber);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This means that when the javascript calls choirwindow.php with parameters, choirwindow.php will respond by printing its music table.  However, when the file is included, since these parameters will not be set during the include call, no output will muddy up the top of the page.&lt;br /&gt;&lt;br /&gt;Finally, for the sake of thoroughness, let's see the code with the search box and audiotable div:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;      Search: &amp;lt;input maxlength="60" size="60" name="searchtext" id="searchtext" onkeyup="search();"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;      &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;      &amp;lt;div id="audiotable" class="audiotable"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;  &lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;          printChoirs("",0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;      ?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:arial;" &gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Requirements:&lt;br /&gt;In order to use this PHP functionality then, the calling PHP file must do the following:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Must contain a search field named "searchtext" whose onClick function calls "search();"&lt;/li&gt;&lt;li&gt;Must call printChoirHeader() in its header&lt;/li&gt;&lt;li&gt;Must call printChoirs() from within a div whose id is "audiotable"&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Firefox and Opera issues:&lt;br /&gt;Both Firefox and Opera have, on occasion, issues with this functionality.  While both have different visual manifestations, they seem to have the same root cause.  After the asynchronous call to reload the page, Firefox sometimes throws a javascript exception and refuses to redraw the page.  The result of this is that the table dissapears.  Interestingly, if you view the source that Firefox sees, you will find that the source is rendered perfectly.  Additionally, you can save the source as an html file, reload with Firefox, and everything will appear correctly.   Not being a Firefox developer, I cannot tell you why exactly that is, but, I can point you to the &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=322317"&gt;bug report&lt;/a&gt; where you can vote for it to get fixed faster :)&lt;br /&gt;&lt;br /&gt;Similarly, Opera sometimes "forgets" to erase what was in the audiotable div before, resulting in two different musical tables in the results box.  Like with the Firefox bug, though, this seems to be a rendering issue as you can examine the source that Opera is trying to render and the source is correct.&lt;br /&gt;&lt;br /&gt;Internet Explorer seems to render the table perfectly every time.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-113650669870909424?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/113650669870909424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=113650669870909424' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/113650669870909424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/113650669870909424'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2006/01/itunes-style-music-db-with-ajax.html' title='iTunes Style Music DB with AJAX'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-113601025896569490</id><published>2005-12-30T21:24:00.000-08:00</published><updated>2005-12-30T22:24:18.986-08:00</updated><title type='text'>Incredible Appearing AJAX Map</title><content type='html'>Everyone's heard of the the big AJAX projects like Google Maps and Yahoo's Beta Mail program, but if you're just wanting to get into AJAX, those sorts of projects are probably a bit daunting.  Here's something simpler.  (Not quite tutorial simple because I get bored too easily, but still, the good kind of simple.)&lt;br /&gt;&lt;br /&gt;Check out &lt;a href="http://www.northwestbaptistchurchonline.org"&gt;this site&lt;/a&gt; and click on the street address.  If your internet connection isn't too fast, you'll get a loading message and then a nifty little popup map with buttons on it including a close button that will make it go away.  How's this work?  It centers around this little bit of the page:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;a class="fakelink" onclick="showMap();"&amp;gt;6701  ...&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;div id="mapWindow"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A little bit later, we're going to look at the code that adds in the map window, but as you've probably already guessed, it simply uses javascript to pop in the extract code inside of the division entitled "mapWindow".  The other thing that probably jumps out is the "fakelink" class of the address.  That class corresponds to an entry in the page's css file where I define the common attributes of text necessary to fake a hyperlink so as not to confuse the site's users.  It is defined as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;.fakelink{text-decoration:underline;cursor:pointer;cursor:hand}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ok, now the fun stuff.  What happens when you actually click on the link?  According to the onClick attribute, we call a function called showMap().  This is a javaScript function that appears as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;function showMap() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    var url = "mapwindow.html";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    document.getElementById('mapWindow').innerHTML = "Loading Map...";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    http.open("GET", url, true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    http.onreadystatechange = handleHTTPResponse;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    http.send(null);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the second line there, we see the reason for the "Loading Map..." message.  As soon as you click the button, the javascript searches through the document (an object representing the structure of the current web page) until it finds an element defined by the id "mapWindow" which you will recall was what we named the empty division that awaited the loaded map.  Next, we employ an http object.  This is actually an XMLHTTPRequest object created earlier&lt;br /&gt;through the following code on the index page:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;var http = getHTTPObject();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;function getHTTPObject() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  var xmlhttp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  if (!xmlhttp &amp;&amp;amp; typeof XMLHttpRequest != 'undefined') {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;      xmlhttp = new XMLHttpRequest();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    } catch (e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;      xmlhttp = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  return xmlhttp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This getHTTPObject() is actually a generic function I stick in a file I call ajax.js whose sole purpose is to contain it.  If someone actually starts making me support pitifully old browsers, I will simply update this function appropriately to return the correct object.  Consider that a hint.&lt;br /&gt;&lt;br /&gt;Now, back to the code in showMap().&lt;br /&gt;First, we make a request to "Open" the URL.  The first parameter to open is either GET or POST, but since this is simple and because we actually won't be passing any parameters, we will use GET.  The second is, of course, the URL of the page where the request is to be made.  The next thing that we need to set up in the http object is the callback function which will be informed when something has happened this request (like it being done and loaded).  We call this one handleHTTPResponse, and then finally send the request.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;function handleHTTPResponse() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  if (http.readyState == 4) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    document.getElementById('mapWindow').innerHTML = http.responseText;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When the page is finally loaded, our handleHTTPResponse function is called.  We check the ready state for state 4 which indicates that the request had completed.  The response comes back in our XMLHTTPRequest object in the responseText field.  If we were going to be parsing it, we could parse this variable via standard text processing or XML processing.  In this case though, we just want to display it, so we pop in there to the same place where we put our loading message earlier, thus simultaneously removing the loading message and displaying the map.&lt;br /&gt;&lt;br /&gt;The only thing left is what happens when you press the close button.  The onClick for the close button contains a call to killMap() which merely removes the innerHTML from the page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;function killMap() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    document.getElementById('mapWindow').innerHTML = "";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This may seem inefficient because it basically means that a user who repetitively click on the open/close map window links will cause the web server to have to repeatedly serve up the map window page over and over again.  However, since it is a simple HTML document, the user's browser will in all probability simply return the locally cached copy.  For the rare circumstance when users do not locally cache, it would be more effecient to simply hide and re-display the window, but that is left as an exercise for the reader. :)&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-113601025896569490?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/113601025896569490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=113601025896569490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/113601025896569490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/113601025896569490'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2005/12/incredible-appearing-ajax-map.html' title='Incredible Appearing AJAX Map'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-112988077070597204</id><published>2005-10-21T00:34:00.000-07:00</published><updated>2005-10-21T00:49:38.096-07:00</updated><title type='text'>Flock developer preview available</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt; For those of you who haven't heard of it (yet), Flock is kind of a conglomeration of all the tools that the nerdiest amongst us use on a regular basis. Building straight into the browser such things as social bookmarking and blogging tools, its a real up and comer in todays competitive browser market. While a lot of the technologies aren't in popular use yet, its not often a good idea to second guess America's pocket protector brigade.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt; See below for an example of this app's current best feature: blogging tools, and then go download a copy from&lt;a href="http://www.flock.com/developer/"&gt; http://www.flock.com/developer/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="Flickr Photo" src="http://photos29.flickr.com/54518535_2799c1e8bb_m.jpg" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-112988077070597204?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/112988077070597204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=112988077070597204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/112988077070597204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/112988077070597204'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2005/10/flock-developer-preview-available.html' title='Flock developer preview available'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546575.post-110723989521166310</id><published>2005-01-31T22:36:00.000-08:00</published><updated>2005-02-08T00:18:41.450-08:00</updated><title type='text'>My First Post</title><content type='html'>As usual, the first post will be a test post with absolutely nothing interesting.&lt;br /&gt;&lt;br /&gt;So ... go away.&lt;br /&gt;&lt;br /&gt;Shoo.&lt;br /&gt;&lt;br /&gt;I mean it.&lt;br /&gt;&lt;br /&gt;Seriously.&lt;br /&gt;&lt;br /&gt;Now print this out and roll it up into a ball.  It will be &lt;a href="http://www.origamiboulder.com"&gt;an origami boulder&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546575-110723989521166310?l=palantar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://palantar.blogspot.com/feeds/110723989521166310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10546575&amp;postID=110723989521166310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/110723989521166310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546575/posts/default/110723989521166310'/><link rel='alternate' type='text/html' href='http://palantar.blogspot.com/2005/01/my-first-post.html' title='My First Post'/><author><name>Tim "Palantar" Jones</name><uri>http://www.blogger.com/profile/02880343855198771555</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/-pXghghConWI/TXkN_Hhs_lI/AAAAAAAAAFU/4fS82j9vhTI/s220/tim_with_imac.JPG'/></author><thr:total>0</thr:total></entry></feed>
