<?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-15145059</id><updated>2012-01-17T17:08:21.769-05:00</updated><category term='audio book review'/><category term='education'/><category term='astronomy'/><category term='astrology'/><category term='computer savvy'/><category term='learning'/><category term='computer user interface'/><category term='computer languages'/><category term='teaching'/><category term='rewards'/><category term='passwords'/><category term='palm'/><title type='text'>predelusional</title><subtitle type='html'>If being delusional is having a false persistent belief or opinion not substantiated by sensory or objective evidence, then this blog is about what happens just before that.  So, as you read and respond, keep the goal in mind. There is a big difference between being almost insane and being barely insane. This blog is about that difference.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default?start-index=101&amp;max-results=100'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>328</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15145059.post-150986563424031523</id><published>2012-01-17T17:05:00.002-05:00</published><updated>2012-01-17T17:08:21.785-05:00</updated><title type='text'>Internet Blackout</title><content type='html'>Tomorrow, Wednesday, January 18th, there will be no blog post here on Predelusional. This is to protest big entertainment companies, the Chamber of Commerce, and their lobbyists attempt to get their way by ramming Internet censorship legislation through the US Senate.&lt;br /&gt;&lt;br /&gt;On Thursday, January 19th, there probably won't be any new content either, but you never know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-150986563424031523?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/150986563424031523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=150986563424031523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/150986563424031523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/150986563424031523'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2012/01/internet-blackout.html' title='Internet Blackout'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7881407153431034824</id><published>2011-10-21T09:17:00.002-04:00</published><updated>2011-10-21T09:19:36.816-04:00</updated><title type='text'>parent/teacher conferences</title><content type='html'>An algebra teacher has four hundred and twenty students. There are three hours for parent/teacher conferences.  If each parent talks to the teacher for one minute, how many new gray hairs does the teacher have by the end of it?&lt;br /&gt;&lt;br /&gt;a. 5&lt;br /&gt;b. 100&lt;br /&gt;c. 500&lt;br /&gt;d. all of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7881407153431034824?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7881407153431034824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7881407153431034824' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7881407153431034824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7881407153431034824'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/10/parentteacher-conferences.html' title='parent/teacher conferences'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3115479424070901021</id><published>2011-10-17T14:46:00.003-04:00</published><updated>2011-10-17T15:18:32.573-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>teacher pay for performance</title><content type='html'>I'm an engineer and computer programmer.  One of the things that bothers me is that my employers, and i'm talking about managers here, almost never have a clue about how good or otherwise my performance is.  I'd have thought that one would get an idea based on productivity or problem solving, or problem anticipation, or something. It simply doesn't happen.  Most managers have little or no technical competence of their own. They don't seem to have any way to judge the performance of any of their direct reports with respect to others. They mostly either like you personally, or they don't.&lt;br /&gt;&lt;br /&gt;As a contractor, i've changed positions frequently, so i've gotten to participate in numerous interviews.  These too, have been nearly without exception, awful.  More than a few have subjected me to a "quiz".  For no apparent reason, i generally have performed quite poorly on these quizzes.  One exception revolved around a research question that would be worthy of a Master's Thesis.  I'd never seen the problem before.  Though i was not able to come to a solution in 20 minutes, my direction was at least tenable.  So, my performance has historically been good on impossible questions, but poor otherwise.&lt;br /&gt;&lt;br /&gt;In a few cases, i've gotten a new manager at an old job where the new manager subjected me to a quiz.  These have also been awful gages of performance.  Why have tests been so bad?&lt;br /&gt;&lt;br /&gt;I've talked about the No Child Left Behind (NCLB) program that G. W. Bush pushed into law.  The idea here seems to have been that 1) teacher's own test scores do not correspond with student competence, so 2) we'll test students, and reward teachers with improvements in student's scores. A logical problem with this approach is that student's scores on testing also does not correspond well with student competence.&lt;br /&gt;&lt;br /&gt;I've just read the &lt;a href="http://www.aasa.org/uploadedFiles/Publications/Journals/AASA_Journal_of_Scholarship_and_Practice/JSP_Summer_2011.FINAL.pdf"&gt;editorial&lt;/a&gt; in the AASA Journal of Scholarship &amp; Practice, Summer 2011 edition.  It lists a number of further points.  These include the fact that NCLB was rolled out to the nation, but never tested. There are numerous statistical issues with what students are tested for what teachers, and how the response to the program is to "play the program", without concern for the education of students.  For example, let's say that you are a Special Education teacher.  All of your students have been given to you because they are behind.  But there's no policy that protects you as a teacher.  Even if you improve your student's test scores dramatically (though they're still below average), you'll be penalized.  This editorial talks about how some students have been encouraged to drop out of school and pursue a GED, instead of staying in school, and lowering the average test scores for the school.  This doesn't help the students.  And so on. The details are important.  I highly encourage everyone to read the above referenced article.&lt;br /&gt;&lt;br /&gt;As an engineer, i don't have pay for performance unless i go into business for myself.  And, even then, i only have pay for performance if i get all the business stuff right, and perhaps, am lucky.  But now it appears that even if i'm an above average engineer (whatever that means), this is a good thing - judging by the teaching profession.&lt;br /&gt;&lt;br /&gt;If we want our kids to do better in school, we have to be smarter than this.  We need to use systems that work, proven in pilot programs.  Our current system, forged in the general incompetence of politics, doesn't work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3115479424070901021?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3115479424070901021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3115479424070901021' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3115479424070901021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3115479424070901021'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/10/teacher-pay-for-performance.html' title='teacher pay for performance'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8253812051815361399</id><published>2011-10-04T11:37:00.002-04:00</published><updated>2011-10-04T11:43:15.164-04:00</updated><title type='text'>User Interface Rant</title><content type='html'>&lt;table bgcolor="blue" align="right"&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://farm4.static.flickr.com/3391/3435081160_4795fc9ef5.jpg" alt="photo" width="400" height="225" align="right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;In the early days of the web, all hyperlinks were &lt;u color="blue"&gt;&lt;font color="blue"&gt;blue &amp;amp; underlined&lt;/font&gt;&lt;/u&gt;.  Even images were outlined in blue.  So all clickable links were easy to recognize. This was quickly fixed. These days, most pages have clickable images. These days, there are images that are clickable from icons that look like buttons to images you might want to see at a larger size. Seldom is there the slightest indication that they can be clicked.  I ignore the boiler plate of most pages, since that's where much of the advertising or non-changing content resides.  But some sites hide valuable content there - like the dates and times for events.&lt;br /&gt;By default, links look like links. So web developers have to go out of their way to make this happen.  Pretty strange, eh?  An entire planet seemingly dedicated to user interface obfuscation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8253812051815361399?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8253812051815361399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8253812051815361399' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8253812051815361399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8253812051815361399'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/10/user-interface-rant.html' title='User Interface Rant'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3391/3435081160_4795fc9ef5_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2184965478614493069</id><published>2011-08-25T13:29:00.002-04:00</published><updated>2011-08-25T13:34:11.049-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='computer savvy'/><title type='text'>Sudoko</title><content type='html'>I've now solved over 70 of the &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt; site i &lt;a href="http://predelusional.blogspot.com/2011/06/euler.html"&gt;mentioned&lt;/a&gt; a couple months ago.  One of the problems i just solved was to generate solutions to 50 Sudoku puzzles.  People solve these sorts of puzzles by hand all the time. I could have done it that way.  I started by solving the first one by hand.  It was pretty easy.  I really only used one rule to make it happen.  I thought about the rule for a bit, and decided it would be easy enough to code into a program, and that might be quicker than doing 50 by hand.  And this first version solved some 29 of the 50. My program showed how far it had gotten.  I used that to tackle the next unsolved puzzle by hand.  And, indeed, i found an easy rule to code, and that version managed 39.  From there, it might have been quicker to solve the last 11 by hand.  Eventually, there were five ideas, and 46 problems were solved.  One of the problems could be easily solved by hand from there if a guess was made of one of the two remaining possibilities for the cell.  I decided to code in guesses.  After making a guess, it would use it's previous system to see if it could get a solution.  It continued to make a single guess until it either solved the puzzle, or it ran out of single guesses.  All fifty puzzles were solved.  &lt;br /&gt;&lt;br /&gt;Total run time was difficult to get.  What you'd like is the amount of time it takes to solve each puzzle.  So, if you had a thousand puzzles to solve, you could multiply your time by a thousand and get a good estimate for how long that would take.  But the total time was much less than a second.  It's unlikely that the time would scale.  It's quite possible that a thousand puzzles would also take less than a second.&lt;br /&gt;&lt;br /&gt;Of notable interest is that nearly five thousand people have solved this problem.  There are tons of programs that have been published that also solve this problem.  So at least one person in a million, world wide, has written a Sudoku solver. That's a good deal more than i'd have expected.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2184965478614493069?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2184965478614493069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2184965478614493069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2184965478614493069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2184965478614493069'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/08/ive-now-solved-over-70-of-project-euler.html' title='Sudoko'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6544814639737277887</id><published>2011-08-19T09:37:00.001-04:00</published><updated>2011-08-19T09:39:26.576-04:00</updated><title type='text'>Bike Log Day Four</title><content type='html'>I weighed myself just before day one. I guess that would be day zero. I'd lost five pounds compared to the previous time i'd weighed myself. That was a couple months ago. As i haven't been dieting, per se, i didn't expect to see a drop. I figured that since it was a fairly dramatic five pounds, i must have caught my weight at a low ebb. Historically, my weight has normally risen and fallen, pretty much at random, over a ten pound range, in the course of any random week. When i take a measurement, there's usually no way to take it at face value. I weigh myself approximately daily over a week, and my weight for the week is the lowest number. I figure it's easy to add weight - drinking a gallon of water is about eight pounds. But, i figure the bottom is the bottom.&lt;br /&gt;&lt;br /&gt;A gallon of water is quite a bit. In 1986, i drank a gallon of water every day for six months, and half a gallon the other six months. It's great for your health. Now, you might think that my weight value from two months ago would also be subject to the ten pound range. But that was with several measurements. So it's likely that it really was the minimum back then.&lt;br /&gt;&lt;br /&gt;On day two, i weighed myself again, and it was another three pounds down. So that's down eight pounds. Eight pounds is not something i lose in two months without serious effort. So this minor mystery is getting to be less minor.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6544814639737277887?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6544814639737277887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6544814639737277887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6544814639737277887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6544814639737277887'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/08/bike-log-day-four.html' title='Bike Log Day Four'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-9213185857432683519</id><published>2011-08-18T12:09:00.002-04:00</published><updated>2011-08-18T12:14:48.157-04:00</updated><title type='text'>Bike Log Day Three</title><content type='html'>In 1992, i rode to work every day for an entire summer.  My speed started out at about 6 MPH, and ended at 21 MPH. I had a shower at work, so i could go as fast as i wanted.  It was 9 miles each way, and so that first trip was an hour and a half. By the end, it was 27 minutes.  Fastest transport across Boston.&lt;br /&gt;&lt;br /&gt;Back in Boston, i started biking to work in the Spring.  I really hadn't done any biking that season.  Six miles per hour is the speed you can go on a bike if you're totally out of shape.  Little kids who have just gotten over using training wheels can go this fast.&lt;br /&gt;&lt;br /&gt;My first measured day this time around was a bit over ten miles per hour. It took a couple weeks to get to that speed back in '92.&lt;br /&gt;&lt;br /&gt;Day three's first timing was 31:43, for an average speed of 11.91 MPH.  That's more than 10.35 MPH.  That's a 15% increase in speed in just one day.  In 1992, a big speedup like this took a week. Things aren't exactly the same.  One of the things that changed on this day was that instead of wearing a hooded sweat shirt, i just wore a sweat band over my ears.  That means it was easier for my body to get rid of waste heat.  Some of the early speed increases are going to be due to improvements in how things are done rather than in changes in physical health.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-9213185857432683519?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/9213185857432683519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=9213185857432683519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/9213185857432683519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/9213185857432683519'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/08/bike-log-day-three.html' title='Bike Log Day Three'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1879487349127205679</id><published>2011-08-17T10:12:00.002-04:00</published><updated>2011-08-17T10:26:37.869-04:00</updated><title type='text'>Bike Log Day Two</title><content type='html'>There is no bike log from day one.  I wasn't going to log anything.  After all, i probably won't bike to work for more than a few days this time.  Don't worry.  I won't post anything if i don't have anything to say.&lt;br /&gt;&lt;br /&gt;The trip to work is 6.3 miles.  My bike computer (odometer) said 10.11 km. I've not calibrated it to four significant digits. I haven't had this unit very long.  I could have told this unit to read out in miles, but for no reason that i can discover, i told it to read out in km. So if i'm listening to jazz music on my mp3 player, i suppose it's Kilometers Davis.&lt;br /&gt;&lt;br /&gt;It took 36 minutes and 25 seconds, according to the bike computer.  My wrist watch said it took about 50 minutes.  The bike computer keeps the time of day accurately.  But if i stop for a street light, the bike computer stops too.  There's no way that i was stopped for fourteen minutes.  But i was stopped for perhaps five.  I stopped my wristwatch stopwatch a bit later than when the bike computer would have stopped, so there's another two or three minutes.  This anomaly is about six minutes.  The man who has two clocks has no idea what time it is.&lt;br /&gt;&lt;br /&gt;The average speed was 10.35 MPH. Again, this isn't calibrated to four significant digits. I'd read this as ten and a third MPH. The numbers probably have four significant digits of precision, but not accuracy.  Precision has to do with repeatability.  So you can think of the distance as a unit similar to miles, and compare day to day numbers with four digits. Unfortunately, though the bike computer has an Average Speed readout, and although the bike computer manual says that there's a trip timer, the only way to get trip statistics is to reset all values in the computer.  So i lose the odometer setting. However, this value matches the bike computer's average speed readout, despite the fact that it also averaged a few previous trips. While what really matters is distance, what tracks progress is speed.  I'll likely focus on average speed in the future.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1879487349127205679?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1879487349127205679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1879487349127205679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1879487349127205679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1879487349127205679'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/08/bike-log-day-two.html' title='Bike Log Day Two'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4022830282761264005</id><published>2011-08-11T11:48:00.001-04:00</published><updated>2011-08-11T11:50:19.386-04:00</updated><title type='text'>interviews</title><content type='html'>I've been on both ends of the interview.  I've seen that both ends pretty much suck. Interviewers ask pointless and stupid questions.  Interviewees are in a half panic and act like they've lost 50 IQ points or more. It's not realistic on either side.  It's mostly luck if it ends up with any kind of a match.&lt;br /&gt;&lt;br /&gt;Despite getting resumes from recruiters, who were supposed to match requirements to experience, we seldom got the experience we were looking for.  We soon discovered that only 1 in 3 candidates that we asked in for an interview actually showed up.  So, we invited everyone. No big deal - i always had work to do to fill in. In one interview, the English was so bad that it wasn't clear if the candidate matched the resume or not.  One guy showed up, we showed him the job in the morning.  He went out for lunch and didn't return.&lt;br /&gt;&lt;br /&gt;One of our best employees was transferred in from another department. She would never have made it through our interview. She had little actual relevant skills, but learned quickly.  I spent about an hour with her about once a week in a code review.  I tried not to critasize her working code too much.  I'd simply make non-mandatory suggestions.  Her code improved rapidly in quantity and quality. Everyone has a learning curve period. Hers was no worse than most. When she left, she tried to get me hired by her new employer.  They turned me down.&lt;br /&gt;&lt;br /&gt;These days, when i'm the interviewer, the question is "is this someone i'd like to hang out with?".  It's not that i want someone to hang out with.  It's just that these are the people who are the really sharp candidates.  Very little else matters.  I don't care if the candidate can't wake up in the morning, if they're obnoxious, if they're holding 3 other jobs.  I only care if they'll get the job done.&lt;br /&gt;&lt;br /&gt;I often get a contract with only one or a couple interviews.  I often get offers for months after getting hired and i've stopped sending out resumes. How long do they think i'll wait?&lt;br /&gt;&lt;br /&gt;I didn't send a resume or cover letter for my first interview.  It was a summer job while i was in school.  I'd made it through my freshmen year in Engineering, and that was enough.  I didn't send a resume or cover letter for my first job after i graduated.  I said i had an Engineering degree. They wanted to hire me for whatever. By the time i needed a resume, i had tons of experience on it. Many employers are looking for specific narrow skills these days, so i have to edit it down to what they want to see.&lt;br /&gt;&lt;br /&gt;I don't say anywhere that "I have strong communications skills." My resume now has a reference to my TV show. It's a real attention grabber.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4022830282761264005?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4022830282761264005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4022830282761264005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4022830282761264005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4022830282761264005'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/08/interviews.html' title='interviews'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4400433509998826974</id><published>2011-07-25T10:31:00.003-04:00</published><updated>2011-07-25T11:01:34.206-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomy'/><title type='text'>Mars attacks, every year</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3443/3862898448_62d7391bf2.jpg" align="right"&gt;It's time for the Mars hoax email again.  You may get email that says that &lt;i&gt;Mars will appear as big as the full Moon&lt;/i&gt;, or even &lt;i&gt;There will be two moons in the sky&lt;/i&gt;, and with a date, like August 27th.  It comes from the 2003 Mars opposition announcement.  In late August of 2003, Mars had a particularly close opposition, and in a telescope at 75x, Mars appeared as big as the Full Moon does with the unaided eye.  Each summer, the email gets modified a bit more, and is pretty far from reality.&lt;br /&gt;&lt;br /&gt;Mars doesn't get real close to the Earth every summer.  Not even once a year.  The next close approach is in March of 2012.  Mars closest approaches that happen in Augst or September are the closest that they get.  The March event won't be particularly good.  But it will be worth a look.&lt;br /&gt;&lt;br /&gt;At the moment (late July 2011), Mars is a morning object, and the visual diameter is 4.4 arc seconds.  One must magnify Mars by about 400x to bring it to the visual size of the Full Moon.  Fairly large back yard telescopes can achieve this. Perhaps an eight inch (200 mm) or ten inch (250 mm) diameter telescope would perform OK at this magnification. However, the atmosphere needs to be really steady to get a good view.  One can expect a brief really still view about once every five minutes.&lt;br /&gt;&lt;br /&gt;And then, you'd get a view with the kind of detail you can see on the Moon.  That is, you'd see the largest areas of light and dark. No craters or mountains. For Mars, this may include a polar cap, and shades of orange.  Waiting until March will give you views that are about 4 times larger in any given telescope.&lt;br /&gt;&lt;br /&gt;The closest views of Mars at the moment can be downloaded over the Internet.  They come from a rover that is on Mars - Opportunity.  The twin cameras give a very human like stereo view, in color (multiple images are taken with red, green and blue filters, which combine to make color images).  Further, there's a microscope, which can take &lt;a href="http://nssdc.gsfc.nasa.gov/planetary/mars/mars_exploration_rovers/merb_images.html"&gt;images&lt;/a&gt; that can show detail to something like a 20th of a millimeter.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1109/729061264_962805f7fb.jpg" align="left"&gt;There is something about using your eyeball and a telescope and seeing it for yourself.  It's different.  There's still a month or so of Saturn's big show this summer.  So get out to your local astronomy club's next event and take a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4400433509998826974?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4400433509998826974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4400433509998826974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4400433509998826974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4400433509998826974'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/07/mars-attacks-every-year.html' title='Mars attacks, every year'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3443/3862898448_62d7391bf2_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4016822039523149450</id><published>2011-07-19T10:40:00.003-04:00</published><updated>2011-07-19T11:26:26.260-04:00</updated><title type='text'>the possible future of cars</title><content type='html'>An &lt;a href="http://www.motortrend.com/features/auto_news/2011/1109_obamas_epa_seeks_56_mpg_by_2025/index.html"&gt;article at Motortrend&lt;/a&gt; covers the proposed 56.2 MPG fuel standard by 2025.  It's easy to be alarmed by the article, as evidenced by some of the comments left there. I'm not alarmed. I'm impatient. Here's why.&lt;br /&gt;&lt;br /&gt;My 2000 Saturn (an American car) has a lifetime average of over 43 MPG, though it's still low mileage, at 290,000.  A turbocharger should boost it's fuel economy by 20%.  That would bring it to 52.4 MPG.  A cruise control would boost highway economy by 5 MPG.  That's been my experience with all my other cars. This car isn't a hybrid, or diesel, or indeed anything special.  It's a cheap, reasonably peppy 4 door sedan, with air conditioning added for summer comfort and safety.  Adding a cruise control would add less than $50.  A turbocharger is a bit more, but not thousands. It'd be cheaper than A/C, and would pay for itself in gas. So, 56.2 MPG was achievable more than ten years ago at a reasonable price. Why wait?&lt;br /&gt;&lt;br /&gt;I've said earlier that reducing highway speed from 70 MPH (in Michigan) to 62 MPH (100 km/hr) &lt;a href="http://predelusional.blogspot.com/2009_10_01_archive.html"&gt;improves fuel economy by 17%&lt;/a&gt;. This hasn't changed. Not only do you save money, but your vehicle gets better range. Highway signs are cheap.  They were changed to 55 MPH nationwide for a few years in the late 70's.  We didn't get out of that fuel crisis because we obtained more fuel.  We got out of it by improving fuel economy.  One of the issues is that refinery capacity isn't growing.  So gas availability is effectively capped. That's what the crisis was about.&lt;br /&gt;&lt;br /&gt;The following was my response to the Motortrend article, including some of the comments at the time.&lt;br /&gt;&lt;br /&gt;The BP oil spill in the Gulf has cost plenty to everyone. It's still costing us.&lt;br /&gt;&lt;br /&gt;The American auto industry isn't at a disadvantage. My 11 year old American car has delivered over 43 MPG, lifetime average. Nearly 50 on the highway. It's just a cheap car, with A/C.&lt;br /&gt;&lt;br /&gt;There's a saying that "There's no replacement for displacement" in the industry, meaning you have to have a big engine to have high power. But turbochargers have been in use since at least the 1940's, where they delivered higher power at lower weight, with less fuel, giving performance and range to aircraft. That's a 70 year lifetime for this particular nonsense.&lt;br /&gt;&lt;br /&gt;This article claims that a breakthrough in battery technology is unexpected. But more than ten years ago, flywheel batteries were shown to have a 50:1 advantage in energy storage to weight ratio over lead-acid batteries. That's much better than Lithium. Everything in a flywheel is recyclable, and there are no toxic or rare chemicals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4016822039523149450?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4016822039523149450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4016822039523149450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4016822039523149450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4016822039523149450'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/07/possible-future-of-cars.html' title='the possible future of cars'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-516442420191621519</id><published>2011-07-01T11:03:00.002-04:00</published><updated>2011-07-01T11:22:39.485-04:00</updated><title type='text'>Generic terms</title><content type='html'>One of the job titles that's pretty common is &lt;i&gt;Systems Specialist&lt;/i&gt;.  What does it mean?  The word &lt;i&gt;Systems&lt;/i&gt; is pretty generic.  The solar system is a system.  The one we live in has a star, some planets, asteroids, comets, and so on.  So a &lt;i&gt;Planetary Scientist&lt;/i&gt; is a &lt;i&gt;Systems Specialist&lt;/i&gt;, right?  But i work in &lt;i&gt;Information Technology&lt;/i&gt; (IT), which is another overly generic title, but which is nearly always taken to have something to do with computers.  So what is a &lt;i&gt;Systems Specialist&lt;/i&gt; in terms of computers?  Well, computers have parts too.  There's the thing that actually processes data, the Central Processing Unit (CPU).  There's at least one of them in every computer.  But there's also specialized memory called &lt;i&gt;cache&lt;/i&gt;, Random Access Memory (RAM), disk, networking, and various other devices.  That's a computer system.  Computer systems come in a number of varieties.  Sometimes the same hardware can run very different software.  For example, the exact same hardware might be able to run MS Windows, Linux or Apple Macintosh operating systems.  So the same hardware might have very different personalities.  And a &lt;i&gt;Systems Specialist&lt;/i&gt; might not be a specialist in all of them. What kind of &lt;i&gt;Systems&lt;/i&gt; is this person a &lt;i&gt;Specialist&lt;/i&gt; in?  Why not say &lt;i&gt;Unix Systems Specialist&lt;/i&gt;, or whatever? Then examine the word &lt;i&gt;Specialist&lt;/i&gt;.&lt;br /&gt;&lt;p&gt;When i'm asked what i do for a living, it is often the case that i'm talking to someone who doesn't do what i do.  I assume they don't know the details of computers at first.  So i don't launch into the details unless asked.  I say, "I do something with computers".  It's pretty generic.  I've been asked what my job title is, and i tell them.  But when they ask me what that means, and it's as generic as &lt;i&gt;Systems Specialist&lt;/i&gt;, the only really good answer is "&lt;i&gt;My job is so secret, not even i know what i'm doing&lt;/i&gt;".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-516442420191621519?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/516442420191621519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=516442420191621519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/516442420191621519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/516442420191621519'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/07/generic-terms.html' title='Generic terms'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1394464973392010088</id><published>2011-06-29T09:52:00.007-04:00</published><updated>2011-06-29T10:57:42.633-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computer languages'/><category scheme='http://www.blogger.com/atom/ns#' term='computer savvy'/><title type='text'>euler</title><content type='html'>I bumped into a &lt;a href="http://projecteuler.net/"&gt;site&lt;/a&gt; that has mostly mathematical computer problems to solve. The site says that you can use any tools you want to come up with solutions. I use whatever i have at hand. That has included &lt;a href="http://predelusional.blogspot.com/2007/12/top-ten.html"&gt;C&lt;/a&gt;, Perl, the shell, and my 25 year old &lt;a href="http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-zero-of.html"&gt;HP-28C calculator&lt;/a&gt;. The problems are genearlly designed to require some computer programming. But some people have managed to solve some of the problems by hand(!). I have not, as yet, looked for hints elsewhere on the Internet, even though this is encouraged. The site suggests that computer programs can be written which take less than a minute to run.&lt;br /&gt;&lt;br /&gt;At the time of this post, i've solved 36 of the over 300 puzzles.  I don't attempt to limit computer time.  If i get a solution, it's a solution.  I expect that once i have a correct solution, it's code that will never run again, so there's not much point in optimizing the code.  However, i like optimizing code...&lt;br /&gt;&lt;br /&gt;Sometimes i make mistakes.  But the system allows you to guess again if you get a wrong answer.  One of the solutions i was writing had an estimated run time of a few hours.  I ran it over night.  But in the morning, it was still running.  It turned out that there was an error, and it would never have finished.  Opps.  When i fixed it, i also noticed a way to speed it up, and the final version took about a minute.  However, it took me a half hour to get the speed up working. I'm really just trying to get the total time spent down, except that i value my time over my computer's time.&lt;br /&gt;&lt;br /&gt;One of the puzzles asks how many months start on Sunday in the 20th century.  I could have done some calendar arithmetic (i've done it before).  I could have narrowed it down with some math.  But Unix (and Linux) have a calendar function, and it produces text, so how hard could it be in a shell script?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;for y in `cnt 1901 2000`; do&lt;br /&gt; for m in `cnt 1 12`; do&lt;br /&gt;  cal $m $y | grep "^ 1"&lt;br /&gt; done&lt;br /&gt;done&lt;/pre&gt;&lt;br /&gt;I ran this script with the output into "wc -l".  The "wc" program is the Unix &lt;i&gt;word count&lt;/i&gt; program.  The "-l" option makes it count lines.  So here's how it works.  The "for y" loop counts years from 1901 to 2000, inclusive.  That's the 20th century.  The 20th century is almost the 1900's.  That's because the 1st century is the first hundred years, from year 1 through year 100, inclusive.  The 2nd century is from 101 to 200.  Anyway, the "for m" loop counts the 12 months.  "cal" is the Unix calendar program.  It can take two arguments, the month ($m) and year ($y). The "|" (vertical bar) symbol tells the shell to direct the output of "cal" into the next program. The "grep" bit is the Unix search program.  It stands for "General Regular Expression and Print".  The regular expression is the "^ 1" bit. This expressions tells &lt;i&gt;grep&lt;/i&gt; to only pass lines that start with a space and the number 1.  It turns out that the calendar format for a month has dates right justified.  If a date is "10", then there's no space before it.  The default calendars have Sunday at the far left.  So this little script spits out a line like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; 1  2  3  4  5  6  7&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;for each month that starts with a Sunday.  I run the output of the script into the word count program, having it count lines.  The number of lines is the number of months that start on Sunday.&lt;br /&gt;&lt;br /&gt;There's just one more little thing to describe.  In the line "for y in `cnt 1901 2000`; do" there's a bit of syntax and a program.  The syntax is the back quotes - the first just before the word &lt;i&gt;cnt&lt;/i&gt;.  The stuff in between the back quotes is a program with it's options, in this case &lt;i&gt;cnt&lt;/i&gt;.  This program is expected to print out a list, and the variable &lt;i&gt;y&lt;/i&gt; gets set to each value on each loop.  But the program &lt;i&gt;cnt&lt;/i&gt; is something i wrote in the 1980's.  It knows how to count up or down, with skips, with leading zeroes or spaces, with small functions taking the initial integer for a start, and can output in roman numerals and other formats.  There must be solutions like it for other people, but this is what i've used.  I've not released it to the public, for various reasons. So, if you want to use my solution, you'll have to solve this bit of the puzzle yourself.&lt;br /&gt;&lt;br /&gt;Anyway, this solution produced an answer really quickly. It took more time to write this post than to write and run this program.&lt;br /&gt;&lt;br /&gt;The site has a forum for each problem.  Early solvers often post hints on how to solve or optimize solutions.  And, often, these hints help you solve later problems.  For example, there are a bunch of problems involving prime numbers.  Having a good prime number test can be really handy.  I peruse these and see if there's anything of interest.&lt;br /&gt;&lt;br /&gt;This whole site is about education. A million years ago, i looked at the book &lt;a href="http://www.atariarchives.org/basicgames/"&gt;101 BASIC Games&lt;/a&gt;.  These were games, written in the computer language BASIC.  Not all of them worked.  There were lots of different variants of BASIC when it was written.  The programs were submitted by lots of different people using most of those variants.  I studied a bunch of them to see how they worked.  But it wasn't really a curriculum.  The interesting thing about Project Euler is that it's more like a curriculum.  Each of the problems requires a new skill or skills.  The result is inductive chain learning.  This can be an efficient way to learn.  And, it's free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1394464973392010088?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1394464973392010088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1394464973392010088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1394464973392010088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1394464973392010088'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/euler.html' title='euler'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7011164311394998405</id><published>2011-06-15T08:46:00.001-04:00</published><updated>2011-06-15T08:50:58.635-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>Stress</title><content type='html'>&lt;p&gt;It's been suggested that college students should be graded on attendance.&lt;br /&gt;http://www.wired.com/wiredscience/2011/06/do-you-get-better-grades-with-better-attendance/&lt;br /&gt;First, a couple anecdotes, and then a better idea.&lt;br /&gt;&lt;p&gt;I had an engineering class called Stress, with a low pass rate. The prof did everything he could think of to get students to pass. Tons of office hour time, etc. 1st day, he passed out a syllabus noting the 3 open book exam dates and all homework. All homework counted the same as an exam. Of the 4 grades, the lowest was dropped. I started the 1st week's homework, but it was clear there was only time for half of it. I was careful to hit all types of problems. I passed it in, but, of course, 50% is not a passing grade. It became clear that the prof taught the material in the book. But i could read faster than he could talk, so i stopped going to class. I did OK on the first exam. One Friday, i came in for what i thought was the 2nd exam, but he passed out a quiz. At a glance, it covered next week's homework. I hadn't done that yet. I rechecked the syllabus, and it said that the 2nd exam was the following Monday - i hadn't missed it. I handed the quiz back. The prof told me that i'd likely fail the course. I looked him in the eye, but didn't tell him i'd do OK if i didn't miss any exams. The last exam was held at the start of the last week. It didn't cover the last week's homework. I did half of that anyway. And, i passed the course.&lt;br /&gt;&lt;p&gt;I would never have skipped half the homework if it weren't impossible to finish. I would never have skipped the classes if the pressure to optimize my time weren't so severe. Exams have high time pressure, and i already knew that my performance would be awful on them. It was just the only choice available. I liked the course material and the prof, but it still pisses me off that the course was set up that way. If i'd known in advance, i'd have dropped another course from my schedule, so i could devote twice the time to it. So the degree means what? These are the students who managed to get through by cheating, optimization, or by being unbelievably quick? Are these skills one needs in industry? Not as far as i can tell.&lt;br /&gt;&lt;p&gt;There was a brief break. Then Stress 2 was taught by the same prof. I figured he'd pass out a syllabus on the first day, so i didn't bring my books or calculator. He passed out an exam! I ran home, grabbed my stuff and ran back in 20 minutes. Panting, i asked for an exam. He found me a seat and an exam that didn't match my neighbors. At the 50 minute mark, i was done (!). I looked around and there was panic on 109 faces. I figured i must have done something wrong. All these kids are brilliant. I checked my answers. No errors. So at the 55 minute mark, i got up and handed it in.&lt;br /&gt;&lt;p&gt;Next day, the prof writes something like this on the board:&lt;br /&gt;&lt;table border=0&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;97:&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;60-70:&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;50-60:&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;40-50:&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;30-40:&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;20-30:&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;10-20:&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;td align="right"&gt;0-10:&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;At first i wondered how i'd lost 3 points. But then i realized that i'd done the course right. One of the four questions was on that last week's homework, and i was the only one who'd done even half of it. In this course, there'd be 4 exams, homework with the lowest dropped. I did half the homework. Then it was announced that the lowest two grades would be dropped. But i took the 4th exam even though i'd already passed the course.&lt;br /&gt;&lt;p&gt;Years later i auditioned for a chorus. It involved sight singing and a bunch of music things i'd never done before. That morning, i ran 4 miles, showered, and took the train. The director gave me my starting tenor note and played the accompaniment. I dived in, but stumbled. But then i started getting where the piece was going, relaxed a bit and read ahead. At the start of the last line, i turned the page over (while singing), but it was blank. I looked up and finished the page, adding dynamics. The director was stunned. So was i. I'm simply not that good. But a 4 mile warm up does wonders. Phys Ed should be held for 20 minutes every morning for all students. They don't have to be awake for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7011164311394998405?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7011164311394998405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7011164311394998405' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7011164311394998405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7011164311394998405'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/stress.html' title='Stress'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6460424904327247505</id><published>2011-06-13T14:30:00.003-04:00</published><updated>2011-06-15T08:53:30.330-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>STEM</title><content type='html'>One of the big pushes in education is to get students to do well in the &lt;a href="http://www.stem2stern.org/index"&gt;STEM&lt;/a&gt; areas.  That's Science, Technology, Engineering, and Math.  From my perspective, SE would be enough.  That is, if you've got Engineering, that's how you build or support technology.  To do either Science or Engineering, you need math.  Math turns out to be one of those tools which allows you to solve all sorts of problems.  You really can't do without it.  Not all students are good at it.  In fact, nearly everyone has to struggle with it.  Being good at math is, at least to some extent, a measure of how hard one has struggled with it compared to everyone else.&lt;br /&gt;&lt;br /&gt;One of the reasons for students to go into science or engineering is that a technological society needs people to do these things to stay competitive with other countries. And if there is a need for a skill, then there are jobs.  So, that's good for the student's future.&lt;br /&gt;&lt;br /&gt;But just to mention a contrary concept, it turns out that when you go to bigger companies that want engineers, they're also looking for engineers with communications skills.  So, it is not a good idea to ignore your natural language skills.  That includes reading and writing, but also public speaking.  These are good skills to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6460424904327247505?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6460424904327247505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6460424904327247505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6460424904327247505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6460424904327247505'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/stem.html' title='STEM'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-47397715550015270</id><published>2011-06-09T14:01:00.002-04:00</published><updated>2011-06-09T14:20:28.667-04:00</updated><title type='text'>Forth for Enlightenment, part nine of ten, primes</title><content type='html'>&lt;p&gt;Prime numbers are positive integers that can only be divided evenly by themselves and the number one. So there are no factors for prime numbers. Prime numbers are great for factoring, because if there are no prime factors, then there are no factors. The first few interesting prime numbers are 2, 3, 5, 7, 11, 13, 17, 19. If you're trying to factor a number, you only have to attempt to divide the number by prime numbers up to the square root of the number. An example should make it clear why. Let's say you're trying to tell if 25 is prime. You try 25 / 2, and get a 12 with a remainder of 1. You try 25 / 3, and get 8 with a remainder of 1. You try 25 / 5, and get 5 with a remainder of 0. So 25 is divisible by 5. But notice that you divided by 5 and got 5. The number 5 is the square root of 25. If you divide 25 by 6, you get 4 with a remainder of 1. But you already checked division by 4 (it's not a prime, but it's between 3 and 5, so we have effectively checked it). We don't want to check anything twice, so we only have to check up to the square root of the number. The short list of prime numbers given is good enough to check numbers up to 528. That's because the next prime after 19 is 23, which when squared id 529. So a small list of primes allows checking of large numbers. However, memory for storing prime numbers is in short supply on the HP-28C, so we'll check all numbers up to the square root, not just the primes.&lt;br /&gt;&lt;p&gt;The HP-28 RPL language has pretty much everything we need. There's a function to compute square root (&amp;radic;). There's a division function that returns the remainder called MOD. There are loops and conditionals. Yet my first version ran into a snag. It was convenient to use a FOR loop with a local variable. Having a local variable is handy because it doesn't clutter the stack, it doesn't need to be created before you start and purged when you're done with it. And local variables can be easily recalled. However, when a remainder of zero is found, indicating a factor has been found, the next thing to do is exit the loop and report the answer. It turns out that you can't exit a FOR loop in RPL. There's no "GOTO" in the language. The loops don't have any other "break" function, for example, as the C language has. There are two solutions. One is to let the loop finish. The other is to use a WHILE loop. In my first version, I continued with the FOR loop, but changed the problem to factoring a number. It got ugly. For example, if the number was 12, it divided by 2, but failed to check to see if it could continue dividing by 2. So it didn't always result in prime factors. A second version returns the focus to primes, using WHILE.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo;&lt;br /&gt;  DUP &amp;radic; FLOOR WHILE DUP 2 &amp;#8805; REPEAT&lt;br /&gt;    DUP2 MOD IF 0 == THEN&lt;br /&gt;      DROP 1&lt;br /&gt;    END&lt;br /&gt;    1 -&lt;br /&gt;  END&lt;br /&gt;&amp;raquo; 'ISP' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This function takes a number on the stack. It returns two numbers. The original number is left on the stack. But also a 0 is left if there is a factor, or a 1 is left on if the number is prime. Let's walk through this a bit to see how it does it. The first thing we want to do is get the square root of the number. But we'll need the original number later, so the first thing is to push a duplicate onto the stack. The square root function consumes that duplicate and pushes the square root of that number. The FLOOR function turns that into an integer, discarding any decimal fraction. So if the original number is seven, the square root is 2.64575..., FLOOR turns that into just two. The WHILE loop is started. The bit between WHILE and REPEAT is the loop condition. As long as the loop condition is true, the loop will execute. We'll need this square root, so DUP is used to make a stack copy. Then 2 &amp;#8805; compares it to 2 and the loop runs as long as the number is still at least 2. At this point we have the original number and the current number to check on the stack. We'll need both later, so DUP2 is called push a copy of both on the stack. MOD gets the remainder after division. I doubt that the IF does anything, but 0 == compares the remainder to zero. THEN executes the block to the matching END if the answer is true. If the remainder was zero, what we want to do is exit the loop, returning something that means the original value isn't prime. We have two items on the stack at this point. That's the original number and the current number to divide by. We DROP this number to divide by and push the constant 1 on the stack. After the IF THEN END, we have the current number to divide by on the top of the stack. We subtract one from it. If we had just pushed one on the stack, it becomes zero. If we just divided by two, which is the last number we check, it becomes one. In either of these cases, the loop stops. But if there are more numbers to check, they get checked in subsequent loops.&lt;br /&gt;&lt;p&gt;There are better ways to check for prime numbers. For example, a simple optimization is to first check if the number is divisible by 2. If it isn't even, then only the odd numbers up to the square root need to be checked. For large numbers, this could double the speed. There are other ideas as well. Some require lots of memory. Some are quite complicated. So we won't consider them now.&lt;br /&gt;&lt;p&gt;The main point of this exercise was to show how searching can be accomplished on this machine. Searching requires breaking from a loop that's in progress. A design decision in RPL was to not provide an explicit loop break mechanism. In fact, there is no GO-TO like function in the language. While anything you could want to implement can be implemented in this language, it isn't necessarily very easy. The loop structures available that work for this are WHILE-REPEAT-END and DO-UNTIL-END. My first thought was that these loops are equivalent and have their test at the start of the loop. But it turns out that the test can be placed anywhere in the loop. That is, any arbitrary commands can be placed between the WHILE and REPEAT clauses, and nothing need be placed between REPEAT and END. It turns out that one can not use WHILE-REPEAT-REPEAT-END to get the effect of two exits in one loop.&lt;br /&gt;&lt;p&gt;This bit about having to change the condition of the loop to break out of it is part of a wider issue. In 1968, Edsger W. Dijkstra published an often quoted paper entitled &lt;a href="http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html"&gt;Go To Statement Considered Harmful&lt;/a&gt;. The paper starts with this line: &lt;i&gt;For a number of years I have been familiar with the observation that the quality of programmers is a decreasing function of the density of go to statements in the programs they produce.&lt;/i&gt; Note that he has a value judgment not on the programs written, but on the programmers who wrote them. Programs in languages like FORTran (at the time) absolutely required the use of go-to statements. And in such programs, it was easy to end up with spaghetti code that was very difficult to follow. And that is the gist of the paper. But the opening line suggests that the fewer go-to's in a program, the better the programmer. It had been proven that go-to statements were never necessary in languages that support if-then-else and loops or recursion. The logical conclusion is that programmers who never use go-to statements are as good as one can get. This conclusion isn't correct. Once the right languages appeared, the goal of zero go-to's became possible, but a new issue reared it's ugly head. The issue is breaking from a loop. There are two easy ways to do this in a language like C. First, one can jump out of the loop with a go-to. Second, one can create a state variable and set it so that when the loop test is executed, the loop exits. And what happened in the go-to's are evil era was that all such loops were exited using a state variable. There are at least two problems with this approach. First, extra instructions to set up a test must be executed. Often there are extra instructions in the test itself that are executed each loop. Second, compilers of the day had no idea how to optimize this sort of code. Third, state variables can be just as difficult to follow as go-to's are. For example, if there are four state variables, it's just as difficult to understand as four go-to's. Except that if all four go-to's are clearly loop exits, then they're very clear after all. The Internet didn't exist back in the '70s, so most people never read the original paper. They just latched onto that first statement, and used it as Gospel. These days, we have less of an excuse. It's an easy read. It's quite clear that the &lt;i&gt;go-to's are always bad&lt;/i&gt; concept is an over-generalization. After all, Dijkstra makes an exception for machine language. Why make an exception there? Well, the flow control in machine language generally is all built on some form of go-to. There's no choice. And besides assembly language programmers are generally better than those who can't code in assembler. What i mean by this is that assembly language is not generally the first computer language that programmers are taught. By the time one is writing assembly language, they have considerably more experience. It turns out that there are other exceptions to go-to's being poor practice.&lt;br /&gt;&lt;p&gt;In any case, the designers of RPL decided not to include a go-to. And, the decision made it sometimes more difficult for the programmer to achieve certain goals. But nothing was made impossible. And, there may have been a performance reason for not including a go-to. Some of the Scheme language environments allow go-to, but performance for all structures suffers all the time because of it. That means that performance for the Scheme implementation suffers. It's a big deal.&lt;br /&gt;&lt;p&gt;There was one other observation of note during this project. I ran across a list of &lt;a href="http://www.thimet.de/CalcCollection/Calculators/HP-28SC/Contents.htm"&gt;software errors&lt;/a&gt; for the HP-28 (they're at the bottom). I tried some of these on my unit, and they were all problems. So one issue with having a system strictly in hardware is that it can't be fixed. The software in something as complicated as the HP-28 series is way too large to have any hope of being bug-free. The bright side is that the language can't change out from under your program. I've been bitten by Light Year conversions getting inaccurate results.&lt;br /&gt;&lt;p&gt;Lots of applications written for the HP-28 series are available through &lt;a href="http://www.hpcalc.org/"&gt;this site&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;&lt;b&gt;Conclusion:&lt;/b&gt;The HP-28 is a highly capable machine. The RPL language is concise, making it a good match for limited machines. However, it can be difficult to estimate how much memory a structure or chunk of code might consume without actually trying it. The stack manipulation slows writing of functions, and can make reading functions difficult. Since tail recursion optimization is not supported, the system is not a particularly good place to experiment with recursion.&lt;br /&gt;&lt;p&gt;As always, any questions, leave a comment. I'll get it and respond, even if this post is ancient history by the time you read it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-47397715550015270?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/47397715550015270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=47397715550015270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/47397715550015270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/47397715550015270'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/forth-for-enlightenment-part-nine-of.html' title='Forth for Enlightenment, part nine of ten, primes'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3105861191400882899</id><published>2011-06-03T12:26:00.001-04:00</published><updated>2011-06-03T12:27:16.659-04:00</updated><title type='text'>Fear of Math</title><content type='html'>Fear of Math is real.  If one adds 2 + 3 and gets 6, it's not close. It's wrong. All math requires careful approach, careful execution, and careful cross checking.  For example, in 2 + 3, start with two fingers, and add three more.  The answer is 6.  But 2 is even and 3 is odd, and an even plus an odd is always odd, and 6 isn't odd.  All this careful stuff requires a huge investment, and if there is a perception of likely failure, the return on investment calculation (which for some reason is easy for everyone as it is a right brain function though apparently with output directly to the amygdala) comes up negative.  It's no wonder that no one wants to do it. Just for fun, anxiety shuts down short term memory. Proof positive that God isn't very smart - though one can sort of see the evolutionary advantages. The left brain style computations aren't as fast as the right brain reactions. So right brain reactions kept our ancestors from getting eaten more often.&lt;br /&gt;&lt;br /&gt;My approach has been mostly to make the math work more reliable.  For example, when my son was adding 2 + 3, he got 4, 1/3rd of the time, 5, 1/3rd of the time and 6, 1/3rd of the time. I had to watch him do this quite a bit before i figured out that he somehow was taught counting on his fingers in an unreliable manner.  I introduced him to the &lt;a href="http://www.uitti.net/stephen/soroban/index.shtml"&gt;Japanese abacus&lt;/a&gt;, and in twelve weeks his addition and subtraction was reliable.  I then showed him that he could use his fingers like an abacus (for two digits), and his math scores went from behind the class to ahead.  Also, every time we were in the car, i drilled him mercilessly on "what is seven plus eight", "what is eight plus seven", "what is fifteen minus seven", and "what is fifteen minus eight".  He eventually relented and memorized the answers. He was, however, incredibly stubborn. For the record, his memory is astonishingly good. He can normally repeat anything i've said just once in the past year verbatim with minimal prompting.&lt;br /&gt;&lt;br /&gt;But in 7th grade, i'd spend all weekend getting him caught up with his homework, and he refused to turn it in.  The next weekend, i'd spend all weekend making him do it over.  Old homework that was finished started appearing out of nowhere, but i still couldn't get him to turn it in.&lt;br /&gt;&lt;br /&gt;I've just reviewed my own K-8 report cards.  While i was always at least a little above average in math, in 8th grade all my grades jumped up permanantly.  I recall nothing of the sort.  My son seems to have had a maturity growth spurt at the end of 7th grade. I hope so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3105861191400882899?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3105861191400882899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3105861191400882899' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3105861191400882899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3105861191400882899'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/fear-of-math.html' title='Fear of Math'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4621942253356198593</id><published>2011-06-02T15:25:00.004-04:00</published><updated>2011-06-02T15:55:39.182-04:00</updated><title type='text'>Autism and the Hypocondriac</title><content type='html'>Steve Silberman from &lt;a href="http://www.wired.com/"&gt;Wired magazine&lt;/a&gt; wrote a seminal paper in something like 1993 about &lt;a href="http://www.wired.com/wired/archive/9.12/aspergers_pr.html"&gt;autism&lt;/a&gt;.  It's definitely worth a read.  It's not the last word on the subject.  He knows this, otherwise, he wouldn't be writing a book on the subject now.&lt;br /&gt;&lt;br /&gt;You should know that i'm an Engineer, and furthermore, one who has pursued a career in computer programming. Since i've done both, i'm qualified to say that computer programming is like engineering, only much, much more difficult.  My ex wife has accused me of having autism.  OK, so being obsessive compulsive is something one needs to be a halfway decent computer programmer.  And since the computer does exactly what you tell it to, no matter how stupid that might be, having the attention to detail to spot the most minor of flaws is something one needs.  These skills, and others, can be viewed as symptoms of autism.  One expects that all such people must have at least some bits of the autism spectrum. Still, i thought the idea was silly. These skills can be &lt;a href="http://www.uitti.net/stephen/soroban/index.shtml"&gt;learned&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The article above has a link to an &lt;a href="http://www.wired.com/wired/archive/9.12/aqtest.html"&gt;autism test&lt;/a&gt;. The test itself is not diagnostic.  That is, it won't tell you if you definitely have or do not have autism.  But a control group who took the test averaged 16.4 - and 80% of those diagnosed with autism or a related disorder scored 32 or higher.  My score was eleven.  One of the common symptoms of autism is an inability to tell lies.  It's not that the autistic person avoids untruth.  Telling an untruth isn't &lt;i&gt;thinkable&lt;/i&gt;.  It doesn't make any sense.  So, either this is a lie or it's not.  Either way suggests i'm not autistic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4621942253356198593?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4621942253356198593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4621942253356198593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4621942253356198593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4621942253356198593'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/autism-and-hypocondriac.html' title='Autism and the Hypocondriac'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6565920881935474536</id><published>2011-06-01T14:49:00.001-04:00</published><updated>2011-06-01T14:53:00.263-04:00</updated><title type='text'>Forth for Enlightenment, part eight of ten, Backwords 4</title><content type='html'>&lt;p&gt;In part six, a full runnable program was presented.  But the startup time, generating the random puzzle, takes forever.  How to speed it up?  One thing to try is to abandon strings, which aren't randomly writable, and use arrays, which are. Characters aren't allowed as a data type in arrays. Only numbers are allowed.  All we need are 9 different numbers.  But some numbers are easier to convert to characters than others.  In particular, the ASCII values of characters can be directly converted. The code for lower case "a" is 97, with the alphabet following sequentially. An array is created with the highly imaginitive name "a".  Here's the code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 97 105 FOR x x NEXT { 9 } &amp;rarr;ARRY 'a' STO &amp;raquo; 'MKARRR' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;i&gt;97 105 FOR x&lt;/i&gt; starts a loop from ASCII values 'a' through 'i'.  The next &lt;i&gt;x&lt;/i&gt; pushes that value onto the stack.  &lt;i&gt;NEXT&lt;/i&gt; ends the loop.  At the end of the loop, 9 values are on the stack.  The list &lt;i&gt;{ 9 }&lt;/i&gt; is pushed, which is used by &lt;i&gt;&amp;rarr;ARRY&lt;/i&gt; to create an array on the stack of length 9, using the numeric values just pushed.  This array is stored in the variable &lt;i&gt;a&lt;/i&gt;. The whole function is called MKARRR.&lt;br /&gt;&lt;p&gt;Given the array, we need a function to shuffle it. But such a function will probably need a helper function that swaps values at two positions.  It's a bit more complex.  Two positions from 1 to 9 are placed on the stack before called.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo;&lt;br /&gt;  DUP2 'a' SWAP 1 &amp;rarr;LIST GET&lt;br /&gt;  SWAP 'a' SWAP 1 &amp;rarr;LIST GET&lt;br /&gt;  ROT 1 &amp;rarr;LIST 'a' SWAP ROT PUT&lt;br /&gt;  'a' SWAP ROT 1 &amp;rarr;LIST SWAP PUT&lt;br /&gt;&amp;raquo; 'SWAPA' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can see that each line ends with GET or PUT.  These are the functions that get or put values into an array.  Both GET and PUT require a list for the array index.  that's because arrays can be two dimensional, and making the coordinates a single list allows the same number of arguments for any array dimensions.  A stack track should help see what's going on. The function is passed two array indexes to swap, which are called &lt;i&gt;x&lt;/i&gt; and &lt;i&gt;y&lt;/i&gt; below.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;start&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;DUP2&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;'a'&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;&amp;rarr;LIST&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;{ y }&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;GET&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=7&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;'a'&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;&amp;rarr;LIST&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;{ x }&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;GET&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=7&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;ROT&lt;/th&gt; &lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;&amp;rarr;LIST&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;td&gt;{ y }&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;'a'&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;td&gt;{ y }&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;{ y }&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;ROT&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;{ y }&lt;/td&gt;&lt;td&gt;xval&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;PUT&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=7&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;'a'&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;x&lt;/td&gt;&lt;/th&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;ROT&lt;/th&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;&amp;rarr;LIST&lt;/th&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;td&gt;{ x }&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;{ x }&lt;/td&gt;&lt;td&gt;yval&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;PUT&lt;/th&gt;&lt;br /&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The stack is used for temporaries. It starts with DUP2, because both GET and PUT will consume an index for both coordinates. From there on out, it's all about goofing around with the stack until the arguments are in the right places. One can test this function by running MKARRR, entering two indexes on the stack, calling SWAPA, and looking at the &lt;i&gt;a&lt;/i&gt; array for the results.&lt;br /&gt;&lt;p&gt;We need a new shuffle that uses this routine to create a puzzle.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo;&lt;br /&gt;  1 9 FOR x&lt;br /&gt;    x x RAND * FLOOR 1 + SWAPA&lt;br /&gt;  NEXT&lt;br /&gt;&amp;raquo; 'SHFLA' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Clearly, &lt;i&gt;1 9 FOR x&lt;/i&gt; starts a loop that runs 9 times.&lt;br /&gt;Two &lt;i&gt;x&lt;/i&gt;'s are put on the stack.  RAND returns a random number between zero and 1.  It's multiplied by the current x, the integer part is extracted with FLOOR.  Then one is added with &lt;i&gt;1 +&lt;/i&gt;. This produces a number from 1 to x. Finally, that first &lt;i&gt;x&lt;/i&gt; on the stack and the computed random number between 1 and &lt;i&gt;x&lt;/i&gt; are swapped with SWAPA.  So each value can get swapped to any other position.  This whole function takes about 6 seconds to run on the HP-28C. While there probably are ways to make this faster still, six seconds is fast enough.&lt;br /&gt;&lt;p&gt;We still need a function which turns the array into a puzzle string.  It's quite simple.  The CHR function turns an ASCII number into a single character string. The '+' operator concatenates strings.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo;&lt;br /&gt;  a ARRY&amp;rarr; DROP ""&lt;br /&gt;  1 9 START&lt;br /&gt;    SWAP CHR +&lt;br /&gt;  NEXT&lt;br /&gt;&amp;raquo; 'A2S' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The entire &lt;i&gt;a&lt;/i&gt; array is put on the stack as a single object. ARRY&amp;rarr; converts that into the individual values with the list { 9 } at the top of the stack, which is then DROPped.  A zero length string is pushed onto the stack so that it can be appended to.  The second line starts the loop.  An ASCII value is SWAPped to the top of the stack, converted to a one character string, and appended to the running string answer.  And that's all there is too it.&lt;br /&gt;&lt;p&gt;Finally, a modification of 'BACK' is needed that uses the new shuffle.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; CLLCD MKARRR SHFLA A2S&lt;br /&gt;  1 'BMV' STO&lt;br /&gt;  WHILE DUP "abcdefghi" &amp;#8800; REPEAT&lt;br /&gt;    BMV 1 DISP 'BMV' 1 STO+ DUP 2 DISP&lt;br /&gt;    DO UNTIL KEY END STR&amp;rarr; REV&lt;br /&gt;  END&lt;br /&gt;  2 DISP&lt;br /&gt;  "You win" 3 DISP&lt;br /&gt;  'BMV' PURGE&lt;br /&gt;  'a' PURGE&lt;br /&gt;&amp;raquo; 'ABACK' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And that's it. This version is quite a bit larger, but also quite a bit faster. Usually, in space vs. time trade offs, the code size is ignored.  In this case, the code size is nearly everything. Have a bit of fun with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6565920881935474536?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6565920881935474536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6565920881935474536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6565920881935474536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6565920881935474536'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/06/forth-for-enlightenment-part-eight-of.html' title='Forth for Enlightenment, part eight of ten, Backwords 4'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3822332860058062912</id><published>2011-05-31T10:05:00.000-04:00</published><updated>2011-05-31T10:08:23.512-04:00</updated><title type='text'>Forth for Enlightenment, part seven of ten, Backwords 3</title><content type='html'>&lt;p&gt;At this point, a diversion to playing the game is in order. If you examine the program, you might notice that when the program ends, it always says "You win!".  You could quit before winning, but the game isn't that difficult.  You always win.  Compare that to a simple eye-hand coordination game like Tetris.  There, you always lose.  Always.  With this positive reinforcement, one might expect that players would never stop playing.&lt;br /&gt;&lt;p&gt;There's a very simple algorithm for coming up with a solution to any problem.  And, it turns out that &lt;i&gt;2 * n - 3&lt;/i&gt; (on the HP-28, that's &lt;i&gt;n 2 * 3 -&lt;/i&gt;) moves are required, as a maximum, and usually fewer.  And when i learned this game so many ages ago, that's about all i knew about it.  I had to figure out what the algorithm was.  And it's pretty simple.&lt;br /&gt;&lt;p&gt;Note that if you get the last symbol, the "i" into the right most position, you should never have to move it again.  So, if you build the string backwards one symbol at a time, you're done.  What you do is search for "i", reverse it to the left most position.  Then with "9", reverse it to the right most position.  Then search for "h" and do the same.  This seems to take two reverses per digit, so for a string with &lt;i&gt;n&lt;/i&gt; symbols, you should have to perform &lt;i&gt;2 * n&lt;/i&gt; moves.  But when you get to the first symbol, &lt;i&gt;a&lt;/i&gt; in this case, it's already where you need it.  So that's two moves you don't need, or &lt;i&gt;2 * n - 2&lt;/i&gt;.  The remaining exercise is to figure out what other move you don't need.  In any case, often, when you search for a symbol, it's already in the first position, so you don't need to get it there.  Sometimes it's already in the position you need it to go to, so you save both moves.  So the formula gets you a maximum number of moves.  It may be fewer.&lt;br /&gt;&lt;p&gt;One might ask if there are optimum solutions that don't follow this algorithm.  And there are.  And in my opinion, that's where the real fun for this game lies.  I've written optimal solution finders in C and Perl.  And even the Perl version can find all optimal solutions for puzzles of length 9 in an hour on a modern computer. The C version can do it in under a second.  How many puzzles of length 9 are there? Here's how to figure this out.  If you're looking for a random puzzle, the first position can be any of 9 symbols.  But having chosen one of these, there are only 8 symbols to choose from for the next symbol.  So the first two symbols can be 9 * 8.  Continue this way until the last symbol, from which there is only one left. The answer turns out to be 9! - that is 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 362,880.  I'd like to say that this was computed with my factorial program, but it had already been deleted.  So the built in FACT function was used instead.  Blame it on the low total memory area of the HP-28C.&lt;br /&gt;&lt;p&gt;Once one has an optimal solution generator, then one can compare the simply algorithm performance to the optimal solutions.  In this table, &lt;b&gt;Moves&lt;/b&gt; is that number of moves required. &lt;b&gt;Optimal&lt;/b&gt; is the number of games with that many moves, and &lt;b&gt;Auto&lt;/b&gt; is the number of games with that many moves using the simple algorithm.  You can see that zero moves (starting with the solution) through two moves have the same number of games.  That's because for those games, the optimal solution is the same as the easy solution.  But there are no games where the optimal solutin requires more than ten moves.  This table is for games of length nine.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;th&gt;Moves&lt;/th&gt;&lt;th&gt;Optimal&lt;/th&gt;&lt;th&gt;Auto&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;56&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;391&lt;/td&gt;&lt;td&gt;252&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;2278&lt;/td&gt;&lt;td&gt;980&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;10666&lt;/td&gt;&lt;td&gt;2968&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;38015&lt;/td&gt;&lt;td&gt;7798&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;93585&lt;/td&gt;&lt;td&gt;16836&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;132697&lt;/td&gt;&lt;td&gt;31396&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;79379&lt;/td&gt;&lt;td&gt;48636&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;5804&lt;/td&gt;&lt;td&gt;63868&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;68432&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;59233&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;39268&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;18108&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;5040&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;My evolution for puzzle solvers for this game over the years is interesting in it's own right.  The first solvers were brute force with minor optimizations.  They were written in C, but ran on machines that required hours of CPU time to solve a single puzzle.  It would take years to generate all solutions of length 9. Modern computers are easily 10,000 times faster, so it would only be days now. But an idea came to me for solving all puzzles of length 9.  One started with the solution.  Each possible last move was generated, and that puzzle with the final solution move was recorded.  Then, each of those puzzles was subjected to a single move as well.  If the puzzle had already been recorded, the solution was ignored.  Otherwise the puzzle and the move to get to a solved puzzle was recorded.  This proceeded until all puzzles were recorded.  In the early 1980's 362,880 puzzles would not fit into RAM except on large and expensive machines. For home machines the answers had to be stored on disk, and searched.  By the late 1980's, everything could be kept in RAM even on home machines.  But then my buddy Karl came up with an algorithm that could get an optimal solution to a single puzzle essentially instantly.  It was so fast that it was quicker to generate puzzle solutions independently than all at once.  And, no significant data needed to be stored.  Further, with it's principals, one could solve any puzzle by hand, and quickly.  Now that this has happened, i don't play the game very much. It's peculiar, but one of the goals of writting these puzzle solvers is to render the game less interesting.  And this is done by attempting new techniques, and using the computer to prove that they are, in fact, essentially perfect.  In this case, the computer didn't teach me the techniques, however.  I have other, more complicated games, where the computer's brute force searching has lead to strategies that can be learned from study of the computer's play.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3822332860058062912?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3822332860058062912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3822332860058062912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3822332860058062912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3822332860058062912'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-seven-of.html' title='Forth for Enlightenment, part seven of ten, Backwords 3'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3715076864837245196</id><published>2011-05-27T10:05:00.000-04:00</published><updated>2011-05-27T10:06:55.605-04:00</updated><title type='text'>Forth for Enlightenment, part six of ten, Backwords too</title><content type='html'>&lt;p&gt;One of the problems that had yet to be solved in the previous post is creating a new puzzle. And, the cat was let out of the bag, in that the HP-28 has no way to write into the middle of a string.  However, we have already created a function, REV, that changes a string.  Further, if the string starts out with no duplicate characters, it stays having no duplicates.  So one idea is to call it a bunch of times with random reversals.  The idea is to call the function often enough to randomize the string, but not so often as to take too long.  After some experimentation, 30 calls was settled on.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 1 30 START&lt;br /&gt;    RAND 8 * 2 + FLOOR REV&lt;br /&gt;  NEXT&lt;br /&gt;&amp;raquo; 'SHFL' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can test this function by keying in the string "abcdefghi" and pushing the user defined key under 'SHFL'. This function takes about 18 seconds to run.  It's too long.  Most people can wait about 7 seconds before they start thinking about something else.  At 18 seconds, they're thinking about getting a cup of coffee. I don't drink coffee.&lt;br /&gt;&lt;p&gt;Back in 1988, i had an 7.16 MHz 8088 based PC clone (switch selectable to 4.77 MHz).  There were two C compilers.  Microsoft C 5.0, and Borland's Turbo C.  Turbo C seemed like it was infinitely faster.  But timing tests showed that it was only three times faster at compiling programs. The expectation was that Borland must have been at least ten times faster.  But here's what was really going on. Compiling a program that took 20 seconds in Microsoft's compiler would take about 7 seconds to compile with Borland's Turbo C.  It turned out that typical C program files acted exactly this way.  For larger projects, there were multiple files, and each turned out to take about 7 seconds to compile with Turbo C.  When modifications were made to a program, typically only one file would be edited, and the compiler was smart enough to compile only the edited files.  The developer experience was that Turbo C was always quick, while Microsoft C was always slow.  It was worse than this, though.  Turbo C really understood the new ANSI (now ISO) C standard, where Microsoft C 5.0 would only happily ignore the new syntax.  And i encountered real working C code that would actually crash the Microsoft C compiler.  Microsoft could refund me the more than three times higher cost any time now, and i wouldn't be quite so pissed off.&lt;br /&gt;&lt;p&gt;All this to say that while this solution is quick to write, it isn't very satisfactory.  However, i went on to write the rest of the game.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; CLLCD&lt;br /&gt;  "abcdefghi" SHFL&lt;br /&gt;  1 'BMV' STO&lt;br /&gt;  WHILE DUP "abcdefghi" &amp;#8800; REPEAT&lt;br /&gt;    BMV 1 DISP 'BMV' 1 STO+ DUP 2 DISP&lt;br /&gt;    DO UNTIL KEY END STR&amp;rarr; REV&lt;br /&gt;  END&lt;br /&gt;  2 DISP&lt;br /&gt;  "You win" 3 DISP&lt;br /&gt;  'BMV' PURGE&lt;br /&gt;&amp;raquo; 'BACK' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After you enter this program, you can run it by clicking on the user key labeled 'BACK'.  It clears the screen first, and after what seems like forever, it puts up the new random puzzle.  It then waits for single key presses.  When it gets a digit between 1 and 9, it reverses that many letters, checks to see if you won, and if not, waits for the next key. You might notice that there is a symbol on the top of the screen that says that a program is running, even though it's waiting for you. When you finish the game (that is, when you win), it prints "You win".  You can quit a game by pressing the "ON" button.  It will probably leave the current puzzle string on the stack.&lt;br /&gt;&lt;p&gt;A closer look at the program shows that it starts with the solution and passes it to SHFL.  It creates the variable BMV, with the value 1.  This is the count of moves so far.  It might have meant "Backwords MoVes". It then loops until the string is the solution string.  It displays the current puzzle and the current move.  The DO UNTIL KEY END is an idiom to get a character for input.  The KEY function does not wait for a key press.  There isn't a built-in function to wait for a character.  So you must provide the wait loop yourself.  The key comes back as a string.  What was needed was a number. The STR&amp;rarr; function converts the string into a number.  It wasn't my first guess for a function that might do that.  It's passed to REV without any error checking.  I mean, you could press anything. If you press the SOLV button, it turns out that STR&amp;rarr; can't convert that to anything.  The machine beeps, prints "Bad Argument Type" on the screen and stops.  There's lots of crap on the stack, too.  Not very graceful.  If you press the zero key, the first character is duplicated in the string. Pressing the '1' key reverses one character, which is to say that it does nothing.  But it does increment your move count. So, confine your entries to 2 through 9.  Back in the day, i might have performed better data entry checking.  Call me lazy.&lt;br /&gt;&lt;p&gt;Next up is a diversion about playing this game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3715076864837245196?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3715076864837245196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3715076864837245196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3715076864837245196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3715076864837245196'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-six-of-ten.html' title='Forth for Enlightenment, part six of ten, Backwords too'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8825323761312649019</id><published>2011-05-26T13:57:00.000-04:00</published><updated>2011-05-26T14:06:57.382-04:00</updated><title type='text'>Forth for Enlightenment, part five of ten, Backwords</title><content type='html'>&lt;p&gt;How about a game that fits on this tiny machine that's fun to play? With 2 KB of RAM, this is tough.  Fortunately, i have a copy of &lt;a href="http://www.atariarchives.org/basicgames/"&gt;101 BASIC Computer Games&lt;/a&gt;, which was written mostly using a PDP-11/70 (i got to log into the actual system, briefly, way back when). Anyway, there's a fairly simple game called &lt;a href="http://www.atariarchives.org/basicgames/showpage.php?page=135"&gt;REVERSE&lt;/a&gt;. I call it &lt;i&gt;Backwords&lt;/i&gt;.  Yes, it's misspelled. I've used the game for a couple purposes over the years.  One is as an early program to write in a variety of languages. So, I have versions in C, Perl and OPL.&lt;br /&gt;&lt;p&gt;The game is pretty simple to play.  In the original version, the digits from one through nine are used, but as ordered symbols.  They start out in non-repeated random order.  At each move, the user can reverse the first few digits.  That is, the first two, or the first three, or, ... and on up to the first nine digits.  The goal is to sort the digits from 1 to 9. Here's an example.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;342156789 - Reverse 2 to get&lt;br /&gt;432156789 - Reverse 4 to get&lt;br /&gt;123456789 - you win.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A number of language capabilities have already been used in this series. For whatever reason, i've decided to use the letters 'a' through 'i' for this version.  That lets me consider string manipulation.&lt;br /&gt;&lt;p&gt;The first obviously hard problem to solve is to take a string and reverse the first &lt;i&gt;n&lt;/i&gt; symbols in it.  Imagine a function named &lt;i&gt;REV&lt;/i&gt; that takes two arguments, a string, and a number, and returns a string.  First, my solution.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP2&lt;br /&gt;DUP 'ACNT' STO 1 SWAP START&lt;br /&gt;  DUP 1 1 SUB&lt;br /&gt;  SWAP 2 20 SUB&lt;br /&gt;NEXT&lt;br /&gt;DROP "" SWAP 1 ACNT START&lt;br /&gt;  SWAP +&lt;br /&gt;NEXT&lt;br /&gt;SWAP DROP SWAP&lt;br /&gt;ACNT 1 + 20 SUB +&lt;br /&gt;'ACNT' PURGE&lt;br /&gt;&amp;raquo; 'REV' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;By the way.  I just got my 25 year old HP28 printer working.  New batteries were installed.  The darkness slider was pushed all the way to full dark.  About a meter (three feet) of paper was unspooled.  And, it started working.  So the main issue is that 25 year old thermal printer paper is pretty marginal, and the most external bits of it didn't work at all.  When a function is printed using the printer, it prints the name of the function first, rather than the way i've done it above.  I'm giving you the command to save the function.&lt;br /&gt;&lt;p&gt;But back to this function.  You feed it a string, like "abcdefghi", and a number, like 3, and it spits out "cbadefghi".  A little study of the function reveals that 'ACNT' is a variable used to remember something.  It is incremented in the 2nd loop. The value is used with SUB, which is a built in string function to get part of a string. This variable is deleted before the function exits. Beyond that, we really need some stack diagrams to see what's going on. Here, the function is called with a string, and is directed to reverse the first 3 symbols. The stack trace is transposed so that time goes down, and the top of the stack is to the right.  That's because web pages are potentially infinitely long, but in this forum, narrow. Stacks are often quite shallow. I'd only seen stack traces horizontally, but i find that i like them vertically now. Note that the &lt;b&gt;Start&lt;/b&gt; at the begining is just to show what's on the stack before this segment runs.  The &lt;b&gt;START&lt;/b&gt; at the end is the loop START function.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Start&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;DUP2&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;DUP&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;'ACNT'&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;'ACNT'&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;STO&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;START&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The DUP2 saves both arguments for later. The DUP is used to make a stack copy of the numeric argument that gets consumed when 'STO' is used to put it into 'ACNT'. Then, the loop needs a start value (1) and an end value, the number to reverse. So in this case, the loop will execute 3 times.  The 'START' loop command does not iterate a variable that you can access.  So one of the features of the language is that there is often stack setup several commands before a function is called.  While you read this setup, it's not at all clear what it's for.  And that's why my listing is in little chunks.  And it's probably easiest to read these backwards.  Which is to say, start with the function, and try to figure out what the arguments are.&lt;br /&gt;&lt;p&gt;So, let's consider the loop.  Here, the original arguments are not modified in the loop.  So, they're not considered in the stack trace.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Start&lt;/th&gt;&lt;td&gt; "abcdefghi" &lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;DUP&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SUB&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;"a"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;"a"&lt;/td&gt;&lt;td&gt;"abcdefhgi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;2&lt;/th&gt;&lt;td&gt;"a"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;20&lt;/th&gt;&lt;td&gt;"a"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SUB&lt;/th&gt;&lt;td&gt;"a"&lt;/td&gt;&lt;td&gt;"bcdefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;NEXT&lt;/th&gt;&lt;td&gt;"a"&lt;/td&gt;&lt;td&gt;"bcdefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;This is just one trip through the loop. In the first loop, it starts with the full string on the stack.  It gets copied in the DUP.  That's probably because it will get consumed shortly.  Two constants, 1, and 1 are put on the stack.  Then, SUB is called, which consumes both constants and the copy of the string.  SUB takes the string and a position and a length from the stack and returns a string starting at the position and as long as the length.  So, in this case, it returns the first character.  SWAP pushes that first character one deeper on the stack and exposes the original copy of the string.  The constants 2 and 20 are put on the stack, and SUB is called again.  A substring is returned, starting with the 2nd character.  But the returned string isn't 20 characters long because the original string isn't that long.  So, clearly, this SUB returns the string from the 2nd character to the end of the string.  And that's it for one pass.  Each subsequent run through the loop effectively pushes one more character of the string onto the stack.  The loop runs for as many times as we want to reverse.&lt;br /&gt;&lt;p&gt;The next code segment pops each of these characters off the stack and builds a new string.  Since they were pushed onto the stack in order "a", "b", "c", they are popped off of the stack in the order "c", "b", "a", which is the reversing that we want.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DROP "" SWAP 1 ACNT START&lt;br /&gt;  SWAP +&lt;br /&gt;NEXT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The DROP discards any remaining string on the stack from the first loop. This exposes the "a", "b", "c" list on the stack.  A zero length string is then pushed.  This is the start of the answer string being built.  A loop from 1 to ACNT (the number to reverse) is started.  In each loop, the string being built and the next single character are SWAPed on the stack.  Then "+" concatenates the string being built with the single character.  All the single characters are consumed by the end of the last run through the loop, leaving the built reversed string. If this isn't clear from the code, build a stack diagram to see how it works.  After a while, you end up recognizing patterns like this.  Or, you get to be able to visualize the stack processing in your head.  Or, you get good enough at the logic to be able to predict what happens.  This last is cool, because you've just demonstrated that the &lt;a href="http://en.wikipedia.org/wiki/Halting_problem"&gt;Halting Problem&lt;/a&gt; can be solved after all, even though Alan Turing proved it can't be. There may be hope for computer program &lt;a href="http://en.wikipedia.org/wiki/Correctness_(computer_science)"&gt;correctness&lt;/a&gt; after all.&lt;br /&gt;&lt;p&gt;The last bit does some stack cleanup, gets the rest of the string from the original, and pastes the reversed part and the rest of the string together.  There's no loop here, but you may have forgotten some of the stack from the start of the function.  So, we'll do a stack trace.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SWAP DROP SWAP&lt;br /&gt;ACNT 1 + 20 SUB +&lt;br /&gt;'ACNT' PURGE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Start&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;DROP&lt;/th&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;ACNT&lt;/th&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;+&lt;/th&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;20&lt;/th&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;"abcdefghi"&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;SUB&lt;/th&gt;&lt;td&gt;"cba"&lt;/td&gt;&lt;td&gt;"defghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;+&lt;/th&gt;&lt;td&gt;"cbadefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;'ACNT'&lt;/th&gt;&lt;td&gt;"cbadefghi"&lt;/td&gt;&lt;td&gt;'ACNT'&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;PURGE&lt;/th&gt;&lt;td&gt;"cbadefghi"&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The SWAP exposes the count to reverse, which is then DROPped. The next SWAP exposes the original string. Then ACNT is recalled and one is added to it. The constant 20 is pushed so that the SUB gets the string from position 4 to the end. The "+" concatenates the two strings, yielding the answer.  The 'ACNT' PURGE simply deletes the temporary variable.&lt;br /&gt;&lt;p&gt;At this point, the Forth programmer is thinking, "Why was 3, which is the number of characters to reverse, remembered on the stack for all this time, just to DROP it?  And indeed, code like "SWAP 1 + SWAP ROT ROT 20 SUB +" would work as a replacement for the above sequence. It's the same length and doesn't need the 'ACNT' variable. Since it is the same length, it is likely to run in about the same amount of time. Then, one could also rewrite the rest of the function to eliminate the 'ACNT' variable. And that rewrite might be slightly shorter or longer.  It's highly likely that Forth programmers do this sort of thing all the time.  But consider that the 'ACNT' variable is labeled, whereas none of the stack positions are labeled.  It's kind of like Star Trek, where on the bridge, there are huge panels full of unlabeled buttons.  Labeled variables are easy to read.&lt;br /&gt;&lt;p&gt;It must be admitted that it was my intent to rewrite the function to eliminate the variable. It was easiest to get the gist of the function working by using the variable.  I thought of it as a crutch to get the function written.  But having gotten it written, it seems to me that it's better the way it is. A down side of using a variable is that some other program might accidently use the same name.  Since programs all use the same name space, this function could possibly delete a variable that is in use by some other program.  Yet, i have total control over the calling program, so it's simply not going to be an issue. And, a naming convention, such has using the name of the function as a variable name suffix, would also make this a non-issue. On the HP-28C, there's only 2 KB of RAM.  That's not much for code and data.  On the HP-28S, there's 32 KB of RAM.  But even there, only the calling program parts of this function need be considered.  Only one program can run at a time.&lt;br /&gt;&lt;p&gt;This function is basically enough to play the game.  Key in "abcdefghi", the enter button, and a number like 3.  It runs pretty fast, and returns "cbadefghi". It's reasonably fast because the two loops combined have ten functions. If you reverse 9, that's 90 functions. There are another 10 odd functions, so the maximum is about 100 functions. That takes place in a hair over a second. One should see how it performs on unexpected input. Key in other numbers and make sure they return the right result. Does it work right if you try to reverse 1 character?   How about something longer than the string, like 20?  How about zero?  How about -2?  Frankly, i was satisfied with it's behavior with unexpected input. This can be controlled by calling code anyway.&lt;br /&gt;&lt;p&gt;One of the design notes that was skipped is interesting.  The stack is used to effectively reverse characters in the string.  But in a language like C or Perl, it's more likely that pairs of characters would be swapped, using a temporary variable.  And that's because in those languages, one can subscript into a string and write whatever you want there.  The HP-28 RPL language does not have a function to put a character into the middle of a string.  So this simply isn't possible.  In fact, i considered not using strings at all. I considered using an array for everything.  Arrays can't hold characters or strings.  So i'd have to either convert the result array to a string or come up with some other way to display it.  It's very likely that using arrays on this calculator would require less code that executes faster on this machine, despite conversion.&lt;br /&gt;&lt;p&gt;This function isn't the whole game. It doesn't know if you've "won", and it doesn't create a randomized string for a starting problem. What is amazing is how much code is needed to turn this almost-game into a game.  And that's in the next post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8825323761312649019?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8825323761312649019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8825323761312649019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8825323761312649019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8825323761312649019'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-five-of.html' title='Forth for Enlightenment, part five of ten, Backwords'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-212356944496211001</id><published>2011-05-25T12:14:00.001-04:00</published><updated>2011-05-25T12:17:09.523-04:00</updated><title type='text'>Forth for Enlightenment, part four of ten, GCD</title><content type='html'>&lt;p&gt;GCD implements an interesting way to compute Greatest Common Divisor. You remember fractions?  Let's say you need to reduce the fraction &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;210&lt;br /&gt;---&lt;br /&gt;462&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;They're both even, so you can divide by 2.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;210   105&lt;br /&gt;--- = ---&lt;br /&gt;462   231&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Uhm... the digits of 105 add to 6, and the digits of 231 add to 6, so they're both divisible by 3.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;210   105   35&lt;br /&gt;--- = --- = --&lt;br /&gt;462   231   77&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then, 35 is 5 * 7, and 77 is 7 * 11, so they're both divisible by 7.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;210   105   35   5&lt;br /&gt;--- = --- = -- = -&lt;br /&gt;462   231   77   11&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, effectively, 210 / 42 = 5, and 462 / 42 = 11.  42 is the greatest common divisor between 210 and 464. The way this was solved was to attempt to find prime numbers that are factors. And it turned out that it wasn't that difficult. That's because we were able to divide big numbers by small numbers until all the numbers were pretty small.  But you might have felt a looming fear that you'd have to do a bigger divide. There are &lt;a href="http://en.wikipedia.org/wiki/Greatest_common_divisor"&gt;lots of ways&lt;/a&gt; to get the greatest common divisor.  Astonishingly, there is one that doesn't involve division.  In C, it looks something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int gcd(int a, int b) {&lt;br /&gt;  if (a == b) return a;&lt;br /&gt;  if (a &gt; b) {&lt;br /&gt;    return gcd(a - b, a);&lt;br /&gt;  } else {&lt;br /&gt;    return gcd(a, b - a);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's use this to figure out the GCD of 210 and 462. Since b &gt; a, the first step is to subtract 462 - 210 = 252, so it's gcd(210, 252). Then, b &gt; a, so gcd(210, 252 - 210 = 42).  Then gcd(168, 42).  Then gcd(126, 42).  Then gcd(84, 42).  Then gcd(42, 42).  Since 42 = 42, the answer is &lt;a href="http://en.wikipedia.org/wiki/42_(number)"&gt;42&lt;/a&gt;.  OK, maybe this isn't so easy to do in your head.  But there used to be computer processors like the 8080 that did not know how to divide directly. Such processors could use this sort of thing, and they were really relatively fast at it.&lt;br /&gt;&lt;p&gt;Anyway, the recursive version of this function on the HP-28 looks like this.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP2 IF == THEN&lt;br /&gt;      DROP ; return a&lt;br /&gt;   ELSE&lt;br /&gt;      DUP2 IF &gt; THEN&lt;br /&gt;         SWAP DUP ROT - SWAP GCD ; return gcd(a-b, a)&lt;br /&gt;      ELSE&lt;br /&gt;         SWAP DUP ROT SWAP - GCD ; return gcd(a, b-a)&lt;br /&gt;      END&lt;br /&gt;   END&lt;br /&gt;&amp;raquo; 'GCD' STO&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;This GCD function is called with two numbers, which i'll call &lt;b&gt;a&lt;/b&gt; and &lt;b&gt;b&lt;/b&gt; on the stack.  The first thing the function does is make copies of the two arguments.  They are then compared.  If they are the same as each other, one of them is dropped from the stack.  This is the return value of the function. If &lt;b&gt;a&lt;/b&gt; and &lt;b&gt;b&lt;/b&gt; aren't the same, the if &lt;b&gt;a&lt;/b&gt; &amp;gt; &lt;b&gt;b&lt;/b&gt; it returns the value from the recursive call of gcd(a - b, a).  Let's look at this with a stack trace.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;Start&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;th&gt;DUP&lt;/th&gt;&lt;th&gt;ROT&lt;/th&gt;&lt;th&gt;-&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a - b&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a - b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;And then GCD is called.  The stack trace for when b &gt; a follows.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;Start&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;th&gt;DUP&lt;/th&gt;&lt;th&gt;ROT&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;th&gt;-&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b - a&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;This program works.  However, for large arguments it can run out of memory.  That is, despite not putting much in the way of data on the stack, it runs out of recursive call depth.  For example, it chokes on gcd(100, 101).  I wanted to know exactly how deep it could go, and i tried various number pairs that are separated by 1.  And gcd(100, 101) failed.  So i wrote this little program to find out when it first fails. It starts at 50, and tries up to 200.  It then calls gcd(x + 1, x).  And, unexpectedly, it returned that gcd(180,179) works.  That was really unexpected.  It turns out that gcd(179,180) fails.  The order of the arguments is important, for no apparent reason.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 50 200 FOR x&lt;br /&gt;      x&lt;br /&gt;      x 1 + x GCD&lt;br /&gt;      DROP DROP&lt;br /&gt;   NEXT&lt;br /&gt;&amp;raquo; 'G' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Anyway, the fact that fairly small arguments lead to a stack crash is not good.  The C version, using the full -O3 optimization of the gcc compiler, never runs out of memory.  That's because this compiler optimizes the tail recursion, and it never generates much of a call stack.  Likewise, the Scheme version never runs out of memory.  The Scheme language requires that tail recursion optimization is implemented. Perl 6 is supposed to do some simple tail recursion optimization. All my code is in Perl 5, and it fails pretty quickly. It complains of &lt;i&gt;Deep recursion&lt;/i&gt; with gcd(101, 100). By gcd(131, 130) it runs out of stack memory. But could the program be written without recursion?  Sure.  In fact, it's pretty easy.  First we'll see what it might look like in C. Often to eliminate tail recursion, all you need is a jump back to the top.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int gcd(int a, int b) {&lt;br /&gt;  while (a != b) {&lt;br /&gt;    if (a &gt; b) {&lt;br /&gt;      a = a - b;&lt;br /&gt;    } else {&lt;br /&gt;      b = b - a;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return a;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What this does is loop until &lt;b&gt;a&lt;/b&gt; and &lt;b&gt;b&lt;/b&gt; are the same.  It changes it's own arguments each loop instead of calling itself.  If this is done on the HP-28, then there's no recursion, and large numbers can be handled, given time. Note that the &lt;b&gt;&amp;#8800;&lt;/b&gt; in the first line is a single HP-28 character, a shifted '='.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP2 WHILE &amp;#8800; REPEAT&lt;br /&gt;      DUP2 IF &gt; THEN&lt;br /&gt;         SWAP DUP ROT - SWAP ; repeat with gcd(a-b, a)&lt;br /&gt;      ELSE&lt;br /&gt;         SWAP DUP ROT SWAP - ; repeat with gcd(a, b-a)&lt;br /&gt;      END&lt;br /&gt;      DUP2 ; for the != in WHILE&lt;br /&gt;   END&lt;br /&gt;   DROP ; drop one of the equal a, b.&lt;br /&gt;&amp;raquo; 'GCD2' STO&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;This version is also a little quicker, because the while loop is quicker than a function call.  At first, things seem to be moved around at random compared with the original version.  The DROP that removed one of the identical values on the stack moved to after the while loop, just as the C version's return statement moved.  Otherwise, the first IF became a WHILE.&lt;br /&gt;&lt;p&gt;Is the iterative version easier or harder to follow than the recursive version? This is an important maintenance question.  And it isn't clear that either one are very easy.  After all, even having stepped through an example, it's not clear how the subtractions end up giving you what amounts to division.  And the begining of the answer is that repeated subtraction can be used in division.  Think about how you have to guess the next digit in long division.  You don't really have to guess.  You can try the digit one, do a subtraction of the divisor, and repeat this (while incrementing the answer digit) until just before it goes negative.  But that's just a hint. On the other hand, the nonrecursive version demonstrates that nothing needs to be remembered and that the only time something is returned is when a == b.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-212356944496211001?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/212356944496211001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=212356944496211001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/212356944496211001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/212356944496211001'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-four-of.html' title='Forth for Enlightenment, part four of ten, GCD'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7142709632913862887</id><published>2011-05-24T15:25:00.004-04:00</published><updated>2011-05-24T15:48:19.475-04:00</updated><title type='text'>Razor sharp humor</title><content type='html'>&lt;p&gt;The radio show &lt;a href="http://www.abc.net.au/rn/ockhamsrazor/"&gt;Okham's Razor&lt;/a&gt;, starring &lt;a href=" http://www.abc.net.au/rn/ockhamsrazor/about/default.htm#presenter"&gt;Robyn Williams&lt;/a&gt; has a &lt;a href="http://www.abc.net.au/rn/ockhamsrazor/stories/2011/3222215.htm"&gt;show on humor&lt;/a&gt;, from a grammar point of view. It's good, but not very funny. Download it now and listen to it, or read the transcript. I'll wait.&lt;br /&gt;&lt;p&gt;Everyone knows that jokes that are explained are universally not funny. One assumes that people who study humor, called 'jokeologists', are singularly unfunny people. Comedians study humor. Most people will claim that they can't remember jokes. Jokes are generally nonsense - who could remember that? It seems that most people can't tell jokes very well. That may be because they don't practice. A good comedian can tell jokes and make it look easy because they practice telling jokes until the jokes are old and tired. They're literally not funny any more. And that gets us back to how jokeologists are people that are not funny, at least to themselves. But don't feel bad for the poor comedian. The jokes were funny for them once. And they get a rush when the audience is amused.&lt;br /&gt;&lt;p&gt;Groucho used elephants because elephants are inherently funny. He could have use a cow, if cows weren't so cuddly. Groundhogs are funny, but they also might fit in Groucho's pajamas. And shirts aren't nearly as funny as pajamas. Groucho even breaks the rule about explaining his joke, and gets away with it. That's genius. Anyone else trying that would be considered conceited. Content is important. This is the main problem with the humor constructed by ten year olds. It should be noted that your average ten year old knows how to properly use ten thousand rules of grammar. Where a ten year old's attempts at humor go wrong is generally in content, not grammar.&lt;br /&gt;&lt;p&gt;Many of my friends who are mathematicians are some of the funniest people around. Perhaps their jokes are funny because the rules their humor break have no ambiguity to exploit, and when broken shake the foundations of the Universe. Perhaps these jokes are funny because there's a sense that it took more work to create them. Mark Twain said that it takes about two weeks to come up with a really good extemporaneous comment.&lt;br /&gt;&lt;p&gt;The problems with teaching grammar are related to the problems of teaching math(s). 1) The plethora of definitions. 2) The applications that might provide context aren't elucidated. 3) The use of arbitrary rules that are difficult to cope with (where extra work is needed to avoid having a preposition at the very end). 4) The use of vocabulary that is specialized to the point of obfuscation. Math(s) teaching goes further with this obfuscation bit by using symbols that are apparently invented on the spot, often using glyphs pulled from other languages, without explanation. Symbols introduce indirection, which is an irritant to the non-specialist. For the mathematician, if one knows how to go from New York to Detroit, and one knows how to go from Detroit to Boston, then one knows how to go from New York to Boston. The rest of us will get out a map and figure out how to go from New York to Boston directly, since that's likely to be less than a tenth of the distance, as it was even when gas (petrol) was cheaper. Neither math(s) nor grammar make much sense or appear to have much use (power to achieve any likely goals). It's too bad, since both math and grammar are among the most powerful tools ever invented.&lt;br /&gt;&lt;p&gt;When the ten year old says, "My friend and me went to the store", i don't correct it by stating "My friend and I". I explain that 'Me went to the store' doesn't sound as good as 'I went to the store'. I have no idea what the formal rule is. Ten year olds don't get the rule right mainly because they don't think about the whole sentence before it comes out of their mouth. I want to teach the child to think a bit before they speak. It would solve so many other issues.&lt;br /&gt;&lt;p&gt;Just as with the doctor, a ten year old is only a little patient. Computers have infinite patience. If computers could be taught grammar, and were fed a dictionary, could they produce huge amounts of humor? Perhaps IBM's Watson could take up this new avocation.&lt;br /&gt;&lt;p&gt;My favorite one liner is this: A Zen master went to his hot dog vendor and said, "Make me one with everything"'.&lt;br /&gt;&lt;p&gt;I heard it again in the movie "The Bicentennial Man", starring of all people, &lt;a href=" http://www.imdb.com/name/nm0000245/"&gt;Robin Williams&lt;/a&gt;. There aren't any jokes near it. I'd heard it before, and laughed right away. Some thirty seconds later, someone else in the theater laughed. Then a couple guys laughed at what must have been five minutes. When i tell it, not everyone gets it. I figured that they didn't know what Zen is or something. So i told it to a group of five of my Indian colleagues. They didn't laugh. I asked them about it. One said that "It's not a Zen Master. It's a Buddhist monk." Another said, "And they're vegetarian, so they wouldn't be eating hot dogs." And so on. In fact, i counted nearly as many errors in the joke as words in it. It's not that they didn't get it, it was just too broken for them to be funny. To me, that's what makes it funny. And listing the things wrong with it doesn't diminish it as a joke. Though, to be fair, i've practiced telling it quite a bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7142709632913862887?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7142709632913862887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7142709632913862887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7142709632913862887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7142709632913862887'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/razor-sharp-humor.html' title='Razor sharp humor'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-341133393632765508</id><published>2011-05-24T09:16:00.003-04:00</published><updated>2011-05-24T09:36:09.816-04:00</updated><title type='text'>Forth For Enlightenment, part three of ten, Logic two</title><content type='html'>&lt;p&gt;Last time, the four digit logic problem was introduced, with solution.  This time, we'll develop a brute force solution for the HP-28, which we're thinking of as a Forth language engine.&lt;br /&gt;&lt;p&gt;We're looking for a four digit number.  It must be greater than 2000.  The digits of this number add to 14.  The one hundred's digit is less than the one's digit.  The ten's digit is three times the thousands digit. The number must be odd.&lt;br /&gt;&lt;p&gt;Since the number is four digits and greater than 2000, the number must be between 2001 and 9999.  That suggests a loop.  In Forth, the style is to use lots of little functions to get things done. So, in writing the top level function, we'll imagine that we have helper functions to solve smaller problems.  The top level could be a loop that checks every digit. Call it 'TOP'. It effectively enforces the first two rules. The development plan was more or less top down design, bottom up implementation, though with some feedback leading to a little jumping around. It's presented as top down, that is callers first, however. For testing, it should be entered bottom up. The called functions can be tested first.  If you don't recall the syntax for something, you can refer to my &lt;a href="http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-zero-of.html"&gt;previous articles&lt;/a&gt;.  Hewlett Packard has the full manual available as well, though not online or free.&lt;br /&gt;&lt;p&gt;By the way, using lots of little functions isn't how i learned to write C. I use C when performance is everything. When i learned C, subroutine calling always introduced a few instructions of overhead. The incentive is to only write subroutines when they'll be called more than once.  But modern C compilers can perform function inlining automatically.  And, statically declared functions can be inlined with the original function eliminated entirely.  So the effect can be better readability and maintainability without the subroutine call performance penalties or extra code. However, there's still the issue of variable scope, parameter passing and return. So it's not something you can always do. By the way, when entering this routine, NEXT isn't the NEXT key on the machine.  It's in the Program Branch menu on the 2nd level. This procedure ironically has you use the NEXT button to get to the 2nd level of the menu. Alternately, you can enter the 4 letters N E X T and a space.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 2001 9999 FOR x x CHECK NEXT&lt;br /&gt;&amp;raquo; 'TOP' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, the next thing to consider is CHECK, which enforces the last four rules. It takes a 4 digit number from the stack (and consumes it). How does it flag any correct answers? The stack is not a good place for this.  We could store any answer we get in a variable called 'ANS'.  If we assume that we don't know how many correct answers that there might be, 'ANS' could be a list which we can append to.  So, TOP needs to initialize this list with an empy list before the loop that calls CHECK.  We'll do that in a function called INIT.  We might modify INIT later to add anything else that comes up. Also, TOP should recall the value of ANS. Here's the brand new INIT along with the new version of TOP.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; { } 'ANS' STO&lt;br /&gt;&amp;raquo; 'INIT' STO&lt;br /&gt;&lt;br /&gt;&amp;laquo; INIT 2001 9999 FOR x x CHECK NEXT ANS&lt;br /&gt;&amp;raquo; 'TOP' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now CHECK needs to break the number into digits.  I considered using an array for the digits, and index into the array.  But there doesn't seem to be much advantage to that approach.  A variable for each digit is OK. I went with 'THO', 'HUN', 'TEN' and 'ONE'.  A function 'BRK' breaks the number into digits.  The idea is to divide the number by 10 using the HP-28's MOD function - which gets the remainder. That's the low digit.  Then divide the number by 10 and use FLOOR to get the integer part.  This is repeated, so we'll write a GETDIG function to do that much. GETDIG takes the number to break and returns the new number to break and the digit obtained on the stack. BRK calls it 4 times, storing results.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP 10 MOD 10 SWAP / FLOOR SWAP&lt;br /&gt;&amp;raquo; 'GETDIG' STO&lt;br /&gt;&lt;br /&gt;&amp;laquo; GETDIG 'ONE' STO&lt;br /&gt;   GETDIG 'TEN' STO&lt;br /&gt;   GETDIG 'HUN' STO&lt;br /&gt;   'THO' STO&lt;br /&gt;&amp;raquo; 'BRK' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This much is easily tested.  Type 1234 and using the USER function key setter run 'BRK'.  Four variables are created, ONE, TEN, HUN and THO, and pressing those buttons shows their digit values.  Testing again with 5678 shows that each value changes appropriately.&lt;br /&gt;&lt;p&gt;The CHECK function has four rules to enforce.  The order doesn't matter.  If the number passes all four rules, then the 4 digit number is added to the list. The tests are in the functions IS14, ISHLO, IST3T and ISODD.  These functions look at the digits stored by BRK and return true or false. They could be all tested and the results ANDed together, but it's probably faster to have nested IFs so that if any are false, it can stop checking. Using AND would eliminate all but one of the IFs. A new typography thing. The &lt;i&gt;&amp;rarr;LIST&lt;/i&gt; notation is for an HP28 built in function.  The function name really starts with a right arrow. In development, i wrote a version that kept the current potential answer on the stack as an unnamed variable.  It even worked.  But storing it in a real variable called 'PANS' is easier and shorter than goofing around with the stack.  It looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP 'PANS' STO&lt;br /&gt; BRK&lt;br /&gt; IF IS14 THEN&lt;br /&gt;  IF ISHLO THEN&lt;br /&gt;   IF IST3T THEN&lt;br /&gt;    IF ISODD THEN&lt;br /&gt;     ANS PANS 1 &amp;rarr;LIST + 'ANS' STO ; a solution&lt;br /&gt;    END&lt;br /&gt;   END&lt;br /&gt;  END&lt;br /&gt; END&lt;br /&gt;&amp;raquo; 'CHECK' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If there is a solution, it is converted to a list and appended to the ANS list of solutions. This function can't be checked yet.  All the called check functions must in place first.&lt;br /&gt;&lt;p&gt;The first rule function is IS14.  It checks to see that the digits add to 14. It recalls each digit and adds. It doesn't perform the IF, it just does the compare. The compare returns 0 for false or 1 for true.  So Booleans are just numbers.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; THO HUN + TEN + ONE + 14 ==&lt;br /&gt;&amp;raquo; 'IS14' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;One can check this function using 1234 BRK IS14. It should report 0.  Then 2165 BRK IS14 should report 1.&lt;br /&gt;&lt;p&gt;The next rule is ISHLO, which checks that the one hundred's digit is less than the one's digit. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; HUN ONE &lt;&lt;br /&gt;&amp;raquo; 'ISHLO' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2165 BRK ISHLO should report 1. 4321 BRK ISHLO should report 0.&lt;br /&gt;&lt;p&gt;The next rule is IST3T, which checks that the ten's digit is three times the thousands digit.  I'm using * instead of X for multiply because that's what you get on an HP-28 when you press the X button when you are creating a function.  The letter X could be a variable or function. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; THO 3 * TEN ==&lt;br /&gt;&amp;raquo; 'IST3T' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4321 BRK IST3T should report 0. 2165 BRK IST3T should report 1.&lt;br /&gt;&lt;p&gt;The last rule is ISODD, which checks that the number must be odd.  One imagines that such a function could be handy for other things, and therefore is a candidate for a library function.  Then any mistakes you make in creating it could be reused.  No, no.  Really, libraries are a good thing.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; ONE 2 MOD 1 ==&lt;br /&gt;&amp;raquo; 'ISODD' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2165 BRK ISODD should report 1. 1234 BRK ISODD should report 0. Visually, it may not be totally clear what it's doing. We don't need to know anything other than the least significant digit. Recall the one's digit, divide it by 2 with the MOD function, and compare the result to 1.&lt;br /&gt;&lt;p&gt;The CHECK function can now be checked using INIT 1234 CHECK ANS. It should report { }. Then INIT 2165 CHECK ANS should report { 2165 }.  Of course, if we didn't know a solution to the problem, you'd have to check that TOP yields an answer with TOP.&lt;br /&gt;&lt;p&gt;Running the full program by invoking TOP takes 49:22 (2962 seconds) to run on my HP-28C. It should be faster on an HP-28S, since the processor speed is higher. Optimization or speed was not a particularly big consideration with this program.  A logic program like this would be run once. There are no parameters.  It should always produce the same answer. But it should be noted that some of the tests report false more often than others, so should be evaluated first. For example, one expects that IS14 is true 1/14th of the time, while ISODD is true half of the time.  In fact, ISODD could have been incorportated into TOP's FOR loop by using a STEP clause of 2 and count just the odd numbers.  And of course, if speed were required, a modern machine could have been used and with an efficient compiler.  One expects that a C version should consume less than a second.  That's because 8000 just isn't a very large number. And in fact, even a decade old PC requires only a millisecond, and sometimes reports zero time.&lt;br /&gt;&lt;p&gt;One of the things that is attractive about this language is that the check functions are all really tiny. Indeed, having a compact language makes considerable sense for small machines.  I had heard that Forth for the 1970's batch of microcomputers could achieve 1/3rd of the speed that typical programmers could achieve using assembly language. However, i doubt it.  If i recall right, the inner loop for a Forth engine required 21 instructions on a z80. This is all overhead. But perhaps the figure was for a Forth system where many of the primitives were in assembly language, and therefore much of the code executed in a Forth system was, in fact, assembly language. Given that Forth is arguably easier to write, that's quite promising. The low memory foot print for Forth is also encouraging.  Java has achieved 1/3rd the performance of C, but it started out at about 1/350 of C's speed. Java has only achieved this performance through considerable heroics.  It took over ten years to happen. By available evidence, every opportunity to trade memory for speed has been used to achieve it.  Java is incredibly memory hungry.&lt;p&gt;The CHECK function shows that even a little complexity can give rise to an increased programmer burden tracking how the stack is used.  Tracking what's on the stack is one of the major challenges with writing and debugging Forth. One ends up drawing stack diagrams all the time. When i wrote this program, the only problem was that the first version of the CHECK function left an extra value on the stack. I didn't happen to notice it, so my first run of TOP ran out of memory due to the accumulating values on the stack every loop.&lt;br /&gt;&lt;p&gt;Even as short as ISODD is, it's not evident from the code what it might be doing to the novice. It's probably more evident to the seasoned Forth programmer. But this forms a barrier to entry, and makes procedural (or imperitive) languages easier in general.  In fact, i find that documenting my Forth code to the level of this article is what i need to have a clue even a year later.  That's distressing.&lt;br /&gt;&lt;p&gt;Is the application of logic, or the crafting of a program faster if the goal is getting the answer?  I'd have to say that the logic was marginally quicker for me. It's not as complicated.  It took nearly twice as much text to describe the program as it did the mathematical logic.  I don't attempt to solve this sort of logic problem very often.  While i'm not currently an HP-28 RPL or Forth guru, i do write programs all the time.  I'm much quicker at it than i was towards the start of my programming career.  Although the debug cycle was short, the run time was pretty long.  I don't count it, as i was able to do other things while it ran.  Uhm, i added 440 1 BEEP at the end of TOP to alert me when it was finished with a 1 second long musical A note.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-341133393632765508?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/341133393632765508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=341133393632765508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/341133393632765508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/341133393632765508'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-three-of.html' title='Forth For Enlightenment, part three of ten, Logic two'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3236627019022541425</id><published>2011-05-23T13:16:00.000-04:00</published><updated>2011-05-23T13:17:31.785-04:00</updated><title type='text'>Forth for Enlightenment, part two of ten, Logic problem</title><content type='html'>&lt;p&gt;Here's a logic problem that i came across while helping a 5th grade student with math. My interest in it is to solve it in a brute force manner on the HP-28C.  But before i do that, i'll go through the problem and logic solution.  First, the problem.&lt;br /&gt;&lt;p&gt;We're looking for a 4 digit number.  It must be greater than 2000.  The digits of this number add to 14.  The one hundred's digit is less than the one's digit.  The ten's digit is three times the thousands digit. The number must be odd.&lt;br /&gt;&lt;p&gt;So, first, the logic solution. In these sorts of logic search problems, you'd like to use the clues to narrow down the search, if possible.  We'll start with the first two rules.  It's a 4 digit number that is greater than 2000.  So, the number is in the range from 2001 to 9999. That's roughly 8,000 numbers to check.&lt;br /&gt;&lt;p&gt;It's not immediately clear that adding digits to 14 helps narrow the search at this point. You'd have to check all 8,000 numbers or something. And for the same reason, we'll skip the hundred's digit rule for now as well.  But consider that the ten's digit is three times the thousands digit.  Well, the thousand's digit has to be at least 2.  Three times two is 6.  If the thousand's digit is 3, then the ten's digit must be 9.  If the thousand's digit is 4, then ten's digit is 12, which is not a digit.  So the thousand's digit must be either 2 or 3.  That narrows the search to the range 2069 to 3999.  And the number must be 2?6? or 3?9?. Here, i'm using &lt;i&gt;?&lt;/i&gt; to mean any digit. That looks like 200 numbers to check.&lt;br /&gt;&lt;p&gt;Now the hundred's digit must be less than the one's digit.  So, for 2?6? numbers, the hundred's digit must be in the range of 0 through 5.  For 3?9? numbers, the hundred's digit must be 0 through 8.  Let's use [0-5] and [0-8] as notation for single digit ranges. We have 2[0-5]6? and 2[0-8]9? as possibilities. Since the hundred's digit must less than the one's digit, it follows that the one's digit must be greater than the hundred's digit.  Since the hundred's digit must be at least zero, the one's digit must be at least one.  So the ranges are 2[0-5]6[1-9] and 3[0-8]9[1-9]. That's 54 + 72 numbers or 126 possibilities remaining.&lt;br /&gt;&lt;p&gt;Let's check the rule that the digits must add to 14. In the 3[0-8]9[1-9] case, the two known digits add to 12. So the only valid combination is 0, 2.  But since the one's digit must be odd, even this combination must be eliminated.  In the 2[0-5]6[1-9] case, two of the digits are known, and add to 8.  So the other two digits must add to 6.  Since the hundreds digit has to be smaller, the valid combinations are 0, 6, and 1, 5, and 2, 4. Since the one's digit must be odd, that leaves 1, 5. So the answer is 2165.&lt;br /&gt;&lt;p&gt;What does a 5th grade student do with this problem?  They guess.  It's a 4 digit number.  It must be greater than 2000.  So the first guessed digit is 2.  It's 2???. The "digits add to 14" rule is ignored. The 10's digit is 3x the 1000's digit.  So, the guess is 2?6?. There's no rule that the numbers must be unique, but they guess '1' for the hundred's digit all the same. They could have guessed zero, since it's a digit.  But they don't know much about zero. So that's 216?. The number must be odd.  The next guess is 2163, because 1 was already taken and this is the next odd number. Some 5th graders stop there.  And it's not quite the right answer. But really smart 5th graders go back to the "adds to 14" rule, and notice they need 4 more, and so guess 2165.  And, it's the right answer.&lt;br /&gt;&lt;p&gt;Is this problem reasonable to hand to a 5th grade student?  IMO, no. There are several skills that could have been taught first.  For example, one could teach the idea of doing the easy stuff first.  But my real complaint is that this exercise teaches the 5th grader to guess at answers, and fairly randomly.  Usually, at this age, the guesses are not checked for correctness, and wrong answers come out.  So, one should also explicitly teach students to check their answers. This problem also requires quite a bit of estimation and mental juggling for anyone, much less a 5th grader.  Sorting the rules by next easiest is another teachable skill. But the school that assigned this problem taught none of these skills. Finally, this is a logic problem with no obvious (or explained) real world analogy.  There seems to be no use for knowing how to solve it.  Most math can be applied.  IMO, it's criminal to expose students to math without explaining what it it might be for.&lt;br /&gt;&lt;p&gt;Admittedly, it took me much longer to solve than it took a smart 5th grader.  But that's because i took the time to understand more about the problem.  For all i know, there might be more than one solution.  I invented notation to help keep track of the possible solutions.  I did go with easy constraints first.  So, i skipped the "adds to 14" constraint until later.  But i also ignored the odd number constraint. I could have invented a [2-9]??[13579] notation. But that's really three notation inventions all at once. And when I was finished, not only did i know that i had an answer, i also knew it was the only answer.&lt;br /&gt;&lt;p&gt;There's a fear of math issue for the 5th grader (and, one imagines, for most of us).  If one makes a mistake, one gets the wrong answer.  If one adds 2 + 2 and gets 5, it's not close.  It's wrong.  Fear of math is mostly the fear of failure.  That is, you invest your time and effort, but if you get the wrong answer, it's entirely wasted.  At least, that's the fear.  It's worthwhile to teach the idea that the problems are a challenge. One way to get over the fear is that getting the right answer is rewarding in itself.  Frankly, i get a little rush.  I find it addictive.  I try not to let it go to my head and make me proud and boastful. That's not the person i want to be.  But i do want it to build up my self esteam or self confidence.  That will make it easier to do the next problem.  But along with the fear of failure and wasted investment in time that comes from poor self confidence, there's also the fear that there may be no solution. As an adult working real world problems, i've come across problems that don't appear to have real solutions.  Or if real solutions exist, there doesn't seem to be a way to get at them with logic. The 5th grade student should be assured that a solution exists.  Still, this problem is way too complex for most parents, let alone typical 5th grade students. How an untrained 5th grade student is supposed to solve it as a homework problem is beyond my reckoning.&lt;br /&gt;&lt;p&gt;I've consumed enough of your consideration on the logic of this problem.  The next article will dive into an HP-28 solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3236627019022541425?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3236627019022541425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3236627019022541425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3236627019022541425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3236627019022541425'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-two-of-ten.html' title='Forth for Enlightenment, part two of ten, Logic problem'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5814974923284296417</id><published>2011-05-20T09:50:00.001-04:00</published><updated>2011-05-20T09:54:36.017-04:00</updated><title type='text'>Forth for Enlightenment, part one of ten, Factorial</title><content type='html'>&lt;p&gt;My Scheme series introduced &lt;a href="http://predelusional.blogspot.com/2008/01/scheme-for-enlightenment-part-one.html"&gt;factorials&lt;/a&gt; in part one (the 2nd post). The factorial function is strictly numerical. The factorial of 5 is 5! = 5 * 4 * 3 * 2 * 1 = 120. The factorial of any number is the product of the integers from 1 up to that number. The numbers are multiplied together. A series using the HP-28 calculator ought to have this function early on. After all, the factorial function works with numbers. So do calculators. But doesn't the HP-28 have a built-in factorial function? Yes it does. And it's fast. And it can deal with fractions. I mean, the factorial of 5 is 5! = 5 * 4 * 3 * 2 * 1 = 120. But what is the factorial of 5.5? Well, there's a gamma function, and it yields 287.9 (with more decimal digits). The gamma function closely tracks the factorial function. For very large factorials, the gamma function can get you an answer that is good enough without doing all those multiplies. The HP-28 can represent numbers up to 10^500. So the FACT function is limited to input up to 253.&lt;br /&gt;&lt;p&gt;If you write your own factorial function, you'll find that it's not as fast as the internal function. The internal function is pretty much instant. It's not clear if they coded it in assembler, if ROM is faster than RAM (as it was with the Texas Instruments TI-59 calculator), or if they used some tricks. It might be a combination of these. One of the tricks it might do is store the answers to all factorials up to 253. Or, they could use less space and only store every tenth factorial. So, 10! is 3,628,800. If you need 11!, you start with 10! and multiply by 11. Then, factorials would be really fast.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I wasn't so much interested in speed as programming. The recursive version is first. It doesn't support the gamma function. Just the multiplication of integers is considered.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP IF 1 &amp;#8800 THEN    ; stop at 1. If not...&lt;br /&gt;       DUP ROT *     ; multiply count into product&lt;br /&gt;       SWAP          ; switch prod and count&lt;br /&gt;       1 - FA        ; cnt = cnt - 1, call self&lt;br /&gt;     END&lt;br /&gt;&amp;raquo; 'FA' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Typography first. The 'FA' STO at the end isn't really part of the function. It's how you enter the function. 'FA' is the function's name.&lt;br /&gt;&lt;p&gt;The function expects two arguments. The number 1, and the factorial to be computed. So, this can be run with 1 5 FA. But it also returns two items on the stack. And the answer, 120, is buried. It returns the answer and the number 1 on the stack. So, get the answer by running DROP. This isn't really clear to an end user, so there should be a wrapper function, which i call 'FAC'.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 1 SWAP FA DROP&lt;br /&gt;&amp;raquo; 'FAC' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This FAC fucntion takes one argument, and returns the answer. So 5 FAC returns 120. FA, and therefore FAC, can compute factorials for numbers up to 253 properly. That's from the limitation of numbers, not from running out of memory for stack data.&lt;br /&gt;&lt;p&gt;But let's get back to FA again. In it, the HP-28 function ROT is used which rotates entries on the stack. It's pretty clever. But it's not clear what it should be good for. It works for this program. ROT comes from ROTate. Let's examine how it works. If a, b, and c are on the stack before ROT, then b, c and a are on the stack afterwords. Here it is in table form.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;Before ROT&lt;/th&gt;&lt;th&gt;After ROT&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;Now, FA takes two arguments on the stack, which are 1 and the factorial number to compute. It turns out that the 1 is needed as a running product. The count is multiplied by the current product on each loop down. The current count is at the top of the stack. In the first line, the count is copied, so that there are two of them. The IF consumes one count in the compare to 1. In the line with the count, we want to multiply the count into the product, but we need to remember the count also. So the count is duplicated, and then ROT does it's magic. Finally, we have the multiply. The next line does a SWAP to restore the product and count to where they started. Here's a stack diagram for operations starting in line 2. The stack shows what's on the stack after each operator.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;Start&lt;/th&gt;&lt;th&gt;DUP&lt;/th&gt;&lt;th&gt;ROT&lt;/th&gt;&lt;th&gt;*&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;-&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;prod&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;prod&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;prod&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;prod&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;prod&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;prod&lt;/td&gt;&lt;td&gt;prod * count&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count - 1&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;Note that in the column with the multilply, &lt;i&gt;prod * count&lt;/i&gt; is shown. After that, it's the new product, so just &lt;i&gt;prod&lt;/i&gt; is shown. The stack diagram should get you through the operation of this function. Forth programmers use these often. But i wouldn't be surprised if after awhile, idioms involving ROT become second nature. I timed this function with the highest argument, 253. It took 20 seconds. The built in function comes back with the answer almost right away, even for 253.&lt;br /&gt;&lt;p&gt;This is an acedemic excersise, so a version that uses a loop instead of recursion was written next. I used a new name, FACTO. It takes the number to compute, and returns the answer. It's also shorter and simpler.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 1 SWAP 1 SWAP&lt;br /&gt;     FOR x&lt;br /&gt;       x *        ; multiply count into product&lt;br /&gt;     NEXT&lt;br /&gt;&amp;raquo; 'FACTO' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The first line with the SWAPs might be confusing. The FOR operator takes two arguments, the start number, and the ending number. The &lt;i&gt;count&lt;/i&gt; is already on the stack, but needs to be in level 1. A 1 is needed on level 2 to serve as the start number. A 1 is needed on level 3 to serve as the running product. Here's a stack diagram.&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;start&lt;/th&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;SWAP&lt;/th&gt;&lt;th&gt;FOR&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;The FOR loop's first iteration starts with 1 on the stack, which is the running product. The &lt;i&gt;x&lt;/i&gt; in the FOR line is a local variable. It matches the &lt;i&gt;x&lt;/i&gt; in the third line. This variable counts from 1 to count, stepping by one each loop. So &lt;i&gt;x *&lt;/i&gt; multiplies the current running product by the current count number each loop. The NEXT function marks the end of the FOR loop. The local variable conveniently and automatically is removed when the loop is finished with all iterations. When each loop is finished, the current running product is the only thing on the stack. So when all loops are complete, the complete product is returned.&lt;br /&gt;&lt;p&gt;The start with the SWAPS can be made shorter, if perhaps more complicated. Consider this version:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 1 1 ROT&lt;br /&gt;     FOR x&lt;br /&gt;       x *        ; multiply count into product&lt;br /&gt;     NEXT&lt;br /&gt;&amp;raquo; 'FACTO' STO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;table border=1&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;start&lt;/th&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;ROT&lt;/th&gt;&lt;th&gt;FOR&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;count&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;Clearly, it gets the stack to the same place and with 1 fewer command. It might be marginally faster, but it's only one command that is skipped, and only once. It is shorter, so it should take just a tiny bit less memory. While the HP-28C is memory starved, in reality one would use the built-in FACT function, which would take zero memory. It does show that the ROT function is often valuable.&lt;br /&gt;&lt;p&gt;This version of the factorial function is faster than the recursive version. It took 5.8 seconds. That's more than three times faster. It isn't anywhere near as fast as the built-in function, however. It also takes less memory, since it doesn't use more than three stack levels. It doesn't need a helper function.&lt;br /&gt;&lt;p&gt;Since recursion can always be converted to loops, one wonders why recursion is ever needed. And indeed, it isn't. But sometimes recursion is how the problem is presented. If that's the case, then often recursion is a good approach to take. But there are also algorithms that are easier with recursion. The Quick Sort algorithm comes to mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5814974923284296417?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5814974923284296417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5814974923284296417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5814974923284296417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5814974923284296417'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-one-of-ten.html' title='Forth for Enlightenment, part one of ten, Factorial'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2305661338443138262</id><published>2011-05-19T16:37:00.003-04:00</published><updated>2011-05-19T16:43:50.484-04:00</updated><title type='text'>Forth for Enlightenment, part zero of ten - count</title><content type='html'>&lt;p&gt;Back in 2008, i posted a series of articles as an introduction to the &lt;a href="http://predelusional.blogspot.com/2008/01/scheme-for-enlightenment-part-zero.html"&gt;scheme&lt;/a&gt; computer language, and basically functional programming in general.  One of the quotes one hears from functional programming enthusiasts says that languages are either &lt;i&gt;functional&lt;/i&gt; or &lt;i&gt;disfunctional&lt;/i&gt;.  From my perspective, C can be used as a functional language, even if that isn't the usual case.  For that matter, assembler can be used as a structured language if just a little discipline is used, despite only directly supporting GOTO. And back in the 70's, with &lt;i&gt;8 bit processors&lt;/i&gt; such as the 8080, z80, 6502, 6809, or 1800 (all of which i consider to be 16 bit processors, since that's the address space), memory space was so tight that having little tiny functions made sense. Therefore, assembler programs often had a functional feel to them.&lt;br /&gt;&lt;p&gt;Anyway, the next language i wanted to visit, or in this case revist, is &lt;a href="http://en.wikipedia.org/wiki/Forth_(programming_language)"&gt;Forth&lt;/a&gt;.  I could download a Forth system for Linux, but i happen to have something like Forth in a more portable form.  I have an &lt;a href="http://en.wikipedia.org/wiki/HP-28_series"&gt;HP-28C&lt;/a&gt; calculator from Hewlett-Packard.  I got it in late 1986, i think.  When i saw the HP-28S, i wished i'd gotten that one instead.  The HP-28C has 2 KB RAM.  The HP-28S has 32 KB RAM.  The speed increase of the HP-28S would have been irrelevant to me.  This might be considered blasphemy.  But i had access to much faster computers with C compilers if i needed to perform serious computations. Battery life is more important.  Battery life on the HP-28C is excellent, by the way. But lots of RAM (16 times more) would have opened up the range of potential applications dramatically.  For example, one of my benchmarks involves performing a matrix multiply using three 20x20 arrays.  That's 1,200 cells, which won't fit in 2 KB of RAM.  Numbers take at least 8 bytes of storage.  So 1,200 cells takes at least 9,600 bytes.  So, it will fit fine in 32 KB, but not even close in 2 KB.&lt;br /&gt;&lt;p&gt;Anyway, the HP-28C doesn't implement Forth exactly.  HP called the language &lt;a href="http://www.hpmuseum.org/rpl.htm"&gt;RPL&lt;/a&gt;.  This stands for Reverse Polish Lisp, though it looks more like Forth than Lisp.  Forth was already available.  In fact, Rockwell sold a version of their 6502 computer chip with a Forth system in ROM on the chip. The way i heard it, Rockwell was working on a version of the 6502 that would include ROM on the chip.  Engineers asked around for some code that could be tested, and one guy handed them some code. They manufactured a chip, and gave it to the guy with the code for testing.  Does it work?  Sure. What is it?  It's a Forth system.  So then they had a product with no documentation. They had an external 2 KB ROM that implemented a text editor and floppy disk system for development.  All this to say, Forth is extremely bit-efficient.&lt;br /&gt;&lt;p&gt;So, the HP-28C is something like Forth.  Close enough for what i wanted to do.  My 25 year old calculator works fine. And, it's very portable, allowing me to doodle with it while waiting for various things to happen.  One of the Wiki pages suggests that the battery door tends to break, and most of these devices are taped shut.  My battery door is intact.  I love the machine.  The keys have very nice tactile feedback, and there's a "back up a character" key that lets you edit numbers. Further, you can undo operations to find out what you did.  And I have the printer.  All this makes me gravitate towards this machine when i need to do my taxes.  There just aren't the fat-finger unreliability issues i often have with other machines.  But while i programmed the device extensively in the late 80's, i really only retained fairly simple arithmetic skills until recently. By comparison, i have &lt;a href="http://en.wikipedia.org/wiki/Psion_Organiser"&gt;another device&lt;/a&gt; from the late 80's that has a BASIC like language. After a couple decades of disuse, i found i could program it without the manual.  So, there's something about Lisp and Forth like languages that make them more difficult to read and write than strictly procedural languages. The barrier to entry is higher.  Yet, there are many who would advocate that procedural languages should be relegated to only where optimization is required.  My opinion is that this is idea is neither practical nor desirable.&lt;br /&gt;&lt;p&gt;In Forth (or RPL), one puts one or more objects (which can be any of several types, but numbers for now) onto the stack, and then one runs a function which consumes value(s), and leaves some result(s).  A function can call other functions.  I recall that one of the manuals warns against having a function call itself, or call a function that ends up calling itself - since that can result in an infinite loop.  But that's exactly what i wanted to do first. Not an infinite loop, but have a function call itself. The way it could work properly is if there was some way of terminating the recursive call somehow. RPL has IF...THEN...ELSE...END conditionals. So the first thing i did was create a recursive counting function.  It counts down to zero.  Yes, this function alway returns zero, if it works.  And usually, that wouldn't be very interesting.  But what i wanted to know was approximately how deep recursion can work on this system. I should also point out that there are two stacks in Forth.  There's a call stack where the return address of the caller goes, and there's a data stack.  In C (and many other languages), the call stack and data stack are implemented with a single structure.  It makes memory management easier - especially for local variables.  It has some disadvantages as well, though these are managed easily.&lt;br /&gt;&lt;p&gt;Two issues in typography need to be mentioned first.  The HP-28 has single characters for double less than and double greater than.  I'll use the web characters '&amp;laquo;' and '&amp;raquo;'.  These single characters start and end procedures.  If a procedure is stored in a variable - that is, if it has a name, then it is a callable function.  Like Lisp (and Scheme), you can have unnamed procedures. I don't find unnamed procedures very valuable on a hand held calculator. They have limited, but important use on bigger systems.  The other typographical note is that the HP-28 has a single character that is an '=' with a '/' through it.  It means &lt;i&gt;not equal&lt;/i&gt;, and it is represented with '&amp;#8800;'.  Finally, I show end of line comments starting with a semicolon ';'. I don't actually enter comments into the calculator. Amazingly, comments can be entered into programs. I'm not using the HP-28 convention. With that, here is the first program, which i called 'BCNT'.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; DUP IF 0 &amp;#8800; THEN  ; If not zero...&lt;br /&gt;   1 - BCNT        ; Subtract 1 and call self&lt;br /&gt;  END              ; ends the IF.  Returns 0&lt;br /&gt;&amp;raquo; 'BCNT' STO       ; end of the procedure&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt; Note that IF consumes the value on the stack. So this program starts with DUP.  This makes a copy of the value on the top of the stack.  Perhaps it retrieves the value, then pushes it twice.  The next line puts the value '1' on the stack, and issues '-', which subtracts 1 from whatever was on the stack, and puts the result back on the stack. It then calls itself.  The END is the end of the IF statement from the first line.  And that's it. Except that the key to figuring out how it works is that if the value isn't zero, it subtracts one and calls itself.  But what happens when it returns?  Nothing.  It hits the END, which ends the IF statement, but that doesn't actually do anything.  It returns from the function, carrying with it whatever value was on the stack.  But if it returned, it's always zero that's on the stack.  It's worthwhile to trace what it does for a small value, like 3.&lt;br /&gt;&lt;p&gt;After typing in the program, i typed 'BCNT, the 'enter' key, and the STO key, which binds the program the the variable named 'BCNT'. Yes, that was a single quote, then the letters B C N &amp;amp; T. The 'enter' key closed the string with a single quote.  You get used to it. To run it, type a number and the name of the function.  The machine has a USER menu where the new function name appears under a function key. So, it's really enter a number an press a single key. I'm giving detailed instructions on how to enter programs because, after decades of disuse, i'd forgotten most of it.  Should you have a functioning multiple decade old calculator to try this on, here it is.&lt;p&gt;After typing in the program, i typed 'BCNT, the 'enter' key, and the STO key, which binds the program the the variable named 'BCNT'. Yes, that was a single quote, then the letters B C N &amp;amp; T. The 'enter' key closed the string with a single quote.  You get used to it. To run it, type a number and the name of the function.  The machine has a USER menu where the new function name appears under a function key. So, it's really enter a number and press a single key. I'm giving detailed instructions on how to enter programs because, after decades of disuse, i'd forgotten most of it.  Should you have a functioning multiple decade old calculator to try this on (i've seen it in two museums), here it is.&lt;br /&gt;&lt;p&gt;Anyway, with some trial and error, i discovered that this function could count down to zero from 317. There was nothing else in memory.  The HP-28 is clearly not performing any &lt;a href="http://predelusional.blogspot.com/2008/01/scheme-for-enlightenment-part-three.html"&gt;tail recursion optimization&lt;/a&gt;.  Otherwise it could count down from any integer it could represent, given enough time.  I also timed this maximum depth count.  And it counts at 18.2 per second.  Calling and returning are fairly high overhead operations.  A simple loop counts faster.  That means that loops are faster than recursion.  That's also true in C, lisp and scheme systems i've used.  It's not a surprize.&lt;br /&gt;&lt;p&gt;This program adds 1000 to the current value on the stack, by adding 1 repeatedly.  I uses a loop. It counts at 60.75 per second. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;laquo; 1 1000 START   ; Peform 1000 loops&lt;br /&gt;    1 +          ; add 1 to the stack.&lt;br /&gt;    NEXT         ; end of the loop&lt;br /&gt;&amp;raquo; 'C' STO        ; end of the procedure&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I called it this version 'C'. Run it by typing any number and 'C' from the USER menu function key.  So far, we have functions, recursive calls (which look like any other kind of call), conditional if, and loops.  This is enough to write almost anything, given memory and time. More to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2305661338443138262?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2305661338443138262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2305661338443138262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2305661338443138262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2305661338443138262'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/05/forth-for-enlightenment-part-zero-of.html' title='Forth for Enlightenment, part zero of ten - count'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6417691550750986711</id><published>2011-04-12T14:10:00.003-04:00</published><updated>2011-04-12T14:28:53.354-04:00</updated><title type='text'>one point six million</title><content type='html'>&lt;img src="http://farm6.static.flickr.com/5310/5613450341_8c6bbaf1b2_z.jpg" align="right"&gt;Only really dramatic traffic deaths make the news.  And fender benders never make the news.  That's because they're so common. Until recently there were some 45,000 traffic deaths per year in the US. That works out to 3 per day per state. So, if they were news, you'd see them every day. Traffic deaths have gone down recently and dramatically, to only about 2 per day per state in the US. Accidents per year in the US total some &lt;a href="http://www.nytimes.com/2011/04/12/health/12brody.html"&gt;1.6 million&lt;/a&gt;.  That's pushing 90 per day per state.  With gas prices going up, maybe it's time to &lt;a href="http://www.amtrak.com/"&gt;take a train&lt;/a&gt;. As with &lt;a href="http://www.astronomy.com/en/Community/Astronomy%20Day/2011/01/National%20Astronomy%20Day%202011.aspx"&gt;Astronomy Day&lt;/a&gt;, May 7th, 2011 is &lt;a href="http://www.nationaltrainday.com/"&gt;National Train Day&lt;/a&gt;. Passenger &lt;a href="http://en.wikipedia.org/wiki/Amtrak"&gt;deaths on trains&lt;/a&gt; are news when they happen. You don't hear about them because they happen so seldom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6417691550750986711?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6417691550750986711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6417691550750986711' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6417691550750986711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6417691550750986711'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/04/one-point-six-million.html' title='one point six million'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5310/5613450341_8c6bbaf1b2_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8014584489619280862</id><published>2011-03-29T09:59:00.003-04:00</published><updated>2011-03-29T10:09:30.129-04:00</updated><title type='text'>Top Ten, 20 of 10</title><content type='html'>&lt;p&gt;We last left our &lt;a href="http://predelusional.blogspot.com/2011/03/top-ten-19-of-10.html"&gt;hero&lt;/a&gt; in the &lt;a href="http://www.andromeda.com/people/ddyer/topten.html"&gt;top ten&lt;/a&gt; list of ways to be Screwed by "C". Today's entry is &lt;b&gt;64 Bit Madness&lt;/b&gt;.&lt;br /&gt;&lt;p&gt;No example is given, just a general warning about how integers are often signed by default, and therefore do not always behave as expected when moving from 32 bit architectures to 64 bit architectures.  Since i learned C on the PDP-11, i'm predisastered. The PDP-11 is a 16 bit architecture and commonly used 16 bit integers.  C's &lt;i&gt;long&lt;/i&gt; type was 32 bits, but was not generally used for pointer arithmetic on this system.  The Vax 11/780 was a commonly accessible 32 bit computer that was contemporarily available when i learned C.  So, there was a considerable amount of code that i ported from the 32 bit VAX to the 16 bit PDP-11.  I had fewer issues moving from 16 bits to 32 bits than from 32 bits to 16.&lt;br /&gt;&lt;p&gt;The sign extension problem was not much of an issue. If there was a sign issue on the 16 bit PDP-11, it generally showed up right away.  That's because using more than 2^15 = 32,768 bytes was common on these machines.  These machines often had between a quarter of a megabyte of physical RAM and as much as four megabytes.&lt;br /&gt;&lt;p&gt;On 32 bit machines, until very recently, it wasn't very common to have more than 2 GB of RAM, which is what you need to run into sign extension problems.  However, it's already very common to have more than 4 GB of RAM on 64 bit computers.  I already have one with 8 GB.&lt;table border=1&gt;&lt;tr&gt;&lt;th align="left"&gt;Computer&lt;/th&gt;&lt;th align="left"&gt;char&lt;/th&gt;&lt;th align="left"&gt;short&lt;/th&gt;&lt;th align="left"&gt;int&lt;/th&gt;&lt;th align="left"&gt;long&lt;/th&gt;&lt;th align="left"&gt;long long&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;PDP-11 16 bits&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;n/a&lt;/td&gt;&lt;tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;32 bits&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;64 bits&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;64 bits&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Denis Ritchie's C compiler was nearly always used the the PDD-11. And the &lt;i&gt;int&lt;/i&gt; type was explicitly stated to be the &lt;i&gt;most natural&lt;/i&gt; size for the machine. For most computers, this is the width of the CPU registers.  And, for most machines, this is also the width of the program counter so that general registers could be used to compute addresses. The gcc compiler introduced the &lt;i&gt;long long&lt;/i&gt; data type.  It was a way to allow the &lt;i&gt;int&lt;/i&gt; type to remain flexible while allowing access to a new longer integer type, whose time had come.  It also had the feature of not breaking the language.  No new keywords were introduced.  Old compilers did not break on new code (though they usually did not produce what was desired).  But when 64 bit computers came out, there were two standards, often for the same hardware.  Depending on the compiler, the &lt;i&gt;int&lt;/i&gt; data type may be 32 or 64 bits in length. So, there are some C compilers which decided that the &lt;i&gt;int&lt;/i&gt; data type was not a redundant optimization type but rather had it's own type, and further, that data type is not the same size as pointers on that machine, as was historically the case.&lt;br /&gt;&lt;p&gt;So while porting C code from the PDP-11 to the 32 bit VAX was generally easy, it can be awkward to port code from one compiler to another on the same 64 bit machine.  There are workarounds.&lt;br /&gt;&lt;p&gt;Could Dennis have planned better when he designed his language?  While 64 bit integers weren't much in demand on the PDP-11, 64 bit architectures existed in hardware since 1961.  That's much older than the C language.  It wouldn't have hurt much to add 64 bit support for the PDP-11. Indeed, Unix was ported to the 1976 Cray-1 computer architecture eventually. That's well before the roughly 1969 vintage C language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8014584489619280862?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8014584489619280862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8014584489619280862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8014584489619280862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8014584489619280862'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/top-ten-20-of-10.html' title='Top Ten, 20 of 10'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-942354287891062732</id><published>2011-03-28T15:48:00.003-04:00</published><updated>2011-03-28T15:53:45.986-04:00</updated><title type='text'>Top Ten, 19 of 10</title><content type='html'>&lt;p&gt;We last left our &lt;a href="http://predelusional.blogspot.com/2008/01/top-ten-18-of-10.html"&gt;hero&lt;/a&gt; some time ago in the &lt;a href="http://www.andromeda.com/people/ddyer/topten.html"&gt;top ten&lt;/a&gt; list of ways to be Screwed by "C". I happened to be looking at the old posts, and noticed that the author has added a couple. Today's entry is &lt;b&gt;Accidental Integers&lt;/b&gt;.  The first example is:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int a = 2 &amp;&amp; 4 &amp;&amp; 8; // what is the value of "a" ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The issue here is that integers are also Booleans in the C language.  So this expression is expected to use the constant "2" as a Boolean, which is clearly not false and therefore true, perform logical &lt;i&gt;and&lt;/i&gt; with "4", which is also true, and perform a logical &lt;i&gt;and&lt;/i&gt; with "8", which is also true.  The answer is true, and the variable &lt;i&gt;a&lt;/i&gt; is set to 1. On read, integer values that are zero are false, and anything else is true.  But if the language has to pick a non zero value, it uses 1. Since this example has several constants in an expression, the compiler would evaluate these at compile time and simply assign the value of 1 to &lt;i&gt;a&lt;/i&gt;. The second example is a little curious. It's supposed to be the same.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int value = a &amp;&amp; b &amp;&amp; fn(a-&gt;x,b-&gt;x);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this example &lt;i&gt;a&lt;/i&gt; and &lt;i&gt;b&lt;/i&gt; are structure pointers, and &lt;i&gt;fn&lt;/i&gt; is a function which returns an integer.  The author wants to check to see that the structure pointers aren't NULL before calling the function, which in C is usually zero.  NULL is typically a zero cast to (void *). If you check the boolean truth value as in this code example, you are expecting the value to be compared with zero.  But also, the &amp;amp;&amp;amp; &lt;i&gt;and&lt;/i&gt; operator is a shortcut operator.  If the left hand side of the operator is false, then the right hand operator is not evaluated. So, the idea in this code fragment is if pointer &lt;i&gt;a&lt;/i&gt; isn't NULL then check if pointer &lt;i&gt;b&lt;/i&gt; isn't NULL, and if it isn't, call function &lt;i&gt;fx&lt;/i&gt; and set &lt;i&gt;value&lt;/i&gt; to the truth value of the integer returned by &lt;i&gt;fn&lt;/i&gt;. One suspects that the unexpected result is how the return value is assigned.  So this is probably what the author wanted:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int value; /* return value from fn() */&lt;br /&gt;&lt;br /&gt;if (a &amp;&amp; b) {&lt;br /&gt; value = fn(a-&gt;x, b-&gt;x);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Which is to say that the author didn't want the truth value of the function, but rather the integer value. From a stylistic point of view, i would not be tempted to compress this to&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int value; if (a &amp;&amp; b) value = fn(a-&gt;x, b-&gt;x);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;or even&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int value = (a &amp;&amp; b) ? fn(a-&gt;x, b-&gt;x);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This last is particularly odd.  It explicitly sets &lt;i&gt;value&lt;/i&gt; only if &lt;i&gt;a&lt;/i&gt; and &lt;i&gt;b&lt;/i&gt; are both non zero. I can't think of any production code that uses the question mark operator without a colon.  The question mark operator is not that commonly used as it is, but one could imagine it could be used to conditionally set a variable in this way.  Perhaps in some real life example, the variable was initialized. But in this case, it's difficult to imagine how the return that is set to &lt;i&gt;value&lt;/i&gt; is used.  Since &lt;i&gt;value&lt;/i&gt; was uninitialized, how could the code dependably know if it's the return of &lt;i&gt;fn&lt;/i&gt; or some random value?  Well, perhaps &lt;i&gt;fn&lt;/i&gt; has some side effect, such as setting a global variable that the following code could check.  It's a poor example, in my opinion.&lt;br /&gt;&lt;p&gt;The idea that NULL is zero is pervasive in C code.  However, i've worked on a machine where the NULL pointer was not, in fact, zero.  That's because this unusual 16 bit segmented architecture added byte addressability late in its development.  So pointers point at 16 bit words. They added an address bit for the even/odd bytes, though for compatibility reasons, it's not the low bit in a pointer.  And worse, the bit is set to "1" for the even numbered bytes.  So address zero has a "1" set in it somewhere.  The C compiler for this machine defined NULL correctly, but it isn't zero. Yes, there are other complications for C on this unique and special architecture. But we did get a Unix kernel to boot on it.  So the above code fragment wouldn't work on this machine.  You'd need to explicitly compare with NULL, which properly documents intent, and has no performance consequences.  It might looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int value = ((a != NULL) &amp;&amp; (b != NULL) ? fn(a-&gt;x, b-&gt;x);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It should also be noted that this topic is directly related to the second topic in this series.  That is &lt;a href="http://predelusional.blogspot.com/2007/12/top-ten-2.html"&gt;Accidental assignment/Accidental booleans&lt;/a&gt;. Use of "=" when you meant "==" is a pretty common error.  And it's true that it wouldn't happen at all if a strict Boolean type existed in C and people actually used it, and if the C language did not allow integers to be used as Booleans.  My own opinion is that in assembler language, which C compiles to, integers are used in exactly this way for Booleans.  And, it was up to the programmer to document the meanings of variables. For code size and performance, integers and Booleans are routinely mixed.  Therefore it is up to the programmer to document their variables. My own coding style is to do this near the declaration.  Most C programmers do not explicitly declare local loop variables with comments where the use is common and obvious.  But in my standards, each variable is declared on its own line so that it can be documented.  After all, this makes no difference whatsoever to the compiled code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-942354287891062732?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/942354287891062732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=942354287891062732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/942354287891062732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/942354287891062732'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/top-ten-19-of-10.html' title='Top Ten, 19 of 10'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8258353901852942761</id><published>2011-03-25T15:42:00.002-04:00</published><updated>2011-03-25T15:49:29.237-04:00</updated><title type='text'>Filters in Emacs</title><content type='html'>In the early 80's, i wrote a filter in C called 'onespc' (V7 Unix had 14 char filenames, i tended to omit vowels).  'onespc' by default would read stdin, compress groups of blank lines (with optional white space) to a single blank line, and write to stdout.  I'd use it from the command line, sometimes in scripts that changed many files.  I'd use it from Emacs on the whole buffer or regions.  'onespc' has a bunch of options to do similar things, like remove all blank lines.&lt;br /&gt;&lt;br /&gt;Emacs was sluggish starting up until the 386/33 or 486/25.  This may be ancient history, but it was more than a decade for me.  I haven't come up with a good way to use Emacs to edit hundreds of files.  My current plan is to learn elisp.  That should fix everything.  Lisp isn't easy to learn.  But i've used Lisp and &lt;a href="http://predelusional.blogspot.com/2008/01/scheme-for-enlightenment-part-zero.html"&gt;Sheme&lt;/a&gt; in the past.&lt;br /&gt;&lt;br /&gt;In the late 80's, i wanted something easier in scripts than&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for i in *.txt; do&lt;br /&gt;&amp;nbsp;onespc $i &gt; x&lt;br /&gt;&amp;nbsp;mv x $i&lt;br /&gt;done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It's not a good solution, since x might exist as a file.  So, i wrote a version of 'into'.  The syntax is&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for i in *.txt; do&lt;br /&gt;&amp;nbsp;onespc $i | into $i&lt;br /&gt;done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;So, 'into' copies stdin to a temp named file, which it determines does not exist in advance.  On EOF, it renames it to the argument, deleting the existing file if it can.&lt;br /&gt;&lt;br /&gt;I was about to publish all these utilities, but then someone publish the 'getopt' functions for command line.  I liked my least ambigous command line parser better.  I never liked the '--' standard.  I stalled.&lt;br /&gt;&lt;br /&gt;Who knows?  Maybe Emacs has a simple file mapper.  I'd like to be able to do this easily:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for i in `find . $HOME/some/other/place -type f -name \*.txt`; do&lt;br /&gt;&amp;nbsp;onespc $i | into $i&lt;br /&gt;done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;But 'find' and my filter set (including all of the *ix filters, including 'sed' and 'perl') is a pretty powerful set of flexibility to allow.&lt;br /&gt;&lt;br /&gt;Despite emacs's internal docs, 'info', 'man', and google, i can't always find docs for what i want to do just at this moment.  One learns by putting in effort.  One can always learn more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8258353901852942761?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8258353901852942761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8258353901852942761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8258353901852942761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8258353901852942761'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/filters-in-emacs.html' title='Filters in Emacs'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2040519039804607757</id><published>2011-03-14T14:41:00.001-04:00</published><updated>2011-03-14T14:43:13.791-04:00</updated><title type='text'>No Child Left Untested</title><content type='html'>&lt;p&gt;The news is that President Obama is to &lt;a href="http://www.pbs.org/newshour/rundown/2011/03/nclb.html"&gt;push an overhaul&lt;/a&gt; of the No Child Left Behind (NCLB) program. As a parent of school age children, i'd like to get rid of it.&lt;br /&gt;&lt;p&gt;From my perspective, what we need is evidence based education.  The way that would work is that we would come up with ideas on how to educate better.  The first step would be to implement them in small pilot programs.  If the new idea works better than the standards, then it would be moved to a larger pilot.  Really good programs would be expanded nation wide.  Every change implemented at large scale would have costs and benefits understood beforehand. Was there ever a pilot before introduction of No Child Left Behind (NCLB)?&lt;br /&gt;&lt;p&gt;NCLB suggests that we can't test teachers to determine their competence at teaching. I can understand that.  Testing is rarely a good test of competence.  Managers in industry mostly can't tell competent employees from dead wood.  So, the NCLB idea is to test students.  But why do we then think that testing students determines their level of compentence?  Didn't we just say that testing rarely is a good test of competence?&lt;br /&gt;&lt;p&gt;And, NCLB does not address course approach and content.  For example, teaching astronomy with english together allows students to research history, make observations, etc., and write papers about these things - graded for content and form together.  It's been shown more efficient.  And why wouldn't it be.  Students put in a little extra effort to make their papers better, but don't have to do as many.  That's more efficient for the students.  It's more efficient for the teachers.  There's no additional teacher training cost.  You use an English teacher and an Astronomy teacher.  You just use them at the same time.  Teachers alternate classroom time.  Both teachers grade papers.  This is just one of a zillion examples.&lt;br /&gt;&lt;p&gt;There are lots of cheap programs that have worked well in pilots that have not been fielded at large scales.  It's so sad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2040519039804607757?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2040519039804607757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2040519039804607757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2040519039804607757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2040519039804607757'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/no-child-left-untested.html' title='No Child Left Untested'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2051378271353073857</id><published>2011-03-10T14:43:00.001-05:00</published><updated>2011-03-10T14:43:54.912-05:00</updated><title type='text'>Kepler</title><content type='html'>&lt;img src="http://farm6.static.flickr.com/5180/5515109857_9c78d2ffe9_z.jpg" height="226" width="257" align="right"&gt;&lt;p&gt;If you look at all the colors of the light given off by a star in fine detail, you'll see lines that are characteristic of atoms and molecules that make up the star.  These lines can be compared with similar lines when the same atoms or molecules are heated in the lab back here on Earth.  So, you can tell what objects are made of anywhere in the Universe.  If an object is moving toward you, these lines move to higher frequencies - towards the blue end of the spectrum (at least in visible light).  If the object moves away, these lines move to lower frequencies - towards the red end of the spectrum.  It's similar to the way a fire truck's siren is higher pitched when it comes towards you, but falls to a lower pitch when it has passed by and moves away from you.  Looking at the detail of the colors of light is called spectroscopy.&lt;br /&gt;&lt;p&gt;The first planet discovered around a star other than the Sun was announced in 1995.  That's about 16 years ago.  Since then, 528 such planets have been discovered (a number that changes almost daily).  The method used at the time was the "wobble" method. Most of these discoveries were made using this technique. It's based on spectroscopy.  The idea is that as a planet orbits it's star, it tugs on it's star with gravity.  So the star wobbles.  With spectroscopy, the movement of the star towards or away from us can be detected.  It's not just if it's moving away or towards us, but how fast.  So, if the planet is closer to us, it tugs the star towards us.  If it's on the far side, it tugs it away.  The planet has to go around it's star at least once, but more is better.&lt;br /&gt;&lt;p&gt;Now, it's easier to detect movements of a big star if the planet is big.  And, it's easier to detect movements of a planet if the planet is closer to it's star.  That's because planets closer to the star pull on the star with more force if it's closer.  And, shorter, quicker orbits mean that you can get one or more full orbits quicker.  So, most of the planets detected this way are large - as big as Jupiter, and close in to their parent star - sometimes closer than Mercury is to the Sun.  And, it's easier if the star is smaller than the Sun.  A planet can move a small star easier than a big one.&lt;br /&gt;&lt;p&gt;What we'd like find is Earth sized planets in orbit around stars like the Sun.  That's because what we'd really like to know is if there are planets like ours.  At the moment, the only place we know of for sure with life on it is the Earth.  We'd like to know if there are other places with life.  Do aliens exist? (If they're on their own worlds, they aren't aliens - they're natives).&lt;br /&gt;&lt;p&gt;There are other ways to discover planets around other stars.  One might expect that a picture could be taken of a star at high resolution, and all the planets would show up.  Unfortunately, stars shine through their own light, and planets shine mostly through reflected light.  So, stars are something like a billion times brighter than planets.  It's like looking for a firefly next to a search light, only harder.  But it has been done.  At least twice.  This technique favors planets that are far from their host star, big, and it helps if they're very young, so they can shine in infrared light by virtue of being hot.  You have to take at least two images to show that the planet moves with the star.  Three images gives you more confidence, and can show the planet arc around in it's orbit.&lt;br /&gt;&lt;p&gt;Another way detect a planet around another star is to watch a star often, and look for a small drop in light as the planet comes in front of the star.  You have to look very often to catch it in the act. You have to have pretty good sensitivity, like a part per 50,000.  Both of these issues suggest that you need a telescope in space.  In space, you can look at the same spot on the sky 24x7.  You don't have to worry about poor weather.  And, you don't have a boiling Earth atmosphere making changes to your star's brightness every few seconds.  But there's another issue.  Most planets won't happen to pass in front of their stars from our point of view.  It's a geometry thing.  If we're looking down on the pole of the star, then we'll never see any planets come in front. And the farther the planet is from it's star, the fewer stars will be aligned close enough to get one cross in front. So, if you want to detect planets this way, you have to look at lots of stars.  This method, called the 'transit method', is used by the Kepler space craft. It's looking at the same patch of sky with a keen interest in about 150,000 stars.&lt;br /&gt;&lt;p&gt;And, the Kepler mission has 15 confirmed planet discoveries.  In February of 2011, the team announced 1,235 planet candidates.  Estimates are than perhaps 80% of these candidates will be confirmed as real planets.  That suggests that perhaps 976 new planets will have been found.  If confirmed, it more than doubles the current number of known planets.  And, this preliminary data is from when the Kepler mission has more or less just gotten started, nothing like sixteen years. Since Kepler hasn't been looking very long, the data favors planets that orbit close to their stars.  Bigger planets are easier to spot.  But planets as small as the Earth and smaller are among the candidates.  And yet, fifty four of the candidates orbit their star at a distance where liquid water might exist on the surface. These kinds of orbits are smaller for smaller stars. Five of these palnets are near the size of the Earth.&lt;br /&gt;&lt;p&gt;The Kepler mission is currently funded for an initial mission of 3 1/2 years.  That's because the goal is to find Earth-like planets in orbit around Sun-like stars.  We can tell if a star is Sun-like through spectroscopy.  We can tell if a planet is Earth-sized by the amount of dimming.  The spacecraft needs to detect three transit events to give us confidence that it's really a planet.  Three orbits of a planet in an Earth-like orbit around a Sun-like star will take three years.  You'll need a little extra to make sure you get three.  The mission could easily be extended longer.  The spacecraft doesn't run out of fuel at the 3 1/2 year mark.  It's is hoped that the data from Kepler will lead to solid statistics on how common habitable planets are in the Universe.  Or, at least, in our part of the galaxy.&lt;br /&gt;&lt;p&gt;What can we do with such statistics?  We'll, in 1961, Frank Drake proposed a simple formula for estimating how many civilizations there might be in the galaxy.  At the time, we didn't know much about what numbers to plug into the formula.  The formula has terms like "the fraction of stars with planets".  This is a number where Kepler data can help.  Better numbers help give us a better estimate.&lt;br /&gt;&lt;p&gt;We also might be able to discover not only if there might be water, but if there actually is water on these planets.  The Spitzer infrared space telescope was used to detect a variety of compounds in the atmospheres of a couple extrasolar planets.  And while it is no longer capable of this feat, it demonstrates that it can be done.  Transit data tells you when to look to pull it off.&lt;br /&gt;&lt;p&gt;The Kepler discovered planets will miss something we would really like.  And that is that none of them will be very near to the Earth.  If a planet discovered by Kepler has intelligent life on it, communication (by radio) would still take thousands of years, each way.  It's tough to hold up much of a conversation with that sort of delay.  We'd really like to find habitable planets that happen to be closer to us.  But to do that, you have to look in almost every direction at once. And, we'll likely have to use direct imaging.  That's going to require very large telescopes in space.  In principal, it can be done.  In practice, it will be expensive. But the results will definitely be exciting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2051378271353073857?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2051378271353073857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2051378271353073857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2051378271353073857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2051378271353073857'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/kepler.html' title='Kepler'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5180/5515109857_9c78d2ffe9_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5680756527732436512</id><published>2011-03-09T13:53:00.003-05:00</published><updated>2011-03-09T14:12:25.272-05:00</updated><title type='text'>Truth That Hurts</title><content type='html'>&lt;p&gt;&lt;table border=0 align="right"&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://farm6.static.flickr.com/5052/5512874806_684a6e5a8a_z.jpg" width="236" height="314" align="right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;center&gt;Edsger W. Dijkstra&lt;br&gt;&lt;i&gt;You're doing it wrong.&lt;/i&gt;&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Edsger W. Dijkstra wrote a very short classic paper, &lt;a href="http://www.cs.virginia.edu/~evans/cs655/readings/ewd498.html"&gt;How do we tell truths that might hurt?&lt;/a&gt; in 1975.  In it, he lists a number of things that he imagined computer scientists of the day thought were true "without hesitation".  They're great sound bites.  That is, they have no context. They have no explanation.  But they're delivered by someone (in this case Dijkstra) in authority.  For the record, though Dijkstra was amazing, he said a number of things that are no longer true, and/or were overly general.&lt;br /&gt;&lt;p&gt;For example, at the time, languages such as machine language, FORTran or BASIC, one of the primary control structures available was the "GO TO" command.  There was no real choice. You had to use it frequently. And it could be very difficult to follow the flow of a program when there were lots of them. You'd try to follow where things were going, but it was like following spaghetti noodles. By the 1980s, block structured languages were abundantly available.  That included C, Pascal, and even Fortran, with the 1977 standard.  Oddly, one of Dijkstra's favorite languages, Algol 60, was on it's way out.  Anyway, in 1968, he wrote an &lt;a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/EWD215.html"&gt;article&lt;/a&gt; against the Go To.&lt;br /&gt;&lt;p&gt;In the 80's, i had managers totally go crazy seeing even a single "go to" in my code.  Now, while a single "go to" could in principal be difficult to follow, when it is clearly used to exit a doubly nested loop, there's no such issue.  The spaghetti argument can't be made.  How much of a rat's nest can you make if you are limited to one loop?  My argument wasn't that he was wrong.  My argument was that by using absolute authoritarian statements, he caused as many problems in the industry as he solved.  The C language has the &lt;b&gt;break&lt;/b&gt; statement to exit a loop. But one must use "goto" to get out of two nested loops.  One of the typically ways to get the same effect is to introduce a state variable.  This has two problems. First, state variables can be just as hard to follow, or even worse than spaghetti "go to"'s.  Second, checking a run time variable increases code size and slows execution.&lt;br /&gt;&lt;p&gt;The same managers who balked at a single "go to", would scold me for daring to use recursion to solve a problem.  Really.  Recursion looks strange when you see it for the first time, but it's very powerful. If you're a programmer and don't know it, then it's something you must learn.  Get out of your comfortable space and do some growth. Dijkstra would have approved.  I haven't yet spotted a reference where Dijkstra was a big Lisp fan, but he was into proving program correctness, and Lisp was and is the language to do that in.  You can do lisp without recursion, but Lisp lends itself to recursion so much that many programs use it instead of using loops, and it's quite natural.&lt;br /&gt;&lt;p&gt;Anyway, back to the paper.  It's pretty funny.  But in his paper, &lt;i&gt;How do we tell truths that might hurt?&lt;/i&gt; he never answers the question.  It's a rant.  If you tell people that they're doing things wrong, you'll ruffle feathers.  After all, Galileo was a giant - developing the telescope, discovering all sorts of interesting things with it.  But he suffered house arrest by the Vatican for his arrogance.  Yet, it doesn't seem to occur to Dijkstra that there's only a little difference between "You're doing it wrong", and "there is a better way to do it".  And yet the difference makes all the difference. There is plenty of evidence that the Vatican was already cool with a Sun centered solar system.  It wasn't the facts so much as the way they were delivered.&lt;br /&gt;&lt;p&gt;I'm currently learning COBOL - a language i've been avoiding for decades.  It's not that it's difficult.  It's a little clunky.  But it can certainly get the job done. And in the late 70's, everyone claimed that it was on it's way out.  But forty years later, it's still going strong.  So, what did people know back then? Anyway, the paper starts by calling COBOL a disease to either fight or ignore.  Hysterical.  But, let's see how the other sound bites hold up. &lt;br /&gt;&lt;p&gt;&lt;i&gt;Programming is one of the most difficult branches of applied mathematics;  the poorer mathematicians had better remain pure mathematicians.&lt;/i&gt; I agree that programming is difficult.  I have an engineering degree. When you design a car, you reuse the same bolt design over and over. In programming, if you're doing the same thing again, you make it a subroutine and call it twice.  Ideally, there's no repetition, no repeated parts. And each of those parts works with, reacts, and counter reacts, at least potentially, with every other part in the system.  So the complexity goes up faster in programming. Now, only one in four students who start an engineering degree graduate.  And, you have to be really sharp to get enrolled.  Back in 1975, programmers came from the ranks of mathematicians.  Today, it's its own discipline.  It's not that mathematicians were poor programmers.  Programming requires unique skills.  And not everyone gets it. Not all programmers with a Computer Science degree today will meet Dijkra's standards. The standard of competence today is that the programs created work.  Dijkstra also required elegance, which leads to mainainability, sometimes performance, in addition to a sort of art appreciation.&lt;br /&gt;&lt;p&gt;&lt;i&gt;The easiest machine applications are the technical/scientific computations.&lt;/i&gt; This was likey true at the time.  Computers are good at math.  If you need to figure out how much the beam will bend under load, it's a pretty easy program to write. But these days, the simulations you need to do for a car crash aren't exactly easy. It's just that computers in 1975 weren't up to the task.  I'd say that business applications are the easiest.  That's not to say that they're trivial. &lt;br /&gt;&lt;p&gt;&lt;i&gt;The tools we use have a profound (and devious!) influence on our thinking habits, and, therefore, on our thinking abilities.&lt;/i&gt; The language you learn, be it English or whatever, has cultural prejudices embedded.  And, solving a problem in Lisp will almost always lead to a very different approach than solving it in C.   &lt;a href="http://predelusional.blogspot.com/2008/01/scheme-for-enlightenment-part-zero.html"&gt;Having done both&lt;/a&gt;, my initial guess, that one language would be better than the other at some tasks, has been validated.  So with any two languages, each will have it's strengths. I wrote both solutions, using the available language features and styles. So it's not necessarily thinking habits.  Habits can be broken.  Prejudices can be fought.  The process is the same.  Think about everything. Don't take anything for granted.  Anything less is lazy.  So, Dijkstra is right, but not in any absolute sense.  In particular, we should not all switch to Lisp, even if that is the language where it's easiest to "prove" the correctness of our programs.&lt;br /&gt;&lt;p&gt;&lt;i&gt;FORTRAN --"the infantile disorder"--, by now nearly 20 years old, is hopelessly inadequate for whatever computer application you have in mind today:  it is now too clumsy, too risky, and too expensive to use.&lt;/i&gt; FORTran, about 50 years old, has evolved.  One of the quotes going around in the 80's was &lt;i&gt;I don't know what language we'll be using in the year 2000, but it will be called FORTran&lt;/i&gt;.  It's not my favorite language.  Last i used it, it was difficult (but not strictly impossible) to write code that manipulated text symbolically.  It was great for math computations, but not great at symbolic math.  When i got to use C, which is pretty good at math, pretty good with text, and OK with symbols, i pretty much only used FORTran if i had to.  But it's still in use today.  It's just not as clumsy.&lt;br /&gt;&lt;p&gt;&lt;i&gt;PL/I --"the fatal disease"-- belongs more to the problem set than to the solution set.&lt;/i&gt; PL/I was an IBM language.  I wrote one of my very first programs in a subset of PL/I, called PL/C. I was maybe 12 or 13. It was block structured.  It seemed OK. But i didn't stress the language, so i have no idea what Dijkstra might have been on about. It couldn't have been as bad at the time as BASIC, from Dijkstra's perspective. Last i heard, PL/I was in use at IBM internally only.  It may have been abandoned by now. &lt;br /&gt;&lt;p&gt;&lt;i&gt;It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.&lt;/i&gt; Well, BASIC seemed to encourage GO TOs.  All lines were numbered, and these numbers could be used as labels for GO TO. Numbered lines made editing easier. But BASIC had &lt;i&gt;for&lt;/i&gt; loops.  And these loops added some block structure. Another issue was that all variables had global scope.  That limited the size of programs by making the complexity needlessly high.  Later versions of BASIC fixed these issues by adding real block structure, local variables for subroutines, and even recursion.&lt;br /&gt;&lt;p&gt;The real problem with BASIC wasn't that it damaged anyone.  It was that the tools it provided were &lt;i&gt;good enough&lt;/i&gt;.  And programmers that learned it, tended to write code in other languages as if those other languages were BASIC.  It was comfortable. But Bruce Lee had it right: &lt;i&gt;“There are no limits. There are plateaus, and you must not stay there; you must go beyond them. If it kills you, it kills you.”&lt;/i&gt; Bruce studied martial arts.  It's hard to imagine that learning Lisp will kill you. And, Lisp might have been what Dijkstra was thinking about as an alternative. It gave you block structure, recursion, complex data structures, and things that are difficult to imagine if all you've seen before is BASIC.  The Lisp/Algol course i took in school gave us five weeks for Lisp and two weeks for Algol.  Algol is more similar to BASIC.  Five weeks was not nearly enough for Lisp.  Two weeks was like luxury for Algol.&lt;br /&gt;&lt;p&gt;&lt;i&gt;The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence.&lt;/i&gt; I've just started with COBOL in detail. I suppose that Dijkstra would have considered this, like suicide, to have the perpetrator and the victim be the same person. So he'd likely consider it an unpardonable sin. Maybe i'd get special dispensation for learning it as my fiftieth language. But from what i've seen of COBOL, all of the complaints that Dijkstra had for BASIC and FORTran apply to COBOL.  There may be more complaints. Perhaps the idea that COBOL is so verbose is one of them.&lt;br /&gt;&lt;p&gt;&lt;i&gt;APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums.&lt;/i&gt; I haven't seen APL (A Programing Language) in decades.  Perhaps it's dead now.  It had some warts.  It required a non-ASCII character set that included the entire Greek alphabet. That made it difficult to use in an era when most computer terminals could only display UPPER CASE.  APL used single greek letters for built-in function names.  And, one would string together dozens of these letters together without spaces to form a new function.  Calling it hard to read is an understatement.  I thought of it as a write-only language.  However, it was terse. Whole programs were often a single line, and a short one at that.  And, terse can be good.&lt;br /&gt;&lt;p&gt;&lt;i&gt;The problems of business administration in general and data base management in particular are much too difficult for people that think in IBMerese, compounded with sloppy English.&lt;/i&gt; I believe Dijkstra is talking about COBOL again, though maybe with JCL - the other language i'm learning currently.  I don't think he was talking about SQL - the Standard Query Language, used by most databases today, invented at IBM.  I have issues with SQL, but i'll save that for some other rant.  Obviously, business administration has worked using COBOL.  I'll grant that other languages would have been OK too, possibly better.  But the computer scientists of the 70's turned out to be wrong on many, many fronts, when predicting the future.  Their logic was sound, generally.  It was the assumptions that were mostly wrong. Can't fault them too much for that.  Things happened in computers in the past 30 years that would have been hard to believe. So they probably wouldn't have given much thought to the ramifications.  But memory is more than a million times larger.  Disk storage is a million times larger.  Everything is 10,000 to a million times faster.  Everything is cheaper. The rules and goals have changed.  &lt;br /&gt;&lt;p&gt;&lt;i&gt;About the use of language: it is impossible to sharpen a pencil with a blunt axe. It is equally vain to try to do it with ten blunt axes instead.&lt;/i&gt; I agree with him here.  Well, he was vague enough that he could actually get away with being general.&lt;br /&gt;&lt;p&gt;&lt;i&gt;Besides a mathematical inclination, an exceptionally good mastery of one's native tongue is the most vital asset of a competent programmer.&lt;/i&gt; I'd agree if i thought that mathematical inclination was very important for computer programming.  Native language skill is paramount, to be sure.  But i know people who are very good at math that absolutely do not grasp programming concepts in any practical way.  I was pretty good at math, but i don't see that it helped me overly much.  Skills are skills.  Is there one skill that everyone will find more difficult to master than every other?  I doubt it.&lt;br /&gt;&lt;p&gt;&lt;i&gt;Many companies that have made themselves dependent on IBM-equipment (and in doing so have sold their soul to the devil) will collapse under the sheer weight of the unmastered complexity of their data processing systems.&lt;/i&gt; This simply hasn't turned out to be the case.  Perhaps all the big companies have made themselves dependent on IBM or MicroSoft, and so are on equal footing with each other.  Digital Equipment, which was a clear alternative to IBM in the 70's, is gone.  IBm is still with us. Of course Digital's demise didn't necessarily have anything to do with the quality of their technology, for good or ill.&lt;br /&gt;&lt;p&gt;&lt;i&gt;Simplicity is prerequisite for reliability.&lt;/i&gt; What is a prerequisite for reliability is program correctness and maintainability. Generally, these are achieved through simplicity.  But i've written programs that i could maintain, but had much difficulty in explaining.  They were as simple as i could make them, but that didn't turn out to be very simple.  The requirements demanded a certain minimum level of complexity.  Yet, these programs had long lifetimes. They were configurable by anyone, and that was pretty much the only maintenance required.&lt;br /&gt;&lt;p&gt;&lt;i&gt;We can found no scientific discipline, nor a hearty profession on the technical mistakes of the Department of Defense and, mainly, one computer manufacturer.&lt;/i&gt; Obviously, it was done. I agree that it was a bad idea. And, the industry has managed to move away from that model to some extent. Unix, and the open source movement have had an incredible effect on the industry.&lt;br /&gt;&lt;p&gt;&lt;i&gt;The use of anthropomorphic terminology when dealing with computing systems is a symptom of professional immaturity.&lt;/i&gt; I'm not entirely sure where Dijkstra is coming from with this.  It's certainly a mistake to talk about computers as "thinking", at least at the moment. Take the example of the chess player. Humans and computers do use some of the same logic.  But they don't get at strategy from the same perspective.  Humans do better at recognizing situations as similar to historic situations, and work with classes of problems.  Computers tend to work at the tactical level so deeply that strategy emerges. So it's different. And that's just one example. It gets worse with more complicated problems. But maybe he meant this: &lt;i&gt;So, there's a bug, and because the computer saw this datum, it came to this erroneous conclusion.&lt;/i&gt; It happens.  And Dijkstra may call it immature because that's what parents do with their infants, when no such claim could possibly be scientifically made.&lt;br /&gt;&lt;p&gt;&lt;i&gt;By claiming that they can contribute to software engineering, the soft scientists make themselves even more ridiculous. (Not less dangerous, alas!) In spite of its name, software engineering requires (cruelly) hard science for its support. &lt;/i&gt; If by soft sciences, Dijkstra includes philosophy or psychology, then i agree. Otherwise, i've no idea what he's talking about.&lt;br /&gt;&lt;p&gt;&lt;i&gt;In the good old days physicists repeated each other's experiments, just to be sure. Today they stick to FORTRAN, so that they can share each other's programs, bugs included.&lt;/i&gt; In the 1980's, when C++ was gaining momentum, the claim was that you'd write a good class (set of methods combined with a data representation), and it would simply be reused.  You were done with that problem.  And the joke was, "Now we can reuse all of our mistakes".  My good friend Karl lamented that he was rewritting his subroutine library (the equivelent of a class) for the third time, so solve some issue.  I thought version two was pretty damned good. So i told him that "all software&lt;br /&gt;needs to be rewritten".  (And in this sense, Dijkstra was right, you are doing it wrong. It can always be better in some sense.) But in the open source arena, you can use the existing code to stand on, and fix it if it's broken. And, you can contribute your fixes, so that when the next version comes out, it has your fixes, but also everyone else's. And there's open competition to have the best code to steal. Physicists still repeat each other's experiments, when at all practical. Otherwise, they examine each other's data.&lt;br /&gt;&lt;p&gt;&lt;i&gt;Projects promoting programming in "natural language" are intrinsically doomed to fail.&lt;/i&gt; I think, with the victory of IBM's Watson in the game Jeopardy, natural language is within the grasp of computers in the near future.  But Dijkstra was likely talking about COBOL, which was touted as readable by (non-technical) mangers.&lt;br /&gt;&lt;p&gt;&lt;i&gt;PS. If the conjecture "You would rather that I had not disturbed you by sending you this." is correct, you may add it to the list of uncomfortable truths.&lt;/i&gt; The current most disturbing thing i've heard is from Carl Sagan's 1980 Cosmos series.  He talks about how carbon dioxide has formed a greenhouse on Venus that keeps the surface temperatures hot enough to melt lead.  Then he goes on to say that we are engaged in a similar, but uncontrolled experiment with our own atmosphere.  Back in 1980, there wasn't much talk about it.  We're talking about it now.  Sagan didn't say anything in his series that wasn't already solid science.  That's why so much of the series is still so relevant, 30 years later.  What's most disturbing is that many are still in denial about climate change.&lt;br /&gt;&lt;p&gt;If Dijkstra wanted computer engineering to be practiced by an elite, then perhaps politics, on which our shared planetary environment depends, should be dictated by the best scientists. Just because industries of all sorts have survived with mediocre computer programming, doesn't mean that the Earth will make it.  Consider that moving to Mars isn't a solution. Moving to Antarctica is much easier.  You don't need to manufacture your own air.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5680756527732436512?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5680756527732436512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5680756527732436512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5680756527732436512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5680756527732436512'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/truth-that-hurts.html' title='Truth That Hurts'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5052/5512874806_684a6e5a8a_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7068060051596227721</id><published>2011-03-08T10:58:00.002-05:00</published><updated>2011-03-08T11:23:22.216-05:00</updated><title type='text'>Sounds Fast</title><content type='html'>&lt;p&gt;My newest Sansa mp3 player has &lt;i&gt;slow&lt;/i&gt;, &lt;i&gt;normal&lt;/i&gt;, and &lt;i&gt;fast&lt;/i&gt; modes for podcast play.  The &lt;i&gt;fast&lt;/i&gt; mode increases the rate at which sound is played back.  And the idea is clearly to get through material faster. A side effect is that the pitch of the sound is increased.  It's like playing a tape faster than it was recorded.  There are techniques for playing back a digital recording faster, without changing the pitch, but this unit isn't doing that.  There are both computational and quality advantages to the way the Sansa does it.&lt;br /&gt;&lt;p&gt;I measured the speed at which &lt;i&gt;fast&lt;/i&gt; mode plays.  It takes 80% of normal time.  So, a track which would normally take an hour will take 48 minutes.  That's a 12 minute savings. The speed is therefore 1/0.8 = 1.25 times normal.  As an aside, in marketing, people do the sale percent math inconsistently with each other, often making it difficult or impossible to predict what the final price will be.  This case might be reported as either 20% faster or 25% faster.  I'm trying not to be sloppy.&lt;br /&gt;&lt;p&gt;Some of the podcasts either have music introductions, or the show is actually about music.  So, for example, i listen to my friend Craig's &lt;a href="http://openmetalcast.com/"&gt;Open MetalCast&lt;/a&gt;. He interviews artists, but also plays tracks from their albums.  I was curious how the pitch changes for music and voices.  How would one figure this out?  It should be a case of a little math.&lt;br /&gt;&lt;p&gt;A piano keyboard is organized into octaves. Each octave going up in pitch has a frequency that is exactly twice as fast as the previous octave.  Now, you might think that there are eight notes in an octave - since the &lt;i&gt;oct&lt;/i&gt; prefix means eight. The notes are labeled A through G, which is seven notes.  The eight comes from counting the note that you start on.  So, in this case, A is counted twice.  And, indeed, there are eight. But, there are 5 black keys interspersed.  There are a total of 12 notes to an octave. You still have to count the starting note twice.  It's a fence post problem. The way to solve fence post problems is to think about each one carefully. Otherwise, you'll be off by one.&lt;br /&gt;&lt;p&gt;In the modern equal tempered scale, each half note - adacent keys on a piano, has the exact same frequency ratio as any other adjacent keys. Since there are 12 steps in an octave, and an octave gives you a factor of 2 frequency change, the ratio for a half step is the 12th root of 2, or 2^(1/12).&lt;br /&gt;&lt;p&gt;Now, remember that the speed change is a factor of 1.25.  If we want to find out how many half steps that is, we need to know how many times we must multiply the 12th root of 2 by itself to get 1.25.  So, here it is in algebra.  We just need to solve for x.&lt;br /&gt;&lt;p&gt;(2^(1/12))^x = 1.25&lt;br /&gt;&lt;p&gt;We can take the logarithm of both sides and preserve the equality.  It doesn't matter what base log you use.  Your calculator may have a base 10 logarithm funcion labeled "log", and a natural logarithm (base 2.718...) button labeled "ln".  The Windows calculator, in scientific mode (use the View menu), has these.&lt;br /&gt;&lt;p&gt;log(2^(1/12)) * x = log(1.25)&lt;br /&gt;&lt;p&gt;we can divide both sides by the constant log(2^(1/12)) and get:&lt;br /&gt;&lt;p&gt;x = log(1.25) / log(2^(1/12))&lt;br /&gt;&lt;p&gt;Plugging this into a calculator:&lt;br /&gt;&lt;p&gt;x = 3.8631371386483481744438331538727&lt;br /&gt;&lt;p&gt;This is the first thirty two digits of the answer.  I'd be very surprised if the full answer has fewer than an infinite number of decimal digits. Since i only measured the speedup to about a part per 1000 (to the second over about 17 minutes), the result should be rounded to 3 significant digits, or 3.86.  So, the speedup is more than a minor 3rd, and closer to a major third. It's not exact.  So, all music played this way will not be in an A 440 based key.&lt;br /&gt;&lt;p&gt;As an aside, the quartz crystal used to regulate how the sound is produced is likely accurate to at least nine significant digits. A part per billion.  It's quite possible that the manufacturer designed the speedup to be arbitrarily exactly 25% faster.  In that case, nine digits, or a value of 3.86313714 might be justifiable.  Or, again, who knows, the manufacturer could have wanted A 440 music to stay A 440 (but transposed), and set the speedup to be about 1.25992105 times faster (to get a major 3rd).&lt;br /&gt;&lt;p&gt;Anyway, more or less a major third.  What's interesting is how a major third changes everything.  Many voices are nearly unrecognizable.  The tonal quality of voices generally change dramatically.  There are very few spoken voices that you thought were typical deep male radio voices that you'd consider at all deep when played faster.  Many adult voices sound like children. And music vocals, singing or rap, change in character similarly.  But instrumental music usually sounds pretty normal right away, or pretty normal after a few seconds.&lt;br /&gt;&lt;p&gt;What amazes me about this is that my musical sense of pitch is quite relative, not so much absolute in nature.  I can't tell you if a piano is a half step flat, generally speaking, even if i play it.  Sometimes i'll accidently play a left hand part in the wrong octave without noticing. Yet, the character of the voice is quite apparent.&lt;br /&gt;&lt;p&gt;Another aside, when i play violin, i carefully tune each string with an electronic tuner.  If a string goes out of tune, it generally goes out of tune with respect with the other strings.  Once my brain has an absolute reference, i can get the instrument to play accurately pitched notes. There are no frets on a violin.  You have to put your fingers in the right spots to get the right pitches.&lt;br /&gt;&lt;p&gt;In the mean time, there is a little music in my podcasts.  This music, when played up a major 3rd, often sounds odd for a bit, then i get used to it. There is the odd piece that doesn't translate.  For example, Beethoven wrote the Moonlight Sonata in C# minor.  You can get a sheet music version transcribed (transposed down a half step) in C minor, which, having fewer sharps and flats, some people find easier to play. If i hear it played in C# minor, then hear it in C minor, it sounds disturbing to me.  But if my piano is consistently tuned a half step down, and there's no absolute reference, i'm totally cool with it.&lt;br /&gt;&lt;p&gt;Anyway, this is a little thing.  There's a function on my mp3 player. A curious thing, and i was curious.  Was there more to think about for this function?  Maybe.  This musing was well within my comfort zone. I just sort of rambled around and played with what appeared interesting in my most distracted ADHD sort of way. But Bruce Lee had a different idea. He said, &lt;i&gt;There are no limits. There are plateaus, and you must not stay there; you must go beyond them. If it kills you, it kills you.&lt;/i&gt; Bruce was into martial arts.  A little curiosity won't kill you, unless you're a cat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7068060051596227721?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7068060051596227721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7068060051596227721' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7068060051596227721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7068060051596227721'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/sounds-fast.html' title='Sounds Fast'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5341638793790865850</id><published>2011-03-02T13:11:00.003-05:00</published><updated>2011-03-02T13:15:04.976-05:00</updated><title type='text'>Pope: Jews not to be blamed for death of Jesus</title><content type='html'>&lt;p&gt;&lt;a href="http://www.catholicherald.co.uk/news/2011/03/02/pope%E2%80%88jewish-people-must-never-again-be-blamed-for-crucifixion/"&gt;Pope: Jewish people must never again be blamed for crucifixion&lt;/a&gt;&lt;br /&gt;&lt;p&gt;So,  Pope Benedict XVI says that Jews are not responsible for the Death of Jesus.  Must be a slow news day. The Vatican has maintained this view for decades.  But i'd heard the view as a kid and rejected it out of hand.&lt;br /&gt;&lt;p&gt;There's a passage in the Gospel of Matthew, where the Jews shout to Pilate, &lt;i&gt;Let his blood be on us and on our children.&lt;/i&gt;  For one thing, if this was said at all, these people didn't have the authority to say such a thing.  How could they?  But since Christianity didn't exist, all Christians at the time were Jews.  Further, despite the rampant ramblings of Paul, the Christian Church is founded on Peter, who taught at the synagogue.  Christianity is built upon Judaism.  Get over it.  So, if the Jews are somehow responsible for the death of Christ, so are Christians. And probably Islam. Everyone else is innocent. BTW, if i'm responsible for the death of Jesus, i'm cool with it.&lt;br /&gt;&lt;p&gt;One expects that Biblical scholars have thought about this before.  And, they probably have thought about the next puzzle.  After all, Biblical scholars should be thinking about the basest blasphemy possible, if only to strengthen the faith.  And that is, this.  Given that Jesus partakes in the divinity, he could certainly have avoided his own death. He clearly knew about its coming in advance. Scripture says he was tempted to do something about it, and chose not to. So, was Jesus responsible for his own death?  Was it assisted suicide?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5341638793790865850?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5341638793790865850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5341638793790865850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5341638793790865850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5341638793790865850'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/03/pope-jews-not-to-be-blamed-for-death-of.html' title='Pope: Jews not to be blamed for death of Jesus'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7995791418502915139</id><published>2011-02-23T15:33:00.005-05:00</published><updated>2011-02-23T15:59:34.573-05:00</updated><title type='text'>Task Master</title><content type='html'>&lt;p&gt;I've been using Windows since 3.0, even if it wasn't my first choice.  Sitting in front of Windows XP, i happened to notice something i'd not seen before.  I had a long running task - consuming CPU time.  The interactive response had become crappy, even though the machine is generally pretty capable and modern.  I brought up the task manager, and found my program in the Processes tab.  On a whim, i right clicked on my task.  A pull down menu came up.  One of the entries is &lt;b&gt;Set Priority&lt;/b&gt;.  There are six entries, &lt;b&gt;Realtime&lt;/b&gt;, &lt;b&gt;High&lt;/b&gt;, &lt;b&gt;AboveNormal&lt;/b&gt;, &lt;b&gt;Normal&lt;/b&gt;, &lt;b&gt;BelowNormal&lt;/b&gt;, and &lt;b&gt;Low&lt;/b&gt;.  There was a bullet by &lt;b&gt;Normal&lt;/b&gt;.  I set it to &lt;b&gt;BelowNormal&lt;/b&gt;.  My interactive response snapped back to reasonable.  And, the task seemed to be getting most of the wall clock time in CPU time, as i'd wanted.&lt;br /&gt;&lt;p&gt;Now, i could rant about how under Linux, or other Unix variants including MacOS, the normal priority for a CPU bound task does not, in general totally mess up interactive response.  It's just under Windows.  I could also rant about how right clicking on random data is not a particularly discoverable user interface.  It's not like my employer gives me a Windows manual to read, or the time to read it.  I can't very well right click on every little piece of data in every window.  But at the moment, the fact that there's a problem i can actually fix, and easily, is a good thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7995791418502915139?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7995791418502915139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7995791418502915139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7995791418502915139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7995791418502915139'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/02/task-master.html' title='Task Master'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8208160001492273848</id><published>2011-02-22T15:01:00.002-05:00</published><updated>2011-02-22T15:06:02.606-05:00</updated><title type='text'>Vaccination</title><content type='html'>&lt;p&gt;The &lt;a href="http://www.pharmalot.com/2011/02/supreme-court-vaccine-lawsuits-can-be-preempted/"&gt;US Supreme Court&lt;/a&gt; has ruled that vaccine lawsuits can be preempted. I'm no lawyer.  I know neither the law involved, nor the case involved.  But here's my take on it.&lt;br /&gt;&lt;p&gt;As a parent, what i want is the highest chance of a good outcome for my child. No vaccines are perfect.  None protect every child.  Often it's just 80%.  But if all children are vaccinated, then the disease has fewer places for transmission, and the all children are protected. So, vaccines protect not only my child, but all children against some dread disease. It may also harm a few, even if everything is done as well as can be done. Chances are still way better for all of the children.  Having parents opt out of a vaccination program doesn't just fail to protect their kids, it also fails to protect my child. And, we're starting to see cases of dread diseases for the first time in decades. Kids now face death at much greater numbers than they did with vaccines.&lt;br /&gt;&lt;p&gt;It's not a perfect world. But vaccines have certainly made it better.&lt;br /&gt;&lt;p&gt;I'm no lawyer, and won't comment on any particular litigation.  But as a society, we're smarter if we decide to protect ourselves.  Is it worthwhile to compensate the one in a million harmed while protecting the million?  It's a fair question. Perhaps the vaccination laws could have put in non-confrontational compensation to the few. For all i know, they did. Having been to court, i've come to this conclusion. We'd like justice, but we have the courts instead.&lt;br /&gt;&lt;p&gt;On the subject of protecting ourselves, there are diseases, like polio, where we vaccinate, but haven't had a case in the US for ages.  It costs alot to vaccinate.  But we could forego it once we've eliminated polio from the Earth, as was done for smallpox.  And we could fund such an all out attack on polio, and come out ahead in just a few years.  The economics make sense, even if we're all totally selfish bastards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8208160001492273848?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8208160001492273848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8208160001492273848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8208160001492273848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8208160001492273848'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/02/vaccination.html' title='Vaccination'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1995093345579217317</id><published>2011-02-14T12:53:00.007-05:00</published><updated>2011-02-14T14:56:56.077-05:00</updated><title type='text'>Valentine's day car</title><content type='html'>&lt;p&gt;Saw an advertisement from a car company suggesting that having a cool car loaded with features might impress your first date.  Yes, it's Valentine's Day. Of course, St. Valentine had nothing to do with sex.&lt;br /&gt;&lt;p&gt;My first date (in a car) was with a Lincoln Continental Mark iv. Quiet, smooth, electric sun roof, and with a 7.5 liter v8. The family Lincolns actually had climate control, not a silly blend door control.  We'd set the thermostat to 72 year round, and it'd turn on the a/c or heat as needed. But my date was disappointed.  She knew i had access to a real beater: an F-250 with three quarters of a ton of character. No tail gate, an electric bench seat taken from a Buick - not even bolted to the floor, AM radio, starter motor on it's last legs, and zero fear of dirt. Every ride was an adventure, with no cell phone to call for help. What more could one want?&lt;br /&gt;&lt;p&gt;And these days, my car is a stripped down 2000 Saturn.  It's a 4 door sedan with a 1.9 liter straight four, front wheel drive and 5 speed manual.  It's got 285k miles now, and has averaged over 43 MPG.  The 12 gallon tank costs $36 to fill at $3 a gallon.  Sure, it only goes 500 miles on a tank.  When the wife and i go somewhere, it's not in her much younger, more comfortable vehicle.  We keep the excitement going.&lt;br /&gt;&lt;p&gt;A &lt;a href="http://www.usatoday.com/money/autos/2011-02-14-carspoll14_ST_N.htm?loc=interstitialskip&amp;plckOnPage=2&amp;loc=interstitialskip"&gt;USA Today&lt;/a&gt; article says that the Ford Escape hybrid is $7,600 more than the Ford Escape non-hybrid.  It gets 9 more miles per gallon (MPG) - 32 MPG vs 23 MPG combined. The obvious question is how many miles before the hybrid breaks even on cost?&lt;br /&gt;&lt;p&gt;$7600 / (($3/g / 23m/g) - ($3 / 32m/g)) = 207,170 miles.&lt;br /&gt;&lt;p&gt;This assumes that maintenance for the hybrid will be zero. That's probably not true.  But it also assumes that gas will be $3 a gallon for the life of the car.  My guess is that gas will go up.  It was $4 a gallon in 2008. Math is a powerful tool, if used to inform.  But it's important to know what the math is telling you, and what it doesn't say.&lt;br /&gt;&lt;p&gt;I did this math for the Escape in 2008.  The answer was 270k miles. Gas was $4 then. My car at the time had 295k miles, so it seemed at least a possible win.  But, given that the break even cost is lower now, at least Ford is making headway towards making hybrids worthwhile economically. That's encouraging.  Hybrids make more sense for people with lots of city miles, like taxi drivers.  I drive lots of highway. I don't expect a hybrid in my near future.  Turbo diesel might be nice.&lt;br /&gt;&lt;p&gt;There's more math. If $7,600 makes such a big difference that it takes 200k miles to make it up, clearly, the purchase costs dominate. Since i didn't get a car that's bigger than i needed, i saved huge amounts up front.  And i bought it used, saving most of that. I spent less than 10% of the $23k non-hybrid Escape. And, since it's smaller, it gets better economy too. What have i spent my money on?  Well, mostly on family essentials.&lt;br /&gt;&lt;p&gt;The total dollars aren't the only concern.  There's also capability.  My current favorite new car on the market is the Fiesta.  I don't happen to know if my telescope will fit in it.  I'd like a vehicle that can tow a boat. I've got a boat. The Fiesta won't do it. One cheap way is to get an old body-on-frame car.  I've got the car.  It needs an engine.  I expect to come out ahead compared with buying a truck.  It'll get 30 MPG when not towing.&lt;br /&gt;&lt;p&gt;I remain convinced that cars are not a good investment.  It often makes sense to put money in an old car even if the resale value is lower. Invest in your own comfort. Realize that comfort is ephemeral. What's the cheapest way to get what you want for the longest time?  Buying another junk can set you up for expensive diagnostic costs. Taxes devalue other vehicles compared to yours. I'm glad that people buy new cars, though.  Please buy a new Fiesta so that in a few years when my Saturn dies at 350k miles, i can buy it from you.  I'd like the smallest engine, turbo if you can get it, with the manual transmission, please.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1995093345579217317?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1995093345579217317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1995093345579217317' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1995093345579217317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1995093345579217317'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/02/valentines-day-car.html' title='Valentine&apos;s day car'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4414562598818883756</id><published>2011-02-01T10:47:00.002-05:00</published><updated>2011-02-01T10:58:27.894-05:00</updated><title type='text'>Trader Joe's Wine</title><content type='html'>&lt;p&gt;So, i've got a head cold. Concrete in the sinuses.  I'm not on my death bed, so i'm going to work.  Last night, i got a free music track download from &lt;a href="http://www.reverbnation.com/sharonbautista"&gt;Sharon Bautista&lt;/a&gt;, called &lt;a href="http://www.myspace.com/sharonbautista/blog/541752346"&gt;Trader Joe's Wine&lt;/a&gt;. It's a preview of her new album.  I put it on my mp3 player in the morning, but waited until i was at my desk to listen to it. After all, it's noisy in the car.  By the time i got to work, i was in a kind of sour mood. Damned cold.  As i started the tune, i felt like a music critic.  Was this another song about song writing?  Almost no one can pull that off. But half way through the piece, i'd calmed down and just let it move through me.  When it seemed to be getting slow (i really doubt the tempo changed), it switched to some sort of bridge, which really does pick up. Sharon has a beautiful voice with some vocal range and variety.&lt;br /&gt;&lt;p&gt;My music biases are few. I listen to Contemporary American Folk, Classical, Indian, Industrial, Rock, Disco, Movie Soundtracks and so on, and even in shuffle mode.  Mozart next to Sister Machine Gun. Rap isn't music. I don't listen to much Country.  My rules are these:  If there are no lyrics, then the music has to do something. I would say that there must be melody and chord progression, but i've heard good atonal music that really goes somewhere. If there are lyrics, they have to be presented so the listener can hear them, and they have to have something to say. And it can't be some dead horse you're flogging.  Country often violates this.  It's "he left her", or some such tear jerker, but the same plot as the last ten songs.&lt;br /&gt;&lt;p&gt;This bit about saying something is tricky, since it's really easy to sound like you're on a soap box, preaching your personal Gospel.  Worse, my all time favorite pieces really are someone preaching their personal Gospel.  The main trick that saves these pieces for me is to show some insight.  For example, P!nk's &lt;i&gt;So What?&lt;/i&gt; is a "He left her" song, but she's already picked herself up and figured out that he's not her whole life. Sure, it hurts, but life goes on, and there's hope for the future after all, and it could be even better. Without giving away the plot, &lt;i&gt;Trader Joe's Wine&lt;/i&gt; has a situation, and presents, well, if not a full solution, then at least something that makes it suck less.  If Sharon writes her own stuff (and i think she does), then in addition to a voice, she's got serious writing talent. &lt;br /&gt;&lt;p&gt;If this track is representative of the album, then it's pure gold.  In the old days, when albums had mostly top 40 radio (which was really top 5 with a few stray tracks), i was happy if an album had only one track i liked.  In this case, i've heard one track.  And if that's the only track on the album i'll end up liking, it will still be worth it.  Even though i've already got the one track.  Perhaps i don't really have a one track mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4414562598818883756?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4414562598818883756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4414562598818883756' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4414562598818883756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4414562598818883756'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/02/trader-joes-wine.html' title='Trader Joe&apos;s Wine'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-9033615256437421514</id><published>2011-01-26T18:37:00.003-05:00</published><updated>2011-01-26T21:35:51.683-05:00</updated><title type='text'>Number seven</title><content type='html'>&lt;p&gt;&lt;img src="http://farm6.static.flickr.com/5097/5391672400_70bc1a631f_z.jpg" align="right"&gt;So, this is an empty bottle of &lt;a href="http://www.drinkarizona.com/"&gt;Arizona&lt;/a&gt; iced tea (sorry, the home page is Flash.  I really wish people wouldn't have their home page in flash.)  I bought three of them, and this is the last.  This isn't a returnable bottle.  Iced tea has no carbonation, so no deposit/return is required.  That's the way it is.  But it is plastic, and therefore can be recycled.  So, i flipped the bottle over to discover a number 7 in the triangle.  It's very hard to see.  I tried, but could not get a photo of it.  The camera refused to focus on it.  There's not much contrast.  The raised triangle and number are not raised very high and the plastic is translucent, so even lighting it from a slant angle produced no defined shadows to help in reading it.  All this to say, it's not very easy to read.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In truth, if i'd known that it was number seven, i would not have bought it.  There are two reasons.  From a convenience point of view, my curb side recycling only accepts number 1 plastic and number 2 plastic.  So, i must go quite a ways out of my way to recycle number 7 plastic.  But the other reason is more interesting.  Number 7 plastic has a rather perverse history.  The &lt;a href="http://en.wikipedia.org/wiki/Bisphenol_A"&gt;material&lt;/a&gt; was originally an attempt at making artificial female hormones, like estrogen.  It has been said that you should not refill plastic water bottles because it's unsafe.  IMO, if it is unsafe to refill, then it's unsafe to use for food in the first place.  I'd like to see the material banned, certainly for food, but probably for everything.  After all, if the material makes it to landfill, then it's likely to leach stuff we'd rather not have leached into the environment.  Short of banning it, it'd be real nice if Arizona, and other companies would simply stop using it.  After all, the stuff is potentially nasty, and what company needs to have a public relations issue on their hands.  And if a company like Arizona doesn't do their own local bottling, then they should put the ban into their contracts with their bottling partners.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I'm not particularly worried about the effects of estrogen-like compounds in my own body.  I'm an adult.  But my kid's development could be affected.  What, if any, long term research has been done?  Leave a comment if you know anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-9033615256437421514?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/9033615256437421514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=9033615256437421514' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/9033615256437421514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/9033615256437421514'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2011/01/number-seven.html' title='Number seven'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5097/5391672400_70bc1a631f_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2807475453716867116</id><published>2010-12-27T12:09:00.002-05:00</published><updated>2010-12-27T12:27:44.824-05:00</updated><title type='text'>Helicopter flight school</title><content type='html'>&lt;img src="http://farm6.static.flickr.com/5044/5297337730_7555798af6_z.jpg" align="right"&gt;Excerpt from a toy helicopter's directions: "&lt;i&gt;In if the flight does not have the impetus to change the operating lever, but the helicopter still in airborne spun, by now might adjust in your hand on remote control's vernier adjustment knob, balanced does not spin until the helicopter.&lt;/i&gt;"&lt;br /&gt;&lt;p&gt;My translation: "Fly the helicopter to a steady height with the Throttle stick. Then adjust the Vernier adjustment knob so that the helicopter does not spin left or right."&lt;br /&gt;&lt;p&gt;Note that the diagram shows the Throttle stick and the Vernier adjustment knob.&lt;br /&gt;&lt;p&gt;Note to companies: I charge $100 per hour for translations. That's real cheap. This entire manual could be fixed in under an hour.  Then your company won't be so embarrassed, and more of your customers will be able to figure out how to use their Holiday Gifts. Lowered childhood frustration might lead to world peace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2807475453716867116?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2807475453716867116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2807475453716867116' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2807475453716867116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2807475453716867116'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/12/helicopter-flight-school.html' title='Helicopter flight school'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5044/5297337730_7555798af6_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7426198451525478435</id><published>2010-12-12T11:40:00.002-05:00</published><updated>2010-12-12T12:01:46.852-05:00</updated><title type='text'></title><content type='html'>&lt;a href="http://www.npr.org/blogs/krulwich/2010/12/08/131910930/neil-armstrong-talks-about-the-first-moon-walk"&gt;Neil Armstrong&lt;/a&gt; sent Robert Krulwich, of &lt;a href="http://www.radiolab.org/"&gt;Radiolab&lt;/a&gt; on National Public Radio fame, a letter.  And he talks a bit about what he and Buzz did on the Moon in '69.  And, I agree with everything he said.  I'd love to hear Neil make an appearance on Radiolab.&lt;br /&gt;&lt;br /&gt;And, i haven't &lt;a href="http://predelusional.blogspot.com/2010/12/be-unreasonable.html"&gt;changed my opinion&lt;/a&gt; about what NASA is currently doing.  Going to the Moon was dangerous.  And worth it. As far as the space program goes, i'm not risk averse.  While one should do everything one can think of to limit risk, it's required to make progress.&lt;br /&gt;&lt;br /&gt;The Shuttle accident rate is 2%.  That's the worst of any vehicle that carried anyone into space. In my opinion, that's unwarranted risk.  Use more reliable rockets.  Further, the Shuttle program promised that it would be cheaper, through reuse of systems, than other vehicles.  But it hasn't delivered on the cost promise.  It's easily twice as expensive. Don't get me wrong - the Shuttle is amazing.  While the external booster issue that the Challenger disaster exposed seems to have been solved, the wing problem that the Columbia disaster exposed was not solved.  The program should have been terminated.  I understand that the long-canceled &lt;a href="http://en.wikipedia.org/wiki/Rockwell_X-30"&gt;National AeroSpace Plane&lt;/a&gt; did solve the wing problem.  But that's not something that could be retrofit into the Shuttle.&lt;br /&gt;&lt;br /&gt;So, the recent success that NASA has had with &lt;a href="http://www.spacex.com/"&gt;SpaceX&lt;/a&gt; is encouraging news.  I was hoping that when the &lt;a href="http://www.nasa.gov/mission_pages/constellation/main/index.html"&gt;Constellation&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Constellation_program"&gt;program&lt;/a&gt; was canceled, that something like this would emerge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7426198451525478435?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7426198451525478435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7426198451525478435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7426198451525478435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7426198451525478435'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/12/neil-armstrong-sent-robert-krulwich-of.html' title=''/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8095974787125514651</id><published>2010-12-10T22:14:00.002-05:00</published><updated>2010-12-10T22:22:25.728-05:00</updated><title type='text'>Unkillable</title><content type='html'>Over at &lt;a href="http://www.theseanachai.com/"&gt;The Seanachai&lt;/a&gt;, Patrick has a new book - &lt;a href="http://patrickemclean.com/unkillable/"&gt;Unkillable&lt;/a&gt;.  I've listened to the first seven chapters.  If you loved &lt;a href="http://www.succeedinevil.com/"&gt;How To Succeed In Evil&lt;/a&gt;, you'll love &lt;a href="http://patrickemclean.com/unkillable/"&gt;Unkillable&lt;/a&gt;.  If you haven't yet succeeded in evil, you should do yourself a favor now.  Then, do me a favor.  Send him a few bucks.  Maybe he'll write some more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8095974787125514651?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8095974787125514651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8095974787125514651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8095974787125514651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8095974787125514651'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/12/unkillable.html' title='Unkillable'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1200804769285958577</id><published>2010-12-01T10:14:00.003-05:00</published><updated>2010-12-01T10:21:12.750-05:00</updated><title type='text'>Be Unreasonable</title><content type='html'>&lt;blockquote&gt;&lt;i&gt;The reasonable man adapts himself to his environment.&lt;br /&gt;The unreasonable man adapts his environment to himself.&lt;br /&gt;Therefore, all progress is due to unreasonable men.&lt;/i&gt;&lt;/blockquote&gt;&lt;p&gt;In this case, NASA is taking the reasonable approach. If the astronauts experience bone loss, radiation damage, etc., then change their diet, give them drugs, or whatever to get them through it.&lt;br /&gt;&lt;p&gt;The unreasonable approach is to notice that astronauts do not have millions of years of evolution in near zero G conditions. So, provide them with artificial gravity. This can be achieved by spinning. Radiation shielding is expensive, but possible. 10 meters of water all around should do it. Since this weighs as much as a battleship, one should consider electrostatic and magnetic deflection as lighter and therefore cheaper alternatives. And one should test these technologies. Half a trillion dollars has been spent on the International Space Station.&lt;br /&gt;&lt;p&gt;Going to the Moon was unreasonable. Audacious aeronautical research, like the X15, was unreasonable. That's what NASA was created for. NASA is being reasonable when being unreasonable is called for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1200804769285958577?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1200804769285958577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1200804769285958577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1200804769285958577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1200804769285958577'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/12/be-unreasonable.html' title='Be Unreasonable'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6371759510338192261</id><published>2010-11-17T19:05:00.002-05:00</published><updated>2010-11-17T19:10:36.590-05:00</updated><title type='text'>Podcast file name convention</title><content type='html'>&lt;p&gt;What's in a name?  If you're publishing a podcast, the filename used makes a difference.  File names must be unique, otherwise your subscribers will overwrite older shows that they may not have listened to yet.  The file name should distinguish the show from other subscriptions the subscriber may have, much for the same issue.  So, don't use 'episode'.  Someone else may do that.  Better, is something from the name itself.  &lt;i&gt;All In The Mind&lt;/i&gt; becomes &lt;i&gt;aim&lt;/i&gt;, for example.  And this show-unique bit should come first in the name, so the subscriber, using a sorted list, can see all your shows together.&lt;br /&gt;&lt;p&gt;After the show title part of the name should come a numeric part that makes each episode unique.  One way to do that is to number them.  The first show could be '1', and the second could be '2'.  But, such numbers should have leading zeros so that in a sorted list, the lexicographic sort order also is a sequence sort order.  So, use '01', at least, so that the first nine episodes sort properly with the tenth.  It may be arrogance or optimism to use '001' or '0001' for your first show, suggesting that the expectation is over a hundred or thousand shows.  But there are plenty of shows out there with more than one hundred episodes already.  And some monthly shows are getting close.&lt;br /&gt;&lt;p&gt;Another way to do this is to encode the date.  Some shows use a 2 digit year, 2 digit month, and 2 digit day.  For example, 100823 is 2010, August 23rd.  This has the advantage that the lexicographic sorting is also the date order.  And the sequence won't break for another 90 years.  Of course, a 4 digit year such as 20100823 also sorts properly, and won't break sort order for nearly eight thousand years.  Either is fine.  But i find that the four digit year is easier for a human to read.  That is, while one hopes that it's a date, and one hopes that it's in the form of year, month, day for sorting, one must still guess that 10 is the year and not October.  Dates come in all the permutations of order, in different cultures.  IMO, the military gets it right with YYYYMMDD.  While 2010Aug23 may be easier for a human to read, it fails the sort order requirement, and is therefore unacceptable.&lt;br /&gt;&lt;p&gt;Underscores are optional in filenames.  aim100823.mp3 is OK.  But they must be consistent.  You can't use aim100823.mp3 one week and aim_100830.mp3 the next week. This error breaks the sorting order. Best to name these things with a script.  Does it matter if the file name is the recording date or publish date?  Probably not.  There should be a publishing script that gets all the RSS details right.  If there is, it could get the file name right as one of those details.&lt;br /&gt;&lt;p&gt;Speaking of underscores, are there characters that should not go into file names?  Yes.  No colons (:), no slashes (/), and no backslashes (\), because these characters are directory separators on various operating systems.  But really, one should stick to alphanumerics, hyphen (-) and underscore.  In command line environments, (parenthesis), dots (.), quotes ("'`), brackets (&amp;lt;{[]}&amp;gt;), pipes (|) and so on (~!@#$%^&amp;*+=;?)  can all be interpreted, making it difficult (but almost never impossible) to cope.  Simply avoid these.&lt;br /&gt;&lt;p&gt;After the sequence number or date, a very brief description of the show may be included.  This information can very easily be included in id3 tags within the file - and they should be there.  But one or two words will often help the subscriber.  Don't make it too long.  Windows may have long filenames but DOS does not.  And, like it or not, there are mp3 players out there that have 8.3 filenames.  So long file names show up as micros~1.mp3 on these players.&lt;br /&gt;&lt;p&gt;What can be included as text within mp3 files?  Some of the shows i listen to have complete transcripts.  It's incredible.&lt;br /&gt;&lt;p&gt;What if you got it wrong?  Should one rename old shows?  Absolutely not.  Once you've made an error, changing an old filename risks having thousands of podcasting software suites download these old shows again.&lt;br /&gt;&lt;p&gt;This podcast filename convention should also work for any other RSS published material, such as a blog.  However, for blogs, the file name length does not have to observe the 8.3 convention. Short file names have mostly gone the way of the dinosaurs.  You do use Rock Ridge extensions on your CDs, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6371759510338192261?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6371759510338192261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6371759510338192261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6371759510338192261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6371759510338192261'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/11/podcast-file-name-convention.html' title='Podcast file name convention'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3877186622242386062</id><published>2010-11-08T21:22:00.004-05:00</published><updated>2010-11-08T22:14:30.608-05:00</updated><title type='text'>Binocular spam</title><content type='html'>I got some spam by email recently.&lt;br /&gt;&lt;font color="green"&gt;&lt;blockquote&gt;&lt;br /&gt;The Optic 1050 binoculars, with up to 1000x magnification will allow you to see objects up to 35 miles away! The lightweight, rugged and durable Optic 1050 binoculars are only $19.98 and just $7.95 P&amp;H. These super lightweight binoculars easily adjust to your eyes, are shock resistant with shatterproof lenses and feature wide-angle viewing.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Plus, with each pair of binoculars you order, youll also receive the bonus Pocket Spyscope. Its less than 6 inches long with 24x magnification. Thats a $50 value, yours FREE! You just pay $4.95 to cover shipping and handling. The Pocket Spyscope is lightweight and portable. You can see objects up to 7 miles away and it doubles as a magnifying glass for close up use.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;National TV Bargains Power Binoculars...&lt;br /&gt;&lt;/blockquote&gt;&lt;/font&gt;&lt;br /&gt;Ignore the missing single quote in &lt;i&gt;youll&lt;/i&gt;.  Presumably, when they say &lt;i&gt;1050 binoculars&lt;/i&gt;, they're talking about 10x50 binoculars.  Read this as "ten by fifty".  But it's 10x - ten times larger than your eyes normally see.  The big end of the binoculars are 50 millimeters. That's about two inches.&lt;br /&gt;&lt;br /&gt;They say &lt;i&gt;up to 1000x magnification&lt;/i&gt;.  No.  They're 10 times magnification.  1000 times magnification with binoculars that have a 2 inch big end would produce a useless, grainy image.  For 1000x magnification, the big end would have to be about 20 inches across.  And that would be pushing it.  I'd really want the big end to be 40 inches across for 1000x.  That's how optics work.  Naturally, such an instrument would be more expensive, and less portable.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;will allow you to see objects up to 35 miles away!&lt;/i&gt;  How disappointing.  I've seen the Andromeda Galaxy without optical aid. That's about two and a half million light years away.  One light year is about 6 trillion miles.  So Andromeda is more than 15 quintillion miles away.  If i can only see 35 miles with these binoculars, but can see 15 quintillion miles without them, there must be something wrong with them.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;shatterproof lenses&lt;/i&gt;.  They must come from Krypton, like Superman.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;feature wide-angle viewing&lt;/i&gt;.  I suppose anything is relative.  They're likely wider angle viewing than my telescope at low power.  But they're not very wide compared to naked eye.  But notice that they don't say what they're relative to.  Nor do they give any measure of how wide an angle you can see with them.  Normally, binoculars are sold with such a reference.  It might be five degrees or seven degrees.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Pocket Spyscope. Its less than 6 inches long with 24x magnification.&lt;/i&gt;  The length isn't that important. If this Spyscope has a diameter of less than an inch, then the views through it will be grainy.  For 24x magnification, it will likely have to be two inches in diameter to be able to produce any kind of decent image.  If it's six inches long, it's unlikely to be even an inch in diameter.  This is not a $50 value.  It's so mis-designed that $5 is too much.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;You can see objects up to 7 miles away&lt;/i&gt;.  So, it's not even as good as the binoculars?  Well, that's the truth.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;doubles as a magnifying glass for close up use&lt;/i&gt;.  I think this says something about the way the optics work.  I don't think means anything good for use with distant objects.&lt;br /&gt;&lt;br /&gt;I have a pair of 10x50 binoculars.  They're really good.  However, if i want binoculars for hand held use (no tripod), then I find that 8x, or eight times magnification, is about as much as I can handle.  With more magnification, the view isn't as steady.  But I have a nice tripod.  And my 10x50 binoculars work really well on it.  I also have a small scope - much more than 6 inches long, and 2 inches in diameter.  And it can magnify to something like 24x.  But it is totally useless without a tripod.  So, my best guess is that this 24x Spyscope is useless.&lt;br /&gt;&lt;br /&gt;$19.98 + $7.95 + $4.95 = $32.88.  That's the amount you can save by reading this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3877186622242386062?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3877186622242386062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3877186622242386062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3877186622242386062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3877186622242386062'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/11/binocular-spam.html' title='Binocular spam'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8522379746682225387</id><published>2010-11-08T12:10:00.002-05:00</published><updated>2010-11-08T12:22:11.717-05:00</updated><title type='text'>Everything breaks</title><content type='html'>An odd series of failures seems to have happened all at once.  Seals on the oil pump for one car, the water pump, and now it seems, the thermostat of the other car, a printer, and the CPU fan for a computer. The phone. Having redundant hardware isn't enough.  Well, nothing lasts forever.  But the CPU fan is only maybe five months old.  I had expected better. The worst failure, though, is a long lasting cold.  Well, there's no fever.  But it's been far too long.&lt;br /&gt;&lt;br /&gt;This blog has been idle for quite a bit.  Lots going on.  There are about a dozen posts in the queue.  Just have to get time to upload them.  Also, i've pretty much abandoned my &lt;a href="http://suitti.livejournal.com/"&gt;livejournal&lt;/a&gt; blog.  The ads that livejoural have added are invasive.  I don't like my own site.  So, my astronomy stuff will start getting posted here as well in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8522379746682225387?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8522379746682225387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8522379746682225387' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8522379746682225387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8522379746682225387'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/11/everything-breaks.html' title='Everything breaks'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6648247997259529901</id><published>2010-08-05T22:25:00.002-04:00</published><updated>2010-08-05T22:39:03.596-04:00</updated><title type='text'>English as a first language</title><content type='html'>I admit it.  I &lt;i&gt;hated&lt;/i&gt; English in school.  Well, perhaps &lt;i&gt;hate&lt;/i&gt; is too strong a word.  It was more that there were other subjects that i preferred.  I don't &lt;i&gt;hate&lt;/i&gt; chocolate ice cream.  I simply prefer vanilla.  But i was talking to someone who majored in English in college the other day, and it got me thinking.&lt;br /&gt;&lt;br /&gt;So why was English less than my favorite subject?  It's probably the way grammar and spelling are taught.  The way grammar is often taught is to explain the rules of grammar, with heavy emphasis on &lt;i&gt;this is a noun&lt;/i&gt; and &lt;i&gt;all sentences have at least a noun and a verb&lt;/i&gt;.  It largely ignores the simple fact that English has no rules at all that aren't regularly broken.  By the time the average American child is ten years old, they've learned 10,000 words of vocabulary, but also 10,000 rules of grammar.  This is as large a vocabulary as adults master for most other languages. And really, &lt;i&gt;come on&lt;/i&gt;.  A rule for every word is pretty much the same as an exception for every rule.  That's like saying that there are no rules at all.  And American children don't learn these things by having to remember either the rules or the names of the rules.  They do it by usage.  And usage is how the language is defined. Really.  Dictionaries are written by examining published material. That's why congress critters and others can routinely &lt;i&gt;verb&lt;/i&gt; words.  (The word &lt;i&gt;verb&lt;/i&gt; is, of course, a noun). And, of course, learning just exactly what words are nouns, verbs, adverbs, adjectives, pronouns, prepositions, and so on, and what, exactly, the rules are for these things is roughly irrelevant to the English speaking child.&lt;br /&gt;&lt;br /&gt;Here's an example.  As a former child, i remember these, and swore i'd never torture my kids with them, should i ever have any.  As a parent, i enjoy torturing my kids with them.  There are few other perks being a parent, so one must enjoy the opportunities available.  &lt;i&gt;Johnny and me went to the park.&lt;/i&gt;  The correct phrasing is &lt;i&gt;Johnny and I went to the park.&lt;/i&gt;  Please don't explain what rule this breaks.  The correct way to teach this is as follows.  One must drop the &lt;i&gt;Johnny and&lt;/i&gt; bit and see if it still sounds right.  So, &lt;i&gt;Me went to the Park&lt;/i&gt; doesn't scan as well as &lt;i&gt;I went to the Park&lt;/i&gt;.  And yet, when i was a kid, i didn't respond even to the full grammar lesson, with what amounts to technojargon words and rules, using &lt;b&gt;what ever&lt;/b&gt; in a sing-song voice, as i routinely get now, even with my methods.  So, there are at least two things to note here. The education problem is much harder these days, now that we don't demand so much respect from kids.  And, it's likely that we're attempting to teach kids the full grammar rules before they're mentally equipped to deal with them.&lt;br /&gt;&lt;br /&gt;I did hear a &lt;i&gt;Johnny and me&lt;/i&gt; reference on the &lt;a href="http://www.planetary.org/"&gt;radio&lt;/a&gt; recently.  It was correct. Which is to say, it passed my test.  I can't remember when (if ever) i've encountered anyone doing it right.  Maybe the simpler rule is to simply always use &lt;i&gt;Johnny and I&lt;/i&gt;.  It may not always be right, but it may be right so much more often as to not make any difference.  You heard it first here.&lt;br /&gt;&lt;br /&gt;Spelling is even easier to teach.  Tell the kids to write lots of stuff, and demand that they use spelling checkers.  Have them turn off the word processor feature that corrects words as you type.  This feature doesn't teach anything.  Have the word processor mark anything it doesn't understand, and allow it to offer suggestions.  This is how i learned to spell.  Learning vocabulary words by rote was irritating. It also wasn't nearly as effective at expanding vocabulary as simply reading challenging books.&lt;br /&gt;&lt;br /&gt;This correct-as-you-type feature is pretty evil. IMCO (In My Considered Opinion), the feature should be removed from all software. It often "corrects" words that have been typed correctly.  That is, it often introduces errors.  I often use a specialized vocabulary, for computers, engineering, or some other business. I end up having to type the same word correctly half a dozen times in the course of editing. I often have to come up with unique tricks to get what i need, such as writing some longer word, and deleting bits of it to get the right spelling.  I even have to correct broken capitalizations.&lt;br /&gt;&lt;br /&gt;I went to an Engineering school.  And i work with engineers.  With few exceptions, these people are brilliant, well rounded people.  But they often have poor English skills.  They leave out articles, make references using pronouns without clearly establishing what the references are for, and so on.  And many of these people only know one language. It's often far worse when English isn't their first language.  From a strictly business point of view, one might say, who cares?  The work is getting done, right?  And these people are brilliant, right?  But poor documentation, especially unclear and ambiguous documentation can lead to needless rework and worse.  Worse is documentation that misleads.  One could call it anti-documentation.  You're actually better off without anything.  It has negative value.&lt;br /&gt;&lt;br /&gt;Now, when i went to school for engineering, there was considerable opportunity to write.  There were lab reports and other assignments.  There were requirements to do work outside of your chosen major.  Usually, these were not graded on English grammar or spelling, however.  There were projects that one needed to do in groups.  Since i had advanced computer editing, formatting and typing skills, i generally typed up the group projects. And, it was somewhat of a surprise to me that my ability to compose prose was generally superior to that of other students. After all, these kids were all off-the-wall brilliant. I completely ignore students for which English was not their first language here.  I'm talking about native English speakers.  And yet, as far as i recall, the school did not offer an English course of any kind.  But one really needs a firm understanding of English to achieve technical excellence. And technical excellence was clearly the primary goal of the school.  So, while it isn't my opinion that engineering schools need to have an English department offering and capable of granting an English degree, they should offer English courses as an option.  Otherwise, all students are stuck with whatever they happened to learn in high school.&lt;br /&gt;&lt;br /&gt;How large is your vocabulary?  It's worse than impractical to try to list all the words you know and count them.  Humans are terrible at listing things, especially when the list is long, such as when there are more than about three items.  And yet, it turns out that there is a fairly quick and simple way to find out.  Get a dictionary that brags about the number of words it contains.  Many college dictionaries boast half a million words.  Get a blank piece of paper and a pencil. A pen will do.  Make two columns, &lt;i&gt;Right&lt;/i&gt; and &lt;i&gt;Wrong&lt;/i&gt;.  Open the dictionary to a random page.  Jam your finger down the left edge without looking.  Then slowly move your finger down until a new word is exposed.  Examine the word.  Do you know what it means?  Can you use it in a sentence?  Try it.  Then read the definition.  If you were right, make a mark in the &lt;i&gt;Right&lt;/i&gt; column.  Otherwise, make a mark in the &lt;i&gt;Wrong&lt;/i&gt; column.  Do this exactly thirty times.  Now the math.  Take the total number of words in the dictionary, multiply it by the number of words you got right and divide that by thirty.  That is, multiply the total number by the fraction you got right.  That's an estimate of the number of words you know.  If you don't believe it, you can always use a larger sample than thirty, or repeat the experiment, or change dictionaries.&lt;br /&gt;&lt;br /&gt;So, my spelling is now good enough that i frequently argue with my spelling checker.  But there is a word that i always spell wrong.  Everyone has one.  For me, the word is &lt;i&gt;wrong&lt;/i&gt;, which i always spell &lt;i&gt;&lt;b&gt;w r o n g&lt;/b&gt;&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6648247997259529901?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6648247997259529901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6648247997259529901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6648247997259529901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6648247997259529901'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/08/english-as-first-language.html' title='English as a first language'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6107450617779220481</id><published>2010-08-01T12:11:00.002-04:00</published><updated>2010-08-01T12:26:16.086-04:00</updated><title type='text'>Practical hyperthreading</title><content type='html'>I recently read some inconsistent material concerning Intel's CPUs.  It had to do with hyperthreading.&lt;br /&gt;&lt;br /&gt;The idea behind hyperthreading is that you have more than one set of CPU registers (including hidden registers) so that it is very quick for the CPU to switch from one process to another. In fact, it can be done between every instruction.  That is, if there are two processes currently runable, the CPU can execute instructions from alternating processes.&lt;br /&gt;&lt;br /&gt;There are a couple of reasons one might want to do this.  One might want to have separate state for operating system kernel instructions and user level instructions. One might have separate state so that interrupt routines would run quickly.  No need to save the state, just use registers dedicated to running interrupt service routines.  This was done for Digital's PDP-10 computer back in the 1970's.&lt;br /&gt;&lt;br /&gt;But there is a problem for modern machines that's a little different.  It's the memory wall.  Eventually, the bottleneck for Von Neumen architecture CPUs is the communication of data between the CPU and main memory.  One can delay this bottleneck for awhile, and this has been done, but it will eventually come up and smack you in the face.  And these days, CPUs are much faster than main memory.  So, while the CPU may execute instructions at three billion per second, main memory takes at least several nanoseconds to respond to a request.  OK, so most memory references only go as far as the on-CPU chip cache.  These requests may be satisfied in as little as a single cycle.  But to go all the way out to main memory can take what seems like forever.  At least, forever if you're a fast CPU.  It can be over a hundred cycles.&lt;br /&gt;&lt;br /&gt;So the idea is, have more than one process running.  When an instruction is executed that fetches data from main memory, the CPU might have to wait for the result before the next instruction is executed.  However, if the CPU switches to an entirely different process, then that processes' next instruction can't be waiting for this result.  There's a better chance that it can proceed without waiting at all.  If the CPU is idle less often, then it is doing more useful work per unit time.  It's faster.  For Intel, this is usually about 20% faster.  That is, you get an extra 20% more cycles per unit time.&lt;br /&gt;&lt;br /&gt;However.  Let's say you have two processes.  Each process will get about half of the available cycles.  If the total is 120%, then each process will run at about 60% of the original speed.  Yes, that's right, the total throughput is higher, but a single processor will run a single process faster.  But consider that a single processor will run two processes at 50% each, rather than 60% each.  Still, people worried about speed often want their single process to run as fast as possible.  Can one get the best of both worlds?&lt;br /&gt;&lt;br /&gt;Yes.  Often, there is inherent parallelism available within an application.  The operating system supports something called threads.  An application can have two threads running at the same time.  Both threads have access to all the memory of the application.  And in a hyperthreading environment, both threads can contribute to the performance of the single application.  Therefore, a single application can get the speed boost offered by hyperthreading.  It requires more effort on the part of the programmer.  The result is usually more complicated, and can be more difficult to debug (get right).  But it can, and often is, done.&lt;br /&gt;&lt;br /&gt;When hyperthreading became available, i fired up a benchmark, timed a run of one copy.  Then timed a run of two copies at the same time.  Then, i went into the BIOS, turned on hyperthreading, and reran both tests.  With hyperthreading turned off, the results were 100% speed with one process, and 50% for each with two simultaneous processes.  With hyperthreading turned on, the results were 100% speed with one process and 60% for each with two processes.  There was no additional gain to be had in total bandwidth for more than two processes with my simple benchmark.  The benchmarks perform a fixed amount of work.  So by 50%, i mean that this work load takes twice as long (wall clock) to execute.  By 60% speed, i mean that this work load takes 1.66 times as long measured by the wall clock (1 / 1.66 = 0.60).  Very simple.&lt;br /&gt;&lt;br /&gt;But i started this article talking about confusion i've seen.  One of the things i've heard stated is that if you turn on hyperthreading, your speed is immediately cut in half.  This may be due to the way that the tools report your performance.  We pretty much have an idea what 100% means if there is a single CPU with no hyperthreading.  100% use means that the CPU is totally consumed.  But with hyperthreading turned on, some tools report 100% if two threads are executing the entire time.  And if only one process is running, these tools often report 50%.  However, in this later case, the CPU isn't idle.  It's getting 83% (100 / 120) as much work done as is possible with this CPU.  But this is exactly as much total work as the CPU would have done if hyperthreading were turned off.&lt;br /&gt;&lt;br /&gt;And it gets worse.  Some tools report 200% instead of 100%, as above.  That's on the same running system.  With some tools reporting 100% and others reporting 200%, it's a royal pain to compare results.  And those reporting up to 100% often end up reporting 102% from time to time.&lt;br /&gt;&lt;br /&gt;And it gets worse still. The operating system reports the CPU time that a process uses based on the runable time and the number of processes that were runable at the time.  But the performance during that time can vary by 20%.  So, CPU time doesn't measure total cycles delivered very accurately or repeatably.  Well, with demand paging, this has been true for awhile anyway.  Page replacement interrupts, TLB replacement interrupts, and even I/O interrupts all take their toll on accounting.  So, IMO, it's not that much of a loss.&lt;br /&gt;&lt;br /&gt;My new 4 core AMD Phenom II does not appear to support hyperthreading.  I wish it did.  But it still suffers a bit from poor accounting.  My operating system tools sometimes report up to 400% CPU utilization, and sometimes report up to 100% CPU utilization.&lt;br /&gt;&lt;br /&gt;And yet, there is a downside to hyperthreading.  It has to do with priority.  I often run a very long running background process, with the priority set as poor as possible.  And Unix (or Linux) will typically give this process nearly 100% of the CPU when nothing else is running.  And if there is a normal priority process running, then the background process will get 5%, with the foreground process getting 95%.&lt;br /&gt;&lt;br /&gt;But with hyperthreading turned on, two processes may run at &lt;i&gt;full speed&lt;/i&gt; because the operating system treats threads as CPUs.  Since there are two CPUs (there aren't, really), the operating system lets them both run at full speed.  That means that each process gets 60% of the single CPU speed.  That's much less than 95% for the normal priority process, and much more than 5% for the low priority process.  And there are times when i'm impatient enough to want that extra 35%.  In fact, it's been awhile, but at one time i ran a Unix variant that would give the normal priority process 100% percent, with no cycles at all going to the low priority process.  I miss those days.  They were &lt;i&gt;nice&lt;/i&gt;, or is it &lt;i&gt;not so nice&lt;/i&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6107450617779220481?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6107450617779220481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6107450617779220481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6107450617779220481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6107450617779220481'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/08/i-recently-read-some-inconsistent.html' title='Practical hyperthreading'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1611207870212291231</id><published>2010-04-07T19:31:00.003-04:00</published><updated>2010-04-07T19:39:32.337-04:00</updated><title type='text'>Of Course</title><content type='html'>I just completed a three day course at work.  That's one point of view.  The course used to be four days or five days, but now it's three days.  Same material.  It takes time for the material to sink in.  And the way that this might happen is if i read the 500+ page text book from cover to cover, and do all the exercises in the work book. And soon.  But, in principal, i know it all now.&lt;br /&gt;&lt;br /&gt;Early in the course, there was an example where there was a pin that was measured to be a certain diameter, and also, there was a hole that was measured to be the same diameter.  The question was, will the pin fit into the hole?  My response was to ask how big the hammer was allowed to be.&lt;br /&gt;&lt;br /&gt;One can, indeed, jam that much information into one's brain in such a short period of time.  However, one must be prepared to use a really big hammer.  But it's not free.  I now feel like i've been hit by a truck, and then run over by a steam roller.  We have chosen to describe the result of the incident &lt;i&gt;survival&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1611207870212291231?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1611207870212291231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1611207870212291231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1611207870212291231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1611207870212291231'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/04/of-course.html' title='Of Course'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8581481496902975828</id><published>2010-02-17T21:21:00.002-05:00</published><updated>2010-02-17T21:54:20.791-05:00</updated><title type='text'>Ipod Shuffle - Not Dead Yet</title><content type='html'>&lt;img src="http://farm3.static.flickr.com/2791/4366943622_6c73bac645.jpg" align="right"&gt;My original iPod Shuffle classic isn't dead yet.  Fortunately, the ring came off while i was at my desk, and i saw where it landed quickly.  I doubt i could get another ring.  It appears that the ring was simply glued on in such a way that the bubble buttons underneath can be pressed with it.  So, all i should have to do is glue it back on.  There are a couple protrusions on the back side of the ring that allow the ring to be aligned properly so the symbols match up.&lt;br /&gt;&lt;br /&gt;I fully expect the device to die eventually.  After all, there's a non-replaceable rechargeable battery inside. It won't last forever. And, the cover cap for the USB port doesn't have any kind of permanent connection, so one expects to lose this eventually.  It came with a second cap that has a cord attached.  I never use it.  It's around somewhere (i never throw anything out), and could be used as a spare, i suppose.&lt;br /&gt;&lt;br /&gt;I have three other mp3 players.  They all have more memory than the iPod.  From twice as much to four times as much.  And they all have more features, for example, a display so you can see what track you're listening to.  But i end up using the iPod the most.  And that's because i use it while commuting to work.  You see, since it has no display, it is designed to be operated without looking at it.  The other units are way more complex, and really can't be conveniently operated without looking at them.  I've seen an mp3 player without a display since my iPod, but by comparison, it sucks.  It's much cheaper, and for example, suffers from having too short of battery life per charge.  So my iPod may be irreplaceable.&lt;br /&gt;&lt;br /&gt;There are bugs and limitations in the iPod Shuffle.  It's not perfect.  If you miss the last bit of a track, you can't simply "rewind" into it.  And it can be quite painful to "fast forward" from the beginning, if the track is long.  And this happens often.  I listen to mostly talk shows, and have missed the final punch line of an hour show due to traffic, etc.  Another issue is that, from time to time, it fails to turn itself off.  So, the battery is dead, even though it was just charged to full.  And speaking of charging to full, all you get is a &lt;font color="green"&gt;green&lt;/font&gt;, &lt;font color="yellow"&gt;yellow&lt;/font&gt;, or &lt;font color="red"&gt;red&lt;/font&gt; light for a battery indication.  This isn't really enough to tell if you've charged it enough.  And, finally, sometimes when you pause the playback, it will turn itself off, but when it starts back up, it has forgotten where it was.  I've run into a couple other bugs, not worth mentioning.  Essentially no software is perfect.  But simpler devices tend to have fewer issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8581481496902975828?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8581481496902975828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8581481496902975828' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8581481496902975828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8581481496902975828'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2010/02/ipod-shuffle-not-dead-yet.html' title='Ipod Shuffle - Not Dead Yet'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2791/4366943622_6c73bac645_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1457662039061331149</id><published>2009-10-24T09:39:00.005-04:00</published><updated>2009-10-24T09:58:24.637-04:00</updated><title type='text'>Coupon</title><content type='html'>Here's a coupon, good for a 17% discount on all the gas you ever buy.  It's good at every gas station on Earth.  It's quite convenient. You don't have to show it to the gas station attendant. Since you keep it, you can reuse it forever.  And you can use it even if you pay at the pump with a credit card.  Did i mention that it's good for 17%?  The coupon is free.  Here it is:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2452/4038989789_f7fb8ac830.jpg" align="right" width="300"&gt;But, i'm willing to bet that you won't use it.  Here's how it works.  Here in Michigan, the speed limit is 70 MPH (112 KPH).  It's legal to drive at 62 MPH (100 KPH), but what people do is drive 75 or 80 (120 to 130 KPH), risking a speeding ticket.  But i drive at 62 MPH.  That's because there's a handy 100 KPH marking on my speedometer pointing straight up.  And, my measurements show that the difference in fuel economy between driving at 70 MPH and 62 MPH is 17%.  I ran these tests on four very different cars.&lt;br /&gt;&lt;br /&gt;But you may find that you can't do it.  There's a problem of the very worst kind.  It's psychological.  Despite the fact that in Michigan, trucks are never allowed to exceed 60 MPH, if you drive at 62, everyone passes you. I pass someone on the highway about once a month or less.  So what i mean is, everyone passes you.  And most people can't stand it. I drive my passengers crazy. You'll think that the other guy is "getting" something that you're not.  They are.  A higher gas bill.&lt;br /&gt;&lt;br /&gt;My commute is 43 miles each way. It's almost all on the highway.  If i could go 70 MPH, it would take 36.9 minutes to get to work.  And at 62 MPH, it would take 41.6 minutes.  So, 62 MPH is 4.7 minutes slower, right?  Wrong.  My record time is 56 minutes.  I think of it as an hour, or an hour and a half if traffic is bad.  But what i really mean is that traffic is always bad.  But sometimes it's horrendous.  So you might think that it takes five minutes longer, but the effect is not measurable.  Except at the gas pump.  I fill up less often, saving money and time.&lt;br /&gt;&lt;br /&gt;I trained myself to drive at 62 MPH with my previous car.  My Mazda has a cruise control.  I'd set it for 62, and sit back and relax.  I'd listen to some tunes, or a prerecorded radio show i'd downloaded from the web.  It was really nice.  I'm going slower, so i have the right of way.  Everyone who wants to go faster must go around me.  I don't have to disengage the cruise until i get where i'm going.  Well, maybe sometimes.  Like in Detroit where i have to take an exit just to stay on i75.  Or in Troy, where despite four lanes, there's not enough room for all the cars.  But now i'm trained, and that's that.&lt;br /&gt;&lt;br /&gt;You can go to the &lt;a href="http://gov.ca.gov/press-release/10435/"&gt;Governator's&lt;/a&gt; web site and learn all about &lt;a href="http://www.ecodrive.org/"&gt;Eco Driving&lt;/a&gt;.  You can buy expensive easy rolling tires and get maybe 2% fuel economy improvement.  Or, you can go a bit slower - which costs you nothing - and get 17%. The coupon never expires.  But there's no reason not to start today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1457662039061331149?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1457662039061331149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1457662039061331149' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1457662039061331149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1457662039061331149'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/10/coupont.html' title='Coupon'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2452/4038989789_f7fb8ac830_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8957613094331408479</id><published>2009-10-23T00:28:00.002-04:00</published><updated>2009-10-23T00:33:44.982-04:00</updated><title type='text'>Warranty</title><content type='html'>&lt;img src="http://farm3.static.flickr.com/2656/4036614030_74db83d238.jpg" width="400" height="333" align="right"&gt;The other day, the phone rang.  It was a sales call.  I call it phone spam.&lt;br /&gt;&lt;br /&gt;"Our records show that you do not have an extended warranty on your Saturn."&lt;br /&gt;&lt;br /&gt;Interesting.  I own a Saturn.  It is true that there is no extended warranty on it.  But I didn't buy it in Michigan.  It's never been in the shop.  So what records are these?  Either the Department of Motor Vehicles sold or gave out this information, or my insurance company did.  I have a good insurance company.  They didn't do it.  I'm liking my government less now.&lt;br /&gt;&lt;br /&gt;"How many miles do you have on your car?"&lt;br /&gt;&lt;br /&gt;I decided to tell the truth.  It turned out to be the right answer, and it would have been even if it was a lie. So i said, "Two hundred and fifty one thousand".&lt;br /&gt;&lt;br /&gt;Pause.&lt;br /&gt;&lt;br /&gt;"You aren't eligible for our extended warranty."&lt;br /&gt;&lt;br /&gt;And that was that. They won't be calling back. I have a car that is in excellent condition and which is rock solid reliable.  It gets great gas mileage, nearly 44 MPG, lifetime average.  And they won't sell me a warranty that they'd push down anyone else's throat if they could.  In the summer of 2008, it's Blue Book value went up by $2000, despite my having driven it an additional 70,000 miles.  That's because gas prices went to $4 a gallon.  Well, gas prices are going up again.  I have a car whose value is increasing with age.  It's been to the Moon (238,000), and it's showing every indication that it will make it back to Earth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8957613094331408479?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8957613094331408479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8957613094331408479' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8957613094331408479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8957613094331408479'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/10/warranty.html' title='Warranty'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2656/4036614030_74db83d238_t.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4651834741387526430</id><published>2009-09-01T17:36:00.002-04:00</published><updated>2009-09-01T17:41:55.128-04:00</updated><title type='text'>FPS games</title><content type='html'>This is a quick start guide for first person shooter games.  This isn't about any particular game. These games can be complicated, and may take a long time to master.  Go for the easy things first.  Easy things first works for learning the piano too.&lt;br /&gt;&lt;br /&gt;You can't shoot without a weapon.  You can't shoot without ammo.&lt;br /&gt;&lt;br /&gt;Aim the weapon, then fire.  Unless you have infinite ammo.&lt;br /&gt;&lt;br /&gt;You can't shoot if you're dead.  Try not to get shot.  Jump and dodge.  Weave. Move all the time.  Standing still is a good way to get killed. There is no hiding. So learn to aim while moving.&lt;br /&gt;&lt;br /&gt;Learn your weapons.  Fast/slow rate of fire.  High/low damage.  Long/short distance. Small/large area of effect. Delayed effect. High/low amount of ammo. Some weapons may have more than one mode of use. Use the right weapon in the right mode at the right time. Even if you're left handed.&lt;br /&gt;&lt;br /&gt;It's good to know where the enemy is.  It's very good to know where an enemy will be. Is the enemy moving to some obvious goal?  Conversely, don't let the enemy know where you are. If you and an enemy are moving to the same goal, consider letting them have it. Since you know where they're going, you can let them have it.&lt;br /&gt;&lt;br /&gt;The terrain can be your friend.  Get to know it.  There may be places where it's hard to see the enemy.  These may be good for you too.&lt;br /&gt;&lt;br /&gt;As you learn the game, identify skills to practice.  Aiming.  Aiming while moving.  Jump to high places.  And so on.  If there's a feature of the game, see if you can use it.  If your game has a novice mode, don't be afraid to use it, and even lose a few games practicing some skill.&lt;br /&gt;&lt;br /&gt;Have fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4651834741387526430?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4651834741387526430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4651834741387526430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4651834741387526430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4651834741387526430'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/09/fps-games.html' title='FPS games'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8645460609392391889</id><published>2009-08-29T13:08:00.002-04:00</published><updated>2009-08-29T13:15:44.428-04:00</updated><title type='text'>Headache</title><content type='html'>I don't get headaches often.  There's usually some identifiable cause.  Dehydration.  Nutrasweet (i seem to be allergic, and it causes what i call a migraine for about six hours. I say i seem to be allergic, but i've not gotten any such diagnosis. I say i call it a migraine, but how do i compare? Besides, the point is, with care (and increasing care at that), i can avoid it.  I've been about a decade now since i was last poisoned.)&lt;br /&gt;&lt;br /&gt;Well, &lt;a href="http://www.physorg.com/news170684124.html"&gt;here's an article&lt;/a&gt; that gives a reasonable overview of the subject. I doubt it's comprehensive.  I don't agree with every word in it.  I doubt an article could be written which covers everyone, since everyone is a bit different.  But on the whole it's the best i've seen in ages - perhaps ever.  And, it's out there for free.  Can't beat that with a stick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8645460609392391889?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8645460609392391889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8645460609392391889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8645460609392391889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8645460609392391889'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/08/headache.html' title='Headache'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7569921916622288217</id><published>2009-08-26T21:41:00.003-04:00</published><updated>2009-08-29T11:56:47.383-04:00</updated><title type='text'>Jack failure</title><content type='html'>&lt;img src="http://farm3.static.flickr.com/2455/3860947414_bb0d0ec75a.jpg" align="right"&gt;I thought i'd mentioned it in a previous post here, but can't find it.  When jacking up the car to do maintenance, i always put something under the car, so that if the car falls off the jack, it's easier to jack it back up, and, by the way, nothing under the car get crushed.  I'm thinking of myself, for example.&lt;br /&gt;&lt;br /&gt;Well, i was changing my oil, and while pulling hard on the oil filter wrench (usually i can just twist it off with my fingers), the car rolled back six inches, falling off of the jack (closest to the tire).  Fortunately, i had the jack stand set up.  And, it held it.  In fact, the car didn't even seem to drop any.  I say fortunately, but it's the way i work.  Always have a backup.&lt;br /&gt;&lt;br /&gt;The picture is kind of odd.  The right front tire is shown, jacked up completely off the ground.&lt;br /&gt;&lt;br /&gt;In case it's not clear, i was indeed, under the car at the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7569921916622288217?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7569921916622288217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7569921916622288217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7569921916622288217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7569921916622288217'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/08/jack-failure.html' title='Jack failure'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2455/3860947414_bb0d0ec75a_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4326087105099881836</id><published>2009-08-25T00:27:00.002-04:00</published><updated>2009-08-25T00:42:24.558-04:00</updated><title type='text'>Firefox and Thunderbird</title><content type='html'>I've used Thunderbird as my email client under Linux for quite a long time.  I recall needing a gui email client because people (probably using Windows) were sending me stuff in styled text, mostly that could easily be sent as plain text.  Anyway, it's been years.&lt;br /&gt;&lt;br /&gt;But last Saturday morning, my main home machine rebooted.  Twice.  The logs showed nary a hint why.  But afterwards, both Firefox and Thunderbird had an unacceptably small font, used for their menus and other dressings.  The size of the content was easily changed.  I'd never felt the need to change other font sizes.  And there are three font sizes that matter.  But only one had changed.  I figured at first that i'd lost some font, and that these two applications needed it.  But Google didn't seem to know where such files might be.&lt;br /&gt;&lt;br /&gt;One of the suggestions was that the file userChrome.css could be modified.  I ran "locate" to see where such a file might be.  I didn't have one.  A Ha!  But, no, it's normal not to have one.  And creating one didn't solve the problem.&lt;br /&gt;&lt;br /&gt;There were other false leads.&lt;br /&gt;&lt;br /&gt;What finally did it was to edit my /etc/X11/xorg.conf file, and in the "display" section for my nVidia card, i added the lines:&lt;br /&gt;    Option   "UseEdidDpi"   "FALSE"&lt;br /&gt;    Option   "DPI"   "100 x 100"&lt;br /&gt;&lt;br /&gt;In particular, it sets my screen resolution to 100x100 dots per inch, rather than 75 dots per inch.  And, i arrived at this result by measuring the screen, computing the resolution (in my head, despite having a computer in front of me that can perform a billion divides or so in a second).&lt;br /&gt;&lt;br /&gt;No idea why a random reboot should cause this behavior.  It'd been working for a decade at least.  No idea why only those two applications should be affected.  xorg.conf is supposed to affect everything.  No idea why there seems to be a bunch of ways to address this issue. For example, userChrome.css made no difference at all.  And, it was system wide, not user wide.  I created a new user just to test this out.&lt;br /&gt;&lt;br /&gt;I'm a Unix guru.  But the complexity and rate of change has gotten so out of hand, that even i had huge problems getting this to work.  We've totally lost focus.  The documentation is out of date.  There are multiple ways to do something, and only one works?  This isn't Unix anymore.&lt;br /&gt;&lt;br /&gt;But with this post, perhaps Goggle does know how to solve this problem now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4326087105099881836?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4326087105099881836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4326087105099881836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4326087105099881836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4326087105099881836'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/08/firefox-and-thunderbird.html' title='Firefox and Thunderbird'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4456730657287533680</id><published>2009-07-26T13:16:00.001-04:00</published><updated>2009-07-26T13:17:57.403-04:00</updated><title type='text'>Dollar Store humor</title><content type='html'>My local dollar store has the slogan:&lt;br /&gt;&lt;br /&gt;"Nothing is more than a dollar".&lt;br /&gt;&lt;br /&gt;This suggests that a dollar is less than nothing, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4456730657287533680?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4456730657287533680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4456730657287533680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4456730657287533680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4456730657287533680'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/07/dollar-store-humor.html' title='Dollar Store humor'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2759286891128820170</id><published>2009-07-06T15:56:00.001-04:00</published><updated>2009-07-06T15:57:54.951-04:00</updated><title type='text'>Alzheimer's cured in mice</title><content type='html'>"Alzheimer's disease is reversed in mice &lt;a href="http://bit.ly/CpXCU"&gt;using caffeine&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;One of the quotes from the article is this: &lt;i&gt;That's important because caffeine is a safe drug for most people.&lt;/i&gt; Note that they don't say that it doesn't have side effects.  I expect sleep disorder, arthritis, &lt;a href="http://www.nof.org/"&gt;osteoperosis&lt;/a&gt;, and addiction. Personally, i'd accept a little pain to avoid Alzheimer's.  And, for a change, i'm glad that caffeine is addictive.  If i had to take medicine for Alzheimer's, i'd be afraid that i'd forget to take it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2759286891128820170?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2759286891128820170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2759286891128820170' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2759286891128820170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2759286891128820170'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/07/alzheimers-cured-in-mice.html' title='Alzheimer&apos;s cured in mice'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3919190103514540015</id><published>2009-05-20T22:42:00.005-04:00</published><updated>2009-05-20T23:06:12.050-04:00</updated><title type='text'>The Seanachai</title><content type='html'>I've been listening to podcasts since they came out.  At first, i'd download them, cut them to CDs, and listen to them on my way to work and back.  Since that was 2+ hours of driving a day (37,000 miles a year), i could listen to quite a bit.  Much better than listening to the traffic report - which mostly told me that my last half hour was due to an accident that happened yesterday. But now i have an mp3 player.  Or maybe three of them.  And i wear headphones 24/7.&lt;br /&gt;&lt;br /&gt;Patrick E. McLean's shows started out as bite sized 5-7 minute stories with extraordinarily great production values.  Not just a good script.  Not just a good mike.  Not just good sound effects.  But the whole thing just sort of sucks you in.&lt;br /&gt;&lt;br /&gt;Now, i just put&lt;br /&gt;&lt;br /&gt;http://www.theseanachai.com/feed/podcast/&lt;br /&gt;&lt;br /&gt;into my long list of stuff to download.  And every now and then, there's this totally off the wall incredible show.  It's like Christmas.&lt;br /&gt;&lt;br /&gt;I'm not the only one who likes it.  Someone out at &lt;a href="http://www.bitstrips.com/series/18339/read.php?comic_id=191505&amp;sc=0"&gt;Bitstrips&lt;/a&gt; likes it too.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.theseanachai.com/wp-content/uploads/2009/03/siethumb100.png" align="right"&gt;But the best is yet to come.  You really have to check out &lt;a href="http://succeedinevil.com/"&gt;SucceedInEvil.com&lt;/a&gt;.  Patrick's novel is fabulous.  I'm getting it daily at &lt;a href="http://podiobooks.com/"&gt;podiobooks&lt;/a&gt;.  You can get it slower if you want.&lt;br /&gt;&lt;br /&gt;But you should hop on over to &lt;a href="http://www.theseanachai.com/products-page/"&gt;the store&lt;/a&gt; and drop $12 for a subscription.  I have no idea what you'll get.  But it's worth it if you get nothing extra.  In fact, it's too cheap by half.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3919190103514540015?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3919190103514540015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3919190103514540015' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3919190103514540015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3919190103514540015'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/05/seanachai.html' title='The Seanachai'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4021497239524306575</id><published>2009-05-14T12:12:00.002-04:00</published><updated>2009-05-14T12:22:11.142-04:00</updated><title type='text'>Job Interviews</title><content type='html'>I recently wrote an extraordinarily brief summary of why i think job interviews are uniformly awful. I do computer programming, but it applies elsewhere. Here it is.&lt;br /&gt;&lt;br /&gt;Programming is not a real time task or performance art. It's not a closed book test. Expect any such tests in interviews to fail. Worse, expect to miss great candidates because you've pissed them off, or they appeared less qualified.&lt;br /&gt;&lt;br /&gt;Programmers need to have unusual skills. They often don't need to have common skills - such as being able to conduct themselves in an interview and sell themselves. Focus on what skills you need, and be prepared to accept that skills you don't need suck. Failure to follow this rule will prevent you from hiring the best talent.&lt;br /&gt;&lt;br /&gt;Non technical managers have no way to evaluate technical candidates. IMO, they shouldn't be invited to interviews. In my experience, non-technical managers also have no way to evaluate productivity after hire. You can't do it on hours worked. And the non-technical manager doesn't have a clue how long a task should take, nor can they recognize quality (or lack of it).&lt;br /&gt;&lt;br /&gt;The right way to hire a competent technical person is to have a competent technical person interview them. And that person much conduct the Turing Test. The Turing Test was devised as a test of artificial intelligence. The idea is that you can't define or describe intelligence, but if you are intelligent, you can recognize it in a machine. It sounds silly, but it's the best we have. And it works. Where i went to school (an engineering school) only one in four entering freshmen (all totally brilliant) graduated. And there didn't seem to be any way to tell who would make it. But of the 22 guys i hung out with starting in my freshman year, one transferred to another school and got his degree there, one had to do a summer session to get his degree, and one failed to graduate when his financial aid ran out. Four went on to get masters, and two got PhDs. And it's starting to become clear that some companies end up with uniformly high quality staff, and others don't. It's the conversation that does it.&lt;br /&gt;&lt;br /&gt;Here's a sample poor conversation:&lt;br /&gt;&lt;br /&gt;Q: Why did you leave your last position?&lt;br /&gt;A: I was a contractor. The contract ended.&lt;br /&gt;Q: How about before that?&lt;br /&gt;A: I've been a contractor for twenty years. But in 1991, the company I was working for went out of business. It wasn't my fault.&lt;br /&gt;(At this point I'm already thinking about my next interview. The question shouldn't have been why i had a run of short contracts, but rather why i worked one for six years. They assume it's due to not getting along with someone - typically a manager. But i could already tell that working for this guy wasn't going to be easy.)&lt;br /&gt;&lt;br /&gt;When i was at Chrysler (and they were attempting to reduce staff), they sent out email with a list of questions you might be asked on your next interview, you know, to help you prepare. It was pages and pages of questions that you should never ask as an interviewer.&lt;br /&gt;&lt;br /&gt;I have lots more on this topic.  Perhaps i'll write a book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4021497239524306575?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4021497239524306575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4021497239524306575' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4021497239524306575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4021497239524306575'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/05/job-interviews.html' title='Job Interviews'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5738881895181161719</id><published>2009-05-13T22:50:00.002-04:00</published><updated>2009-05-13T22:52:34.052-04:00</updated><title type='text'>Abiogenesis</title><content type='html'>We're just a little closer to figuring out &lt;a href="http://www.sciencenews.org/view/generic/id/43723/title/How_RNA_got_started"&gt;how life got started&lt;/a&gt;.  It could be wrong, but it appears we're on the right track. This could be big.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5738881895181161719?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5738881895181161719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5738881895181161719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5738881895181161719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5738881895181161719'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/05/abiogenesis.html' title='Abiogenesis'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2626317147992646221</id><published>2009-04-12T13:11:00.002-04:00</published><updated>2009-04-12T13:13:46.405-04:00</updated><title type='text'>Have you run without being chased?</title><content type='html'>The craziest questions get asked on Yahoo! Answers.  I've no idea where this one was leading.  But here's where i took it.&lt;br /&gt;&lt;br /&gt;Oh sure.&lt;br /&gt;&lt;br /&gt;In Jr. High, cross country races were a mile and a half, so practices were 5 miles, every day. And they introduced the idea of "wind sprints". You'd run all out from one telephone pole to the next. Then you'd jog to the pole after that before running all out again. This jogging was described as "rest by jogging".&lt;br /&gt;&lt;br /&gt;In High School, the races were 2.5 to 3.0 miles. My own school's course was 2.7 miles, went through the woods, and over the only hill around. Practices were 10 miles every day. It takes over 500 miles of running a summer to be at all competitive. More is better.&lt;br /&gt;&lt;br /&gt;In college, the races were 5.0 miles. I was very slow. Clearly, no one was chasing me. I took nearly 25 minutes to run 5 miles. Barely under five minutes a mile. Practices were fifteen (15) miles, twice a day. That's right. 30 miles of running a day, every day. Except race days. On race days, you got to sprint for just five miles. My estimate is that i ran 2100 miles in ten weeks. That's about the distance from New York City to Salt Lake, Utah.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2626317147992646221?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2626317147992646221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2626317147992646221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2626317147992646221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2626317147992646221'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/04/have-you-run-without-being-chased.html' title='Have you run without being chased?'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6256551683131838593</id><published>2009-03-03T17:37:00.003-05:00</published><updated>2009-03-03T17:44:21.980-05:00</updated><title type='text'>Kite</title><content type='html'>About a fifteen years ago, Dawn and i were driving from Tucson to LA.  We'd just crossed the mountains.  There was a wide open and fairly level prairie.  Just this one huge tree.  A simple fence ran along the road.  There was a Bluebird on a fence post.  I pulled over, went to the trunk, pulled out the 22x60 spotting scope and set it up.  The Bluebird waited patiently for all this.  And for maybe a minute sat there to let us get a look.&lt;br /&gt;&lt;br /&gt;While Dawn was looking through the scope, the Bluebird took off and flew to the tree. In the mean time, i saw what looked like a gull flying down the mountain into the field.  I said out loud, "What's a gull doing out here?"  Dawn stood there unable to speak, and barely able to get binoculars up.  It was a Swallow-tailed Kite.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3338/3327030228_de05d3c7e1.jpg" alt="no i didn't take this shot" align="right"&gt;The kite circled the tree once, then landed in it.  Apparently, it didn't see the &lt;font color="blue"&gt;Blue&lt;/font&gt; bird.  Apparently, being bright blue doesn't mean that you get eaten whenever a hungry kite comes by.  The Bluebird didn't move.  After a bit, the kite took to the air and decided to hunt for something on the ground.  This was done by flying to what appeared to be an arbitrary spot to hover.  And by hover, i mean that it appeared that it's head was somehow locked in an invisible vice maybe 40 feet in the air.  The wings moved, other things moved, but the head did not. You could point the scope at the head.  The tripod didn't move, and neither did the head. And after a bit, the kite would suddenly make a dramatic turn, and maybe 50 feet over, it would lock it's head there.  What a show. Magnificent. After maybe twenty minutes, the kite went over the field, harassed a flock of Starlings, then flew back up and over the mountain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6256551683131838593?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6256551683131838593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6256551683131838593' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6256551683131838593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6256551683131838593'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/03/kite.html' title='Kite'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3338/3327030228_de05d3c7e1_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1024296417673788591</id><published>2009-03-01T17:56:00.003-05:00</published><updated>2009-03-01T18:34:35.322-05:00</updated><title type='text'>Screwed</title><content type='html'>My wife teaches violin.  This becomes important to this story later.  She asked me if it was possible to make longer screws into shorter screws.  "Sure", i said.  But later it wasn't so clear.&lt;br /&gt;&lt;br /&gt;In the mean time, the head board on the bed had come unglued, and the wood screws were stripped.  Apparently, it had come apart before, stripping at least two of the screws, and it was put back together with glue and screws. One of the four didn't match the others.  Clearly a substitution had been made.  Now, two were stripped, and one of those two was bent.  I did what i always do.  I looked around the house for something that might work.  In this case, it was a scrounge through my old wood screw collection.  I found two screws that were slightly larger diameter.  One was too long, and would poke through the other side of the head board.  So i got out a hack saw and unceremoniously cut it shorter.  With four screws that should work, i put it back together.  It held for a couple days.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3621/3320671374_1704a9a4cd.jpg" width="400"&gt;&lt;br /&gt;&lt;br /&gt;Clearly, what was needed was some sort of positive structure.  Countersunk wood screws weren't going to do it.  I went to the hardware store, bought four 2 inch 1/4-20 carriage bolts with nuts, for about $5.  Now, 2 inch bolts are way too long.  But the hardware store doesn't sell bolts exactly the length i need.  So, i rummaged around the house for a way to cut them to length.  I don't have a vice that will do it for me.  I have a vice, but i don't really have a work bench.  So i cobbled together this contraption.  The idea is to cut them with the hack saw.  There's a little overhang on the kitchen counter.  A scrap 2x4 that i use as a back for drilling was clamped to it to keep the saw away from the counter.  Vice grips could hold the screw.  A big C clamp i use to fix wooden chairs holds this stack together.&lt;br /&gt;&lt;br /&gt;I'm pictured here sawing with my left hand, and holding the end of the screw with my right.  I'm right handed, so this doesn't really work.  But what did work is to start sawing with my right hand on the saw, and as the screw is nearly cut through, i reach around with my left hand to keep the remaining bit of the screw straight.  There's no way to get a picture of this.  I should also note that the vice grip is clamped onto the little bit of the screw that i'm throwing out.  The vice grip totally mashes the threads.  It's very important that the final threads aren't mashed.  And that's why my right hand had to do the saw.  It's not that my right hand is oh-so-much better coordinated.  It's that despite pushups and curls carefully matched for both arms for years, my right arm is stronger.  When the saw catches, my right arm keeps moving, where my left doesn't.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3656/3320671376_5d1a2947cf.jpg" width="400"&gt;&lt;br /&gt;&lt;br /&gt;After the screw is cut, there's a jagged end to it.  I'm holding a file on the block of wood so it won't move, and moving the screw up and down the file.  This de-burrs the screw, but also makes it so a nut can thread onto the end.  And the result for the head board is that on the outside, the metal caps show.  On the inside, the bolts barely stick out from the nuts.  They have no way of sticking into the mattress.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3649/3320671366_063310e3ed.jpg" width="400"&gt;&lt;br /&gt;&lt;br /&gt;Now, you might think that all this cutting and filing will heat up the screw, and possibly even burn your hand.  Iron conducts heat quickly, right?  But stainless steel does not.  And oddly, i didn't learn this in Materials Science in school.  I learned it from my brother the welder.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3578/3320671390_5eab73accf.jpg" width="400"&gt;&lt;br /&gt;&lt;br /&gt;Back to the violin teacher.  She gave me a bag of screws, with one dark one.  "Could you cut these screws down to the length of the dark one?"  So i used the contraption from the head board job.  And now there's a bag of smaller screws.  But an hour's worth of work was able to take a cheap bag of screws and make them into the custom screws that were desired.  They're low quality because they're not very uniform.  The heads are a little different than the master.  The lengths are a little shorter or a little longer.  But they may be good enough.  And who knows where one might get the &lt;a href="http://en.wikipedia.org/wiki/The_Real_McCoy"&gt;real McCoy&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3627/3320671394_33a89bdaac.jpg" width="400"&gt;&lt;br /&gt;&lt;br /&gt;But good enough for what?  These are tuning screws.  You screw them down, and they push a lever, which pulls on the violin string.  There are tuning pegs that hold the other end of each string.  And you use them to get the pitch of the string close.  But they're not good enough to get the vibration frequency close enough.  The tuning screws are what you use to get the frequency to that last few cents (hundredths of a half tone).  And this exercise is all about having the sense to save a few cents.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3635/3320671400_ef9a0ece1b.jpg" width="400"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1024296417673788591?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1024296417673788591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1024296417673788591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1024296417673788591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1024296417673788591'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/03/screwed.html' title='Screwed'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3621/3320671374_1704a9a4cd_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4991678015400233569</id><published>2009-02-11T13:49:00.006-05:00</published><updated>2009-02-11T14:32:38.421-05:00</updated><title type='text'>Downy</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3350/3271807349_79e02b123e.jpg" align="left" width="400"&gt;&lt;br /&gt;I was sitting in my living room, and happened to see a bird that wasn't one i see every day out the window.  I've not done much birding of late, but i picked up a handy pair of binoculars and looked.  It's clearly a female Downy Woodpecker.  And she went up and down the two crab apple trees in the median that divides my street.  I went back upstairs and got the tripod.  Then i went back up and got the camera.  I took 187 pictures by holding the point and shoot camera to one eyepiece of the 10x50 binoculars, while sitting in my living room.  So, i'm taking shots through the window glass.  Usually, that's such a bad idea. Window glass is not what opticians call optic quality.  There are all sorts of defects, which give you distortion.  And you can get glare.  And, the camera may attempt to focus on it. But the camera usually focused on branches if the shot was out of focus. Here's one of them.&lt;img src="http://farm4.static.flickr.com/3502/3271807335_b468ddd770.jpg" align="left" width="400"&gt;&lt;br /&gt;You can tell that she's a female.  The male has this unmistakable red spot on the back of his head.  The view directly through the binoculars is much better than this picture.  The detail is better.  The color depth is better.  The focus is way better.  You're seeing the bird in this shot, dot for dot, cropped from the much bigger original image. All other shots are cropped and scaled smaller. This blog is only 400 pixels wide. You might think this shot was taken in the woods.  But the background is in fact the neighbor's house. This is clear in the uncropped original shot. So you think you can't get wilderness shots here, but apparently, you can. She put on a great show, and i got this other shot.&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3489/3271807337_67356f87c7.jpg" align="left"&gt;&lt;br /&gt;This is at the top of the tree, with the gray sky behind her.  She paused a bit, then flew to the other tree, where she then continued to put on a great show.  Of course, that's my perspective.  She was just looking for things to eat. She kept poking at the tree, though never seemed to do it any damage.  It was an hour.  She left after combing both trees.  I hope she got something out of it.  Maybe she'll come back.  But she wasn't interested in the leftover fruit still hanging from the tree.  The cardinals and squirrels eat it, and when there's snow on the ground, so do the robins.  And there was a robin out too.&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3318/3271807341_ab0c6fcb13.jpg" align="left"&gt;&lt;br /&gt;You can tell he's a male American Robin.  His head is darker than the back and wings.  The female would have the head the same shade as the back and wings.  And he was digging in the dirt under this bush.  He came out into the sunshine only a couple times.  He'd hop up completely into the bush when someone would walk by, especially with a dog.  Often the robins are wary but hang out in the middle of the lawn. The snow was melting, but the ground was probably still frozen.  Robins around here migrate south if they can't find anything to eat.  Many stay all year round.&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3317/3271807345_9bd7aa2b24.jpg" align="left"&gt;&lt;br /&gt;I'm guessing that this is a female House Sparrow.  I didn't snap this shot of her, per se.  She appeared in this shot with the robin.  I didn't see her through the binoculars with my eyeballs at all. Examination of all these shots reveals a bird nest i'd never noticed as well. European House Sparrows are not sparrows at all.  Genetically, they're finches.  They have that short finch like beak. But it's too late to rename it a House Finch.  We already have a bird called a House Finch. House Sparrows are incredibly common around here. This one also seemed to be uncharacteristically shy.  Didn't care one way or the other about the robin.  Just unusually skittish.  She didn't stay long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4991678015400233569?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4991678015400233569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4991678015400233569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4991678015400233569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4991678015400233569'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/02/downy.html' title='Downy'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3350/3271807349_79e02b123e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1032285004384221284</id><published>2009-02-10T15:38:00.002-05:00</published><updated>2009-02-10T15:54:03.365-05:00</updated><title type='text'>Sign this form</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3426/3270366598_75404e4c11.jpg" align="left"&gt;&lt;br /&gt;Instead of fax, a recruiter sent me a Word doc form to print, sign, scan and send.  Easy. The way it should have been decades ago.  I've been waiting a long time for this.  Oh, sure, MS Word isn't an open standard, but &lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt; reads it just fine.&lt;br /&gt;&lt;br /&gt;But first, my &lt;a href="http://www.epson.com/cgi-bin/Store/support/supDetail.jsp?oid=14363"&gt;printer&lt;/a&gt;'s black ink sprays everywhere. The company logo was blue.  It came out fine. So, blue works fine. So i set the font to blue, to get clean output. Printed it and signed it.&lt;br /&gt;&lt;br /&gt;My scanner wasn't working. It's not new, i've had it for a decade or so. It's a &lt;a href="http://www.umax.com/support/knowledge/specifications.jsp?model=Astra+1200S"&gt;UMAX Astra 1200S&lt;/a&gt;. I had to clear junk off of it, plug it in (the wall wart died years ago, so it gets very clean 12 volt DC power from the computer, so it's been on all this time.  I needed to plug it into the SCSI interface), install a driver (well, user level &lt;a href="http://www.sane-project.org/man/scanimage.1.html"&gt;scanning software&lt;/a&gt;), reboot, and tell my scripts where it is.&lt;br /&gt;&lt;br /&gt;Then, after the scan, i converted it to black &amp; white, increased the contrast to darken it, then converted it to jpeg for email. Piece of cake.&lt;br /&gt;&lt;br /&gt;So, now i have a working scanner, right?  Well, after i find a place for all that junk. I can't just throw it all out.  Some of it is stuff i'm supposed to scan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1032285004384221284?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1032285004384221284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1032285004384221284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1032285004384221284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1032285004384221284'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/02/sign-this-form.html' title='Sign this form'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3426/3270366598_75404e4c11_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7341060216540720444</id><published>2009-02-09T19:37:00.001-05:00</published><updated>2009-02-09T19:39:22.545-05:00</updated><title type='text'>Valentine's day</title><content type='html'>The official joke for February is as follows:&lt;br /&gt;&lt;br /&gt;Two antenna met on a roof top.  (That's where they hang out.)&lt;br /&gt;&lt;br /&gt;And they fell in love.&lt;br /&gt;&lt;br /&gt;And they got married!&lt;br /&gt;&lt;br /&gt;...Well, the wedding, frankly, wasn't very good.&lt;br /&gt;&lt;br /&gt;But the reception was excellent!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7341060216540720444?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7341060216540720444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7341060216540720444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7341060216540720444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7341060216540720444'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/02/valentines-day.html' title='Valentine&apos;s day'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7040106210260008510</id><published>2009-02-03T21:44:00.005-05:00</published><updated>2009-02-04T20:02:20.089-05:00</updated><title type='text'>Plugs</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3397/3254632456_3c1a77c280.jpg" align="center"&gt;&lt;br /&gt;&lt;br /&gt;I changed the plugs and wires on this 1999 Subaru Forester.  These are the tools i needed for this delicate job. Yes, that's a hammer next to the very long scissors on the right. The box in the middle had the new wires. The new wires are now on the car.  The old wires are to the right of the box. The new spark plug boxes are red, and are to the upper right by the white phone. The bright orange handle belongs to my newest favorite tool. It's got a flexible shaft, and a very strong magnet at the end.  My previous big job, changing the battery in my 2000 Saturn (pictured to the left), netted me some very expensive metric ratchets.  One ratchet covers 8, 9, 10 and 12 mm bolts.  And it came in handy for this job on the battery and the windshield washer reservoir.  Very slick. I have an engineering degree.  I would not have signed off on this design.  These are spark plugs. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3455/3254628886_be5255e14f.jpg" align="center"&gt;&lt;br /&gt;&lt;br /&gt;This is the passenger side of the engine.  The thing with the robot arm is a spark plug wire.  There are two on each side. So the other one on this side is behind, and difficult to spot. And they come directly out of the side of the engine.  In fact, this 4 cylinder engine has the cylinders horizontal, facing away from each other.  I'd call it a "flat four".  It sounds good, but nobody seems to know if it's a real name or not.&lt;br /&gt;&lt;br /&gt;It's hard to see in the picture, but the robot arm ends in this big black knob.  If you pull on the knob, this long tube thing comes out of the engine. It's flexible and comes right out.  It's maybe 6 or 7 inches long.  No plug. Where's the spark plug?  There's no room to put anything else into the hole. &lt;br /&gt;&lt;br /&gt;That thing to the left marked "Subaru" is the air filter.  To get at the plugs on this side, you have to remove the air filter.  No problem.  Two clips and it's off.  Well, the cover is off.  You remove the filter, which is brand new.  Then you can see the two bolts that hold it down.  I used a socket wrench and the 3/8" socket.  Why it has an English bolt is pretty much beyond me.  Most everything else is metric.  Pop these two bolts out, and the whole air filter is out.  Then you can get at the plugs, right?&lt;br /&gt;&lt;br /&gt;So you put your 3/8" spark plug socket into the hole...  where it disappears forever.  You can't get your finger into the hole to get it out.  So you run to the internet for instructions.  You discover that you need some long needle nose pliers with a bend, you need a strong magnet on a stick, you need a 3" socket extender (have one), you need a 1 1/2" socket extender (never heard of one), you need a ratchet wrench that has a hinge by the head so it can flop around, and so on.  The guys at the auto parts stores have never heard of a 1 1/2" socket extender.  So you go to a dedicated tool store, and pick up a set of extenders, that happens to include one.  It also has a 3".  It turns out you need two 3" extenders and the 1 1/2" extender.  The magnet on the flexible arm has the bright orange handle.  Very cool.  Dropped tools and bolts can be fished out without having to duck under the car, and without having to see where they fell. Even the heaviest of tools can be picked up off the driveway without bending over. The bright orange handle is hard to miss in the clutter of the engine. Amazing. I'll be using it again.&lt;br /&gt;&lt;br /&gt;So, you fish out the socket.  When it's most of the way into the hole, you add a 3" extender to it.  You fish that most of the way into the hole and add the 1 1/2" extender.  You fish that almost all the way into the hole and add your new flexible ratchet wrench.  And you feel the socket latch onto something.  You assume it's a spark plug, and unscrew it.  It comes out.  And you disassemble the train of extenders and stuff as you remove it.  Use the nifty magnet to pull out a spark plug if you need to.&lt;br /&gt;&lt;br /&gt;The driver's side plugs required that you first remove the battery and the windshield washer reservoir.  The batter is two small corroded bolts on the hold down clamp, and each terminal had a bolt to remove.  The plus (+) side has so much corrosion that you wonder why it still works.  But there's a bolt a bit away that's easy to remove, and disconnects everything.  And the windshiled washer reservoir comes off with two easy bolts.  Don't have to disconnect the tubes and wires, just set it out of the way.  Then the two spark plugs come out as before, only you use a second 3" extender instead of the 1 1/2".  It has to do with how much room you have.&lt;br /&gt;&lt;br /&gt;It may be hard to see, but there's a hammer, and a large pair of scissors.  I used them both.  The robot cover on the new spark plug wires was longer than the original, and needed to be cut.  The hammer was needed for some chiseling near one of the battery terminals to see the nut that you don't need to remove.  That's corrosion you're chiseling.&lt;br /&gt;&lt;br /&gt;The car has 173,000 miles, and belongs to my wife.  The plugs were not corroded.  They were not fouled with oil.  They were not covered in carbon. They were just worn down.  Instead of a 0.045 gap, they had twice that.  The center stub was nearly gone. Every evidence is that they'd never been changed before.  The car was running rough, especially at highway speed, and now purrs like a kitten.  Well, a kitten that can cruise at 70 MPH down the highway for hours.&lt;br /&gt;&lt;br /&gt;My wife's mechanic quoted $383.  $93 of that was plugs and wires.  The plugs and wires i bought totaled $41.  I also bought $10 of transmission fluid.  So, we saved about $330.  Or we would have, except that the plugs were very difficult to get to, and i end up buying $50 in tools.  Now the mechanic's quote also included a fuel filter and a pcv valve, and of course, labor for all of the above.  The car didn't turn out to need a fuel filter or pcv, so those expenses were not required.&lt;br /&gt;&lt;br /&gt;It was roughly five hours of labor, including trips to stores, internet searches and such. It was 22 degrees out when i started, and 30 degrees when i finished. The weather was clear, except that as i finished, it started snowing.  Was it worth it?  I think it was.  And not just for the sense of accomplishment.  And not just for the savings.  The savings were around $300.  And for five hours of work, that's $60 per hour - tax free.  But one of the things you don't get when you have the mechanic work on it is what the diagnosis was.  It might have been the PCV or the fuel filter, and you'll never know.  All you know is all this stuff got replaced, and it works now.  You've no idea which part, if any, did it.  It was, in fact, the 2nd spark plug.  That's the one for cylinder number 3.  And the plugs themselves don't show this.  They're all very similar.  So you'd want to replace them all at the same time, because this job would just come up for each of the others in turn real soon.  And you replace the wires because you already bought them, and it was such a pain to get at them, you might as well do it.  And, these wires have an active component.  Right down there where they connect to the spark plug is a coil.  That's right, a coil right on the spark plug wire.  Never heard of such a thing.  I'd be fascinated to learn what problem it solves.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7040106210260008510?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7040106210260008510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7040106210260008510' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7040106210260008510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7040106210260008510'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/02/plugs.html' title='Plugs'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3397/3254632456_3c1a77c280_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2661819813442760419</id><published>2009-01-30T10:35:00.002-05:00</published><updated>2009-01-30T10:45:52.340-05:00</updated><title type='text'>How to stop procrastinating for tests??????</title><content type='html'>On Yahoo Answers (Y!A) the questioner asks for &lt;i&gt;Real world, tried and true solutions please!!!&lt;/i&gt; My answer follows.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3347/3239255826_73e4e1e591.jpg" align="right"&gt;I was going to join the Entire World Procrastinator's Society (EWPS - pronounced "oops"), but haven't gotten around to it.&lt;br /&gt;&lt;br /&gt;About studying and homework. Convince yourself that it's stuff you like, and it's exciting, and you can't wait to do it. Lie if you have to. Humans have amazing powers of self deception. After no time at all, you'll believe it. You can do this socially too. Get a bunch of your friends, as a running joke, or whatever, to talk about your classes and exams especially as being so much fun. Rowlings has some great ideas that she uses with Hermione in her books, if you need them.&lt;br /&gt;&lt;br /&gt;I find that it's not the work, which i enjoy, but starting it that's painful. Once i get going, i don't want to stop. Part of that is fear of not finishing. So again, you can lie to yourself. In homework you can tell yourself that "I'll just do one problem". Or, "There's lots to study for this test, but just now, I'll tackle orbital mechanics in two dimensions". Then add scope (more stuff) as you get into it. Do one more thing.&lt;br /&gt;&lt;br /&gt;A spoon full of sugar doesn't seem to work for me. It just makes me fatter. Julie Andrews is clearly responsible for the fattening of America, herself being so thin and all, could afford it. And i don't recall her taking any herself, now that i think of it. Evil, evil, evil.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2661819813442760419?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2661819813442760419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2661819813442760419' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2661819813442760419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2661819813442760419'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/01/how-to-stop-procrastinating-for-tests.html' title='How to stop procrastinating for tests??????'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3347/3239255826_73e4e1e591_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8796532371767853395</id><published>2009-01-07T13:08:00.004-05:00</published><updated>2009-01-07T13:14:08.519-05:00</updated><title type='text'>What part of computer science is easiest?</title><content type='html'>Some of computer science is pure math. I took a masters level operating systems course from a prominent professor. He'd done some great theoretical work involving page replacement, and gained a great reputation. But it wasn't at all obvious that he'd ever written anything, much less an operating system. The course was a disaster.  But my point is that there are many things that are sort of part of computer science that have little to do with computers, and you can make a living at the highest levels of computer science without knowing a heck of a lot about computers.&lt;br /&gt;&lt;br /&gt;I'd say of the bits of computer science i've done for a living, like building computers from parts, hardware troubleshooting, programming, requirements gathering, estimating, software architecture, software maintenance, testing, documentation, systems administration, teaching, database administration, network administration, web server administration, posting web content, and software repository administration that building computers from parts is easiest. Software maintenance is probably hardest, especially if you didn't write it.&lt;br /&gt;&lt;br /&gt;I'm often asked what i do for a living. I answer "something with computers". I get blank stares. I like to be understood, and don't care for blank stares. But sometimes, i get the followup question: "What, specifically, do you do?". And i answer "Something. Anything. I do whatever they want me to do." If they continue again, i spit out a dozen unrelated industry keywords and ask if they know what they mean. If the answer is "yes", then i say that i do those things. My motto seems to be that my job is so secret, not even i know what i'm doing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8796532371767853395?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8796532371767853395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8796532371767853395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8796532371767853395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8796532371767853395'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2009/01/what-part-of-computer-science-is.html' title='What part of computer science is easiest?'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2181737765332227851</id><published>2008-12-20T12:56:00.002-05:00</published><updated>2008-12-20T13:14:01.158-05:00</updated><title type='text'>Snow</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3200/3122410141_07fa84c9ac.jpg" align="right"&gt;I'm considerably less enamored with winter today than i was yesterday.  But while i was out there shoveling, one of my neighbors down the street got stuck with her car inches from freedom.  Her front wheels were caught in the hard packed snow that the plow had left at the end of her driveway.  So despite having 90% of the car in the road, the car refused to go anywhere.  She's a good deal older than i am, so i walked over, cleared out the snow behind both front wheels, and then another neighbor and i pushed the car into the street while she drove.&lt;br /&gt;&lt;br /&gt;She was grateful, but i really hope she doesn't get me something for Christmas.&lt;br /&gt;&lt;br /&gt;Me?  I'm nearly 50.  I hope to shovel snow for another 30 or 40 years.  If i don't, i hope it's because Global Climate Change has made it moot.  It's not that i'm rooting for it to get warmer.  That's a disaster i seriously don't wish for.  It's that the alternative explanation is that my health won't allow it.  And i'd rather live to be a healthy old bastard who shovels his own snow, helping out the younger 70 year old women down the street as needed, thank you very much.&lt;br /&gt;&lt;br /&gt;I got to listen to quite a few podcasts while waiting for the driveway and walk to become cleared.  For example, a recent study showed that humor is contagious, out to the third degree of separation.  IMO, that's much better than passing around the flu.  And, i've managed to do better than usual in that regard this season, so far.  That tidbit is from &lt;a href="http://www.sciam.com"&gt;Scientific American&lt;/a&gt;. This is a show that doesn't insult my intelligence, always has something interesting to say, and does it with a bit of humor.  And, it's free for download.  What more could you possibly want?&lt;br /&gt;&lt;br /&gt;My biggest problem wasn't a sore back or arms.  It was 20 degrees F (-6 degrees C).  My biggest problem was overheating.  My feet were hot in my new boots and wool knee sox.  My thighs were a bit chilly, because jeans aren't so hot after all, my head was warm with hat over hood.  But i probably shouldn't have also had the sweater on.  My solution was to take my gloves off.  I didn't just do that for the picture.  Nothing wrong with my circulation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2181737765332227851?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2181737765332227851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2181737765332227851' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2181737765332227851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2181737765332227851'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/12/snow.html' title='Snow'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3200/3122410141_07fa84c9ac_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7689785937558690735</id><published>2008-10-16T11:01:00.003-04:00</published><updated>2008-10-16T11:12:13.108-04:00</updated><title type='text'>Less Filling</title><content type='html'>Went to the dentist first thing this morning and got a filling. As first appointment of the day, there was no waiting. My tongue is about the size of New Jersey now.  When i need to do something, i now have to check if it can be done while having a tongue that big.  I can type, apparently.&lt;br /&gt;&lt;br /&gt;After he took the needle out, i said with enthusiasm, "I &lt;b&gt;like&lt;/b&gt; needles!".  Then i added that i just wanted to say something he hadn't heard before.  He said he doesn't hear it often.&lt;br /&gt;&lt;br /&gt;I probably should have had breakfast first.  But i was in such a hurry to get there on time.  Can't eat now.  Hey - it's a new diet!  Weight loss is guaranteed!  Or is it &lt;i&gt;wait loss&lt;/i&gt;?&lt;br /&gt;&lt;br /&gt;I woke this morning with sore neck muscles.  I was reminded of the Steve Wright line.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;When I woke up this morning, my girl friend asked me, "Did you sleep well?"  I said, "No.  I made some mistakes."&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7689785937558690735?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7689785937558690735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7689785937558690735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7689785937558690735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7689785937558690735'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/10/less-filling.html' title='Less Filling'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5332644645507086820</id><published>2008-09-21T19:18:00.003-04:00</published><updated>2008-10-10T08:53:52.506-04:00</updated><title type='text'>Science Fair Projects</title><content type='html'>Got a science fair coming up?  Need ideas?  Try these sites:&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://www.thenakedscientists.com/HTML/content/kitchenscience/"&gt;http://www.thenakedscientists.com/HTML/content/kitchenscience/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.cool-science-projects.com/"&gt;http://www.cool-science-projects.com/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://school.discovery.com/sciencefaircentral/"&gt;http://school.discovery.com/sciencefaircentral/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://school.discoveryeducation.com/sciencefaircentral/"&gt;http://school.discoveryeducation.com/sciencefaircentral/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://scienceclub.org/scifair.html"&gt;http://scienceclub.org/scifair.html&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.all-science-fair-projects.com/category0.html"&gt;http://www.all-science-fair-projects.com/category0.html&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.energyquest.ca.gov/projects/index.html"&gt;http://www.energyquest.ca.gov/projects/index.html&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.freesciencefairproject.com/"&gt;http://www.freesciencefairproject.com/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.ipl.org/div/projectguide/"&gt;http://www.ipl.org/div/projectguide/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.isd77.k12.mn.us/resources/cf/SciProjIntro.html"&gt;http://www.isd77.k12.mn.us/resources/cf/SciProjIntro.html&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.picadome.fcps.net/lab/sci_fair/science_fair.htm"&gt;http://www.picadome.fcps.net/lab/sci_fair/science_fair.htm&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.sciencebuddies.org"&gt;http://www.sciencebuddies.org&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.sciencebuddies.org/"&gt;http://www.sciencebuddies.org/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.sciencefair-projects.org/"&gt;http://www.sciencefair-projects.org/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.sciencemadesimple.com/"&gt;http://www.sciencemadesimple.com/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.scienceproject.com/"&gt;http://www.scienceproject.com/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.super-science-fair-projects.com/"&gt;http://www.super-science-fair-projects.com/&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;This just in:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=XumT6D6t_4I"&gt;How to make a telescope!&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5332644645507086820?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5332644645507086820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5332644645507086820' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5332644645507086820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5332644645507086820'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/09/science-fair-projects.html' title='Science Fair Projects'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1245234267824403297</id><published>2008-09-20T14:15:00.005-04:00</published><updated>2008-09-21T23:00:37.455-04:00</updated><title type='text'>What spider is this?</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3244/2872495255_dde3c1f3b5.jpg" align="right"&gt;&lt;br /&gt;This spider is prowling my basement.  Any ideas what it might be?&lt;br /&gt;&lt;br /&gt;I don't have arachnophobia.  These things eat other things that would otherwise bug me.&lt;br /&gt;&lt;br /&gt;Darn - the image is clipped.  Use your browser to "view image" to see more of it, like the whole quarter.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3111/2874745297_90316f171f.jpg" align="right"&gt;&lt;br /&gt;&lt;br /&gt;Best guess so far - a &lt;a href="http://www.ento.psu.edu/extension/factsheets/Spider/nurseryWebSpiders.htm"&gt;Dark&lt;/a&gt; &lt;a href="http://spiders.entomology.wisc.edu/Pisauridae/Dolomedes/tenebrosus.html"&gt;Fishing&lt;/a&gt; Spider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1245234267824403297?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1245234267824403297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1245234267824403297' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1245234267824403297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1245234267824403297'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/09/what-spider-is-this.html' title='What spider is this?'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3244/2872495255_dde3c1f3b5_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8219627848041518783</id><published>2008-08-14T10:13:00.002-04:00</published><updated>2008-08-14T10:18:22.476-04:00</updated><title type='text'>Spaced Out</title><content type='html'>This question was posted to the Astronomy and Space section of Yahoo! Answers.  I've copied the question verbatim.  There were several replies complaining about spelling and that it was the wrong category.  Such a wasted opportunity for "Best Answer" of an easy question.  Then, i've copied my reply, verbatim.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I juz need sum help!! sumone??&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;okaii so ive been wiv my bf for ova 2 yrs now nd hes been acting wired l8ly so i asked him wat was up i ended up geting out of him that he doesnt feel the same neymore hes realli confused bout it all i dunno nd he says he doesnt wanna brake up yet.. were giving this week end ago 2 c wat happends but im so confused i juz love him so much i dun wanna loose him plz advice sum1 plz!!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This is Astronomy and Space, so expect some weird, even hostile answers.&lt;br /&gt;&lt;br /&gt;We'll approach this as an engineering problem. What are the requirements? Clearly, you want to attract and keep your boyfriend. There are three things you'll likely want to do.&lt;br /&gt;&lt;br /&gt;First, you want to be good looking. An attractive appearance is a proxy for health. You want him to think that you are healthy. Cut to the chase - ask him to start exercising with you. It could be walking, biking, running, swimming, whatever. And it would get you both off your butts doing nothing. Just making out isn't going to firm up your relationship.&lt;br /&gt;&lt;br /&gt;Second, you want to appear smart. To do that, you have to pass some good ideas by him. This is hard, so one way to do that is to ask lots of people for advice. Yahoo! Answers isn't bad for this. You'll have to decide what is good, however. And, as has been mentioned, you might want to invest some time in spelling and grammar. You may have great spelling and grammar and are just doing this for style. How would i know?&lt;br /&gt;&lt;br /&gt;Third, you want to appear happy. It can be such a drag to be with someone who is cranky or demanding. Be happy and and avoid being a nag. Learn some jokes. More than half of all jokes fail miserably, so you need a bunch of them. Learn what kinds of jokes he likes. But if you become a nag, your relationship is destined to the death spiral. He'll withdraw, you'll want more, and nag more.&lt;br /&gt;&lt;br /&gt;Best of luck, and clear skies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8219627848041518783?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8219627848041518783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8219627848041518783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8219627848041518783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8219627848041518783'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/08/spaced-out.html' title='Spaced Out'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3893184185888013995</id><published>2008-08-12T14:45:00.002-04:00</published><updated>2008-08-12T14:47:11.451-04:00</updated><title type='text'>Is it right time now to start to bicycle on the road?</title><content type='html'>No. It was time at least three decades ago.&lt;br /&gt;&lt;br /&gt;When i lived in Boston, the bicycle was by far the fastest way to get around town. When i lived in Philadelphia, the bicycle was by far the fastest way to get around town. Philadelphia police had several officers patrol by bike. I would say it's quickest in Detroit, but Detroit has nowhere that i want to go.&lt;br /&gt;&lt;br /&gt;But if you haven't started biking around town, it's a good time to start. If everyone biked or walked places, there would also be health benefits - reduced diabetes, heart disease, better sex lives, and so on.&lt;br /&gt;&lt;br /&gt;(more Yahoo! Answers).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3893184185888013995?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3893184185888013995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3893184185888013995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3893184185888013995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3893184185888013995'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/08/is-it-right-time-now-to-start-to.html' title='Is it right time now to start to bicycle on the road?'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-9072090699025423481</id><published>2008-07-16T21:02:00.004-04:00</published><updated>2008-07-16T21:49:23.028-04:00</updated><title type='text'>Yahoo Answers</title><content type='html'>I've been goofing around with &lt;a href="http://answers.yahoo.com/"&gt;Yahoo! Answers&lt;/a&gt; of late.  This is a sort of general forum where people can ask questions, and other people can answer them.  I already have a Yahoo! email account, so it was totally painless to start.&lt;br /&gt;&lt;br /&gt;I've no idea why i started.  It's not like Yahoo! Answers is new.  Nor is that i'd never heard of it before.&lt;br /&gt;&lt;br /&gt;There's a section under &lt;i&gt;Science and Math&lt;/i&gt; called &lt;i&gt;Astronomy and Space&lt;/i&gt;.  I do astronomy.  Some of the questions looked easy.  For example, every few minutes, someone asks if the world is going to end in 2012.  The Mayan calendar flips over then - sort of like we did going from 1999 to 2000. Did we survive? There are no Mayans left to flip the calendar over.  And someone has been saying that there is a planet out there, &lt;i&gt;Planet X&lt;/i&gt;, that is going to strike the Earth in 2012. (We'd have seen it by now.)  There's some other nonsense too.  After typing in my answer for this a half dozen times, i started a file for frequently asked questions.  Someone even asked people not to ask this question.  That held the flow back for... less than 20 minutes.&lt;br /&gt;&lt;br /&gt;When you ask a question, Yahoo! Answers generates links to similar questions.  It's hard to imagine that you wouldn't notice that your exact question was already asked - and has answers - well before you get through the asking process.  These people just want to ask for whatever reason. They aren't going to be deterred.&lt;br /&gt;&lt;br /&gt;So, one day, i ran out of questions i could answer.  It's not that somehow the river ran dry.  It's just that Yahoo! doesn't let people answer an infinite number of questions.  Once you start answering questions and they get picked or voted as the best, then Yahoo! Answers lets you answer more per day.&lt;br /&gt;&lt;br /&gt;So what kinds of questions do i ask?  Well, there are two kinds.  First, i ask questions for which i think there isn't an answer.  Second, i ask questions that will evoke some humor. Third, i ask questions for which i already know the answers. Despite these strategies, i've managed to learn something.  Highly unexpected, but welcome.&lt;br /&gt;&lt;br /&gt;Here's an example question - though i posted it under mathematics.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;Why is the line at the bank that i pick always the longest?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are five lines at the bank. They're more or less the same length. I do my best to pick the shortest one. I note who is at the end of each of the other lines. All four are served before i am. Should i apologize to the people in front of me for picking their line - thus slowing their service?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I'm hoping it's funny because it's common experience.  After all, you only have a 20% chance of picking the fastest lane, so most of the time at least one other line is faster.  You feel that despite your best efforts, there is no justice in the Universe - someone got ahead of you that shouldn't have.  Everyone feels like that.  But i've added another twist.  The other four end-of-line people get served first.  Is that fair?  Am i such an intrinsically unlucky person that i should apologize to the rest of my line for slowing them down?&lt;br /&gt;&lt;br /&gt;Of course the four other end of line people really were in front of you.  They should be served before you.  It's the people behind them that are in any way behind you.  So, the answer is "no".  The Universe works the way it should up to this point.&lt;br /&gt;&lt;br /&gt;Yahoo! Answers are nearly a complete waste of time.  It's the blind following the blind.  Neither the questioners nor the answerers have much in the way of a clue what they're saying.  And i'm not just talking about the ones who can't type.  Is the best answer from the novices any good?&lt;br /&gt;&lt;br /&gt;And what if you really know what you're talking about?  What good does it do to say that the Earth won't be destroyed?  The only help you can give seems to be when the student has copied the question verbatim from their homework. (I've asked people to tell me where they're going to school - but no responses yet.) And if you know the answer and bother to give it, aren't you bursting with pride?&lt;br /&gt;&lt;br /&gt;Perhaps the right thing to do is to write a Yahoo! Answers bot.  This bot will have the answers to a bunch of questions, and when one of them gets posted, it will spit out the canned answer.  The trick here is to recognize that the question matches an answer.  Step two would be to let the bot scan all the questions and answers, figure out what the best answers were, and feed those as canned answers in the future.  It might be fun.&lt;br /&gt;&lt;br /&gt;Just three more days to answer my question on Yahoo! Answers.  Feel free to copy and paste from this blog entry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-9072090699025423481?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/9072090699025423481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=9072090699025423481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/9072090699025423481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/9072090699025423481'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/07/yahoo-answers.html' title='Yahoo Answers'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7911438402228797754</id><published>2008-07-12T14:43:00.002-04:00</published><updated>2008-07-12T15:01:18.575-04:00</updated><title type='text'>New car</title><content type='html'>In 1986, i was working for Harvard University.  I took the subway (the T) to work.&lt;br /&gt;&lt;br /&gt;One night, i had a dream.  I dreamed that instead of taking the T home, i got on a bus instead.  There's a bus station right there at Harvard Station.  No purpose in mind, just a whim.  And instead of going South, i went North up Massachusetts Ave.  The bus made many stops and people got on and off as one might expect.  At one of these stops, i got off.  Again, no purpose in mind, just a whim.&lt;br /&gt;&lt;br /&gt;I walked further North down the sidewalk.  There were lots of businesses on both sides of the street, but nothing of interest. This didn't bother me.&lt;br /&gt;&lt;br /&gt;Then i came across a Chevy dealership.  For no apparent reason, i walked into the showroom.  A salesman walked up to me and asked me if he could help.  I said, "No, i'm just looking around."  He dangled some keys and asked me if i wanted to test drive a corvette.  "It's free", he said.  I said, "Sure", and drove the bright red car around the block and back to the showroom.&lt;br /&gt;&lt;br /&gt;I got out, and he said, "I can let you have this car for no money down."  I thought "no way", but signed the papers on a whim.&lt;br /&gt;&lt;br /&gt;The drive home included a really fun bit on the Jamaica Way.  It has all these small hills and turns. All dreams should be this much fun. The trip ends coming down my street.  There's a parking spot that's very close to my house, and just after a driveway, so it's a smooth shot to park.&lt;br /&gt;&lt;br /&gt;The car comes to a stop.  I pulled out the key and looked forward.  Right there is my 1978 Dodge Omni.  I think, "That's right.  I already have a car!".&lt;br /&gt;&lt;br /&gt;That's when i woke up. No alarm. It was daylight. My bedroom was on the first floor, facing the front of the house.  I got up and looked out the window.  My Omni was exactly where it was in the dream.  And behind the Omni was an empty parking space.  It was a very vivid dream.  I had the distinct notion that my brand new corvette had been stolen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7911438402228797754?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7911438402228797754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7911438402228797754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7911438402228797754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7911438402228797754'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/07/new-car.html' title='New car'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3504457558219283544</id><published>2008-07-11T14:52:00.003-04:00</published><updated>2008-07-11T15:39:11.165-04:00</updated><title type='text'>Birthday Gift</title><content type='html'>I bought a camera to give my wife for her birthday.  It's a fairly low end digital camera.  That's now an 8 mega pixel camera that can do 30 frames per second 640x480 video with sound.  Wait a minute - 640x480 is better than TV (NTSC).  Our son plays violin and piano, and the old camera can do video, but without sound.  Our camcorder works, and has excellent optics, but is ten years old or so, and therefore is analog. I can't just send a clip to my friends and family by email. With a small, 1 GB SD card, the new camera can record approximately 13 minutes of highest frame rate, highest resolution video.  That's more than the couple tunes our son usually plays. I can always get a bigger card.  In fact, i own a 16 GB card that is in use in another device.&lt;br /&gt;&lt;br /&gt;Well, i picked up a Fuji at the Grocery store.  They didn't have the model i was looking for, but i figured i could return it if i didn't like it.  Well, it's impossible to know if you're going to like it, because the box doesn't say everything you need to know.  It turns out you need to install a driver to get it to work.  The CD is supposed to have drivers for Windows or the Mac.  But i run Linux, so this is a non-starter.  Worse, the CD didn't come in the box.  WTF?  And, there was a note in the box that has the Fuji tech support phone number, and a hand scrawled note that said that the pictures from this camera were fuzzy.  That's right, this camera had already been returned by someone as defective, and was being sold as new, though obviously, it wasn't refurbished or anything - they'd have noticed that there was no CD, and that there was this hand scrawled note.  There were also a few pictures of some guy's family on the camera.  I couldn't check them out on my larger computer screen because of the driver issue.&lt;br /&gt;&lt;br /&gt;So, i brought the camera back, but apparently, the receipt was not in the bag.  When i buy tech items, i always leave the receipt in the bag, just for this sort of thing.  Apparently, i didn't buy it via a credit card - but rather my debit card (which is a Visa, BTW).  They couldn't find the record of my purchase on their computer, and would not accept it without a receipt.  I went back home.  The receipt turned up on my kitchen table.  Why was it there?  Oh.  I always put my grocery store receipts there.  That way, when i'm unpacking groceries, i can check to see that i got everything i wanted, and can check that the prices were what i'd expected. So my habits conflicted - buying tech, and buying at the grocery store.&lt;br /&gt;&lt;br /&gt;So, i did some research on line to see if i could find a camera that doesn't need a driver.  I just want something that plugs into USB and mounts like a hard disk.   No big deal.  Nothing.  Not a single ad, not a single review, nothing mentioned this critical issue.  Not one product talked about compatibility with Linux. By the way, having to have the CD to install a driver is a pain for everyone, not just Linux users.  Let's say you're at a friend's house and take some pictures.  They say, "hey, could you send me a couple of those?"  You say, "can't i just plug it into your computer and give them to you now?"  If you have to install a driver, the answer is "no, you can't".  Not unless you bring the CD with you. So, i'd avoid Fuji and Kodak at the moment, without regard to what computer and OS you use.&lt;br /&gt;&lt;br /&gt;Well, my old camera is a Samsung.  It still works.  I like it.  It just doesn't do sound with it's videos.  It can store over 300 pictures on it's quarter gig SD card.  So, i looked up Samsung cameras, found a cheap one, and ordered it.  It's a Samsung 860.  I'm happy to report that it does not require a driver, and just mounts like a disk drive.  The camera is nice.  It's very small - fits in my shirt pocket.  It has two misfeatures.  It does not have a look-through view finder like my old one.  You must use the view screen.  The view screen is hard to see in bright daylight.  Also, it doesn't have a case.  My old camera has both.&lt;br /&gt;&lt;br /&gt;There's a third misfeature.  Well, you might call it a misfeature.  You see, it's so nice, that i want it for myself.  My wife has lost two cameras already.  I don't really want to give it to her. Yes, i picked it because it is cheap enough that i won't cry if it's gone, but it is really nice. And i also don't want to give her my old one.  So, i'm going to have to buy a second one.&lt;br /&gt;&lt;br /&gt;A funny story.  I ordered a 1 GB SD card with the camera so i'd be all set when it arrived.  The SD card arrived several days before the camera.  I checked it out - it works fine.  Only, by the time the camera arrived, the SD card was lost.  I haven't found it yet.  So, while at work, and on lunch break, i went to Best Buy, paid just over twice as much for another 1 GB SD card.  But when i got home, and wanted to put it in the camera, i couldn't find it!  I checked the likely places at the house - i hadn't been home long, and it didn't show up.  I couldn't remember bringing it home, so i went back to the office and checked my desk.  Nothing.  The next day i was out at Walmart, and bought a third 1 GB SD card.  I nearly lost it, but did manage to get it into the camera.  Well, a week later, the second SD card showed up.  It was in the refrigerator.  I had gone out to lunch unexpectedly, and still had my bag lunch at the office.  So i put the new SD card in my lunch bag so i wouldn't forget to bring it home.  When i got home, i put my lunch into the fridge. Next up was a week a vacation. It didn't appear again until i was cleaning the fridge of old science projects.  Maybe i like my chips cold.  That's it.  That's my story and i'm sticking to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3504457558219283544?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3504457558219283544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3504457558219283544' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3504457558219283544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3504457558219283544'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/07/birthday-gift.html' title='Birthday Gift'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2248665276501059291</id><published>2008-07-04T11:41:00.003-04:00</published><updated>2008-07-04T12:16:15.219-04:00</updated><title type='text'>Tor: Orphans of Chaos</title><content type='html'>I just I just finished the book, Orphans of Chaos, written by John Wright, and distributed by &lt;a href="http://tor.com"&gt;Tor books&lt;/a&gt;. Tor has this deal where they give out a free book every week.  You can sign up for their mailing list.  Each week, they send you a link to the new book. They have PDF, html, and moby formats.  I read the book on my n800 pocket computer, using FBReader. This application reads html and moby formats. Evince reads PDF. FBReader with moby seems to be the best. The moby format comes from the Palm pilot.  It's all one file, and supports styled text and embedded images.&lt;br /&gt;&lt;br /&gt;So Tor.com is't just giving these books out from the goodness of their hearts.  This book is no exception. The idea seems to be to hook you on the book, the author, or both.  In the case of Orphans of Chaos, it ends with &lt;i&gt;End of Part OneTo Be Continued in Part Two, FUGITIVES of Chaos, From John C. Wright, Available now in hardcover!&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Without any real spoilers, here are some notes.  If you start reading this, and it seeems boring, note that the book starts pretty slow.  It starts to pick up speed at around 20%. I don't have page numbers to give you, due to the electronic nature of the books.  At the 50% mark, it's moving pretty fast.  And, it ends with the above cliff hanger.&lt;br /&gt;&lt;br /&gt;I liked the author's style, once he got going.  It should be a good series.&lt;br /&gt;&lt;br /&gt;One of the other books in my queue from Tor is Old Man's War.  I have seen this book at Borders.&lt;br /&gt;&lt;br /&gt;I also finished Interplanetary Hunter by Arthur K. Barnes.  This is a light and fun little Scifi book, seemingly wriitten in the 1950's.  At least, if it was written back then, it could be considered hard science fiction.  But it doesn't take itself too seriously, so any science errors can be easily forgiven. For example, we know a bit more about Venus since then. I found it highly enjoyable. And, it's a great book all on it's own.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2248665276501059291?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2248665276501059291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2248665276501059291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2248665276501059291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2248665276501059291'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/07/tor-orphans-of-chaos.html' title='Tor: Orphans of Chaos'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6587320687050906968</id><published>2008-07-03T18:43:00.002-04:00</published><updated>2008-07-03T19:05:04.698-04:00</updated><title type='text'>Delusional</title><content type='html'>In the masthead of this blog, there is a dictionary definition of &lt;i&gt;delusional&lt;/i&gt;. And, i claim not to be there. At least not yet.  Predelusional, whereever it it headed, is not delusional. &lt;i&gt;Being delusional is having a false persistent belief or opinion not substantiated by sensory or objective evidence.&lt;/i&gt; This sounds like something else, though. It sounds like faith. Faith is belief in something without proof or evidence.  Being delusional is having faith.  Having faith is being delusional.  If being predelusional is not delusional, then being predelusional is being faithless. There's something to be proud of.&lt;br /&gt;&lt;br /&gt;"We must have faith", said Spock.  He could have said, "We must have delusions." If they're really the same, then delusions can't be bad while faith is a good thing.  Does it matter what your faith is in?  Does it matter what your delusions are?  It shouldn't.&lt;br /&gt;&lt;br /&gt;OK, so let's say you are going to start a big project.  If you don't think you'll finish the project, it is foolish to start it.  What if you don't know? Then what do you do? You have faith that you'll finish it.  Lie to yourself, if needed.  Create the delusion.  Delusions are good.&lt;br /&gt;&lt;br /&gt;Perhaps life is a journey, and though i'm not delusaional, i expect to get there eventually. The road to salvation is narrow, as the razor's edge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6587320687050906968?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6587320687050906968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6587320687050906968' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6587320687050906968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6587320687050906968'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/07/delusional.html' title='Delusional'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6272014312285315678</id><published>2008-06-26T16:05:00.004-04:00</published><updated>2008-06-26T16:18:56.977-04:00</updated><title type='text'>Maintenance club</title><content type='html'>Let's say you need to have a car.  Maybe you have a job or something.  Much of the cost of the vehicle is in the purchase price.  One way to reduce the purchase price is to buy vehicles used.  Another way is to own them longer.  Either way, you have a vehicle that requires more maintenance.  Need a reliable car?  Have more than one.  Since used cars often cost a tenth of new cars, you may be able to afford several.&lt;br /&gt;&lt;br /&gt;I know something about that.  I've changed an engine, fixed brakes, and so on.  But i have a car in my garage that needs work, and i'm not doing anything about it.&lt;br /&gt;&lt;br /&gt;But let's say you know nothing about car maintenance.  What do you do?  You need help.  Get together with someone like me who knows what they're doing.  You get help.  But what do i get?&lt;br /&gt;&lt;br /&gt;I've come to the conclusion that working on cars would be more fun, and therefore actually happen, if i had someone to do it with.  So the great idea is the maintenance club.  Each club member has some junk car.  A club 'meeting' consists of descending on a club member's car for a few hours to achieve some goal.  Everyone's junk gets some love in a sort of rotation.  Maybe one of the junks is a '48 Chevy restoration project, or a 60's Jag. &lt;br /&gt;&lt;br /&gt;But the thing that makes it work isn't that you get your car fixed.  The thing that makes it work is that it's a social event.  Bring out the pizza and beer, if that's what it takes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6272014312285315678?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6272014312285315678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6272014312285315678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6272014312285315678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6272014312285315678'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/maintenance-club.html' title='Maintenance club'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6002978346743274521</id><published>2008-06-24T14:22:00.004-04:00</published><updated>2008-06-24T15:36:15.242-04:00</updated><title type='text'>Mortgage basics</title><content type='html'>I just read a &lt;a href="http://scienceblogs.com/goodmath/2008/05/mortgage_basics_part_1.php"&gt;two&lt;/a&gt; &lt;a href="http://scienceblogs.com/goodmath/2008/06/mortgage_basics_part_2_the_sys.php"&gt;part&lt;/a&gt; bit on how mortgages work. This guy often talks about math or programming things that are esoteric and difficult. Worth the time to read, if the time can be had. And, most of my blog reading is about science.  These two posts, but especially the first, are really easy to read. There's an error in the formula, but the example is right. It should be&lt;br /&gt;&lt;br /&gt;Payment = P*(i/1-((1/1+i)^n))&lt;br /&gt;&lt;br /&gt;where P is the Price of the house - or really the money to borrow, i is the interest rate: 0.0575 for 5.75 percent, and n is the number of payments - 360 for a 30 year mortgage.  There are rounding issues, so this should be considered approximate. Payment is the payment per period, which is per month for most mortgages.&lt;br /&gt;&lt;br /&gt;I learned that i accidentally picked a pretty good mortgage, and then five years later, did a pretty good refinance to lower interest rates.  I made some very small mistakes (maybe tens of thousands of dollars), but have recovered from them, mostly in the refinance.&lt;br /&gt;&lt;br /&gt;This is Detroit. A friend's folks died last year, and left him and his siblings a house.  They all own houses, so they put it on the market.  A year later, it's still on the market, but at less than 20% of what they'd started it at.  It hasn't sold.  Calling it a buyer's market is generous.  It's foreclosure city.  I assume it's impossible for at least three to five more years to sell my house.&lt;br /&gt;&lt;br /&gt;But the banking industry is so greedy that they may have provided me an out after all.  It used to be that getting a second mortgage was a last resort sort of thing.  But now, banks are trying to sell these loans as "using your equity".  And, they're quite aggressive about it.  So, perhaps, i could suck all the equity out of the house as cash, and walk away from the house.  My equity is probably enough to buy a similar nearby house (perhaps in foreclosure) outright.  &lt;i&gt;No loan of any kind.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Mark's articles talk about how there is a conspiracy in the finance industry.  Short term profit greed drives it.  But there seems to be something similar in the automotive industry.  Why sell small affordable, high efficiency, low margin cars, when large high margin vehicles are selling?  In fact, offering any small cars at all will just encourage people to buy them.  Chrysler sells cars with hemi engines (big powerful engines). GM sells the Hummer. Ford sells the F-150, which was a small pickup when i was a kid.  Then, gas went over $4 a gallon and for some reason people don't want to put $100 of gas into their tanks at a time.  In the course of a month, gas hogs have gone out of style.&lt;br /&gt;&lt;br /&gt;OK, so Ford has the Focus, a 4 door sedan, which if equipped with a 5 speed manual probably can get the kind of &lt;a href="http://predelusional.blogspot.com/2008/05/my-car-gets-44-mpg.html"&gt;gas mileage that my car&lt;/a&gt; gets, assuming you drive it the way i drive mine.  And sales have skyrocketed.  They can't keep up with demand. This is a real problem. It takes awhile to get the pipeline moving. But the demand for the F-150 has dropped to the floor.  Even luxury car sales have dropped.  What's a Ford to do?&lt;br /&gt;&lt;br /&gt;So, the automakers, not just Ford, have claimed that they didn't see this coming.  Ford's solutions (available in Europe) won't be available in the states until 2010.  That could mean summer of 2009.  Chrysler made some investments last year that might pan out around then.  GM makes noises, but i'm still waiting for product. This, despite the fact that &lt;a href="http://predelusional.blogspot.com/2008/05/my-car-gets-44-mpg.html"&gt;my car&lt;/a&gt; was made in 2000 by GM. As far as i can tell, they don't sell it now.&lt;br /&gt;&lt;br /&gt;But from my perspective, the idea that gas will go up isn't news.  Maybe i was driving three times as far as anyone else, and so i noticed it sooner.  But it was important to me twenty years ago.  Well, total cost is also important.  In a year, i'm currently spending $3,500 on gas, $800 on insurance, under $1000 on maintenance, and zero on amortization for my fleet.  That's $5300 for 35,000 miles, or about 15 cents a mile.  That's a quarter of what the government thinks people spend. Actually, it's less than that. My Saturn has &lt;a href="http://predelusional.blogspot.com/2008/06/when-i-got-car-i-looked-it-up-in-kelly.html"&gt;increased in value&lt;/a&gt;, and maintenance has been much lower.  But it freaks me out that i'm paying over a dime a mile.  It's 60 cents to go to the grocery store.  So i go on my way home from work, saving 60 cents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6002978346743274521?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6002978346743274521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6002978346743274521' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6002978346743274521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6002978346743274521'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/mortgage-basics.html' title='Mortgage basics'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5887789964571690815</id><published>2008-06-22T12:36:00.002-04:00</published><updated>2008-06-22T12:43:57.711-04:00</updated><title type='text'>Can we go to a moive?</title><content type='html'>This weekend, i've been treating my son to several movies. He's been away at &lt;a href="http://www.bluelake.org/"&gt;music camp&lt;/a&gt;. We went to see Get Smart, by accident.  I can't read the ticket with my contacts in. I'll bring my reading glasses next time. So, it was theater 8 instead of 7.  We'll have to see Indiana Jones later.&lt;br /&gt;&lt;br /&gt;But he asked me if we can see &lt;a href="http://movies.yahoo.com/movie/1809921595/info"&gt;The Happening&lt;/a&gt;, which is listed as Action/Adventure, Thriller and Politics/Religion, and rated R for violent and disturbing images.  The trailer makes it look like deeply disturbing horror.  I said, "no", and not just because it's rated R.  I like to sleep at night too.  He said, "Good".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5887789964571690815?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5887789964571690815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5887789964571690815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5887789964571690815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5887789964571690815'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/can-we-go-to-moive.html' title='Can we go to a moive?'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-3164619096054849779</id><published>2008-06-19T12:56:00.002-04:00</published><updated>2008-06-19T13:13:49.853-04:00</updated><title type='text'></title><content type='html'>&lt;img src="http://farm2.static.flickr.com/1041/954887513_a22c505f5b.jpg" align="right"&gt;When i got the &lt;a href="http://predelusional.blogspot.com/2008/05/my-car-gets-44-mpg.html"&gt;car&lt;/a&gt;, i looked it up in Kelly Blue Book and found that it's retail value was $1,450.  I've put 70,000 miles on it, so i expected it's value had migrated towards zero.  But one of the guys at work suggested it should be worth &lt;b&gt;something&lt;/b&gt;. I looked it up again.  It's now worth $3,560.  That's right.  I put 70,000 miles on it, and it's value has increased by two grand. I attribute this to increased fuel prices.&lt;br /&gt;&lt;br /&gt;I talk about how cars don't have investment value.  And you might think that this is a windfall.  However, the car still works, and replacing it with something that gets as good gas mileage is unlikely.  So it's not for sale.&lt;br /&gt;&lt;br /&gt;I just did invest something into it.  I bought a new windshield.  Apparently it's not legal in Michigan to drive a car with a windshield cracked all the way across. It really wasn't much of a bother, as the crack wasn't quite in my direct line of sight.  Still, i was never able to clean the inside of the windshield fully, probably a smoker in it's history. For now anyway, it's really clean.&lt;br /&gt;&lt;br /&gt;But back to Michigan.  No inspections in this state.  So if you get pulled over, for anything, they notice your windshield and ding you with an extra fine.  I got away with having to replace it, and going to a police station to have them sign off that i'd gotten it done.  So, i got the windshield replaced right away. I'm really bad at the administrative stuff, but i did manage to get the signed ticket in the mail before the deadline.  Also, the new windshield was cheaper than expected.  Only $160 installed, with tax &amp; everything. Still, it'd be nice if they gave you a list of what you need up front, like when you register it. I consider air conditioning to be more of a safety item in the summer than the cracked windshield.  But i bet that Michigan doesn't care if you have it, or if it works.  And so on.  The windshield was number #3 on my priority list of repairs to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-3164619096054849779?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/3164619096054849779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=3164619096054849779' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3164619096054849779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/3164619096054849779'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/when-i-got-car-i-looked-it-up-in-kelly.html' title=''/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1041/954887513_a22c505f5b_t.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7515188824870700534</id><published>2008-06-17T13:58:00.003-04:00</published><updated>2008-06-17T14:10:08.974-04:00</updated><title type='text'>Acceptable Addiction</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3133/2587169903_2618c0322e.jpg?v=0" align="right"&gt;It's funny what is acceptable and what isn't.  If it isn't acceptable to say that you're an alcoholic even on the wagon, it is acceptable to say that you're a caffeine addict on or off the wagon.  What's the difference? You never get over either. Addiction actually changes the wiring of your brain. They're both legal (in the US). They both seem to be encouraged. Well, caffeine is encouraged for kids too. Both are an acquired taste. My 11 year old son has only recently breached the pop barrier, though he still prefers water. Coffee, beer and wine are still gross.&lt;br /&gt;&lt;br /&gt;So, i tell people that i'm a caffeine addict, but on the wagon. They ask, "Why?" It's not why i got addicted, but why on Earth i'd give it up. Well, it has this feature that it flushes calcium from my body, and that affects my joints first, and gives me arthritis.  "Oh."  And i know they're thinking that it could happen to them, though it clearly doesn't happen to everyone, and they think maybe they'll get lucky, despite osteoporosis running rampant among the older population. Perhaps they think that they won't get older. I could happen, right? There is an alternative to getting older.&lt;br /&gt;&lt;br /&gt;I know what you're thinking.  Alcohol affects your mind, your judgment. That's what makes it different. Except that caffeine also affects your judgment. It makes you jittery.  It make you buy more of that stuff you can barely tolerate. It makes you go to the bathroom more often. It also messes up your sleep patterns, reducing your mental performance. That's right. You took caffeine to improve your mental performance, but eventually you come out behind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7515188824870700534?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7515188824870700534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7515188824870700534' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7515188824870700534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7515188824870700534'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/acceptable-addiction.html' title='Acceptable Addiction'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-5906601316736290022</id><published>2008-06-16T14:37:00.002-04:00</published><updated>2008-06-16T15:09:03.096-04:00</updated><title type='text'>Parnas oopsla keynote podcast notes</title><content type='html'>David Lorge Parnas delivered a keynote speech on October 24, 2007 at &lt;a href="http://www.oopsla.org/oopsla2007/index.php?page=podcasts/"&gt;OOPSLA&lt;/a&gt; in Montreal.  The speech largely covers documentation, and communications required to build large projects. It touches on issues of building these projects, but mostly covers documentation.&lt;br /&gt;&lt;br /&gt;I listened to it twice, and took notes.  I haven't seen his slides. Sorry, this isn't prose, it's notes. Expect sentence fragments. And, they're somewhat organized together by topics, not notes in the order you'd hear in the show. Some repetition was removed. It hasn't escaped my notice that, as documentation, these notes of mine suck.&lt;br /&gt;&lt;br /&gt;Listen to the show.  It's one of the better talks about computing i've heard in the last decade or so.&lt;br /&gt;&lt;br /&gt;Object Oriented: not a language thing.  It's a description thing.  Dykstra's THE does this in assembler.  But OO languages have made it harder.  Parnas has done this in Fortran. But younger people see this as a language issue.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abstraction - what is the "more abstract than" relationship?  Subsetability: sequence of virtual machines.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Information hiding, inspired by managers who wanted to break up a task into work packages, without incurring too much communication. (Parnas).  Information hiding as a way to do composition.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Documenting module interfaces.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; "Information hiding is an empirical result". - no.  It's mathematical.  It allows one to know if module A uses B, and knowing a limited amount about B, you can know if A needs to change or not.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hence, Information Hiding Theorem.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;So, you have the theory, but must also check it out in practice.  Because "Theorectically" means "not really".  "Theoretically, we can all run a 4 minute mile."&lt;/li&gt;&lt;li&gt;Unhappy with this definition: Modules are collections of procedures - invoked by procedure call.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Abstract datatypes. Instead of one data structure for each module, more than one.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Components - really about sellable bits.  Modules aren't components.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Young people may have more energy.  Older people have the experience to know what might change.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Documentation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How can you document a project so that if a manager gives it to three people, he'd get the same thing.  When it fails, there's no one to blame.  It was difficult, not in theory, but in practice.&lt;br /&gt;&lt;br /&gt;Sometimes, combining modules is the right answer.&lt;br /&gt;&lt;br /&gt;Mathematical relations.&lt;br /&gt;&lt;br /&gt;Documentation for other engineering projects has multiple dimensions.  There are multiple documents for a bridge, etc.&lt;br /&gt;&lt;br /&gt;Coffee stain test - if the document is used, it's good.  These days, it would be a document web hit count or something.&lt;br /&gt;&lt;br /&gt;Design through documentation.  Building a bridge: the documentation gets refined until the builders can use it to build the bridge.  In engineering, these documents assist in inspection.  Assists in maintenance.  Enables systematic design review.  Attitude is that the documents are binding.  But in software - it's the program that counts - and the documents may be updated.  In engineering, these documents are binding.  Enables verification and inspections.&lt;br /&gt;&lt;br /&gt;Documentation must be accurate - if it isn't right, people will stop using it.&lt;br /&gt;&lt;br /&gt;Documentation must be precise.  A precise document that is wrong is better than a vague document.  A vague document is not even wrong.  (One complaint i have for the talk is that it's more than a bit vague. It might be the slides i missed. He clearly wasn't reading from the slides, so it's gone.)  Yet, the questions at the end were from people who clearly knew what he was talking about.&lt;br /&gt;&lt;br /&gt;Documentation must be consistent.  Free from contradiction.&lt;br /&gt;&lt;br /&gt;Everything must be only in one place.  Otherwise one will be changed, and you lose consistency.&lt;br /&gt;&lt;br /&gt;Documentation must be complete.  It must answer questions you have.&lt;br /&gt;&lt;br /&gt;Documentation must be easy to search.  You must be able to find the answers to the questions you ask.  Search tools can help you find things in electronic documents.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notation and Organization&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Documentation must use simple, closed form mathematics.&lt;br /&gt;&lt;br /&gt;No introductory sections.  People will look at the introduction, and ignore the body, then misinterpret it.  Extreme example: introductions were audio, and could only be played once.  The goal was to help you understand the body, but were not referenceable.  Of course, clever users figured out workarounds.&lt;br /&gt;&lt;br /&gt;Source code isn't documentation for end users.&lt;br /&gt;&lt;br /&gt;Documents show a separation of concerns.  At least three views for a solid object.  There is a set of documents.&lt;br /&gt;&lt;br /&gt;Documentation is not a crisis: it's a chronic disease.  Documentation needs to be a disciplined effort.&lt;br /&gt;&lt;br /&gt;Documents should be good enough that you should not have to look at the code.&lt;br /&gt;&lt;br /&gt;Documents are practical tools.&lt;br /&gt;&lt;br /&gt;Documents must be authoritative.  They must be organized so that you know where things go, or can be found.  They are reference, like a dictionary, rather than a tutorial.&lt;br /&gt;&lt;br /&gt;The test is that if you ask someone about a program, if they go to the documentation first, then it's good documentation.  If they go to the code first, it isn't.&lt;br /&gt;&lt;br /&gt;Documentation needs structure that avoids inconsistency.&lt;br /&gt;&lt;br /&gt;Documentation needs to be better than "let's just try it".&lt;br /&gt;&lt;br /&gt;Documentation needs to be used before you write the code.  While you write the code, and after the code is finished.&lt;br /&gt;&lt;br /&gt;All these documentation rules are easier said than done.&lt;br /&gt;&lt;br /&gt;Each document should have a clearly defined role.  Description, partial specification, full specification.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Three types of documents&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Description: facts.  Some facts are requirements.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Specification: only requirements.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Full specification: all requirements.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The same notation may be used by all three types. This means that there is no specification language.&lt;br /&gt;&lt;br /&gt;If you look at a document, you can't tell if it is a description or a specification unless someone tells you.&lt;br /&gt;&lt;br /&gt;It's not models. (!)&lt;br /&gt;&lt;br /&gt;It's not formal documentation.&lt;br /&gt;&lt;br /&gt;Source code clearly describes the program, but not the program's intent.  It's not a specification.  So it doesn't describe how the program might change.  (On the other hand, specifications can change too. And, some programs do document intent via comments. One could argue that any other comments are pointless.)&lt;br /&gt;&lt;br /&gt;The word 'theory' often means 'not really'. &lt;i&gt;The program works, in theory.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;All words are bendable (or ambiguous).&lt;br /&gt;&lt;br /&gt;How to define what information should be in a document?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Must specify the content.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each document is the representation of a mathematical relation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ordered pairs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Programing proving.  Preconditions and postconditions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you can start in x, it should end in y.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lots of examples of format and notation.  Must agree on content.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Need to know all the variables you sense and control.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Counter example: Document form vs. content.&lt;br /&gt;&lt;br /&gt;Great anecdote. Manager offers prize for documents conforming to specification: Seven parts on A4 with 1 cm margins, pages numbered, etc., but without talking about content.  Winner submitted document in seven sections that said the same thing. Description: the module copies data from here to there.  Design: Bytes are copied from here to there.  Detailed design: Byte one is copied before byte two... and so on.  Manager never noticed.&lt;br /&gt;&lt;br /&gt;Two are two relations:&lt;br /&gt;&lt;br /&gt;The set of things that are possible without the system - nature.  Describe the restrictions of cases that the system allows.&lt;br /&gt;&lt;br /&gt;Document should be able to be checked for feasibility.&lt;br /&gt;&lt;br /&gt;Software: modules, objects, components.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Distict but related concepts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Module is a work assignment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Component is a unit for sale.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There can be many copies of an object in a system.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The same kind of document techniques can be used for all of these.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Describing things operation by operation is natural to programmers.  It's not very helpful to others.&lt;br /&gt;&lt;br /&gt;A7 aircraft documentation project.  Output by output - with history of inputs.  You get this under these circumstances.&lt;br /&gt;&lt;br /&gt;It's harder to write for managers.&lt;br /&gt;&lt;br /&gt;Microsoft EU court case.  $3 million a day fines.  Anti-trust.  MS was told to document what other vendors needed to do to interoperate.  MS attempted to document their interfaces and failed.  In Parna's opinion, MS tried.  MS offered code, but other vendors refused. Intellectual property, but also that the code can change, and so, the spec.&lt;br /&gt;&lt;br /&gt;Inability to write documentation is key to some of the big expensive problems today.&lt;br /&gt;&lt;br /&gt;Specifications are not wish lists, or lists of features.&lt;br /&gt;&lt;br /&gt;Documentation is not a list of facts about the code.  In engineering, a specification is the requirements for the product.&lt;br /&gt;&lt;br /&gt;Requirements should not be repeated.  Else, inconsistencies creep in.&lt;br /&gt;&lt;br /&gt;Describe the data structure.  Describe how the data structure is interpreted: (interface) abstraction relation.  Describe what each program on the interface does to the data structure.&lt;br /&gt;&lt;br /&gt;Traces - history of what has been done.  Commuting diagram. (More math references).  If it commutes, then it can be implemented.&lt;br /&gt;&lt;br /&gt;A document should be a description of a set of relations.&lt;br /&gt;&lt;br /&gt;Documentation is inconsistent, and has errors.&lt;br /&gt;&lt;br /&gt;Describe mathematical concepts in a readable way.  Predicate pairs.  But how to write it so people can read it?&lt;br /&gt;&lt;br /&gt;Bad example: &lt;br /&gt;&lt;br /&gt;21 pages of inconsistent and erroneous testing documentation.  The testers ignored the errors.  Following testing instructions is dangerous.  Everyone preferred this bad document.  The document was readable, but managers didn't know it was wrong because they never tried to use it.&lt;br /&gt;&lt;br /&gt;These two things are needed for practical, sound documentation.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tabular expressions.  Better for math with if, and but.&lt;br /&gt;Discrete math.The tables parse out the dimensions of the problems.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Relational model of documentation.  Tells you what information must be&lt;br /&gt;in the document.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Requires significant training. But not a PhD.  Fewer mistakes.  Requires an engineering background.  Precise and checkably complete.  Pilots can read it (for A7) likely due to engineering training.  Can be used as a slow (non-real time) prototype.&lt;br /&gt;&lt;br /&gt;Down on Zed, VDM, Alloy (British doc languages).  Alloy is relational, but this is not the problem.  Tabular notation is needed.  These languages are translations of the code into other codes.  May as well use a Turing Machine implementation.  These tools are not practical.  If it's easier to read the code, then the documentation isn't good enough.  These tools are code.  Should use engineering documentation as a guide.&lt;br /&gt;&lt;br /&gt;Down on documentation extracted from source after the fact.  For one thing, it's descriptive, not prescriptive.&lt;br /&gt;&lt;br /&gt;Managers often do not have the engineering background needed to read documentation.  Writing documentation for managers is harder than for programmers or users.&lt;br /&gt;&lt;br /&gt;When you're done, the program should do what the document says it should.  If you test the program from the document, they can't get out of sync.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Testing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Test coverage.&lt;br /&gt;&lt;br /&gt;Reliability estimation via testing.&lt;br /&gt;&lt;br /&gt;Mutation testing.&lt;br /&gt;&lt;br /&gt;Test case generation. Interesting points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extreme values&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cross zero&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Discontinuities&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Equation solving for boundary values&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Precondition/postcondition doesn't scale up as well as relational models.&lt;br /&gt;&lt;br /&gt;Errors escape reviews.  Must use the code to answer questions.  What would you have to change in the code to do something?&lt;br /&gt;&lt;br /&gt;Separation of concerns (Dykstra).  Look at small bits of code at a time.  Important for testing.&lt;br /&gt;&lt;br /&gt;(more testing:)&lt;br /&gt;A "display"&lt;br /&gt;&lt;ul&gt;&lt;li&gt;what it should do&lt;br /&gt;&lt;/li&gt;&lt;li&gt;what the invoked programs do&lt;br /&gt;&lt;/li&gt;&lt;li&gt;right or wrong on it's own.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Then, for large programs, testing uses lots of these displays.  Scalable - lots of people can do little bits.&lt;br /&gt;&lt;br /&gt;"The smallness of the human skull." - Dykstra "You should never look at a long program."  Use divide and conquer.  Precise documentation to hook things together.  It's not stepwise refinement.  In stepwise refinement, the program gets longer.  Instead, keep it separate.&lt;br /&gt;&lt;br /&gt;If it's an object and a component, use the trace function method.  if it's a program within a component, use the display concept with documentation.&lt;br /&gt;&lt;br /&gt;Tools for documentation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Functional and imperative programming are combined.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Functional specs for imperative programs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Don't worry about efficiency of functional programs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Don't worry about illegibility of imperative programs.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Object orientation for hiding the right things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To Change&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vague diagrams that don't answer the right questions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Write the documentation first, to help build the programs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;From group reading to systematic inspection of the doc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Test generation from the documentation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Anyone who knows two language is a software engineer - a myth.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Need to train people in documentation.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Need to take a serious view of documentation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It needs to be seen as normal, expected and effective.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Needs to be taught.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Think about why people don't do it.  (ie: it's not taught).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Licenses for software engineering, including testing documentation skill.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Questions from the audience&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In theory it will work everywhere.&lt;br /&gt;&lt;br /&gt;Interpreting specifications, not executing them.  Theorem provers, etc.&lt;br /&gt;&lt;br /&gt;Deliberately introduce errors into program to find errors.  Deliberately introduce errors into documentation to find errors - Mutation.&lt;br /&gt;&lt;br /&gt;Movies: storyboarding.  Rapid prototyping is similar.  Knowing what you want by creating an approximation. Is the prototype a document?&lt;br /&gt;&lt;br /&gt;The prototype should be bound by the specs, just as the real program.&lt;br /&gt;&lt;br /&gt;Tables of documentation as an interface for talking to the customers.&lt;br /&gt;&lt;br /&gt;Evolution of documents.  The document evolves with the program.  Use information hiding in the document as well as the code.  Allows easier evolution.&lt;br /&gt;&lt;br /&gt;User interfaces and complex database interfaces. - works.&lt;br /&gt;&lt;br /&gt;Teach professionals the tabular notation?  Need to focus on a method that works - not just about methods.  Need to teach better fundamentals.  The math - 'for all', etc.  Lectures and labs.  Lectures give theory.  Labs teach why there's theory.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Questions i might have asked if i'd been there&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;So if the documentation is really good, is the code write-only?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What does Parnas think of use cases?  Aren't they requirements?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Many ideas (like use documentation to show who's to blame) are wrong because the idea itself is shallow.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-5906601316736290022?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/5906601316736290022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=5906601316736290022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5906601316736290022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/5906601316736290022'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/parnas-oopsla-keynote-podcast-notes.html' title='Parnas oopsla keynote podcast notes'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8047898897866853668</id><published>2008-06-15T09:41:00.003-04:00</published><updated>2008-06-15T09:48:43.175-04:00</updated><title type='text'>Rod: part six of six - Coffee</title><content type='html'>Tie's coffee smelled really good. A short blond woman approached.&lt;br /&gt;&lt;br /&gt;"Gail, why a caf&amp;eacute;? You know I don't eat."&lt;br /&gt;&lt;br /&gt;"Someone new. I'll introduce you, then take off. She's &lt;i&gt;seriously creepy&lt;/i&gt;."&lt;br /&gt;&lt;br /&gt;"Another hot date? You know it's doomed", remarked Tie.&lt;br /&gt;&lt;br /&gt;"Yes and no. How did you manage to attend both the Nobel and Ig Nobel ceremonies? Time zones?"&lt;br /&gt;&lt;br /&gt;"I had a new body built, and copied my bits to it. But afterwards, we couldn't merge experiences. Something's wrong."&lt;br /&gt;&lt;br /&gt;"Here she is. Tie, meet Jean. Jean, Tie."&lt;br /&gt;&lt;br /&gt;Jean gave a low gasp as she sat down. "You aren't a breather."&lt;br /&gt;&lt;br /&gt;"No", Tie said tentatively. Didn't everyone &lt;a href="http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html"&gt;know his story?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jean went on. "Not like Nosferatu. And unlike those machines, you have soul."&lt;br /&gt;&lt;br /&gt;"I'm not clueless."&lt;br /&gt;&lt;br /&gt;"Dim ones never have strong souls. Which comes first is hard to prove."&lt;br /&gt;&lt;br /&gt;"So my other body, the new one, may not adjust?"&lt;br /&gt;&lt;br /&gt;"You might try to split your soul."&lt;br /&gt;&lt;br /&gt;Gail got up. "Gotta go. Bye Tie. Bye Ms. Bank".&lt;br /&gt;&lt;br /&gt;Jean said, "You were right, Ms. Force. Fascinating. Thanks."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8047898897866853668?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8047898897866853668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8047898897866853668' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8047898897866853668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8047898897866853668'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-six-of-six-coffee.html' title='Rod: part six of six - Coffee'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-6293045134451581973</id><published>2008-06-13T11:10:00.003-04:00</published><updated>2008-06-13T11:17:11.261-04:00</updated><title type='text'>Rod, part five of six - It's a Tie</title><content type='html'>"You won the court case and Earth Defense Fleet is giving you your back pay. How does it feel?", asked journalist Debbie Jameson-Peterson.&lt;br /&gt;&lt;br /&gt;"And 4% interest and treble damages, said &lt;a href="http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html"&gt;Acting Ensign Rod&lt;/a&gt;, Genocide, Retired", Rod replied with a smile.&lt;br /&gt;&lt;br /&gt;"They said you are a machine, and not entitled to property."&lt;br /&gt;&lt;br /&gt;"I was human enough for them when I signed up."&lt;br /&gt;&lt;br /&gt;"They said more than half of your parts were replaced. You're a new entity."&lt;br /&gt;&lt;br /&gt;"Ninth handle and 3rd blade, but the same axe. Most of your cells have been replaced too. My lawyer told me to use the 'Acting Ensign' bit. Never my first name."&lt;br /&gt;&lt;br /&gt;"Your name's Rod?"&lt;br /&gt;&lt;br /&gt;"That's my last name. First name's Tie."&lt;br /&gt;&lt;br /&gt;"Ha! Sorry. Name Change?"&lt;br /&gt;&lt;br /&gt;"Nope. Floe Rivers married Jack Hammer. Mom and Dad."&lt;br /&gt;&lt;br /&gt;"At least it wasn't Barb Wire."&lt;br /&gt;&lt;br /&gt;"That would be Grandma."&lt;br /&gt;&lt;br /&gt;"Sorry I mentioned it. What do you do next?"&lt;br /&gt;&lt;br /&gt;"Sweden, then upgrades."&lt;br /&gt;&lt;br /&gt;"Sweden?"&lt;br /&gt;&lt;br /&gt;"The Nobel Peace Prize. For killing billions."&lt;br /&gt;&lt;br /&gt;"You ended the war. You saved countless billions."&lt;br /&gt;&lt;br /&gt;"Buy one, get two free. I get an Ig Nobel too. No one ever got both."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-6293045134451581973?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/6293045134451581973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=6293045134451581973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6293045134451581973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/6293045134451581973'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-five-of-six-its-tie.html' title='Rod, part five of six - It&apos;s a Tie'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7987130539054072788</id><published>2008-06-12T13:33:00.002-04:00</published><updated>2008-06-12T13:35:57.574-04:00</updated><title type='text'>Rod, part four of six - Historian</title><content type='html'>No ships in sight. Shut down nonessentials. Set wakeup for a day and sleep.&lt;br /&gt;&lt;br /&gt;Nothing here. Sleep. Nothing. Sleep...&lt;br /&gt;&lt;br /&gt;"Where am I?", asked &lt;a href="http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html"&gt;Acting Ensign Rod&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;"You are on Space Station 666. I'm mission specialist Ray. Are you male or female?"&lt;br /&gt;&lt;br /&gt;"Does it matter?"&lt;br /&gt;&lt;br /&gt;"Many of your parts had to be replaced. Tough to get some of the older ones. And we guessed male."&lt;br /&gt;&lt;br /&gt;"That's right. Uhm, what's your specialty?"&lt;br /&gt;&lt;br /&gt;"I'm a military historian. I'm investigating the Battle of the Berg. No one knows why all the Berg ships blew up."&lt;br /&gt;&lt;br /&gt;"They all blew up?"&lt;br /&gt;&lt;br /&gt;"Including some on the Berg home world. Ship yards were near cities. More than a billion Berg vaporized. Led to the end of the war."&lt;br /&gt;&lt;br /&gt;"So, I've outdone Hitler, Stalin, and everyone combined."&lt;br /&gt;&lt;br /&gt;"Sorry?"&lt;br /&gt;&lt;br /&gt;"Well, Hitler and Stalin only killed millions. Uhm. How long was I out?"&lt;br /&gt;&lt;br /&gt;"We found you a couple years ago. It's been 76 years."&lt;br /&gt;&lt;br /&gt;"Great. Acting Ensign Rod, Genocide. Over 200 years old and totally obsolete."&lt;br /&gt;&lt;br /&gt;"But think of the back pay."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7987130539054072788?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7987130539054072788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7987130539054072788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7987130539054072788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7987130539054072788'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-four-of-six-historian.html' title='Rod, part four of six - Historian'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2405701402299137145</id><published>2008-06-11T14:11:00.002-04:00</published><updated>2008-06-11T14:14:22.718-04:00</updated><title type='text'>Rod, part three of six - Winders</title><content type='html'>&lt;a href="http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html"&gt;Acting Ensign Rod&lt;/a&gt;, on breached enemy Berg ship.&lt;br /&gt;&lt;br /&gt;Have power, but power meters are fried. That was some jolt! All batteries have something, so use them one at a time.&lt;br /&gt;&lt;br /&gt;No shooting. The battle is over. Gotta get this hulk moving or stay here forever.&lt;br /&gt;&lt;br /&gt;This looks like a computer terminal. What? It's Winders? I hate Winders. Wonder if it has that bug...&lt;br /&gt;&lt;br /&gt;W00t! I'm in. And look, the Admiral's unexpired command codes! Can I self destruct every ship in the Berg fleet? Not much time.&lt;br /&gt;&lt;br /&gt;Need his retinal scan. What's the Admiral look like? Where's the bridge?&lt;br /&gt;&lt;br /&gt;Found him. Scan. Send it. Damn. Comms are down. Antenna damaged. Backup antenna in the hold. Set up a 10 second retry send loop. Get some wire for a tether. Out the breach and hook up the backup.&lt;br /&gt;&lt;br /&gt;Here it is. Bolt this down. Plug this baby in.&lt;br /&gt;&lt;br /&gt;Boom.&lt;br /&gt;&lt;br /&gt;Opps. Forgot to tell this hulk not to blow up. Took lots of damage. Golly. Several nearby explosions, though. Maybe it was worth it.&lt;br /&gt;&lt;br /&gt;Once again, Acting Ensign Rod, floating space debris.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2405701402299137145?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2405701402299137145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2405701402299137145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2405701402299137145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2405701402299137145'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-three-of-six-winders.html' title='Rod, part three of six - Winders'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1468767577806161756</id><published>2008-06-10T09:26:00.001-04:00</published><updated>2008-06-10T09:29:21.386-04:00</updated><title type='text'>Rod, part two of six - Adrift</title><content type='html'>&lt;a href="http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html"&gt;Acting Ensign Rod&lt;/a&gt;, the largest intact piece from the Cruiser Chanuk, drifting in space.  All systems nominal.  Imagine that!  Batteries at 15%.  Don't need legs or arms.  Can they be turned off?  Yes.  Four hours left now.  Need to turn around to see.  Uhm double over and twist, bend over backwards.  Hot dang!  Something big coming this way.  What is it?&lt;br /&gt;&lt;br /&gt;What is it?&lt;br /&gt;&lt;br /&gt;Just great. Enemy ship.&lt;br /&gt;&lt;br /&gt;Big breach, but mostly there.  How long will it take to get there?  Too long.&lt;br /&gt;&lt;br /&gt;Shut down torso, hearing, taste, touch.  Is it long enough?  No.  Ok, turn touch back on, and shut down vision.  Power everything back up on contact.  Seven hours.  Long enough?  Better be.  Stop thinking.  Laptop chips have low power idle mode.  Think of nothing.  Nothing.&lt;br /&gt;&lt;br /&gt;Clunk.  Power up.  Grab something.  Damn.  Bounced two meters away.  Toss the remote hard.&lt;br /&gt;&lt;br /&gt;Fabulous.  Boarded an enemy space ship.  Six minutes to find a power outlet.  What, no standard outlets?&lt;br /&gt;&lt;br /&gt;Sparks!  Jam those wires into the charging socket.  Woot!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1468767577806161756?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1468767577806161756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1468767577806161756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1468767577806161756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1468767577806161756'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-two-of-six-adrift.html' title='Rod, part two of six - Adrift'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-2412845595170883006</id><published>2008-06-07T07:26:00.001-04:00</published><updated>2008-06-07T07:29:18.580-04:00</updated><title type='text'>Rod, part one of six - Battle</title><content type='html'>"&lt;a href="http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html"&gt;Acting Ensign Rod&lt;/a&gt;, we still need officers for science and security.  What do you want?"&lt;br /&gt;&lt;br /&gt;"Tactical.  I want to shoot enemy ships.  Kill! Kill! Kill!  Uhm, Captain Sook, Sir!"&lt;br /&gt;&lt;br /&gt;"In case you hadn't noticed, we have no engines."&lt;br /&gt;&lt;br /&gt;"But we still have one reactor, and a port laser."&lt;br /&gt;&lt;br /&gt;"We're blind on our port side.  You can't just shoot, you'll never hit anything."&lt;br /&gt;&lt;br /&gt;"I'll do an EVA with a remote control, Sir."&lt;br /&gt;&lt;br /&gt;"Sorry, all the suits were blown out in the breach."&lt;br /&gt;&lt;br /&gt;"But i don't need a suit.  No biological parts.  Just a battery charge, Sir.  I'm good for ten hours."&lt;br /&gt;&lt;br /&gt;"All right, get down to engineering and see if you can get a remote working."&lt;br /&gt;&lt;br /&gt;Half an hour later, Rod was outside.  The rule was 'shoot anything unrecognized'.  That's the enemy.  Five hits in seven shots, and one was really good.  Everything was going to plan, until the third torpedo hit the Chanuk.  It exploded.&lt;br /&gt;&lt;br /&gt;"Great", he thought. "Acting Ensign Rod.  Ninety minutes of battery power left.  Drifting in space without a ship."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-2412845595170883006?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/2412845595170883006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=2412845595170883006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2412845595170883006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/2412845595170883006'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-one-of-six-battle.html' title='Rod, part one of six - Battle'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-4421099267013742024</id><published>2008-06-06T10:23:00.004-04:00</published><updated>2008-06-06T10:56:17.326-04:00</updated><title type='text'>Rod part zero of six</title><content type='html'>I wrote this seven part series for &lt;a href="http://burst.trajectoryscifi.com/"&gt;Burst Fiction&lt;/a&gt;.  I thought it was a cool idea, and brand new.  The idea is really short stories for those with short attention spans.  Each story is about 1000 characters.  Well, Eric posted my first story, but has been very slow to post part two.  So here are all seven parts, about one per day. Eric has put alot of effort into the site. I read it with an RSS reader, and so don't get that formatting. His value add seems to be in picking stories he likes and releasing about one per day. I thought this idea was brand new.  But, judging by the quantity of content, &lt;a href="http://ficlets.com/"&gt;ficlets&lt;/a&gt; have been around for awhile.&lt;br /&gt;&lt;br /&gt;One thousand characters isn't much. If words are on average 5 characters, and you need a space between words, it's only 167 words. That's really constrained.  So you get story snippets that remind of a turning point in a story.  Further, you get poetry in prose form. For example, each sentence might be purposely written ambiguously, and all meanings are intended. So, far from food for the impatient, these little stories can require significant study. So, AFAICT, not new, and not for short attention spans. Another trick is to play to stereotypes. That way you don't have to explain so much. Pick a Universe everyone already knows. I personally like the unexpected twist for an ending. Harder to do with a story that can be read at a glance.&lt;br /&gt;&lt;br /&gt;Eric has also put alot of effort into the site. I read it with an RSS reader, and don't get that formatting. Honestly, i find it annoying. Yet another unique user interface that is barely discoverable.&lt;br /&gt;&lt;br /&gt;The exercise is valuable. Write some. Leave them in the comments.&lt;br /&gt;&lt;br /&gt;My first draft of "Rod" was from a preface or chapter one. But there wasn't much action. So it got moved to chapter three or four. To save space, the first draft omitted all character names. Without further ado, the story:&lt;br /&gt;&lt;br /&gt;The first incoming torpedo destroyed Cruiser Chanuk’s main engine. Inertial dampers went down seconds later. The second hit slammed everyone who wasn’t strapped down into a wall. 90% casualties, including all bridge officers. The Chanuk would likely sit out the battle. Ensign Sook took command. She didn’t have to like it.&lt;br /&gt;&lt;br /&gt;"Private Rod, why haven’t you reported to sick bay?" asked acting Captain Sook. &lt;br /&gt;&lt;br /&gt;"I’m fine, uhm, Captain. Sir! And I have no biological parts." &lt;br /&gt;&lt;br /&gt;"You’re an android? Your dossier says human." &lt;br /&gt;&lt;br /&gt;"Yes, but my body rejects transplants. So as bits fail, they’re replaced by prosthetics." &lt;br /&gt;&lt;br /&gt;"Not everything can be replaced, can it?" &lt;br /&gt;&lt;br /&gt;"I suffered brain death two months before signing up for Earth Defense Fleet. No big deal. Most of it had been replaced already." &lt;br /&gt;&lt;br /&gt;"Cyborg, then. Why doesn’t it say Cyborg?" &lt;br /&gt;&lt;br /&gt;"There’s been no enhancement. Certified prothestics." &lt;br /&gt;&lt;br /&gt;"Well, when did you first start getting replacements?"&lt;br /&gt;&lt;br /&gt;"At about seven, my dentist put in two fillings."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-4421099267013742024?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/4421099267013742024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=4421099267013742024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4421099267013742024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/4421099267013742024'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/rod-part-zero-of-six.html' title='Rod part zero of six'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-7259962378971792786</id><published>2008-06-05T21:26:00.002-04:00</published><updated>2008-06-05T21:34:32.455-04:00</updated><title type='text'>Bike to Work</title><content type='html'>It's 8 miles each way to work. So, it's 16 miles, round trip. The car gets 44 MPG, so that's about a third of a gallon of gas a day.  Gas is currently about $4 per gallon, so that's $4 every three days, or a $1.33 per day.&lt;br /&gt;&lt;br /&gt;But today, i rode my bike to work.  One might think it was to save $1.33, but it actually saved over $80. That's because my car needed a new windshield.  It takes about 3 hours to do the work, and the mechanics hours are the same as mine.  So, it's 3 hours of work, which is unacceptable to my employer, as well as 3 unpaid hours.&lt;br /&gt;&lt;br /&gt;There was an option.  There's an outfit that will replace your windshield while it sits in the parking lot at work.  They serve the town where i work.  But, they're about $80 more.&lt;br /&gt;&lt;br /&gt;The place that did the work isn't across the street.  They're about 2 miles away.  And, the optimal route from there to work goes by my house.  In fact, i stopped at the house in both directions.  In the morning, i stopped to pump up the tires and get my backpack.  In the evening, i stopped to drop off the backpack.  Instead of about 9 miles (the car route is a little more direct), it was 11 miles each way.&lt;br /&gt;&lt;br /&gt;Since there is a shower at work, i could push it a little and work up a sweat. And the same for going home.  It took an hour and fifteen minutes in each direction, so my speed was something around 7 MPH.  I felt like i was flying, however.  Perhaps if i get a battery for my bike computer, and do another ride, i'll know for sure.  But last time i did something like this, it really was pretty slow at the start of the summer.  Last time, it built to 22 MPH by the end of the summer.&lt;br /&gt;&lt;br /&gt;That is, the speed tripled. Bike speed is limited by drag.  Drag goes up as the cube of the speed.  So if the speed triples, the drag force goes up by a factor of 27.  Energy is force times distance, so the energy required goes up by a factor of 27.  If one's calorie intake stays the same, it suggests that body efficiency can go up dramatically.  And that's an hour or two per day for a hundred days.&lt;br /&gt;&lt;br /&gt;It also means that i'm really out of shape at the moment. Well, i knew that.&lt;br /&gt;&lt;br /&gt;I had a banana with lunch.  I had one with dinner.  I've just heard that they can help reduce the muscle soreness.  No idea why that might be.&lt;br /&gt;&lt;br /&gt;This blog post was written entirely using a Nokia n800 pocket computer while sitting on the downstairs couch. It's quite a bit cooler down here than upstairs where the desktop sits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-7259962378971792786?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/7259962378971792786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=7259962378971792786' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7259962378971792786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/7259962378971792786'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/06/bike-to-work.html' title='Bike to Work'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-8932211646857223878</id><published>2008-05-23T14:45:00.001-04:00</published><updated>2008-05-23T14:47:19.048-04:00</updated><title type='text'></title><content type='html'>&lt;img src="http://farm2.static.flickr.com/1041/954887513_a22c505f5b.jpg" align="right"&gt;My car gets 44 MPG. It's nothing special. A 4 door sedan with a 1.9 liter engine and a 5 speed manual. It was dirt cheap, all the more so because i bought it used.&lt;br /&gt;&lt;br /&gt;But it could get 20% more, or 53 MPG if i put a turbocharger on it the engine it has. It could get 5% more than that, or 55 MPG (rounding) if i add a cruise control. It could get 5% more than that, or 58 MPG, if the bottom was smooth, rather than set up to induce turbulence. Bottom turbulence helps keep the car on the road at high speed, so put in a governor that caps speed to 90 MPH - which is more than fair. Then, replace the gas engine with a diesel, and get 15% more, or 67 MPG. And none of this is high tech, expensive or new. I'm with Carl Sagan, who in his 1981 Cosmos series asked why we don't have cars that get 70 MPG.&lt;br /&gt;&lt;br /&gt;Then there's tech we don't use. The differential consumes 7-15% of your power just to let your car go around corners. An electric transmission (generator at the engine, electric motors near the wheels, should have a total loss of 6%. But, there'd be no engine drag (which is alot like braking - a waste), you'd get automatic like non-shifting - except that there'd really be no shifting - no jerks, and you'd get 4 wheel drive with zero economy penalty. You could also have two independent engines. Why is that good? Well, it only takes about 15 HP to cruise down the highway. A 300 HP engine is really poor at delivering 15 HP. So you put in a small engine for highway cruise, and a larger engine for pulling your boat. If an engine dies, the other will still get you home (remember, the little one will let you cruise down the highway). What's all this going to get you? More than 100 MPG. Oh, and since you've got electric, you can add batteries for regenerative braking, and put solar cells on top for another 10% boost when it's sunny - and it charges your batteries when you're parked. Some people might never have to fire up the diesels. We might even have to 'remove gas from our tanks' - in the form of electric energy transfer from the parked car. Your house could probably use it.&lt;br /&gt;&lt;br /&gt;In the 70's, most of the problem was solved through improved economy, and much of that was the 55 MPH speed limit, which got us some 10 - 15%. Bush has said "There's no instant fix", but we could have new signs on our highways today.&lt;br /&gt;&lt;br /&gt;While we're there, what about home heating? Houses get really poor gas mileage. Insulation already pays for itself in the near term. That's only going to increase. Why don't we have businesses that insulate your house, and get pay back from the improved economy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-8932211646857223878?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/8932211646857223878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=8932211646857223878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8932211646857223878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/8932211646857223878'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/05/my-car-gets-44-mpg.html' title=''/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1041/954887513_a22c505f5b_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15145059.post-1182895159314475261</id><published>2008-05-22T11:08:00.003-04:00</published><updated>2008-05-22T11:19:45.775-04:00</updated><title type='text'>Starship Sofa</title><content type='html'>Just listened to a short story, &lt;i&gt;And the Deep Blue Sea&lt;/i&gt; by &lt;a href="http://www.elizabethbear.com/"&gt;Elizabeth Bear&lt;/a&gt;, hosted on &lt;a href="http://www.starshipsofa.com/"&gt;Starship Sofa&lt;/a&gt;. I've no idea how this mp3 got into my feed and therefore on my iPod.&lt;br /&gt;&lt;br /&gt;It's a good story.  I'm not going to give away the surprise ending.  If i could figure out what the ending is, i wouldn't tell you.  Not every story has to end with "...and they lived happily ever after...".&lt;br /&gt;&lt;br /&gt;The intro can be safely ignored.  He goes on for a bit about how he couldn't think of anything profound to say. Though he does introduce the author.  I like his accent. It's not like mine.  But he doesn't read the story.  That's a relief.  It's a pro reading all the way.&lt;br /&gt;&lt;br /&gt;I'll probably add Starship Sofa to my feed.  That'll put me years behind, i'm sure.  but at least the episodes aren't two hours long like some napolean podcast that i'm still subscribed to.  Isn't Napolean going to die soon? I don't know enough about history to know.  Sigh. That's why it's in my feed. I really can't cope with 2 hour mp3's.&lt;br /&gt;&lt;br /&gt;My commute has gone from an hour each way to twenty minutes.  I did cut a few things from my feed. But the strange thing is that i seem to be getting through nearly as much as i used to.  I'll have it on while cleaning the house, cooking, mowing the lawn (one of the mowers has no engine, and is therefore silent).  All my really short feeds (half hour or less) get consumed right away. But i'm stuck on this 2 hour feed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15145059-1182895159314475261?l=predelusional.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://predelusional.blogspot.com/feeds/1182895159314475261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15145059&amp;postID=1182895159314475261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1182895159314475261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15145059/posts/default/1182895159314475261'/><link rel='alternate' type='text/html' href='http://predelusional.blogspot.com/2008/05/starship-sofa.html' title='Starship Sofa'/><author><name>Stephen</name><uri>http://www.blogger.com/profile/03934169832326108710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://www.uitti.net/stephen/who/who_2.jpg'/></author><thr:total>0</thr:total></entry></feed>
