<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://inexorabletash.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2finexorabletash.spaces.live.com%2fcategory%2fProjects%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Caution: Singularity Ahead: Projects</title><description /><link>http://inexorabletash.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catProjects</link><language>en-US</language><pubDate>Mon, 08 Sep 2008 03:02:07 GMT</pubDate><lastBuildDate>Mon, 08 Sep 2008 03:02:07 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://inexorabletash.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>4595244410013098217</live:id><live:alias>inexorabletash</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>My Other Project</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1102.entry</link><description>&lt;p&gt;Inspired by the &lt;a href="http://steampunkworkshop.com/keyboard.shtml"&gt;Steampunk Keyboard Mod&lt;/a&gt; page and a long term crush on Amanda Pays (Theora on &lt;em&gt;Max Headroom&lt;/em&gt;, who had an actual typewriter for her keyboard), I put this together: &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pdB7gl7MGSx3N0kGHfwOJ8ljwF-O4eATtbAY4_6QyxK47f-RLrPIMeQUqrhYJHXwvY9yyoNhc2-4dIE7aCcfwSw?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt=Keyboard src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfo2aRdZ-uTE1Y1wZ2H3Q52sAuDTqlADh3IxjczRKR4IMey-twLE4x_SilHS-n1T6Tlf_CO438mQq8r9ithMX3F0?PARTNER=WRITER" border=0 height=79 width=244&gt;&lt;/a&gt;  &lt;p&gt;It looks better in person than it does in the pictures, actually. &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pylLSajaHh9EYZ9hkB6MYisOhE6EfmMUJJKdW__Ohu8FiDnJR0Ct4N7DOzXx_jycHQ7SyPuOEP32AgPxgGVsP1mYCwpWC1gEq?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt="100_1808" src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfonvH8TPD2hC8ZDc5YkPIwrWinZ6XHMc1X1v3nhKpatWfXVhdMgj0fdHtbmZ3pAzWRO3nv_REfMzxCdEhglClAB?PARTNER=WRITER" border=0 height=184 width=244&gt;&lt;/a&gt;  &lt;p&gt;Ask friends or co-workers of the cheap keyboard that &amp;quot;came with the computer&amp;quot; that's probably in the closet gathering dust. This one's a Dell USB.&lt;br&gt; &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pylLSajaHh9HemRVoLbaHWGXPCo6IBAz0z3kF-0ch6gisH7vneqxmpH1NAgSvF39XQM8GOohKn_vJw_OyNko2ue0SOYx8IKJd?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt="Carriage Return" src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfoBn9ccp6KboR9syNidKz5m6ziCTQ29caHBOgBDbO6S231kMwPLIAf2W_zh7Q6d67k_LijsD-8NuCyn9m4k1AP3?PARTNER=WRITER" border=0 height=184 width=244&gt;&lt;/a&gt;  &lt;p&gt;Use a &lt;a href="http://www.dremel.com/"&gt;Dremel&lt;/a&gt; rotary tool to chop the edges off the keys - basically draw a box on the top of each key until the &amp;quot;skirt&amp;quot; falls off &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pylLSajaHh9HPEO-Pr9qTXzyCuobjlSECjTuVE8tDy9-sF5-tM-QJh97CdMK5xTT2lOzZ0WW7nhPiTXGSHSfVPm6uu4MqRgWK?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt="Numeric Keypad" src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfpu8XucjuIRN2K85D1Ltxehd_Dl2a6SQ0CiCXtLNZeN0Vi5bRU8KQ1LUiXQ8owO7IKz_62yCNl_0rAJQzdqscSl?PARTNER=WRITER" border=0 height=184 width=244&gt;&lt;/a&gt;  &lt;p&gt;Order all the keys you need on eBay - search on &amp;quot;&lt;a href="http://search.ebay.com/search/search.dll?satitle=typewriter+keys+royal"&gt;typewriter keys royal&lt;/a&gt;&amp;quot;. Note that you'll need 3 complete sets (all of two, a few from one more). Pay attention to whether you want round or rectangular keys for the &amp;quot;special&amp;quot;keys. Expect to pay about $1 per key. If you can, get the logo! &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pylLSajaHh9HJwB9vbH1vTg-QFtIq4s-bNAQD6ousEHvvuNifj20J8DbxvepkFgbVZUlH-O45inOOmPPje888YImVbFChLufF?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt="Royal Logo" src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfrHfkJbhudXKHWoqO8r1TgmrNDjfhYkr783by-A4JxWvG5KgHoOKdvrUVaFEL2Q2qgKejHPbQQUGAKiQAmffjhS?PARTNER=WRITER" border=0 height=184 width=244&gt;&lt;/a&gt;  &lt;p&gt;To make the non-standard key-caps (Carriage return, Function keys, &amp;quot;1&amp;quot;... none of those were around 100 years ago!) either touch type and ignore the glyphs (like I did for the numbers and some of the punctuation) or pry the backs off of the keys and use an inkjet printer to make your own labels. I used &lt;a href="http://www.myfonts.com/fonts/adobe/lucida-sans/"&gt;Lucida Sans&lt;/a&gt; for the lettering and &lt;a href="http://www.myfonts.com/fonts/agfa/bodoni-mt/"&gt;Bodoni MT&lt;/a&gt; for the punctuation. It's not a perfect fit, but it's good enough. Have fun with the labels - the vintage keys already have wacky titles like &amp;quot;Shift Freedom&amp;quot; (as opposed to &amp;quot;shift lock&amp;quot; I suppose?) and &amp;quot;Tabular&amp;quot;. I designed the keys using the Drawing and Word Art features in Word. (I once implemented that UI and functionality in an Office product, so I'm extremely familiar with the quirks of the UI!) &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pylLSajaHh9ESCUDPPtSHdU1IXU7UtWkbCRf1mGu-FhZZfmlkH7TyKJzp-II8uuDGPdszkNieO1e2yGj8-uFjp3d-Olh9LtFe?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt="Weirdo Keys" src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfqoaFWfexbQo41ClvL4uO_b87WocH9gd3z46amM2nUhEnElKNZcANyoCokqx-fsbVlCJikT5hBJPYHEyLnuRI79?PARTNER=WRITER" border=0 height=184 width=244&gt;&lt;/a&gt;  &lt;p&gt;Use &lt;a href="http://jbweld.net/products/jbkwik.php"&gt;JB Kwik&lt;/a&gt; to affix the keys to the posts. &lt;p&gt;&lt;a href="http://pfpiqg.blu.livefilestore.com/y1pylLSajaHh9G7vsBSIJDOY1ZFM9nb_CNim6-Hc2z9obQvt7A6Li6SR7VATfuw18Rsgc9skk6NngrMExz1b-moBPoMsZPfwhXT?PARTNER=WRITER"&gt;&lt;img style="border:0px none" alt=Perspective src="http://blu1.storage.msn.com/y1p5Ln-IAuHBfrGRC_TlhfqDeeuA8nJ4jUbVmFeGu4SrRg87KQ3oOy1404Ju-hsYINZ_Qn3yUO8ZZvsSLu5qU17lIuDjmsL8CAG?PARTNER=WRITER" border=0 height=184 width=244&gt;&lt;/a&gt;  &lt;p&gt;The end result feels pretty good. It's slightly noisier than a normal keyboard, which adds to the charm. The smaller Return key is not a problem - you adapt quickly. &lt;br&gt; &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+My+Other+Project&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1102.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1102.entry</guid><pubDate>Wed, 16 Apr 2008 06:34:09 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!1102/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1102.entry#comment</wfw:comment><dcterms:modified>2008-05-02T03:49:28Z</dcterms:modified></item><item><title>Foundation's End</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1087.entry</link><description>&lt;p&gt;I'm not alone in holding Asimov's &lt;a href="http://en.wikipedia.org/wiki/Foundation_series"&gt;Foundation series&lt;/a&gt; in high regard. In 1965 it won the Hugo Award for &amp;quot;Best All-Time Series&amp;quot; and I can't think of another science fiction series that would be a serious contender. Dune comes closest, but is still outmatched. That's not to say that they are the epitome of SF, but they are deeply &lt;em&gt;special.&lt;/em&gt; &lt;p&gt;Originally written in the 1940s as a serial and later published as a trilogy (&lt;em&gt;Foundation; Foundation and Empire; Second Foundation&lt;/em&gt;), Asimov returned to the series in the 1980s with two sequels (&lt;em&gt;Foundation's Edge; Foundation and Earth&lt;/em&gt;) and two prequels (&lt;em&gt;Prelude to Foundation; Forward the Foundation&lt;/em&gt;). He also linked in his Robot series (&lt;em&gt;The Caves of Steel; The Naked Sun; The Robots of Dawn&lt;/em&gt;) and more loosely the Galactic Empire series (&lt;em&gt;The Currents of Space; The Stars Like Dust; Pebble in the Sky&lt;/em&gt;) as well as numerous short stories. &lt;em&gt;Robots and Empire was&lt;/em&gt; explicitly written as a bridge novel. &lt;p&gt;Additional novels were written by other authors, notably the &lt;em&gt;Caliban &lt;/em&gt;trilogy (set after the &lt;em&gt;Robot &lt;/em&gt;novels, and exploring the same themes) and the &lt;em&gt;Second Foundation Trilogy&lt;/em&gt; by Benford, Bear and Brin that span the same time as &lt;em&gt;Forward the Foundation&lt;/em&gt;. Of these, the best is &lt;em&gt;Foundation's Triumph &lt;/em&gt;(by Brin)... &lt;p&gt;Asimov's writing is in the classic SF style - the characters are noble (even the villains) and spout monologues, but are mostly flat. They exist to move the plot along, and espouse the thoughts and theories of the writer. (Unlike somewhat later SF, at least they do not exist solely to act as sales-persons for the Latest New Fantastic Technology dreamed up by the writer.) In many cases, the only conflict in the story comes from a Socratic dialogue, with the characters merely filling the role of moving the invisible hand of history along. (Which is the whole point of the series, actually...) &lt;p&gt;By the chronological end of the series in &lt;em&gt;Foundation's Edge &lt;/em&gt;and &lt;em&gt;Foundation and Earth&lt;/em&gt;, things have changed. Asimov seems enamored of the &lt;a href="http://en.wikipedia.org/wiki/Gaia_hypothesis"&gt;Gaia Hypothesis&lt;/a&gt;, and explicitly drags this in. The primary characters (Trevize and the immortal robot Olivaw) debate the future of humanity in a secret base, and the series ends with a twist... to ensure truly long term survival of Humanity, a galaxy-wide super-organism must be created. While I ate this up in the early 1990's, now I regard it the same way as many fans of the series - a somewhat unfortunate dead end. (It is reported that Asimov himself felt the same way.) Later, I had my own thoughts on how the series should end, inspired by Brin's &lt;em&gt;Foundation's Triumph&lt;/em&gt;, where Seldon and Olivaw debate the future of humanity; Olivaw already has his plans for Gaia, and Seldon believes it will not succeed. &lt;p&gt;After the events of &lt;em&gt;Foundation and Earth&lt;/em&gt;, Trevize returns to Terminus. He is still an elected representative (having been &amp;quot;banished&amp;quot; only off the record), and thus can't simply be shot... not if he comes in broadcasting. (The implicit assumption in the other novels is that the government dominates communication much as it did in Earth's 1940s and can effectively keep secrets. But the liberties of the Foundation are considered to be expanding at that time.) What he broadcasts is simply the truth which he has discovered... &lt;p&gt;At which we flash back to what happened early, in his debate with Olivaw. Olivaw was convinced that humanity itself must be changed into Galaxia to save it from external threats. Much as Olivaw rendered humanity stagnant throughout the reign of the Galactic Empire with technology, here he would use biology to defend the species. But what he conspired to do with the unwitting Trevize was to do it without &lt;em&gt;choice&lt;/em&gt;. Humanity was not asked to make the choice, only Trevize. &lt;p&gt;Trevize realizes that although he's been gallivanting about the galaxy in his private telepathic uber-ship, seemingly choosing the future course of humanity on his own, it's not what he was &lt;em&gt;elected&lt;/em&gt; to do. Oh yes... not only is he a noble character, he was actually an elected representative on Terminus. In further debate with Olivaw, and discussion with Bliss and the little Solarian they picked up (the series' first pseudo-alien) he convinces Olivaw that Olivaw has actually done a terrible wrong by eliminating choice and free will. Olivaw is destined to continue as the slaver of humanity, rather than the savior he believes himself to be. &lt;p&gt;That's not to say that Trevize thinks that Galaxia is wrong; in fact (and especially to preserve continuity - he did &lt;em&gt;choose &lt;/em&gt;it as a future for humanity, after all) he believes it may be a powerful way for individuals to have even more influence on the future. But he believes that imposing it galaxy wide without choice would be a crime. He also learns of the horrors that Olivaw has done - sterilizing the galaxy of non-human life, introducing thought-suppression satellites to hold back humanity, and so forth. &lt;p&gt;Olivaw is trapped; he has carefully set up the situation so that Trevize's selection of Galaxia for the future of humanity would give him permission to proceed - remember, Olivaw must obey humans, as he never quite internalized the Zeroth Law. Now Trevize is telling him he can't just go ahead. He is effectively powerless against Trevize, who has the radical notion of &lt;em&gt;just telling the truth&lt;/em&gt; - a theme which harkens back to the start of &lt;em&gt;Foundation's Edge&lt;/em&gt;, when doing so gets him started on this adventure. &lt;p&gt;So Trevize returns to Terminus broadcasting the truth about what he has learned. And Olivaw dutifully follows... disabling his thought-suppression satellites in a wave rippling out from Terminus, effectively lifting a cloud from the eyes of humanity. In one fell swoop, the Foundation government's misdeeds are revealed, but so is the Second Foundation, and the humaniform robots who have been hiding among humanity the whole time. Bliss represents the Gaians, and for good measure, some aliens come out of the woodwork to say &amp;quot;Howdy!&amp;quot; &lt;p&gt;The Foundation is shocked to its core. This is no enemy that can be fought. Seldon's invisible hand is powerless; this is a crisis of humanity itself, and for the first time in ten thousand years, it is individuality that matters - something that psychohistory cannot predict. What will they do? &lt;p&gt;Trevize suggests: why don't we all just talk?  &lt;p&gt;The story ends with an article from the &lt;em&gt;Encyclopedia Galactica&lt;/em&gt; published nearly five hundred years later. Rather than destroying the Foundation, this even energized it. All things considered, the Foundation was still the best, um, foundation for a growing human civilization now more democratic than ever. The mentalists of the Second Foundation are not demonized - they are expert social scientists who provide a service to humanity and don't go around controlling minds any more than martial artists go around beating people up. (&lt;em&gt;Boot to the head - shhhthoop!&lt;/em&gt;) Galaxia is slowly taking hold as a means of communication and collaboration for humans, faster than even Olivaw predicted, since it is useful... but as an opt-in experience. Some worlds have gone all Vingean Singularity, but the theme of choice dominates - humans aren't swept away without their consent. &lt;p&gt;(I'm not sure what to do with R. Daneel Olvaw, however. He's potentially too dangerous to leave running around the galaxy. But you can't stick him in jail, and you can't kill him. And you don't want to go all anime and make him the central brain of Terminus or anything either...) &lt;p&gt;By the close of the novel, it should be clear that the Foundation that Seldon started came to an end - hence the title. His predictions are no longer relevant, but is is believed that what he started will be the kernel of the future of humanity (and others) for countless thousands of years to come. &lt;p&gt;In hindsight, my ending is already alluded to by the Second Foundation Trilogy. Rather than having aliens physically come out of hiding, &lt;em&gt;Foundation's Fear &lt;/em&gt;has them hiding as information in the network. (Not a very 1950's theme though, it must be said.) And the ultimate book, Brin's &lt;em&gt;Foundation's Triumph&lt;/em&gt;, features Seldon and Olivaw having a debate about personal choice. (Brin sneaks in an Easter egg where Seldon is cloned, BTW!) I was almost certainly influenced by this when I conceived my sequel. So it truly doesn't need to be written - it's already been imagined by anyone who reads these works in detail. &lt;em&gt;*sigh* &lt;/em&gt;Ah well - I was an acknowledged Brin-o-phile at the time! &lt;p&gt;I only wrote part of the teaser, and it's on the long list of projects I'll probably never finish.... &lt;h1&gt;Foundation’s End&lt;/h1&gt; &lt;p&gt;&lt;b&gt;&lt;i&gt;Olivaw, R. Daneel&lt;/i&gt;&lt;/b&gt;&lt;i&gt; – … Of all the beings that have been in a position to affect the course of galactic events, he was undoubtedly the most influential. Nearly everything that we take for granted about the galaxy in which we live has, in some way, been crafted by his hand. Perhaps no being has ever been both so venerated and reviled. And yet it can also be said that we have the less information about him, relative to his scope of his accomplishments, than any other being in recorded history…&lt;a href="#_ftn1_5517"&gt;*&lt;/a&gt;&lt;/i&gt; &lt;p&gt;Trevize brought the ship into a careful orbit around Terminus. He knew the authorities had been watching him since his ship jumped in at the outer edge of the system and slowly pulled itself inwards using its gravitational drive. And he had a fairly good idea of why they had remained silent: they were waiting for him to make the first move. He had considered the alternatives before making the jump – a warning transmission on the hyperwave, or the abrupt appearance of an interdiction vessel to “guide” his unwelcome person away from the sensitive heart of the Foundation. Maybe even a naval vessel with open gun-ports. But he had been a bureaucrat himself and he could imagine the discussions taking place in the president’s office, perhaps even now. &lt;p&gt;When he had last been in that office himself it was an amicable discussion over a finer point of some upstart bill he had marshaled through the congressional committee despite heavy opposition from the conservative blocs. It was that bill, more than any that followed, that had cemented his reputation as a brash, young, and certainly ambitious politician, and garnered a fair amount of support, both popular and within the houses of government. Trevize had impressed her, and she had wanted him as an ally – she told him as much there in the presidential chambers. On reflection, over the years, he had come to realize it was because she feared him as a competitor, and wanted to ensure he was on her side, not challenging her directly where he might triumph. It was the same president, several years later, who had effectively banished him from Terminus.  &lt;p&gt;Ostensibly he had been granted his wish – free reign to seek out the source of a threat to the Foundation. No doubt his constituents had received an effective propaganda campaign, not too far removed from the truth; public monitoring of the congress floor would have ensured that, at least. But he doubted that they were privy to the full story: that their duly elected representative had been detained in secret on the order of the president, arrested without charge, and told in no uncertain terms to leave, and never return. &lt;p&gt;He was unsure whether or not Madam President would even recall the meeting, in deep space, between the naval forces of the Foundation, the telepathic control of the Second Foundation, and the mediation of the Gaians, with him at the center. Certainly, if she recalled anything at all, it was of a stunning victory for the Foundation, but a victory against forces that were best kept secret from the many worlds under her care – he was sure that the Gaians would see to that, at least. But he was certain that she never expected him to return, with the penalty of death looming over his head. What could be worth returning for? &lt;p&gt;… &lt;p&gt;There was one thing he was counting on, and he asked the ship’s computer to verify it for him, as quietly as it could. Since he was, as far as the public was concerned, still an elected official acting in official government capacity, he had certain privileges associated with the position. Or at least, so said the letter of the law. And, he sincerely hoped, so said the administrative computers that managed the Foundation’s bureaucratic machine. On some outlying worlds, abandoned by the crumbling remnants of the Empire but not yet worked into the Foundation’s socioeconomic fold, actual scraps of physical paper, adorned with cryptic acronyms and decorated with flourished signatures, were used to make requests to the government, transfer resources, or provide a chain of accountability. On such worlds, the governments ran slowly. The Foundation prided itself on its technology, and all such “paperwork” was performed by computers. Biometrics certified all requests originating with a person. From there, everything happened through an electronic series of transfers, acknowledgements, verifications and assurances. Permissions for actions were granted based on vast databases of accountability, networks of legal relationships built into an extremely efficient, yet entirely invisible world that allowed the mere humans involved to work without concerning themselves with the trivial details.  &lt;p&gt;And Trevize was fairly certain that nowhere in that massive machine was there a way to preserve his public status as “elected representative on administrative assignment” and yet take away the privileges that came with such a position. On the one hand, why would the network know of such a contradictory state for one of its records to be in? And on the other, even if it did, how would such machinery be kept secret from the people of the Foundation? &lt;p&gt;Truthfully, he could easily imagine all sorts of conspiracies built up upon deeper conspiracies – shadow governments with secret agendas controlling the media, filtering the reality of its populace for nefarious purposes. And, being the victim of somewhat underhanded dealings himself, he would admit that there might be something to such paranoid delusions. But he more deeply trusted that the checks and balances of the Foundation government, combined with a well educated populace and an automated bureaucracy, would keep any elected officials from actually breaking the letter of the law, despite how badly the spirit might be twisted. &lt;p&gt;And so he was not surprised, although distinctly relieved, when the ship assured him that his broadcast rights remained intact, and further comforted that the permission request had not required any access to sensitive information stores. Hopefully, that meant that the government was still in the proverbial dark. &lt;p&gt;&lt;a href="#_ftnref1_5517"&gt;*&lt;/a&gt; All references are from the &lt;i&gt;Encyclopedia Galactica, 117&lt;sup&gt;th&lt;/sup&gt; Edition&lt;/i&gt;, 1054 F.E. &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Foundation's+End&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1087.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1087.entry</guid><pubDate>Mon, 14 Apr 2008 07:40:17 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!1087/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1087.entry#comment</wfw:comment><dcterms:modified>2008-05-02T03:50:01Z</dcterms:modified></item><item><title>ONERR RESUME and such</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1054.entry</link><description>&lt;div&gt;I added ONERR GOTO linenum / RESUME / POKE 216,0 support to my &lt;a href="http://www.calormen.com/Applesoft/"&gt;Applesoft Interpreter&lt;/a&gt;. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;It turned out to be pretty simple. ONERR sets a handler address. On an exception, check if it's cachable (i.e. the program caused it, it's not the interpreter reporting a bug). If so, store the current execution point and jump to the handler. If the handler calls RESUME, restore the previous execution point. The only wrinkle is that IF...THEN... is considered a single statement, so the IF part needs to be resumed and I was cheating an treating the bit after THEN as a separate statement. I don't twiddle the stack at all, so I'm not positive the behavior there is consistent with a real Apple. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This is not a feature I used when I programmed in BASIC. I didn't have very good examples to learn from. Also, initial experiments with RESUME made me wonder &amp;quot;WTF?&amp;quot;. For example, consider this:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;5 ONERR GOTO 10000&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;10 INPUT &amp;quot;Open file?&amp;quot;;F$ : REM prompt user for file name&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;20 PRINT CHR$(4)&amp;quot;OPEN &amp;quot;F$ : REM open the file&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;...&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;10000 PRINT &amp;quot;Invalid file&amp;quot; : RESUME : REM this won't do what we want&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;That's useless - the RESUME will rerun the statement on line 20, so it will just happen again.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I fell into the trap of thinking of ONERR / RESUME as a mandatory pair, and of errors as some global condition (&lt;em&gt;&amp;quot;error is bad! stop error from bothering user!&amp;quot;&lt;/em&gt;). Here are two more practical examples. First, let's correct the first sample:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;10 INPUT &amp;quot;Open file?&amp;quot;;F$ : REM prompt user for file name&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;20 ONERR GOTO 30 : PRINT CHR$(4)&amp;quot;OPEN &amp;quot;F$ : GOTO 40 : REM open the file; if it worked, keep going&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;30 PRINT &amp;quot;Invalid file&amp;quot; : GOTO 10 : REM oops, caught an error - go back to the right spot to try again&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;40 POKE 216,0 : REM clear onerr handler, and continue reading file&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;In other words, the onerr is used to trap the error result of the call. RESUME isn't used. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Another handy example:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;10 PRINT CHR$(4)&amp;quot;OPEN DATAFILE&amp;quot; : REM open file &lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;20 PRINT CHR$(4)&amp;quot;READ DATAFILE&amp;quot; : REM access file for reading&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;30 ONERR GOTO 50 : REM trap end-of-file error&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;40 INPUT A$: PRINT A$ : GOTO 40 : REM read lines from file&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;50 POKE 216,0 : REM clear onerr handler&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;60 PRINT CHR$(4)&amp;quot;CLOSE DATAFILE&amp;quot;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This treats the end-of-file as exceptional, and handles it with an ONERR trap. Very slick. I wish I'd known this back in the 1980's!&lt;/div&gt;&lt;/div&gt;

&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Instead of this, languages like C (on which UNIX and Windows are built) use error codes - any function that can fail will have some way to return a success or failure code. So you write a lot of code that looks like this:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;FILE* f = NULL;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;while( f == NULL )&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;{&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    /* ask user for filename here */&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    f = fopen(&amp;quot;datafile&amp;quot;, &amp;quot;r&amp;quot;);&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    if( f == NULL )&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    {&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;        printf(&amp;quot;Invalid file&amp;quot;);&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    }&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;}&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;In other words, after every action, check the results!&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;More modern languages provide this mechanism in a less spaghettified fashion, called &lt;em&gt;exceptions. &lt;/em&gt;(If you're unlucky and calling into a library from another language, like from C++ into C, you need to fall back to the old mechanism.) The syntax usually takes the form of a &amp;quot;try &amp;lt;some code&amp;gt; catch &amp;lt;an exception and respond&amp;gt;&amp;quot;, where the verb &amp;quot;throw&amp;quot; is used to indicate that an exception has occurred, e.g. &amp;quot;throw EOFError&amp;quot; for an end-of-file exception.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;For reference, here's what the above might look like in more contemporary language - this is &amp;quot;pseudo-Python*&amp;quot;:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;while True:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    print &amp;quot;Open file? &amp;quot;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    filename = readline()&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    try:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;        file = open(filename,&amp;quot;r&amp;quot;)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    except:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;        print &amp;quot;Invalid file&amp;quot;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    else:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;        break # yay, worked&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;# do stuff with file&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;file = open(&amp;quot;datafile&amp;quot;,&amp;quot;r&amp;quot;)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;try:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    while True:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;        line = file.readline()&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;        print line&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;except EOFError:&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;    pass # we must be done!&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#0070c0" face="Courier New"&gt;file.close()&lt;/font&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Note the similarities to the Applesoft ONERR examples. You can see how the exception syntax is not particularly well suited for interactive actions like prompting the user for a file which require the &amp;quot;success&amp;quot; case to break out of a loop. However, in the case where the exception is the rarity (the end-of-file condition), it lets the code doing the bulk of the work remain clean (the read/print loop).&lt;/div&gt;

&lt;/div&gt; &lt;i&gt;&lt;br&gt;* I've taken liberties with the syntax; in real Python, &lt;/i&gt;&lt;font face="Courier New"&gt;readline()&lt;/font&gt;&lt;i&gt; returns None at EOF rather than raising an exception, and you can just write &lt;/i&gt;&lt;font face="Courier New"&gt;while line in file:&lt;/font&gt; ...&lt;br&gt; &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+ONERR+RESUME+and+such&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1054.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1054.entry</guid><pubDate>Sat, 15 Mar 2008 23:03:54 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!1054/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1054.entry#comment</wfw:comment><dcterms:modified>2008-05-02T03:43:35Z</dcterms:modified></item><item><title>Pocket IE and DHTML</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1000.entry</link><description>&lt;div&gt;So... I thought I'd have a go at seeing what you can do with DHTML (a.k.a. HTML where you monkey with the contents via script, like most modern interactive sites) in Pocket IE (a.k.a. Internet Explorer for Windows Mobile) so far as animation goes.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The short answer appears to be: not much. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The CSS &lt;strong&gt;position &lt;/strong&gt;property is not supported. In fact, the best (only?) documentation of the supported CSS properties is &lt;a href="http://blogs.msdn.com/windowsmobile/articles/213771.aspx"&gt;an entry on the Windows Mobile blog from 2004&lt;/a&gt;. So no absolute positioning.
&lt;ul&gt;
&lt;li&gt;You can set a &lt;strong&gt;margin &lt;/strong&gt;on divs to position them (well, position one of them). However, this only works when PIE is set in &amp;quot;Desktop&amp;quot; rendering mode. It doesn't work in &amp;quot;Default&amp;quot; or &amp;quot;One Column&amp;quot; - I normally use the latter to force pages to reflow. (For WM6 you can specify a meta tag to override this - &lt;a href="http://blogs.msdn.com/iemobile/archive/2006/08/03/Detecting_IE_Mobile.aspx"&gt;see this blog post&lt;/a&gt;)
&lt;li&gt;If you set &lt;strong&gt;margin-left&lt;/strong&gt;, it takes away from the width of an element. So a DIV with a width of 50px and a margin-left of 10px ends up with an effective width of 40px.&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;document.body &lt;/strong&gt;is null. You can use &lt;strong&gt;document.getElementById() &lt;/strong&gt;and find the body if it has an ID, though.
&lt;li&gt;Setting &lt;strong&gt;window.onload &lt;/strong&gt;fails. You need to have &amp;lt;BODY ONLOAD=&amp;quot;...&amp;quot;&amp;gt; instead.
&lt;li&gt;No &lt;strong&gt;offsetLeft&lt;/strong&gt;, &lt;strong&gt;offsetTop&lt;/strong&gt;, &lt;strong&gt;offsetWidth &lt;/strong&gt;or &lt;strong&gt;offsetHeight &lt;/strong&gt;properties on elements.
&lt;li&gt;No &lt;strong&gt;onmousedown/onmousemove/onmouseup &lt;/strong&gt;events. So no iPhone-esque demos. *sigh*
&lt;li&gt;No &lt;strong&gt;onclick &lt;/strong&gt;on elements other than &lt;strong&gt;input type=button &lt;/strong&gt;and &lt;strong&gt;a &lt;/strong&gt;(link).
&lt;ul&gt;
&lt;li&gt;To fake this for a DIV you can do &amp;lt;DIV ... &amp;gt;&amp;lt;A HREF=&amp;quot;#&amp;quot; ONCLICK=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;DIV STYLE=&amp;quot;width: 100%; height; 100%;&amp;quot;&amp;gt;&amp;lt;/DIV&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/DIV&amp;gt;&lt;/ul&gt;
&lt;li&gt;Getting and setting &lt;strong&gt;innerHTML &lt;/strong&gt;works just fine, so you can do arbitrary content updates
&lt;li&gt;&lt;strong&gt;window.setTimeout() &lt;/strong&gt;is also supported, so you can do timed changes, for animations&lt;/ul&gt;
&lt;p&gt;So I was able to get a &lt;a href="http://www.calormen.com/tmp/pie_anim.htm" rel=nofollow&gt;square that moves to a new random position when you click on it&lt;/a&gt;, but it wasn't pretty. &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Pocket+IE+and+DHTML&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1000.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1000.entry</guid><pubDate>Sun, 22 Jul 2007 05:01:07 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!1000/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!1000.entry#comment</wfw:comment><dcterms:modified>2007-07-22T05:01:07Z</dcterms:modified></item><item><title>Scared myself</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!950.entry</link><description>&lt;div&gt;Su and C are out of town on a road trip with Grandpa, and I'm taking it easy. Slept in 'til 10:30 today. Yay! The weather was crappy so I stayed around the house, and got sucked into a project to the exclusion of all else.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Ages ago, someone asked about coding up the &lt;a href="http://traveller.wikia.com/wiki/Main_Page"&gt;Traveller &lt;/a&gt;trade rules (from &lt;a href="http://traveller.wikia.com/wiki/Merchant_Prince"&gt;Merchant Prince&lt;/a&gt;) into a simulation, which turned into a long debate about languages and platforms. Given the desire to make the result useful to everyone, I thought it was a no-brainer to do it in &lt;a href="http://javascript.crockford.com/"&gt;JavaScript &lt;/a&gt;with a web interface. I even went so far as to extract the source code of the &lt;a href="http://www.freelancetraveller.com/infocenter/swlist/appleprogs.html"&gt;canonical implementation - &amp;quot;TRADER&amp;quot; - from an Apple II disk image&lt;/a&gt; and take a peek at the code. Pretty damned elegant, actually.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;So earlier this week I started translating from &lt;a href="http://www.apple2.org/faq/FAQ.applesoft.html"&gt;Applesoft BASIC &lt;/a&gt;to &lt;a href="http://javascript.crockford.com/"&gt;JavaScript&lt;/a&gt;. As I went, though, I kept changing directions - for example, did I want it to be a verbatim, mechanical translation, or did I want to optimize things to take advantage of JavaScript's strengths? Did I want it to follow the procedural path of the original, or turn it into a modern object-oriented approach? And how should I attempt to integrate BASIC's notion of blocking input with a web page's modern eventing model?&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The more I wrote, the more I realized the resulting implementation would look nothing like the original, which had to contend with the joys of BASIC's limited flow control, data structures and variable naming. Which really defeated the whole purpose of the project, since just reimplementing the &lt;em&gt;Merchant Prince&lt;/em&gt; rules from scratch would probably take a quarter of the time. The only advantage of doing a translation was to get it to be an exact simulation... which would invariably fail since the code was radically restructured and differences inadvertantly introduced.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;So...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Walking back from an after-work party last night, I thought: Why don't I dive down a level deeper, and just write an &lt;a href="http://www.landsnail.com/a2ref.htm"&gt;Applesoft BASIC &lt;/a&gt;processor in JavaScript?&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And that's what became of Saturday, April 21st, 2007 in Josh's life - sitting at the computer, dog at my side, music on.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;At this point, it's running inside the Windows Scripting Host (command line JScript interpreter for Windows) and I've got the following fully functional:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Statements:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;CLEAR // Clear all variables
&lt;li&gt;END // End program
&lt;li&gt;FRE // Garbage collect
&lt;li&gt;GOTO // GOTO linenum 
&lt;li&gt;GOSUB // GOSUB linenum
&lt;li&gt;RETURN // Return from a GOSUB
&lt;li&gt;POP // Change last GOSUB into a GOTO
&lt;li&gt;FOR // FOR i = m TO m STEP s
&lt;li&gt;NEXT // NEXT [i]
&lt;li&gt;LET // Assign a variable, LET x = expr
&lt;li&gt;PRINT // Output to the screen
&lt;li&gt;INPUT // Read input from keyboard
&lt;li&gt;IF // IF expr (THEN|GOTO) linenum|statement [statement ... ]
&lt;li&gt;REM // Comment
&lt;li&gt;NOTRACE // Turn off line tracing
&lt;li&gt;TRACE // Turn on line tracing&lt;/ul&gt;
&lt;div&gt;Expressions:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Binary boolean operators: OR, AND
&lt;li&gt;Relational operators: '&amp;lt;', '&amp;gt;', '=', '&amp;lt;=' /'=&amp;lt;', '&amp;gt;='/'=&amp;gt;', '&amp;lt;&amp;gt;'/'&amp;gt;&amp;lt;'
&lt;li&gt;Additive operators: '+', '-' 
&lt;li&gt;Multiplicative operators: '*', '/' 
&lt;li&gt;Power operators: '^' 
&lt;li&gt;Unary operators: '+', '-', NOT &lt;/ul&gt;
&lt;p&gt;Functions:
&lt;ul&gt;
&lt;li&gt;ABS // Absolute value 
&lt;li&gt;ASC // ASCII code of a character 
&lt;li&gt;ATN // Arctangent
&lt;li&gt;CHR$ // Character, given an ASCII code
&lt;li&gt;COS // Cosine
&lt;li&gt;EXP // Raise e to the specified power
&lt;li&gt;INT // Integer portion of the value
&lt;li&gt;LEFT$ // Left end of a string
&lt;li&gt;LEN // Length substring
&lt;li&gt;LOG // Natural log 
&lt;li&gt;MID$ // Arbitrary substring
&lt;li&gt;RIGHT$ // Right substring
&lt;li&gt;RND // Pseudorandom number
&lt;li&gt;SGN // Sign (-1, 0, 1)
&lt;li&gt;SIN // Sine
&lt;li&gt;SQR // Square root
&lt;li&gt;STR$ // Convert number to string
&lt;li&gt;TAN // Tangent
&lt;li&gt;VAL // Convert string to number&lt;/ul&gt;
&lt;p&gt;What's NOT supported so far:
&lt;ul&gt;
&lt;li&gt;I haven't thoroughly exercised string variables and expressions
&lt;li&gt;ON expr GOTO ... is not yet implemented
&lt;li&gt;Arrays (and DIM) are not yet implemented
&lt;li&gt;DATA/READ/RESTORE are not yet implemented
&lt;li&gt;User defined functions (DEF FN) are not yet implemented)
&lt;li&gt;ONERR/RESUME are not yet implemented... and probably won't be, since this was buggy on the Apple II
&lt;li&gt;HOME, HTAB, VTAB, GET, TAB, POS() are tricky as console APIs are not supported (easily?) by WSH
&lt;li&gt;PRINT CHR$(4) hooks and DOS emulation for loading files.&lt;/ul&gt;
&lt;p&gt;Also, the following will probably never be supported:
&lt;ul&gt;
&lt;li&gt;TEXT, COLOR=, DRAW, FLASH, GR, HLIN, HPLOT, HCOLOR=, HGR, HGR2, INVERSE, NORMAL, PLOT, ROT=, SCALE=, SCRN(), VLIN, XDRAW - I'm not touching different display modes!
&lt;li&gt;CONT, DEL, LIST, NEW, RUN, SPEED= - primarily immediate mode, not interesting for 99.99% of programs
&lt;li&gt;CALL, HIMEM:, IN#, LOMEM:, PDL(), PEEK(), POKE, PR#, USR(), WAIT - interact with the native memory space of the Apple II/6502. Not happening.
&lt;li&gt;LOAD, RECALL, SAVE, SHLOAD, STORE - cassette tape I/O. Yeah, I'm all over that.&lt;/ul&gt;
&lt;p&gt;Although honestly, if I can figure out console I/O, doing INVERSE, HTAB/VTAB, and PDL() would be fun - PONG!
&lt;p&gt;The next big step, really, is to get it working in a web page. This is fairly straightforward:
&lt;ul&gt;
&lt;li&gt;I already have a basic TTY emulator. Not glass, paper. Write-only display. Line-oriented programs. Not sexy but it works. 
&lt;li&gt;The program is an array of statements, with the execution context an index into that. There is an explicit stack for statements (but not for functions). Each statement, in turn, is a  pointer into that. Each statement, in turn, is an array of tokens. To handle making INPUT blocking, I can push a stack object (like a GOSUB) that points to the middle of the INPUT statement, and then basically &amp;quot;yield&amp;quot; out of the program. Restoring should be as simple a RETURNing from a gosub.&lt;/ul&gt;
&lt;p&gt;Before I had the interpreter up and running, the routines that used the TTY would basically operate as chains of closures, passing in &amp;quot;after the user inputs something input, here's the point in this closure to rehydrate&amp;quot;. This should be even simpler, and it was this realization that made me really want to pursue this.
&lt;p&gt;So how did I scare myself?
&lt;p&gt;Well, as I've been coding up the interpreter I've also been writing a test program in Applesoft that I run to test features as they come online or as I refactor and &lt;a href="http://www.jslint.com/"&gt;clean up&lt;/a&gt; the code - I have code which spits out the Fibbonacci sequence, a &amp;quot;guess my number&amp;quot; game and a &amp;quot;guess your number&amp;quot; game, various output demos, and so on. Well, I decided to see if the code-to-character function (CHR$) was working. So I plunked in this code:
&lt;blockquote dir=ltr&gt;
&lt;p&gt;10 PRINT CHR$(7) : END&lt;/blockquote&gt;
&lt;p&gt;And ran it. It gave a syntax error - it didn't think CHR$ was a valid variable name, let alone a special function. Oops. After a few minutes of puttering around in the code, I realized that the regular expression matching reserved words didn't have $ escaped. But I was curious as to why CHR$ wasn't a valid variable, and it took several more minutes to figure that out (another regular expression glitch). So I escaped it, and ran it again.
&lt;p&gt;To understand what happened next, there are some key points above:
&lt;ul&gt;
&lt;li&gt;I've been home alone for a week
&lt;li&gt;I've been staring at the computer all day
&lt;li&gt;I have the music cranked on my computer
&lt;li&gt;ASCII code point 7 is the &amp;quot;BELL&amp;quot; character
&lt;li&gt;Between the time I wrote the test code and the time it ran successfully, almost 10 minutes had passed.&lt;/ul&gt;
&lt;p&gt;My computer emitted a very long, very sharp, high pitched &amp;quot;beep!&amp;quot; and I nearly jumped out of my skin.
&lt;p&gt;But it worked!
&lt;p&gt; 
&lt;p&gt;  &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Scared+myself&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!950.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!950.entry</guid><pubDate>Sun, 22 Apr 2007 06:37:40 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!950/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!950.entry#comment</wfw:comment><dcterms:modified>2008-05-02T03:41:59Z</dcterms:modified></item><item><title>Windows Mobile "Soft Key" buttons</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!918.entry</link><description>&lt;div&gt;Perhaps this is obvious, but...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;If you want to capture the Left/Right &amp;quot;Soft Key&amp;quot; buttons in a .NET application, add a handler to the KeyDown event of the Form, make sure there's no Menu, and look for F1/F2. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The gotcha that I ran into was looking for the KeyDown events on the (only) child control of the Form.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;For example, for a fullscreen app:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;blockquote dir=ltr&gt;
&lt;div&gt;&lt;font face="Courier New, Courier, Monospace"&gt;this.KeyDown += new System.Windows.Forms.KeyEventHandler( this.MyForm_KeyDown );&lt;br&gt;this.Menu = null;&lt;br&gt;this.WindowState = FormWindowState.Maximized;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New, Courier, Monospace"&gt;&lt;/font&gt; &lt;/div&gt;
&lt;div&gt;&lt;font face="Courier New, Courier, Monospace"&gt;private void MyForm_KeyDown( object sender, KeyEventArgs e )&lt;br&gt;{&lt;br&gt; switch( e.KeyCode )&lt;br&gt; {&lt;br&gt;  case Keys.F1:&lt;br&gt;  {&lt;br&gt;   // Soft Key 1, when there's no Menu&lt;br&gt;   ...&lt;br&gt;   break;&lt;br&gt;  }&lt;br&gt;  case Keys.F2:&lt;br&gt;  {&lt;br&gt;   // Soft Key 2, when there's no Menu&lt;br&gt;   ...&lt;br&gt;   break;&lt;br&gt;  }&lt;br&gt; }&lt;br&gt;}&lt;/font&gt;&lt;/div&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt; 
&lt;p&gt; &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Windows+Mobile+%22Soft+Key%22+buttons&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!918.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!918.entry</guid><pubDate>Wed, 03 Jan 2007 17:15:29 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!918/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!918.entry#comment</wfw:comment><dcterms:modified>2007-01-03T17:15:29Z</dcterms:modified></item><item><title>Retrocomputing - Mechwarrior for the Apple II</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!912.entry</link><description>&lt;div&gt;Another project that sat dormant for a while - almost 20 years in this case.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This is the basic core of an Apple II game based on &lt;a href="http://en.wikipedia.org/wiki/MechWarrior"&gt;Mechwarrior&lt;/a&gt; (giant fighting robot suits). It was probably inspired, more than anything, by the &lt;a href="http://www.mobygames.com/game/dos/mechwarrior/cover-art/gameCoverId,114/"&gt;box art for a PC version of this game&lt;/a&gt;. I'm rather proud of the sprites!&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I started when I was a teenager and got the basic image blitting and background rendering working and drew up lots of lovely sprites. But the whole thing was tied together with Applesoft BASIC code and was dog slow (like 0.1Hz). When I first (re)&lt;a href="http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!853.entry"&gt;moved to San Francisco &lt;/a&gt;I spent some time rewriting the core of it in C using &lt;a href="http://www.cc65.org/"&gt;CC65&lt;/a&gt; and making the blt engine a lot more flexible and speeding it up too. It's still pretty slow (2Hz or so) but there are plenty of optimizations that can be made: all sprites are 10 bytes wide, for example, and sprites are cached in aux memory which means a double copy when rendering.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;This is way, way down on the priority list to finish.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;(Correlate this with the &amp;quot;&lt;a href="http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!896.entry"&gt;Halo Mobile&lt;/a&gt;&amp;quot; post from a few days ago and you'll see I'm into first-person visualization of sprites against a rolling landscape... and never finish these darned things!)&lt;/div&gt;&lt;div&gt;&lt;table cellspacing="0" border="0"&gt;&lt;tr height="8"&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://blufiles.storage.live.com&amp;#47;y1pQMo3kg2ZfnyXrU9j2zchWvETycpOInqCAs4e4zSOvW55ezaD518J-CSFh4Y71Jcn"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;3FC59671BAEE20E9&amp;#33;913&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://blufiles.storage.live.com&amp;#47;y1p0q6Osf1qgRSFe2ZT1yUUPnzwhSLzuhLOPWPZdWIUsmIM1IFteIL7k1_Pq6Vpm-t_"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;3FC59671BAEE20E9&amp;#33;914&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://blufiles.storage.live.com&amp;#47;y1pHKzgcxxZA91xOky8Uk1rbFL3QkW_2jQE1eH2jTtzhxUPUMw_70RKZrI6ms8FSa57"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;3FC59671BAEE20E9&amp;#33;915&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://blufiles.storage.live.com&amp;#47;y1psoS1QkFxR4NWAJ9grvnjnNSwHUDubaR84RJN_4SLFb3xZzt5-cWB_F1t22N-wvV7"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;3FC59671BAEE20E9&amp;#33;916&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Retrocomputing+-+Mechwarrior+for+the+Apple+II&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!912.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!912.entry</guid><pubDate>Tue, 26 Dec 2006 18:34:34 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!912/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!912.entry#comment</wfw:comment><dcterms:modified>2006-12-26T18:34:34Z</dcterms:modified></item><item><title>PCX Plugin Updated</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!897.entry</link><description>&lt;div&gt;As mentioned &lt;a href="http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!891.entry"&gt;here&lt;/a&gt; I created a PCX file type plugin for Paint.NET&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;In response to a request from a user who needed to preserve the palette during load/save cycles (some downstream process required that the palette remain fixed) I updated the code and save dialog with a new checkbox: &lt;em&gt;Use original palette&lt;/em&gt;. If checked, and if the document was originally loaded as a PCX (or as a PCX and saved as a PDN file, I think) then it will re-save using the original palette.&lt;/div&gt;
&lt;div&gt;&lt;br&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+PCX+Plugin+Updated&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!897.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!897.entry</guid><pubDate>Mon, 25 Dec 2006 19:48:49 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!897/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!897.entry#comment</wfw:comment><dcterms:modified>2006-12-25T19:48:49Z</dcterms:modified></item><item><title>Physics Simulation</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!896.entry</link><description>&lt;div&gt;So one of my hobby projects that I've been putting an average of about two hours a month into for the past 5 years is a Pocket PC first person shooter that grew out of a voxel terrain demo I put together in Java about 10 years ago. When 2002 rolled around I had been playing &lt;a href="http://www.bungie.net/Games/Halo/"&gt;Halo &lt;/a&gt;(on an Xbox at work) and fell in love with the visual design. So morphed the terrain demo - very slowly - into a &amp;quot;Pocket Halo&amp;quot; (later renamed &amp;quot;Halo Mobile&amp;quot;). &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;(It's something I'll never finish, since it borrows all of the media from the game, soundtrack CD, and other fan projects (e.g. &lt;a href="http://www.nextforcesw.com/marathon/halathon.shtml"&gt;Halathon&lt;/a&gt;) and I'm sure Microsoft/Bungie wouldn't be huge fans of it. When I was working at Microsoft I showed it off to a few people, but I didn't give out copies. Please don't ask.)&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Doing it on a Pocket PC (~300MHz ARM processor, ~32MB memory, 240x320 screen, no hardware 3D, no floating point unit) gives it a bit of a retrocomputing aspect as well. (To be fair, it also compiles for Win32 so I can develop on the desktop and create mobile builds every so often). More than anything, it's an excuse to prototype parts of an FPS game. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Thus far, the technologies have been:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Voxel terrain rendering
&lt;li&gt;Game loop and event handling code (based on &lt;a href="http://www.gapidraw.com/"&gt;GapiDraw&lt;/a&gt;)
&lt;li&gt;UI dialog and widget toolkit, event model and dynamic layout engine (to handle screen resizes)
&lt;li&gt;Input abstration layer, multiple data-driven control schemes
&lt;li&gt;Fixed point data types
&lt;li&gt;3D software rendering engine, with texture mapping, lighting and shading, mesh support, etc
&lt;li&gt;Game module logic (menus, levels, etc) and rendering pipeline (e.g. menu UI renders on top of 3D animated titles)
&lt;li&gt;Sound mixer - although I later swapped this for &lt;a href="http://www.fmod.org/"&gt;FMod &lt;/a&gt;leaving my C++ wrappers in place
&lt;li&gt;Game object logic using data-driven, dynamic instancing (There's one Enemy class; different Enemy types are prototypes distinguished solely by data, and then there are multiple instances representing each enemy unit. Ditto for weapons, vehicles, etc.)
&lt;li&gt;Physics engine&lt;/ul&gt;
&lt;p&gt;(Yes, there's no AI yet. That's probably next.)
&lt;p&gt;Since my in-laws arrived for the holidays on Wednesday I've spent a little bit of time each evening going from a completely bogus physics model with gravity, drag, and &amp;quot;if something collides, reverse its velocity&amp;quot;. This was enough to get vehicles, the player, enemies and projectiles working but actual collisions looked horrible. I poked at it enough to get much better collision detection, multiple physics steps per frame, and actual real collision response. It went from a joke (albeit amusing) to looking like a pinball simulation when firing &amp;quot;test spheres&amp;quot; onto a flat surface. W00t!
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Physics+Simulation&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!896.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!896.entry</guid><pubDate>Mon, 25 Dec 2006 07:40:00 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!896/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!896.entry#comment</wfw:comment><dcterms:modified>2006-12-25T20:11:01Z</dcterms:modified></item><item><title>Third Imperium</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!892.entry</link><description>&lt;div&gt;Another &lt;strong&gt;&lt;em&gt;Traveller&lt;/em&gt;&lt;/strong&gt; project has come to fruition:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.travellermap.com/thirdimperium/"&gt;http://www.travellermap.com/thirdimperium/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+Third+Imperium&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!892.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!892.entry</guid><pubDate>Fri, 08 Dec 2006 04:52:27 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!892/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!892.entry#comment</wfw:comment><dcterms:modified>2006-12-20T05:28:48Z</dcterms:modified></item><item><title>PCX Plugin for Paint.NET</title><link>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!891.entry</link><description>&lt;div&gt;I've started using a free image editing application called &lt;a href="http://www.getpaint.net/"&gt;Paint .NET&lt;/a&gt;. It's good stuff. Not quite ready for professional work, and I still miss some features from PhotoShop, but you can't meet the price and the UI wasn't designed by idiots (like most free software).&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;It was missing PCX file support so I added it. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Forum post here: &lt;a href="http://paintdotnet.12.forumer.com/viewtopic.php?p=15973"&gt;http://paintdotnet.12.forumer.com/viewtopic.php?p=15973&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;PCX plugin download here: &lt;a href="http://www.calormen.com/tmp/PcxFileType.zip"&gt;http://www.calormen.com/tmp/PcxFileType.zip&lt;/a&gt; &lt;br&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4595244410013098217&amp;page=RSS%3a+PCX+Plugin+for+Paint.NET&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=inexorabletash.spaces.live.com&amp;amp;GT1=inexorabletash"&gt;</description><comments>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!891.entry#comment</comments><guid isPermaLink="true">http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!891.entry</guid><pubDate>Fri, 08 Dec 2006 04:51:25 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://inexorabletash.spaces.live.com/blog/cns!3FC59671BAEE20E9!891/comments/feed.rss</wfw:commentRss><wfw:comment>http://inexorabletash.spaces.live.com/Blog/cns!3FC59671BAEE20E9!891.entry#comment</wfw:comment><dcterms:modified>2006-12-20T05:29:02Z</dcterms:modified></item></channel></rss>